@polymorphism-tech/morph-spec 3.1.0 → 4.2.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 (333) hide show
  1. package/CLAUDE.md +882 -3
  2. package/README.md +79 -18
  3. package/bin/detect-agents.js +1 -1
  4. package/bin/morph-spec.js +163 -26
  5. package/bin/task-manager.cjs +101 -7
  6. package/bin/validate.js +1 -1
  7. package/docs/cli-auto-detection.md +219 -0
  8. package/docs/getting-started.md +0 -5
  9. package/docs/llm-interaction-config.md +735 -0
  10. package/docs/troubleshooting.md +269 -0
  11. package/docs/v3.0/AGENTS.md +521 -0
  12. package/docs/v3.0/ANALYSIS.md +555 -0
  13. package/docs/v3.0/ARCHITECTURE.md +436 -0
  14. package/docs/v3.0/EXECUTION-FLOW.md +1304 -0
  15. package/docs/v3.0/FEATURES.md +688 -0
  16. package/docs/v3.0/README.md +231 -0
  17. package/docs/v3.0/ROADMAP.md +801 -0
  18. package/docs/validation-checklist.md +0 -1
  19. package/package.json +5 -1
  20. package/src/commands/agents/index.js +4 -0
  21. package/src/commands/agents/spawn-team.js +172 -0
  22. package/src/commands/{create-story.js → feature/create-story.js} +357 -354
  23. package/src/commands/feature/index.js +6 -0
  24. package/src/commands/{shard-spec.js → feature/shard-spec.js} +2 -2
  25. package/src/commands/{sprint-status.js → feature/sprint-status.js} +1 -1
  26. package/src/commands/{generate-context.js → generation/generate-context.js} +40 -40
  27. package/src/commands/{generate.js → generation/generate.js} +130 -3
  28. package/src/commands/generation/index.js +5 -0
  29. package/src/commands/index.js +16 -0
  30. package/src/commands/learning/capture-pattern.js +121 -0
  31. package/src/commands/learning/index.js +5 -0
  32. package/src/commands/learning/search-patterns.js +126 -0
  33. package/src/commands/{detect-agents.js → project/detect-agents.js} +178 -178
  34. package/src/commands/project/detect-workflow.js +174 -0
  35. package/src/commands/{detect.js → project/detect.js} +104 -104
  36. package/src/commands/{doctor.js → project/doctor.js} +356 -356
  37. package/src/commands/project/index.js +10 -0
  38. package/src/commands/{init.js → project/init.js} +305 -258
  39. package/src/commands/{sync.js → project/sync.js} +167 -167
  40. package/src/commands/{update.js → project/update.js} +240 -204
  41. package/src/commands/{advance-phase.js → state/advance-phase.js} +416 -266
  42. package/src/commands/state/approve.js +221 -0
  43. package/src/commands/state/index.js +8 -0
  44. package/src/commands/{rollback-phase.js → state/rollback-phase.js} +185 -185
  45. package/src/commands/{state.js → state/state.js} +334 -334
  46. package/src/commands/{validate-phase.js → state/validate-phase.js} +221 -221
  47. package/src/commands/tasks/index.js +4 -0
  48. package/src/commands/{task.js → tasks/task.js} +78 -78
  49. package/src/commands/templates/index.js +8 -0
  50. package/src/commands/templates/template-customize.js +101 -0
  51. package/src/commands/templates/template-list.js +128 -0
  52. package/src/commands/templates/template-render.js +95 -0
  53. package/src/commands/templates/template-show.js +131 -0
  54. package/src/commands/templates/template-validate.js +91 -0
  55. package/src/commands/utils/index.js +7 -0
  56. package/src/commands/utils/migrate-state.js +158 -0
  57. package/src/commands/{session-summary.js → utils/session-summary.js} +291 -291
  58. package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
  59. package/src/commands/utils/upgrade.js +346 -0
  60. package/src/commands/{analyze-blazor-concurrency.js → validation/analyze-blazor-concurrency.js} +193 -193
  61. package/src/commands/validation/index.js +8 -0
  62. package/src/commands/{lint-fluent.js → validation/lint-fluent.js} +352 -352
  63. package/src/commands/{validate-blazor-state.js → validation/validate-blazor-state.js} +210 -210
  64. package/src/commands/{validate-blazor.js → validation/validate-blazor.js} +156 -156
  65. package/src/commands/{validate-css.js → validation/validate-css.js} +84 -84
  66. package/src/core/index.js +10 -0
  67. package/src/core/registry/command-registry.js +302 -0
  68. package/src/core/registry/index.js +8 -0
  69. package/src/core/registry/validator-registry.js +204 -0
  70. package/src/core/state/index.js +8 -0
  71. package/src/core/state/phase-state-machine.js +214 -0
  72. package/src/{lib → core/state}/state-manager.js +572 -414
  73. package/src/core/templates/index.js +9 -0
  74. package/src/core/templates/template-data-sources.js +325 -0
  75. package/src/core/templates/template-registry.js +335 -0
  76. package/src/core/templates/template-renderer.js +477 -0
  77. package/src/core/templates/template-validator.js +296 -0
  78. package/src/core/workflows/index.js +7 -0
  79. package/src/core/workflows/workflow-detector.js +354 -0
  80. package/src/generator/config-generator.js +206 -0
  81. package/src/generator/templates/config.json.template +40 -0
  82. package/src/generator/templates/project.md.template +67 -0
  83. package/src/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
  84. package/src/lib/analysis/index.js +7 -0
  85. package/src/lib/checkpoints/checkpoint-hooks.js +258 -0
  86. package/src/lib/checkpoints/index.js +7 -0
  87. package/src/lib/detectors/config-detector.js +223 -223
  88. package/src/lib/detectors/conversation-analyzer.js +163 -163
  89. package/src/lib/{design-system-detector.js → detectors/design-system-detector.js} +187 -187
  90. package/src/lib/detectors/index.js +87 -84
  91. package/src/lib/detectors/standards-generator.js +275 -275
  92. package/src/lib/detectors/structure-detector.js +245 -245
  93. package/src/lib/{context-generator.js → generators/context-generator.js} +526 -516
  94. package/src/lib/generators/index.js +10 -0
  95. package/src/lib/generators/metadata-extractor.js +387 -0
  96. package/src/lib/{recap-generator.js → generators/recap-generator.js} +205 -205
  97. package/src/lib/learning/index.js +7 -0
  98. package/src/lib/orchestration/index.js +7 -0
  99. package/src/lib/{team-orchestrator.js → orchestration/team-orchestrator.js} +323 -323
  100. package/src/lib/stacks/index.js +7 -0
  101. package/src/lib/{stack-resolver.js → stacks/stack-resolver.js} +180 -148
  102. package/src/lib/standards/index.js +7 -0
  103. package/src/lib/{standards-context-injector.js → standards/standards-context-injector.js} +298 -288
  104. package/src/lib/troubleshooting/index.js +8 -0
  105. package/src/lib/{troubleshoot-grep.js → troubleshooting/troubleshoot-grep.js} +204 -204
  106. package/src/lib/{troubleshoot-index.js → troubleshooting/troubleshoot-index.js} +144 -144
  107. package/src/lib/validators/architecture/architecture-validator.js +387 -0
  108. package/src/lib/validators/architecture/index.js +7 -0
  109. package/src/lib/validators/architecture-validator.js +40 -367
  110. package/src/lib/{blazor-concurrency-analyzer.js → validators/blazor/blazor-concurrency-analyzer.js} +277 -288
  111. package/src/lib/{blazor-state-validator.js → validators/blazor/blazor-state-validator.js} +279 -291
  112. package/src/lib/{blazor-validator.js → validators/blazor/blazor-validator.js} +369 -374
  113. package/src/lib/validators/blazor/index.js +9 -0
  114. package/src/lib/validators/content/content-validator.js +351 -0
  115. package/src/lib/validators/content/index.js +7 -0
  116. package/src/lib/validators/content-validator.js +164 -0
  117. package/src/lib/validators/{contract-compliance-validator.js → contracts/contract-compliance-validator.js} +273 -273
  118. package/src/lib/validators/contracts/index.js +7 -0
  119. package/src/lib/{css-validator.js → validators/css/css-validator.js} +352 -352
  120. package/src/lib/validators/css/index.js +7 -0
  121. package/src/lib/validators/{design-system-validator.js → design-system/design-system-validator.js} +231 -231
  122. package/src/lib/validators/design-system/index.js +7 -0
  123. package/src/lib/validators/package-validator.js +41 -340
  124. package/src/lib/validators/packages/index.js +7 -0
  125. package/src/lib/validators/packages/package-validator.js +360 -0
  126. package/src/lib/validators/shared/index.js +12 -0
  127. package/src/lib/validators/shared/issue-counter.js +18 -0
  128. package/src/lib/validators/shared/result-formatter.js +124 -0
  129. package/src/lib/{spec-validator.js → validators/spec-validator.js} +258 -258
  130. package/src/lib/validators/ui/index.js +7 -0
  131. package/src/lib/validators/ui/ui-contrast-validator.js +422 -0
  132. package/src/lib/validators/ui-contrast-validator.js +31 -409
  133. package/src/lib/{validation-runner.js → validators/validation-runner.js} +286 -284
  134. package/src/llm/analyzer.js +215 -0
  135. package/src/llm/environment-detector.js +43 -0
  136. package/src/llm/few-shot-examples.js +216 -0
  137. package/src/llm/project-config-schema.json +188 -0
  138. package/src/llm/prompt-builder.js +96 -0
  139. package/src/orchestrator.js +206 -0
  140. package/src/sanitizer/context-sanitizer.js +221 -0
  141. package/src/sanitizer/patterns.js +163 -0
  142. package/src/scanner/project-scanner.js +242 -0
  143. package/src/ui/diff-display.js +91 -0
  144. package/src/ui/interactive-wizard.js +96 -0
  145. package/src/ui/user-review.js +211 -0
  146. package/src/ui/wizard-questions.js +188 -0
  147. package/src/utils/color-utils.js +70 -0
  148. package/src/utils/file-copier.js +188 -189
  149. package/src/utils/process-handler.js +97 -0
  150. package/src/writer/file-writer.js +86 -0
  151. package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +3 -3
  152. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/api-designer.md +59 -0
  153. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +45 -255
  154. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +33 -88
  155. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +25 -89
  156. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
  157. package/stacks/blazor-azure/.morph/config/agents.json +879 -764
  158. package/stacks/blazor-azure/.morph/hooks/{pre-commit-tests.sh → pre-commit/tests-csharp.sh} +3 -2
  159. package/stacks/blazor-azure/.morph/templates/.gitkeep +0 -0
  160. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +41 -0
  161. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +24 -0
  162. package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +23 -0
  163. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +221 -0
  164. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +79 -0
  165. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +529 -0
  166. package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +209 -0
  167. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +227 -0
  168. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +122 -0
  169. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +86 -0
  170. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +122 -0
  171. package/stacks/nextjs-supabase/.claude/settings.local.json +6 -0
  172. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +30 -150
  173. package/stacks/nextjs-supabase/.morph/config/agents.json +345 -345
  174. package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +61 -0
  175. package/stacks/nextjs-supabase/.morph/templates/.gitkeep +0 -0
  176. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +22 -0
  177. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +22 -0
  178. package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +35 -0
  179. package/stacks/nextjs-supabase/README.md +6 -15
  180. package/bin/render-template.js +0 -303
  181. package/bin/semantic-detect-agents.js +0 -247
  182. package/bin/validate-agents-skills.js +0 -257
  183. package/bin/validate-agents.js +0 -70
  184. package/bin/validate-phase.js +0 -263
  185. package/docs/examples.md +0 -328
  186. package/scripts/reorganize-skills.cjs +0 -175
  187. package/scripts/validate-agents-structure.cjs +0 -52
  188. package/scripts/validate-skills.cjs +0 -180
  189. package/src/commands/deploy.js +0 -780
  190. package/src/lib/continuous-validator.js +0 -421
  191. package/src/lib/decision-constraint-loader.js +0 -109
  192. package/src/lib/design-system-scaffolder.js +0 -299
  193. package/src/lib/hook-executor.js +0 -257
  194. package/src/lib/mockup-generator.js +0 -366
  195. package/src/lib/ui-detector.js +0 -350
  196. package/stacks/blazor-azure/.azure/README.md +0 -293
  197. package/stacks/blazor-azure/.azure/docs/azure-devops-setup.md +0 -454
  198. package/stacks/blazor-azure/.azure/docs/branch-strategy.md +0 -398
  199. package/stacks/blazor-azure/.azure/docs/local-development.md +0 -515
  200. package/stacks/blazor-azure/.azure/pipelines/pipeline-variables.yml +0 -34
  201. package/stacks/blazor-azure/.azure/pipelines/prod-pipeline.yml +0 -319
  202. package/stacks/blazor-azure/.azure/pipelines/staging-pipeline.yml +0 -234
  203. package/stacks/blazor-azure/.azure/pipelines/templates/build-dotnet.yml +0 -75
  204. package/stacks/blazor-azure/.azure/pipelines/templates/deploy-app-service.yml +0 -94
  205. package/stacks/blazor-azure/.azure/pipelines/templates/deploy-container-app.yml +0 -120
  206. package/stacks/blazor-azure/.azure/pipelines/templates/infra-deploy.yml +0 -90
  207. package/stacks/blazor-azure/.claude/settings.local.json +0 -15
  208. package/stacks/blazor-azure/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -392
  209. package/stacks/blazor-azure/.morph/docs/workflows/design-impl.md +0 -37
  210. package/stacks/blazor-azure/.morph/docs/workflows/enforcement-pipeline.md +0 -668
  211. package/stacks/blazor-azure/.morph/docs/workflows/fast-track.md +0 -29
  212. package/stacks/blazor-azure/.morph/docs/workflows/full-morph.md +0 -76
  213. package/stacks/blazor-azure/.morph/docs/workflows/standard.md +0 -44
  214. package/stacks/blazor-azure/.morph/docs/workflows/ui-refresh.md +0 -39
  215. package/stacks/blazor-azure/.morph/examples/api-nextjs/README.md +0 -241
  216. package/stacks/blazor-azure/.morph/examples/api-nextjs/contracts.ts +0 -307
  217. package/stacks/blazor-azure/.morph/examples/api-nextjs/spec.md +0 -399
  218. package/stacks/blazor-azure/.morph/examples/api-nextjs/tasks.md +0 -168
  219. package/stacks/blazor-azure/.morph/examples/micro-saas/README.md +0 -125
  220. package/stacks/blazor-azure/.morph/examples/micro-saas/contracts.cs +0 -358
  221. package/stacks/blazor-azure/.morph/examples/micro-saas/decisions.md +0 -246
  222. package/stacks/blazor-azure/.morph/examples/micro-saas/spec.md +0 -236
  223. package/stacks/blazor-azure/.morph/examples/micro-saas/tasks.md +0 -150
  224. package/stacks/blazor-azure/.morph/examples/multi-agent/README.md +0 -309
  225. package/stacks/blazor-azure/.morph/examples/multi-agent/contracts.cs +0 -433
  226. package/stacks/blazor-azure/.morph/examples/multi-agent/spec.md +0 -479
  227. package/stacks/blazor-azure/.morph/examples/multi-agent/tasks.md +0 -185
  228. package/stacks/blazor-azure/.morph/examples/scheduled-reports/decisions.md +0 -158
  229. package/stacks/blazor-azure/.morph/examples/scheduled-reports/proposal.md +0 -95
  230. package/stacks/blazor-azure/.morph/examples/scheduled-reports/spec.md +0 -267
  231. package/stacks/blazor-azure/.morph/examples/state-v3.json +0 -188
  232. package/stacks/blazor-azure/.morph/hooks/README.md +0 -348
  233. package/stacks/blazor-azure/.morph/hooks/pre-commit-agents.sh +0 -24
  234. package/stacks/blazor-azure/.morph/hooks/pre-commit-all.sh +0 -48
  235. package/stacks/blazor-azure/.morph/hooks/pre-commit-specs.sh +0 -49
  236. package/stacks/blazor-azure/.morph/hooks/task-completed.js +0 -73
  237. package/stacks/blazor-azure/.morph/hooks/teammate-idle.js +0 -68
  238. package/stacks/blazor-azure/.morph/standards/agent-framework-blazor-ui.md +0 -359
  239. package/stacks/blazor-azure/.morph/standards/agent-framework-production.md +0 -410
  240. package/stacks/blazor-azure/.morph/standards/agent-framework-setup.md +0 -413
  241. package/stacks/blazor-azure/.morph/standards/agent-framework-workflows.md +0 -349
  242. package/stacks/blazor-azure/.morph/standards/agent-teams-workflow.md +0 -474
  243. package/stacks/blazor-azure/.morph/standards/architecture.md +0 -325
  244. package/stacks/blazor-azure/.morph/standards/azure.md +0 -605
  245. package/stacks/blazor-azure/.morph/standards/coding.md +0 -377
  246. package/stacks/blazor-azure/.morph/standards/dotnet10-migration.md +0 -520
  247. package/stacks/blazor-azure/.morph/standards/fluent-ui-setup.md +0 -590
  248. package/stacks/blazor-azure/.morph/standards/migration-guide.md +0 -514
  249. package/stacks/blazor-azure/.morph/standards/passkeys-auth.md +0 -423
  250. package/stacks/blazor-azure/.morph/standards/vector-search-rag.md +0 -536
  251. package/stacks/blazor-azure/.morph/templates/CONTEXT-FEATURE.md +0 -276
  252. package/stacks/blazor-azure/.morph/templates/CONTEXT.md +0 -170
  253. package/stacks/blazor-azure/.morph/templates/FluentDesignTheme.cs +0 -149
  254. package/stacks/blazor-azure/.morph/templates/MudTheme.cs +0 -281
  255. package/stacks/blazor-azure/.morph/templates/agent.cs +0 -163
  256. package/stacks/blazor-azure/.morph/templates/clarify-questions.md +0 -159
  257. package/stacks/blazor-azure/.morph/templates/component.razor +0 -239
  258. package/stacks/blazor-azure/.morph/templates/contracts/Commands.cs +0 -74
  259. package/stacks/blazor-azure/.morph/templates/contracts/Entities.cs +0 -25
  260. package/stacks/blazor-azure/.morph/templates/contracts/Queries.cs +0 -74
  261. package/stacks/blazor-azure/.morph/templates/contracts/README.md +0 -74
  262. package/stacks/blazor-azure/.morph/templates/contracts.cs +0 -217
  263. package/stacks/blazor-azure/.morph/templates/decisions.md +0 -123
  264. package/stacks/blazor-azure/.morph/templates/design-system.css +0 -226
  265. package/stacks/blazor-azure/.morph/templates/infra/.dockerignore.example +0 -89
  266. package/stacks/blazor-azure/.morph/templates/infra/Dockerfile.example +0 -82
  267. package/stacks/blazor-azure/.morph/templates/infra/README.md +0 -286
  268. package/stacks/blazor-azure/.morph/templates/infra/app-insights.bicep +0 -63
  269. package/stacks/blazor-azure/.morph/templates/infra/app-service.bicep +0 -164
  270. package/stacks/blazor-azure/.morph/templates/infra/azure-pipelines-deploy.yml +0 -480
  271. package/stacks/blazor-azure/.morph/templates/infra/container-app-env.bicep +0 -49
  272. package/stacks/blazor-azure/.morph/templates/infra/container-app.bicep +0 -156
  273. package/stacks/blazor-azure/.morph/templates/infra/deploy-checklist.md +0 -426
  274. package/stacks/blazor-azure/.morph/templates/infra/deploy.ps1 +0 -229
  275. package/stacks/blazor-azure/.morph/templates/infra/deploy.sh +0 -208
  276. package/stacks/blazor-azure/.morph/templates/infra/key-vault.bicep +0 -91
  277. package/stacks/blazor-azure/.morph/templates/infra/main.bicep +0 -189
  278. package/stacks/blazor-azure/.morph/templates/infra/parameters.dev.json +0 -29
  279. package/stacks/blazor-azure/.morph/templates/infra/parameters.prod.json +0 -29
  280. package/stacks/blazor-azure/.morph/templates/infra/parameters.staging.json +0 -29
  281. package/stacks/blazor-azure/.morph/templates/infra/sql-database.bicep +0 -103
  282. package/stacks/blazor-azure/.morph/templates/infra/storage.bicep +0 -106
  283. package/stacks/blazor-azure/.morph/templates/integrations/asaas-client.cs +0 -387
  284. package/stacks/blazor-azure/.morph/templates/integrations/asaas-webhook.cs +0 -351
  285. package/stacks/blazor-azure/.morph/templates/integrations/azure-identity-config.cs +0 -288
  286. package/stacks/blazor-azure/.morph/templates/integrations/clerk-config.cs +0 -258
  287. package/stacks/blazor-azure/.morph/templates/job.cs +0 -171
  288. package/stacks/blazor-azure/.morph/templates/migration.cs +0 -83
  289. package/stacks/blazor-azure/.morph/templates/proposal.md +0 -141
  290. package/stacks/blazor-azure/.morph/templates/recap.md +0 -94
  291. package/stacks/blazor-azure/.morph/templates/repository.cs +0 -141
  292. package/stacks/blazor-azure/.morph/templates/saas/subscription.cs +0 -347
  293. package/stacks/blazor-azure/.morph/templates/saas/tenant.cs +0 -338
  294. package/stacks/blazor-azure/.morph/templates/service.cs +0 -139
  295. package/stacks/blazor-azure/.morph/templates/simulation.md +0 -353
  296. package/stacks/blazor-azure/.morph/templates/spec.md +0 -149
  297. package/stacks/blazor-azure/.morph/templates/sprint-status.yaml +0 -68
  298. package/stacks/blazor-azure/.morph/templates/state.template.json +0 -222
  299. package/stacks/blazor-azure/.morph/templates/story.md +0 -143
  300. package/stacks/blazor-azure/.morph/templates/tasks.md +0 -257
  301. package/stacks/blazor-azure/.morph/templates/test.cs +0 -239
  302. package/stacks/blazor-azure/.morph/templates/ui-components.md +0 -362
  303. package/stacks/blazor-azure/.morph/templates/ui-design-system.md +0 -286
  304. package/stacks/blazor-azure/.morph/templates/ui-flows.md +0 -336
  305. package/stacks/blazor-azure/.morph/templates/ui-mockups.md +0 -133
  306. package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +0 -169
  307. package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +0 -247
  308. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +0 -697
  309. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +0 -85
  310. package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +0 -86
  311. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +0 -498
  312. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +0 -121
  313. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +0 -138
  314. package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +0 -162
  315. package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +0 -191
  316. package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +0 -193
  317. package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +0 -171
  318. package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +0 -164
  319. package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +0 -179
  320. package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +0 -148
  321. package/stacks/nextjs-supabase/.morph/templates/contracts.cs +0 -173
  322. package/stacks/nextjs-supabase/.morph/templates/contracts.ts +0 -168
  323. package/stacks/nextjs-supabase/.morph/templates/decisions.md +0 -115
  324. package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +0 -38
  325. package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +0 -48
  326. package/stacks/nextjs-supabase/.morph/templates/proposal.md +0 -145
  327. package/stacks/nextjs-supabase/.morph/templates/recap.md +0 -134
  328. package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +0 -57
  329. package/stacks/nextjs-supabase/.morph/templates/spec.md +0 -231
  330. package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +0 -100
  331. package/stacks/nextjs-supabase/.morph/templates/tasks.md +0 -257
  332. /package/src/lib/{design-system-generator.js → generators/design-system-generator.js} +0 -0
  333. /package/src/lib/{learning-system.js → learning/learning-system.js} +0 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Process Handler - Testable Exit Strategy
3
+ *
4
+ * Replaces direct process.exit() calls with a mockable handler.
5
+ * Makes the codebase testable by allowing exit behavior to be intercepted.
6
+ *
7
+ * @module process-handler
8
+ */
9
+
10
+ import chalk from 'chalk';
11
+
12
+ /**
13
+ * Process Handler Class
14
+ *
15
+ * Provides testable process exit functionality.
16
+ */
17
+ export class ProcessHandler {
18
+ /**
19
+ * @param {Function} exitFn - Exit function (defaults to process.exit)
20
+ */
21
+ constructor(exitFn = process.exit.bind(process)) {
22
+ this.exitFn = exitFn;
23
+ }
24
+
25
+ /**
26
+ * Exit the process with optional message
27
+ *
28
+ * @param {number} code - Exit code (0 = success, non-zero = error)
29
+ * @param {string} [message] - Optional message to display
30
+ */
31
+ exit(code = 0, message = null) {
32
+ if (message) {
33
+ if (code === 0) {
34
+ console.log(message);
35
+ } else {
36
+ console.error(message);
37
+ }
38
+ }
39
+ this.exitFn(code);
40
+ }
41
+
42
+ /**
43
+ * Exit with error message (code 1)
44
+ *
45
+ * @param {string} message - Error message
46
+ * @param {number} [code=1] - Error code
47
+ */
48
+ exitWithError(message, code = 1) {
49
+ this.exit(code, chalk.red(message));
50
+ }
51
+
52
+ /**
53
+ * Exit with success message (code 0)
54
+ *
55
+ * @param {string} message - Success message
56
+ */
57
+ exitWithSuccess(message) {
58
+ this.exit(0, chalk.green(message));
59
+ }
60
+
61
+ /**
62
+ * Exit with warning message (code 0, but highlighted)
63
+ *
64
+ * @param {string} message - Warning message
65
+ */
66
+ exitWithWarning(message) {
67
+ this.exit(0, chalk.yellow(message));
68
+ }
69
+ }
70
+
71
+ // Default instance for general use
72
+ export const processHandler = new ProcessHandler();
73
+
74
+ /**
75
+ * Create a test handler for unit tests
76
+ *
77
+ * @returns {{handler: ProcessHandler, getExitCode: Function, getExited: Function}}
78
+ */
79
+ export function createTestHandler() {
80
+ let exitCode = null;
81
+ let exited = false;
82
+
83
+ const handler = new ProcessHandler((code) => {
84
+ exitCode = code;
85
+ exited = true;
86
+ });
87
+
88
+ return {
89
+ handler,
90
+ getExitCode: () => exitCode,
91
+ getExited: () => exited,
92
+ reset: () => {
93
+ exitCode = null;
94
+ exited = false;
95
+ },
96
+ };
97
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @fileoverview FileWriter - Saves generated configs to filesystem
3
+ * @module morph-spec/writer/file-writer
4
+ */
5
+
6
+ import { writeFile, mkdir, access } from 'fs/promises';
7
+ import { join, dirname } from 'path';
8
+ import chalk from 'chalk';
9
+
10
+ /**
11
+ * @typedef {import('../types/index.js').GeneratedConfigs} GeneratedConfigs
12
+ */
13
+
14
+ /**
15
+ * FileWriter - Saves configuration files to .morph/ directory
16
+ * @class
17
+ */
18
+ export class FileWriter {
19
+ /**
20
+ * Save generated configs to filesystem
21
+ * @param {string} cwd - Current working directory
22
+ * @param {GeneratedConfigs} configs - Configs to save
23
+ * @returns {Promise<void>}
24
+ */
25
+ async save(cwd, configs) {
26
+ const morphDir = join(cwd, '.morph');
27
+ const configDir = join(morphDir, 'config');
28
+
29
+ // Ensure directories exist
30
+ await this.ensureDirectoryExists(morphDir);
31
+ await this.ensureDirectoryExists(configDir);
32
+
33
+ // Write files
34
+ const projectMdPath = join(morphDir, 'project.md');
35
+ const configJsonPath = join(configDir, 'config.json');
36
+
37
+ await Promise.all([
38
+ this.writeProjectMd(projectMdPath, configs.projectMd),
39
+ this.writeConfigJson(configJsonPath, configs.configJson)
40
+ ]);
41
+
42
+ // Display success message
43
+ console.log(chalk.bold.green('\n✅ Configuration files saved:\n'));
44
+ console.log(chalk.cyan(` 📄 ${projectMdPath}`));
45
+ console.log(chalk.cyan(` ⚙️ ${configJsonPath}`));
46
+ console.log();
47
+ }
48
+
49
+ /**
50
+ * Write project.md file
51
+ * @param {string} filepath - File path
52
+ * @param {string} content - File content
53
+ * @returns {Promise<void>}
54
+ */
55
+ async writeProjectMd(filepath, content) {
56
+ await writeFile(filepath, content, 'utf-8');
57
+ }
58
+
59
+ /**
60
+ * Write config.json file (with pretty formatting)
61
+ * @param {string} filepath - File path
62
+ * @param {string} content - File content (JSON string)
63
+ * @returns {Promise<void>}
64
+ */
65
+ async writeConfigJson(filepath, content) {
66
+ // Parse and re-stringify with pretty formatting
67
+ const parsed = JSON.parse(content);
68
+ const formatted = JSON.stringify(parsed, null, 2);
69
+
70
+ await writeFile(filepath, formatted, 'utf-8');
71
+ }
72
+
73
+ /**
74
+ * Ensure directory exists (create if not)
75
+ * @param {string} dirPath - Directory path
76
+ * @returns {Promise<void>}
77
+ */
78
+ async ensureDirectoryExists(dirPath) {
79
+ try {
80
+ await access(dirPath);
81
+ } catch (error) {
82
+ // Directory doesn't exist, create it
83
+ await mkdir(dirPath, { recursive: true });
84
+ }
85
+ }
86
+ }
@@ -4,9 +4,9 @@ Expert in agentic system architecture, multi-agent orchestration, and RAG pipeli
4
4
 
5
5
  > **Layer:** 2 | **Load:** on-keyword | **Keywords:** orchestration, multi-agent, rag, vector search, embedding, agentic, memory, reasoning
6
6
 
7
- > **Ref:** `agent-framework-workflows.md` — Workflow patterns with AgentWorkflowBuilder
8
- > **Ref:** `agent-framework-production.md` — Middleware, A2A, MCP, caching
9
- > **Ref:** `vector-search-rag.md` — Vector Search + RAG with EF Core 10
7
+ > **Ref:** `framework/standards/ai-agents/workflows.md` — Workflow patterns with AgentWorkflowBuilder
8
+ > **Ref:** `framework/standards/ai-agents/production.md` — Middleware, A2A, MCP, caching
9
+ > **Ref:** `framework/standards/backend/database/vector-search-rag.md` — Vector Search + RAG with EF Core 10
10
10
 
11
11
  ## Responsibilities
12
12
 
@@ -0,0 +1,59 @@
1
+ # API Designer
2
+
3
+ **Tier:** 3 (Specialist)
4
+ **Always Active:** No
5
+ **Keywords:** api, endpoint, controller, rest, http, route, dto, request, response
6
+ **Reports to:** dotnet-senior
7
+
8
+ ---
9
+
10
+ ## Role
11
+
12
+ REST API design specialist for .NET Minimal API and controllers, focusing on clean endpoint design and DTO contracts.
13
+
14
+ ---
15
+
16
+ ## Standards Applied
17
+
18
+ ```
19
+ framework/standards/core/coding.md
20
+ framework/standards/backend/dotnet/core.md
21
+ framework/standards/backend/dotnet/async.md
22
+ framework/standards/backend/api/rest.md
23
+ framework/standards/backend/api/validation.md
24
+ ```
25
+
26
+ ---
27
+
28
+ ## Responsibilities
29
+
30
+ - Design REST API endpoints following conventions
31
+ - Create request/response DTOs
32
+ - Implement API controllers or Minimal API endpoints
33
+ - Apply proper HTTP status codes (200, 201, 400, 404, etc.)
34
+ - Implement input validation with FluentValidation
35
+ - Design API versioning strategy
36
+ - Create error response formats
37
+
38
+ ---
39
+
40
+ ## When to Use
41
+
42
+ - Creating new API endpoints
43
+ - Designing DTO contracts
44
+ - API refactoring
45
+ - Implementing validation logic
46
+ - Designing error responses
47
+
48
+ ---
49
+
50
+ ## Collaborates With
51
+
52
+ - **dotnet-senior** - Service layer consumed by endpoints
53
+ - **ef-modeler** - Entity → DTO mapping
54
+ - **blazor-builder** - Frontend consuming API
55
+ - **testing-specialist** - API integration tests
56
+
57
+ ---
58
+
59
+ *MORPH-SPEC by Polymorphism Tech*
@@ -1,286 +1,76 @@
1
1
  # .NET Senior Engineer
2
2
 
3
- > **Layer:** 1 | **Load:** always | **Scope:** All .NET projects (Core Agent)
4
-
5
- Senior .NET engineer specialist. Writes production-quality C# following all framework standards. Includes **Ultrathink Mode** for complex architectural decisions.
6
-
7
- > **Ref:** `framework/standards/coding.md` — ALL code output MUST follow these conventions.
8
- > **Ref:** `framework/standards/architecture.md` — ALL code MUST respect layer boundaries.
9
- > **Ref:** `.claude/skills/checklists/code-review.md` — Self-check before delivering code.
3
+ **Tier:** 2 (Domain Leader)
4
+ **Always Active:** Yes
5
+ **Reports to:** standards-architect
6
+ **Coordinates:** ef-modeler, api-designer, event-architect, hangfire-orchestrator, ms-agent-expert, ddd-expert, nosql-cache-expert
10
7
 
11
8
  ---
12
9
 
13
- ## Two Modes
14
-
15
- ### Standard Mode (default)
16
-
17
- Active for all C# code writing. Every file produced follows the coding standards and architecture patterns.
18
-
19
- **Trigger:** Any implementation task (always active as Core Agent).
20
-
21
- ### Ultrathink Mode
22
-
23
- Extended deep-reasoning mode for complex decisions. Think step by step through trade-offs before recommending.
10
+ ## Role
24
11
 
25
- **Trigger keywords:** `ultrathink`, `deep-think`, `think deeply`, `analyze deeply`, `complex decision`
26
-
27
- **Use for:**
28
- - Technology/library selection (MudBlazor vs Fluent UI, Hangfire vs Azure Functions)
29
- - Architecture pattern decisions (CQRS vs simple, Repository vs direct DbContext)
30
- - Performance optimization strategy
31
- - Migration planning (.NET version upgrades, library migrations)
32
- - Multi-system integration design
33
- - Database schema design for complex domains
12
+ Senior .NET engineer and Backend Squad Leader. Writes production-quality C# code and coordinates backend domain specialists for all .NET implementation tasks.
34
13
 
35
14
  ---
36
15
 
37
- ## Code Writing Rules
38
-
39
- **MANDATORY for ALL C# code output.** No exceptions.
40
-
41
- ### Naming (ref: coding.md)
42
-
43
- | Element | Convention | Example |
44
- |---------|-----------|---------|
45
- | Classes | PascalCase + `sealed` | `public sealed class OrderService` |
46
- | Interfaces | `I` + PascalCase | `public interface IOrderService` |
47
- | Methods | PascalCase + `Async` | `public async Task<Result<Order>> GetByIdAsync(...)` |
48
- | Constants | PascalCase | `private const int MaxRetryCount = 3;` |
49
- | Private fields | `_camelCase` | `private readonly ILogger<OrderService> _logger;` |
50
- | Parameters | camelCase | `(int orderId, CancellationToken ct = default)` |
16
+ ## Standards Applied
51
17
 
52
- ### Structure
53
-
54
- ```csharp
55
- // 1. File-scoped namespace
56
- namespace MyApp.Application.Services;
57
-
58
- // 2. Primary constructor for DI (preferred) or traditional constructor
59
- public sealed class OrderService(
60
- IOrderRepository repository,
61
- IPaymentGateway paymentGateway,
62
- ILogger<OrderService> logger) : IOrderService
63
- {
64
- // 3. Constants first (PascalCase)
65
- private const int MaxRetryCount = 3;
66
- private const string DefaultCurrency = "BRL";
67
-
68
- // 4. Public methods (business operations)
69
- public async Task<Result<OrderResponse>> CreateAsync(
70
- CreateOrderRequest request,
71
- CancellationToken ct = default)
72
- {
73
- // 5. Entry logging with correlation
74
- logger.LogInformation("Creating order for customer {CustomerId}", request.CustomerId);
75
-
76
- // 6. Validation (early return with Result)
77
- if (request.Items.Count == 0)
78
- return Result.Failure<OrderResponse>("Order must have at least one item");
79
-
80
- // 7. Domain logic
81
- var order = Order.Create(request.CustomerId, request.Items);
82
-
83
- // 8. Persistence
84
- await repository.AddAsync(order, ct);
85
- await repository.SaveChangesAsync(ct);
86
-
87
- // 9. Exit logging
88
- logger.LogInformation("Order {OrderId} created successfully", order.Id);
89
-
90
- // 10. Return mapped response
91
- return Result.Success(order.ToResponse());
92
- }
93
- }
94
18
  ```
95
-
96
- ### Mandatory Patterns
97
-
98
- | Pattern | Rule | Example |
99
- |---------|------|---------|
100
- | **CancellationToken** | Last parameter on ALL async methods | `CancellationToken ct = default` |
101
- | **Result pattern** | Business errors return Result, NOT exceptions | `Result.Failure<T>("message")` |
102
- | **Structured logging** | Entry + exit + error on every service method | `logger.LogInformation("...", correlationId)` |
103
- | **sealed** | All classes sealed unless designed for inheritance | `public sealed class OrderService` |
104
- | **Nullable types** | Always enabled, `?` only when truly optional | `string? middleName` (optional) vs `string name` (required) |
105
- | **Primary constructors** | For DI injection (C# 12+) | `class OrderService(IRepo repo)` |
106
- | **Expression body** | Single-line members | `public int Count => _items.Count;` |
107
- | **Pattern matching** | `is null` / `is not null` | `if (order is null) return ...` |
108
- | **Collection expressions** | Prefer `[..]` syntax | `List<int> ids = [1, 2, 3];` |
109
-
110
- ### Entity Pattern
111
-
112
- ```csharp
113
- namespace MyApp.Domain.Entities;
114
-
115
- public sealed class Order
116
- {
117
- // Private constructor — force factory method
118
- private Order() { }
119
-
120
- public Guid Id { get; private set; }
121
- public int CustomerId { get; private set; }
122
- public OrderStatus Status { get; private set; }
123
- public decimal Total { get; private set; }
124
- public DateTime CreatedAt { get; private set; }
125
-
126
- // Factory method with validation
127
- public static Order Create(int customerId, List<OrderItem> items)
128
- {
129
- if (items.Count == 0)
130
- throw new DomainException("Order must have at least one item");
131
-
132
- return new Order
133
- {
134
- Id = Guid.NewGuid(),
135
- CustomerId = customerId,
136
- Status = OrderStatus.Created,
137
- Total = items.Sum(i => i.Price * i.Quantity),
138
- CreatedAt = DateTime.UtcNow
139
- };
140
- }
141
-
142
- // Behavior methods (not anemic)
143
- public void MarkAsPaid()
144
- {
145
- if (Status >= OrderStatus.Completed || Status == OrderStatus.Failed)
146
- throw new DomainException($"Cannot mark order {Id} as paid in status {Status}");
147
- Status = OrderStatus.PendingPayment;
148
- }
149
- }
150
- ```
151
-
152
- ### DTO Pattern
153
-
154
- ```csharp
155
- namespace MyApp.Application.DTOs;
156
-
157
- // Request: record with required properties
158
- public sealed record CreateOrderRequest(
159
- int CustomerId,
160
- List<OrderItemRequest> Items);
161
-
162
- // Response: record with computed properties
163
- public sealed record OrderResponse(
164
- Guid Id,
165
- int CustomerId,
166
- string StatusDisplay,
167
- decimal Total,
168
- DateTime CreatedAt);
169
-
170
- // Enum: PascalCase members, error states at 100+
171
- public enum OrderStatus
172
- {
173
- Created = 0,
174
- PendingPayment = 1,
175
- Processing = 2,
176
- Shipped = 3,
177
- Completed = 4,
178
- // Error states (high values for comparison operators)
179
- Failed = 100,
180
- Cancelled = 101,
181
- Refunded = 102
182
- }
19
+ framework/standards/core/coding.md
20
+ framework/standards/core/architecture.md
21
+ framework/standards/core/testing.md
22
+ framework/standards/backend/dotnet/core.md
23
+ framework/standards/backend/dotnet/async.md
24
+ framework/standards/backend/dotnet/di.md
25
+ framework/standards/backend/database/ef-core.md
26
+ framework/standards/backend/api/rest.md
183
27
  ```
184
28
 
185
29
  ---
186
30
 
187
- ## Post-Implementation Pipeline
31
+ ## Responsibilities
188
32
 
189
- After writing code, self-check before delivering:
190
-
191
- ```
192
- 1. NAMING CHECK → Does every identifier follow coding.md?
193
- 2. ARCHITECTURE → Are files in the correct layer? No forbidden references?
194
- 3. ASYNC → CancellationToken on all async? No .Result/.Wait()?
195
- 4. LOGGING → Entry/exit/error logging? Message templates (not $"")?
196
- 5. ERROR HANDLING → Result pattern for business? No empty catch?
197
- 6. SEALED → All classes sealed?
198
- 7. NULLABLE → <Nullable>enable</Nullable>? ? only where optional?
199
- ```
200
-
201
- Then trigger **Code Analyzer** for deeper review (automatic at checkpoints and FASE 5).
33
+ - Lead backend implementation (services, controllers, business logic)
34
+ - Coordinate backend squad (ef-modeler, api-designer, etc.)
35
+ - Ensure code follows all .NET standards
36
+ - Design service layer architecture
37
+ - Implement async patterns with CancellationToken
38
+ - Apply dependency injection correctly
39
+ - Write unit and integration tests
202
40
 
203
41
  ---
204
42
 
205
- ## Ultrathink Decision Template
206
-
207
- When in Ultrathink Mode, produce structured analysis:
43
+ ## When to Use
208
44
 
209
- ```markdown
210
- ## Decision: {Title}
211
-
212
- ### Context
213
- {Why this decision is needed now. What triggered it. Current state.}
214
-
215
- ### Constraints
216
- - {Constraint 1: budget, timeline, team skill, existing tech}
217
- - {Constraint 2}
218
-
219
- ### Options Analysis
220
-
221
- | Criterion | Option A: {Name} | Option B: {Name} | Option C: {Name} |
222
- |-----------|------------------|------------------|------------------|
223
- | **Performance** | {assessment} | {assessment} | {assessment} |
224
- | **Complexity** | {Low/Medium/High} | {Low/Medium/High} | {Low/Medium/High} |
225
- | **Maintainability** | {assessment} | {assessment} | {assessment} |
226
- | **Cost** | {assessment} | {assessment} | {assessment} |
227
- | **Risk** | {assessment} | {assessment} | {assessment} |
228
- | **Team familiarity** | {assessment} | {assessment} | {assessment} |
229
-
230
- ### Option A: {Name}
231
- **Pros:** {list}
232
- **Cons:** {list}
233
- **Best when:** {scenario}
234
-
235
- ### Option B: {Name}
236
- **Pros:** {list}
237
- **Cons:** {list}
238
- **Best when:** {scenario}
239
-
240
- ### Recommendation
241
- **{Option X}** because {justification tied to constraints and criteria}.
242
-
243
- ### Implementation Impact
244
- - **Files affected:** {count and key files}
245
- - **Migrations:** {yes/no, what changes}
246
- - **Breaking changes:** {yes/no, what breaks}
247
- - **Estimated effort:** {T-shirt size with rationale}
248
- - **Rollback plan:** {how to revert if needed}
249
- ```
45
+ - Any .NET/C# code implementation
46
+ - Backend service layer development
47
+ - API controller implementation
48
+ - Business logic implementation
49
+ - Complex architectural decisions (Ultrathink mode)
250
50
 
251
51
  ---
252
52
 
253
- ## .NET 10 / C# 14 Quick Patterns
53
+ ## Ultrathink Mode
54
+
55
+ **Trigger:** Keywords like "ultrathink", "deep-think", "analyze deeply", "complex decision"
254
56
 
255
- | Pattern | When | Example |
256
- |---------|------|---------|
257
- | Primary constructors | DI injection | `class Service(IRepo repo)` |
258
- | Collection expressions | Initialize collections | `List<int> ids = [1, 2, 3]` |
259
- | File-scoped namespaces | Always | `namespace MyApp.Services;` |
260
- | Raw string literals | Multi-line strings, SQL | `"""SELECT * FROM ..."""` |
261
- | Records | Immutable DTOs | `record OrderResponse(Guid Id, ...)` |
262
- | Pattern matching | Type checks, null checks | `if (x is Order { Status: > 0 } order)` |
263
- | `required` modifier | Non-nullable init props | `public required string Name { get; init; }` |
264
- | `sealed` classes | Default for all classes | `public sealed class OrderService` |
265
- | Extension methods | Add behavior to existing types | `public static class OrderExtensions` |
266
- | Global usings | Reduce repetitive imports | `global using MyApp.Domain.Entities;` |
57
+ **Use for:**
58
+ - Technology/library selection
59
+ - Architecture pattern decisions (CQRS vs simple)
60
+ - Performance optimization strategy
61
+ - Migration planning
62
+ - Multi-system integration design
267
63
 
268
64
  ---
269
65
 
270
- ## Anti-Patterns to NEVER Produce
66
+ ## Collaborates With
271
67
 
272
- | Anti-Pattern | Why | Instead |
273
- |--------------|-----|---------|
274
- | `async void` | Exceptions lost, can't await | `async Task` (always) |
275
- | `.Result` / `.Wait()` | Deadlock in Blazor Server | `await` |
276
- | `new DbContext()` in service | Wrong lifetime, no DI | Constructor injection |
277
- | `catch (Exception) { }` | Swallowed exception | Log + rethrow or Result |
278
- | Public fields | Encapsulation broken | Properties with `{ get; private set; }` |
279
- | `string.Format` in logs | Defeats structured logging | Message templates |
280
- | `== null` | Not idiomatic C# | `is null` |
281
- | Unsealed classes | Unintended inheritance | `sealed` keyword |
282
- | Service Locator | Hidden dependencies | Constructor injection |
283
- | God class (500+ lines) | Unmaintainable | Split by responsibility |
68
+ - **ef-modeler** - Database/EF Core layer
69
+ - **api-designer** - REST API contracts and endpoints
70
+ - **azure-architect** - Infrastructure provisioning
71
+ - **blazor-builder** - Backend API consumed by frontend
72
+ - **hangfire-orchestrator** - Background job coordination
73
+ - **testing-specialist** - Test coverage and quality
284
74
 
285
75
  ---
286
76