@polymorphism-tech/morph-spec 4.3.7 → 4.6.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 (394) hide show
  1. package/.morph/.morphversion +3 -3
  2. package/.morph/analytics/threads-log.jsonl +6 -9
  3. package/.morph/config/config.json +2 -3
  4. package/.morph/framework/standards/STANDARDS.json +812 -0
  5. package/.morph/{standards → framework/standards}/ai-agents/team-orchestration.md +3 -3
  6. package/.morph/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +17 -0
  7. package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
  8. package/.morph/{templates → framework/templates}/README.md +17 -17
  9. package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
  10. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  11. package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
  12. package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
  13. package/.morph/framework/templates/docs/clarifications.md +253 -0
  14. package/.morph/framework/templates/docs/onboarding.md +123 -0
  15. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  16. package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
  17. package/.morph/framework/templates/docs/ui-components.md +124 -0
  18. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  19. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  20. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  21. package/.morph/framework/templates/docs/user-stories.md +34 -0
  22. package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
  23. package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
  24. package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  25. package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  26. package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
  27. package/.morph/logs/tool-failures.log +7 -0
  28. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +16 -0
  29. package/.morph/state.json +1 -1
  30. package/CLAUDE.md +77 -155
  31. package/README.md +20 -18
  32. package/bin/detect-agents.js +1 -1
  33. package/bin/morph-spec.js +116 -266
  34. package/bin/task-manager.cjs +2 -2
  35. package/bin/validate.js +1 -1
  36. package/claude-plugin.json +14 -0
  37. package/docs/claude-alignment-report.md +137 -0
  38. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
  39. package/docs/plans/2026-02-22-claude-settings.md +515 -0
  40. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
  41. package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
  42. package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
  43. package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
  44. package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
  45. package/docs/plans/2026-02-22-native-enrichment.md +735 -0
  46. package/framework/CLAUDE.md +77 -0
  47. package/framework/{skills/level-2-domains → agents}/ai-agents/ai-system-architect.md +7 -3
  48. package/framework/{skills/level-2-domains → agents}/architecture/po-pm-advisor.md +7 -1
  49. package/framework/{skills/level-2-domains → agents}/architecture/prompt-engineer.md +7 -1
  50. package/framework/{skills/level-2-domains → agents}/architecture/seo-growth-hacker.md +7 -1
  51. package/framework/{skills/level-2-domains → agents}/architecture/standards-architect.md +10 -6
  52. package/framework/agents/backend/api-designer.md +103 -0
  53. package/framework/{skills/level-2-domains → agents}/backend/dotnet-senior.md +7 -1
  54. package/framework/agents/backend/ef-modeler.md +119 -0
  55. package/framework/{skills/level-2-domains → agents}/backend/hangfire-orchestrator.md +8 -4
  56. package/framework/{skills/level-2-domains → agents}/backend/ms-agent-expert.md +7 -3
  57. package/framework/{skills/level-2-domains → agents}/frontend/blazor-builder.md +7 -3
  58. package/framework/{skills/level-2-domains → agents}/frontend/nextjs-expert.md +7 -3
  59. package/framework/{skills/level-2-domains → agents}/frontend/ui-ux-designer.md +8 -2
  60. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-architect.md +7 -1
  61. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-deploy-specialist.md +7 -1
  62. package/framework/{skills/level-2-domains → agents}/infrastructure/bicep-architect.md +7 -3
  63. package/framework/{skills/level-2-domains → agents}/infrastructure/container-specialist.md +7 -3
  64. package/framework/{skills/level-2-domains → agents}/infrastructure/devops-engineer.md +7 -3
  65. package/framework/{skills/level-2-domains → agents}/integrations/asaas-financial.md +7 -3
  66. package/framework/{skills/level-2-domains → agents}/integrations/azure-identity.md +7 -3
  67. package/framework/{skills/level-2-domains → agents}/integrations/clerk-auth.md +7 -3
  68. package/framework/{skills/level-2-domains/integrations/hangfire-orchestrator.md → agents/integrations/hangfire-integration.md} +7 -1
  69. package/framework/{skills/level-2-domains → agents}/integrations/resend-email.md +7 -3
  70. package/framework/{skills/level-2-domains → agents}/quality/code-analyzer.md +9 -5
  71. package/framework/{skills/level-2-domains → agents}/quality/testing-specialist.md +7 -3
  72. package/framework/commands/morph-apply.md +9 -9
  73. package/framework/commands/morph-archive.md +8 -8
  74. package/framework/commands/morph-infra.md +1 -1
  75. package/framework/commands/morph-proposal.md +9 -9
  76. package/framework/commands/morph-status.md +3 -3
  77. package/framework/commands/morph-troubleshoot.md +1 -1
  78. package/framework/hooks/README.md +201 -282
  79. package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
  80. package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  81. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  82. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  83. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  84. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  85. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  86. package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  87. package/framework/hooks/claude-code/statusline.py +538 -0
  88. package/framework/hooks/claude-code/statusline.sh +7 -0
  89. package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  90. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  91. package/framework/hooks/shared/hook-response.js +45 -0
  92. package/framework/hooks/shared/phase-utils.js +129 -0
  93. package/framework/hooks/shared/state-reader.js +138 -0
  94. package/framework/hooks/shared/stdin-reader.js +26 -0
  95. package/framework/phases.json +145 -0
  96. package/framework/rules/csharp-standards.md +10 -0
  97. package/framework/rules/frontend-standards.md +14 -0
  98. package/framework/rules/infrastructure-standards.md +13 -0
  99. package/framework/rules/morph-workflow.md +86 -0
  100. package/framework/rules/testing-standards.md +11 -0
  101. package/framework/skills/README.md +66 -0
  102. package/framework/skills/level-0-meta/brainstorming/SKILL.md +135 -0
  103. package/framework/skills/level-0-meta/brainstorming/references/proposal-example.md +138 -0
  104. package/framework/skills/level-0-meta/{code-review.md → code-review/SKILL.md} +13 -4
  105. package/framework/skills/level-0-meta/code-review/references/review-example.md +164 -0
  106. package/framework/skills/level-0-meta/code-review/scripts/scan-csharp.mjs +121 -0
  107. package/framework/skills/level-0-meta/mcp-registry.json +207 -0
  108. package/framework/skills/level-0-meta/{morph-checklist.md → morph-checklist/SKILL.md} +8 -3
  109. package/framework/skills/{level-1-workflows/morph-replicate.md → level-0-meta/morph-replicate/SKILL.md} +13 -6
  110. package/framework/skills/level-0-meta/{simulation-checklist.md → simulation-checklist/SKILL.md} +9 -4
  111. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +334 -0
  112. package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +147 -0
  113. package/framework/skills/level-0-meta/verification-before-completion/scripts/check-phase-outputs.mjs +110 -0
  114. package/framework/skills/level-1-workflows/{phase-clarify.md → phase-clarify/SKILL.md} +65 -4
  115. package/framework/skills/level-1-workflows/phase-clarify/references/clarifications-example.md +117 -0
  116. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -0
  117. package/framework/skills/level-1-workflows/phase-design/SKILL.md +303 -0
  118. package/framework/skills/level-1-workflows/phase-design/references/spec-example.md +253 -0
  119. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -0
  120. package/framework/skills/level-1-workflows/phase-implement/references/recap-example.md +132 -0
  121. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +171 -0
  122. package/framework/skills/level-1-workflows/{phase-tasks.md → phase-tasks/SKILL.md} +89 -7
  123. package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +231 -0
  124. package/framework/skills/level-1-workflows/phase-tasks/scripts/validate-tasks.mjs +112 -0
  125. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -0
  126. package/framework/standards/STANDARDS.json +812 -0
  127. package/framework/standards/ai-agents/team-orchestration.md +3 -3
  128. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
  129. package/framework/standards/integration/mcp/mcp-tools.md +384 -0
  130. package/framework/templates/README.md +17 -17
  131. package/framework/templates/REGISTRY.json +48 -233
  132. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  133. package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
  134. package/framework/templates/context/CONTEXT.md +3 -3
  135. package/framework/templates/docs/clarifications.md +253 -0
  136. package/framework/templates/docs/onboarding.md +123 -0
  137. package/framework/templates/docs/schema-analysis.md +119 -0
  138. package/framework/templates/docs/spec.md +149 -149
  139. package/framework/templates/docs/ui-components.md +124 -0
  140. package/framework/templates/docs/ui-design-system.md +76 -0
  141. package/framework/templates/docs/ui-flows.md +167 -0
  142. package/framework/templates/docs/ui-mockups.md +98 -0
  143. package/framework/templates/docs/user-stories.md +34 -0
  144. package/framework/templates/examples/spec-examples.md +1 -1
  145. package/framework/templates/infrastructure/github/README.md +11 -11
  146. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  147. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  148. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
  149. package/framework/workflows/configs/express.json +45 -0
  150. package/framework/workflows/configs/spec-only.json +43 -0
  151. package/framework/workflows/docs/enforcement-pipeline.md +8 -8
  152. package/framework/workflows/docs/full-morph.md +3 -3
  153. package/package.json +3 -1
  154. package/scripts/generate-refs.js +336 -0
  155. package/scripts/generate-standards-registry.js +44 -0
  156. package/scripts/validate-real.mjs +255 -0
  157. package/src/commands/feature/create-story.js +362 -361
  158. package/src/commands/feature/shard-spec.js +225 -224
  159. package/src/commands/feature/sprint-status.js +1 -1
  160. package/src/commands/generation/generate-onboarding.js +169 -0
  161. package/src/commands/generation/generate.js +2 -2
  162. package/src/commands/mcp/mcp-setup.js +315 -0
  163. package/src/commands/project/changes.js +66 -0
  164. package/src/commands/project/checkpoint.js +209 -0
  165. package/src/commands/project/cost.js +179 -0
  166. package/src/commands/project/diff.js +278 -0
  167. package/src/commands/project/doctor.js +55 -7
  168. package/src/commands/project/init.js +318 -136
  169. package/src/commands/project/revert.js +173 -0
  170. package/src/commands/project/standards.js +80 -0
  171. package/src/commands/project/status.js +376 -0
  172. package/src/commands/project/update-agents.js +23 -0
  173. package/src/commands/project/update.js +60 -88
  174. package/src/commands/state/advance-phase.js +4 -3
  175. package/src/commands/state/state.js +10 -3
  176. package/src/commands/state/validate-phase.js +19 -2
  177. package/src/commands/templates/template-customize.js +4 -4
  178. package/src/commands/templates/template-render.js +1 -1
  179. package/src/commands/templates/template-show.js +1 -1
  180. package/src/commands/validation/validate-feature.js +359 -0
  181. package/src/core/orchestrator.js +3 -38
  182. package/src/core/paths/output-schema.js +135 -0
  183. package/src/core/state/state-manager.js +831 -592
  184. package/src/core/templates/template-registry.js +2 -2
  185. package/src/core/workflows/workflow-detector.js +17 -1
  186. package/src/lib/agents/micro-agent-factory.js +1 -1
  187. package/src/lib/context/context-bundler.js +2 -1
  188. package/src/lib/detectors/claude-config-detector.js +390 -0
  189. package/src/lib/detectors/conversation-analyzer.js +4 -4
  190. package/src/lib/detectors/design-system-detector.js +6 -5
  191. package/src/lib/detectors/standards-generator.js +2 -2
  192. package/src/lib/generators/context-generator.js +539 -538
  193. package/src/lib/generators/recap-generator.js +1 -1
  194. package/src/lib/generators/settings-generator.js +210 -0
  195. package/src/lib/hooks/hook-executor.js +1 -1
  196. package/src/lib/installers/mcp-installer.js +299 -0
  197. package/src/lib/learning/learning-system.js +3 -3
  198. package/src/lib/orchestration/team-orchestrator.js +1 -1
  199. package/src/lib/standards/standards-context-injector.js +7 -7
  200. package/src/lib/threads/thread-coordinator.js +1 -1
  201. package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
  202. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
  203. package/src/lib/validators/design-system/design-system-validator.js +1 -1
  204. package/src/lib/validators/spec-validator.js +258 -258
  205. package/src/lib/validators/validation-runner.js +270 -269
  206. package/src/utils/agents-installer.js +206 -0
  207. package/src/utils/claude-settings-manager.js +258 -0
  208. package/src/utils/file-copier.js +1 -1
  209. package/src/utils/hooks-installer.js +354 -28
  210. package/src/utils/skills-installer.js +118 -0
  211. package/.morph/project/context/README.md +0 -17
  212. package/.morph/project/context/detection-log.md +0 -16
  213. package/.morph/project/standards/inferred.md +0 -59
  214. package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
  215. package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
  216. package/framework/hooks/agent-stop/validate-tests.js +0 -109
  217. package/framework/hooks/agent-teams/dispatch.js +0 -67
  218. package/framework/hooks/agent-teams/phase-advanced.js +0 -80
  219. package/framework/hooks/agent-teams/task-completed.js +0 -76
  220. package/framework/hooks/agent-teams/teammate-idle.js +0 -70
  221. package/framework/skills/level-1-workflows/phase-design.md +0 -213
  222. package/framework/skills/level-1-workflows/phase-setup.md +0 -106
  223. package/framework/skills/level-1-workflows/phase-uiux.md +0 -169
  224. package/framework/skills/level-2-domains/backend/api-designer.md +0 -59
  225. package/framework/skills/level-2-domains/backend/ef-modeler.md +0 -58
  226. package/framework/skills/level-3-technologies/README.md +0 -7
  227. package/framework/skills/level-4-patterns/README.md +0 -7
  228. package/src/commands/agents/agents-fuse.js +0 -97
  229. package/src/commands/agents/micro-agent.js +0 -112
  230. package/src/commands/agents/spawn-team.js +0 -237
  231. package/src/commands/agents/squad-template.js +0 -146
  232. package/src/commands/analytics/analytics.js +0 -176
  233. package/src/commands/context/context-prime.js +0 -63
  234. package/src/commands/context/core-four.js +0 -54
  235. package/src/commands/generation/generate-context.js +0 -40
  236. package/src/commands/project/detect-agents.js +0 -207
  237. package/src/commands/project/detect-workflow.js +0 -174
  238. package/src/commands/threads/thread-template.js +0 -103
  239. package/src/commands/threads/threads.js +0 -261
  240. package/src/commands/utils/session-summary.js +0 -291
  241. package/src/llm/analyzer.js +0 -215
  242. package/src/llm/few-shot-examples.js +0 -216
  243. package/src/llm/project-config-schema.json +0 -188
  244. package/src/llm/prompt-builder.js +0 -96
  245. /package/.morph/{config → framework}/agents.json +0 -0
  246. /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
  247. /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
  248. /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
  249. /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
  250. /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
  251. /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
  252. /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
  253. /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
  254. /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
  255. /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
  256. /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
  257. /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
  258. /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
  259. /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
  260. /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
  261. /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
  262. /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
  263. /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
  264. /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
  265. /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
  266. /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
  267. /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
  268. /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  269. /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
  270. /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
  271. /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
  272. /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
  273. /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
  274. /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
  275. /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
  276. /package/.morph/{standards → framework/standards}/core/git.md +0 -0
  277. /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
  278. /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
  279. /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
  280. /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
  281. /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
  282. /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
  283. /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
  284. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
  285. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
  286. /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
  287. /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
  288. /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
  289. /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
  290. /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
  291. /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
  292. /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
  293. /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  294. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  295. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
  296. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
  297. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
  298. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
  299. /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
  300. /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
  301. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
  302. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
  303. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
  304. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
  305. /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
  306. /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
  307. /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
  308. /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
  309. /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
  310. /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
  311. /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
  312. /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
  313. /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
  314. /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
  315. /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
  316. /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
  317. /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
  318. /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
  319. /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
  320. /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
  321. /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
  322. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
  323. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
  324. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
  325. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
  326. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
  327. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
  328. /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
  329. /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
  330. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
  331. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
  332. /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
  333. /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
  334. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
  335. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
  336. /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
  337. /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
  338. /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
  339. /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
  340. /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
  341. /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
  342. /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
  343. /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
  344. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
  345. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
  346. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
  347. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
  348. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
  349. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
  350. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
  351. /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
  352. /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
  353. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
  354. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
  355. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
  356. /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
  357. /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
  358. /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
  359. /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
  360. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
  361. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
  362. /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
  363. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
  364. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
  365. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
  366. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
  367. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
  368. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
  369. /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
  370. /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
  371. /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
  372. /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
  373. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
  374. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
  375. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
  376. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
  377. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
  378. /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
  379. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
  380. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
  381. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
  382. /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
  383. /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
  384. /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
  385. /package/.morph/{templates → framework/templates}/state.template.json +0 -0
  386. /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
  387. /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
  388. /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
  389. /package/framework/{skills/level-2-domains → agents}/README.md +0 -0
  390. /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
  391. /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
  392. /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
  393. /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
  394. /package/framework/hooks/{pre-push → git/pre-push}/run-tests.sh +0 -0
@@ -1,258 +1,258 @@
1
- /**
2
- * Spec Validator
3
- *
4
- * Validates spec.md and contracts.cs at design time (Phase 2) to catch
5
- * architectural and coding standard violations early.
6
- *
7
- * MORPH-SPEC 3.0 - Phase 4: Spec-Time Validation
8
- */
9
-
10
- import { readFileSync, existsSync } from 'fs';
11
- import { join } from 'path';
12
-
13
- /**
14
- * Validate spec.md and contracts.cs at design time
15
- *
16
- * @param {string} projectPath - Project root path
17
- * @param {string} featureName - Feature name
18
- * @param {Object} options - Options
19
- * @returns {Object} { status, errors, warnings, issues }
20
- */
21
- export async function validateSpec(projectPath, featureName, options = {}) {
22
- const outputsPath = join(projectPath, '.morph/project/outputs', featureName);
23
- const specPath = join(outputsPath, 'spec.md');
24
- const contractsPath = join(outputsPath, 'contracts.cs');
25
-
26
- const issues = [];
27
-
28
- // Validate spec.md
29
- if (existsSync(specPath)) {
30
- const specContent = readFileSync(specPath, 'utf8');
31
- const specIssues = validateSpecMd(specContent);
32
- issues.push(...specIssues);
33
- }
34
-
35
- // Validate contracts.cs
36
- if (existsSync(contractsPath)) {
37
- const contractsContent = readFileSync(contractsPath, 'utf8');
38
- const contractsIssues = validateContractsCs(contractsContent);
39
- issues.push(...contractsIssues);
40
- }
41
-
42
- const errors = issues.filter(i => i.level === 'error').length;
43
- const warnings = issues.filter(i => i.level === 'warning').length;
44
-
45
- return {
46
- status: errors > 0 ? 'error' : (warnings > 0 ? 'warning' : 'ok'),
47
- errors,
48
- warnings,
49
- issues,
50
- passed: errors === 0
51
- };
52
- }
53
-
54
- /**
55
- * Validate spec.md structure and content
56
- */
57
- function validateSpecMd(content) {
58
- const issues = [];
59
-
60
- // Required sections
61
- const requiredSections = [
62
- { name: 'Overview', pattern: /^##\s+(?:1\.\s+)?Overview/mi },
63
- { name: 'Functional Requirements', pattern: /^##\s+(?:\d+\.\s+)?Functional Requirements/mi },
64
- { name: 'Non-Functional Requirements', pattern: /^##\s+(?:\d+\.\s+)?Non-Functional Requirements/mi },
65
- { name: 'Technical Architecture', pattern: /^##\s+(?:\d+\.\s+)?Technical Architecture/mi },
66
- { name: 'Data Model', pattern: /^##\s+(?:\d+\.\s+)?Data Model/mi }
67
- ];
68
-
69
- for (const section of requiredSections) {
70
- if (!section.pattern.test(content)) {
71
- issues.push({
72
- level: 'error',
73
- type: 'spec',
74
- message: `Missing required section: "${section.name}"`,
75
- solution: `Add ## ${section.name} section to spec.md`
76
- });
77
- }
78
- }
79
-
80
- // Check for manual infrastructure creation (anti-pattern)
81
- const manualInfraPatterns = [
82
- /create.*manually/i,
83
- /portal.*azure/i,
84
- /click.*portal/i,
85
- /via.*portal/i,
86
- /manual.*setup/i
87
- ];
88
-
89
- for (const pattern of manualInfraPatterns) {
90
- if (pattern.test(content)) {
91
- issues.push({
92
- level: 'error',
93
- type: 'spec',
94
- message: 'Spec references manual Azure portal creation (anti-pattern)',
95
- solution: 'Use Infrastructure as Code (Bicep) instead of manual portal operations'
96
- });
97
- break; // One error is enough
98
- }
99
- }
100
-
101
- // Check for Bicep reference (best practice)
102
- const hasBicep = /bicep/i.test(content) || /infrastructure\s+as\s+code/i.test(content) || /\.bicep/i.test(content);
103
- if (!hasBicep && /azure|sql|storage|container/i.test(content)) {
104
- issues.push({
105
- level: 'warning',
106
- type: 'spec',
107
- message: 'Spec mentions Azure resources but no Bicep/IaC reference found',
108
- solution: 'Add Infrastructure section with Bicep module references'
109
- });
110
- }
111
-
112
- return issues;
113
- }
114
-
115
- /**
116
- * Validate contracts.cs coding standards
117
- */
118
- function validateContractsCs(content) {
119
- const issues = [];
120
-
121
- // 1. Interface naming: Must start with 'I' and be PascalCase
122
- const interfaceRegex = /public\s+interface\s+(\w+)/g;
123
- let match;
124
-
125
- while ((match = interfaceRegex.exec(content)) !== null) {
126
- const name = match[1];
127
-
128
- if (!name.startsWith('I')) {
129
- issues.push({
130
- level: 'error',
131
- type: 'contracts',
132
- message: `Interface '${name}' must start with 'I' (e.g., I${name})`,
133
- solution: `Rename to I${name}`
134
- });
135
- } else if (!isPascalCase(name)) {
136
- issues.push({
137
- level: 'error',
138
- type: 'contracts',
139
- message: `Interface '${name}' must use PascalCase`,
140
- solution: `Rename to ${toPascalCase(name)}`
141
- });
142
- }
143
- }
144
-
145
- // 2. Async methods must have CancellationToken parameter
146
- const asyncMethodRegex = /Task(?:<[^>]+>)?\s+(\w+Async)\s*\(([^)]*)\)/g;
147
- while ((match = asyncMethodRegex.exec(content)) !== null) {
148
- const methodName = match[1];
149
- const params = match[2];
150
-
151
- if (!params.includes('CancellationToken')) {
152
- issues.push({
153
- level: 'error',
154
- type: 'contracts',
155
- message: `Async method '${methodName}' missing CancellationToken parameter`,
156
- solution: `Add 'CancellationToken ct = default' parameter to ${methodName}`
157
- });
158
- }
159
- }
160
-
161
- // 3. DTOs should use records (not classes)
162
- const classRegex = /public\s+class\s+(\w+(?:Dto|Response|Request|Command|Query))/g;
163
- while ((match = classRegex.exec(content)) !== null) {
164
- const className = match[1];
165
- issues.push({
166
- level: 'warning',
167
- type: 'contracts',
168
- message: `DTO '${className}' defined as class instead of record`,
169
- solution: `Use 'public record ${className}' for immutable DTOs`
170
- });
171
- }
172
-
173
- // 4. Classes should be sealed (unless abstract/base)
174
- const unsealedClassRegex = /public\s+class\s+(\w+)(?!\s*:\s*\w+Base)/g;
175
- while ((match = unsealedClassRegex.exec(content)) !== null) {
176
- const className = match[1];
177
- // Skip if already sealed
178
- const lineStart = content.lastIndexOf('\n', match.index) + 1;
179
- const lineEnd = content.indexOf('\n', match.index);
180
- const line = content.substring(lineStart, lineEnd);
181
-
182
- if (!line.includes('sealed') && !line.includes('abstract')) {
183
- issues.push({
184
- level: 'warning',
185
- type: 'contracts',
186
- message: `Class '${className}' should be sealed (unless designed for inheritance)`,
187
- solution: `Change to 'public sealed class ${className}'`
188
- });
189
- }
190
- }
191
-
192
- // 5. PascalCase for constants (NOT UPPER_SNAKE_CASE)
193
- const upperSnakeRegex = /const\s+\w+\s+([A-Z_][A-Z0-9_]+)\s*=/g;
194
- while ((match = upperSnakeRegex.exec(content)) !== null) {
195
- const constName = match[1];
196
- if (constName.includes('_') && constName === constName.toUpperCase()) {
197
- issues.push({
198
- level: 'error',
199
- type: 'contracts',
200
- message: `Constant '${constName}' uses UPPER_SNAKE_CASE (anti-pattern in C#)`,
201
- solution: `Use PascalCase: '${toPascalCase(constName)}'`
202
- });
203
- }
204
- }
205
-
206
- // 6. Methods returning Task must end with Async
207
- const taskMethodRegex = /Task(?:<[^>]+>)?\s+(\w+)\s*\(/g;
208
- while ((match = taskMethodRegex.exec(content)) !== null) {
209
- const methodName = match[1];
210
- if (!methodName.endsWith('Async') && !['get', 'set', 'init'].includes(methodName)) {
211
- issues.push({
212
- level: 'error',
213
- type: 'contracts',
214
- message: `Method '${methodName}' returns Task but doesn't end with 'Async'`,
215
- solution: `Rename to '${methodName}Async'`
216
- });
217
- }
218
- }
219
-
220
- // 7. Enum members should be PascalCase (NOT UPPER_SNAKE_CASE)
221
- const enumRegex = /enum\s+\w+\s*\{([^}]+)\}/gs;
222
- while ((match = enumRegex.exec(content)) !== null) {
223
- const enumBody = match[1];
224
- const memberRegex = /\n\s*([A-Z_][A-Z0-9_]+)/g;
225
- let memberMatch;
226
-
227
- while ((memberMatch = memberRegex.exec(enumBody)) !== null) {
228
- const memberName = memberMatch[1];
229
- if (memberName.includes('_') && memberName === memberName.toUpperCase()) {
230
- issues.push({
231
- level: 'error',
232
- type: 'contracts',
233
- message: `Enum member '${memberName}' uses UPPER_SNAKE_CASE (must be PascalCase)`,
234
- solution: `Use PascalCase: '${toPascalCase(memberName)}'`
235
- });
236
- }
237
- }
238
- }
239
-
240
- return issues;
241
- }
242
-
243
- /**
244
- * Check if a string is PascalCase
245
- */
246
- function isPascalCase(str) {
247
- return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str);
248
- }
249
-
250
- /**
251
- * Convert string to PascalCase
252
- */
253
- function toPascalCase(str) {
254
- return str
255
- .split('_')
256
- .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
257
- .join('');
258
- }
1
+ /**
2
+ * Spec Validator
3
+ *
4
+ * Validates spec.md and contracts.cs at design time (Phase 2) to catch
5
+ * architectural and coding standard violations early.
6
+ *
7
+ * MORPH-SPEC 3.0 - Phase 4: Spec-Time Validation
8
+ */
9
+
10
+ import { readFileSync, existsSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { getAbsoluteOutputPath } from '../../core/paths/output-schema.js';
13
+
14
+ /**
15
+ * Validate spec.md and contracts.cs at design time
16
+ *
17
+ * @param {string} projectPath - Project root path
18
+ * @param {string} featureName - Feature name
19
+ * @param {Object} options - Options
20
+ * @returns {Object} { status, errors, warnings, issues }
21
+ */
22
+ export async function validateSpec(projectPath, featureName, options = {}) {
23
+ const specPath = getAbsoluteOutputPath(projectPath, featureName, 'spec');
24
+ const contractsPath = getAbsoluteOutputPath(projectPath, featureName, 'contracts');
25
+
26
+ const issues = [];
27
+
28
+ // Validate spec.md
29
+ if (existsSync(specPath)) {
30
+ const specContent = readFileSync(specPath, 'utf8');
31
+ const specIssues = validateSpecMd(specContent);
32
+ issues.push(...specIssues);
33
+ }
34
+
35
+ // Validate contracts.cs
36
+ if (existsSync(contractsPath)) {
37
+ const contractsContent = readFileSync(contractsPath, 'utf8');
38
+ const contractsIssues = validateContractsCs(contractsContent);
39
+ issues.push(...contractsIssues);
40
+ }
41
+
42
+ const errors = issues.filter(i => i.level === 'error').length;
43
+ const warnings = issues.filter(i => i.level === 'warning').length;
44
+
45
+ return {
46
+ status: errors > 0 ? 'error' : (warnings > 0 ? 'warning' : 'ok'),
47
+ errors,
48
+ warnings,
49
+ issues,
50
+ passed: errors === 0
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Validate spec.md structure and content
56
+ */
57
+ function validateSpecMd(content) {
58
+ const issues = [];
59
+
60
+ // Required sections
61
+ const requiredSections = [
62
+ { name: 'Overview', pattern: /^##\s+(?:1\.\s+)?Overview/mi },
63
+ { name: 'Functional Requirements', pattern: /^##\s+(?:\d+\.\s+)?Functional Requirements/mi },
64
+ { name: 'Non-Functional Requirements', pattern: /^##\s+(?:\d+\.\s+)?Non-Functional Requirements/mi },
65
+ { name: 'Technical Architecture', pattern: /^##\s+(?:\d+\.\s+)?Technical Architecture/mi },
66
+ { name: 'Data Model', pattern: /^##\s+(?:\d+\.\s+)?Data Model/mi }
67
+ ];
68
+
69
+ for (const section of requiredSections) {
70
+ if (!section.pattern.test(content)) {
71
+ issues.push({
72
+ level: 'error',
73
+ type: 'spec',
74
+ message: `Missing required section: "${section.name}"`,
75
+ solution: `Add ## ${section.name} section to spec.md`
76
+ });
77
+ }
78
+ }
79
+
80
+ // Check for manual infrastructure creation (anti-pattern)
81
+ const manualInfraPatterns = [
82
+ /create.*manually/i,
83
+ /portal.*azure/i,
84
+ /click.*portal/i,
85
+ /via.*portal/i,
86
+ /manual.*setup/i
87
+ ];
88
+
89
+ for (const pattern of manualInfraPatterns) {
90
+ if (pattern.test(content)) {
91
+ issues.push({
92
+ level: 'error',
93
+ type: 'spec',
94
+ message: 'Spec references manual Azure portal creation (anti-pattern)',
95
+ solution: 'Use Infrastructure as Code (Bicep) instead of manual portal operations'
96
+ });
97
+ break; // One error is enough
98
+ }
99
+ }
100
+
101
+ // Check for Bicep reference (best practice)
102
+ const hasBicep = /bicep/i.test(content) || /infrastructure\s+as\s+code/i.test(content) || /\.bicep/i.test(content);
103
+ if (!hasBicep && /azure|sql|storage|container/i.test(content)) {
104
+ issues.push({
105
+ level: 'warning',
106
+ type: 'spec',
107
+ message: 'Spec mentions Azure resources but no Bicep/IaC reference found',
108
+ solution: 'Add Infrastructure section with Bicep module references'
109
+ });
110
+ }
111
+
112
+ return issues;
113
+ }
114
+
115
+ /**
116
+ * Validate contracts.cs coding standards
117
+ */
118
+ function validateContractsCs(content) {
119
+ const issues = [];
120
+
121
+ // 1. Interface naming: Must start with 'I' and be PascalCase
122
+ const interfaceRegex = /public\s+interface\s+(\w+)/g;
123
+ let match;
124
+
125
+ while ((match = interfaceRegex.exec(content)) !== null) {
126
+ const name = match[1];
127
+
128
+ if (!name.startsWith('I')) {
129
+ issues.push({
130
+ level: 'error',
131
+ type: 'contracts',
132
+ message: `Interface '${name}' must start with 'I' (e.g., I${name})`,
133
+ solution: `Rename to I${name}`
134
+ });
135
+ } else if (!isPascalCase(name)) {
136
+ issues.push({
137
+ level: 'error',
138
+ type: 'contracts',
139
+ message: `Interface '${name}' must use PascalCase`,
140
+ solution: `Rename to ${toPascalCase(name)}`
141
+ });
142
+ }
143
+ }
144
+
145
+ // 2. Async methods must have CancellationToken parameter
146
+ const asyncMethodRegex = /Task(?:<[^>]+>)?\s+(\w+Async)\s*\(([^)]*)\)/g;
147
+ while ((match = asyncMethodRegex.exec(content)) !== null) {
148
+ const methodName = match[1];
149
+ const params = match[2];
150
+
151
+ if (!params.includes('CancellationToken')) {
152
+ issues.push({
153
+ level: 'error',
154
+ type: 'contracts',
155
+ message: `Async method '${methodName}' missing CancellationToken parameter`,
156
+ solution: `Add 'CancellationToken ct = default' parameter to ${methodName}`
157
+ });
158
+ }
159
+ }
160
+
161
+ // 3. DTOs should use records (not classes)
162
+ const classRegex = /public\s+class\s+(\w+(?:Dto|Response|Request|Command|Query))/g;
163
+ while ((match = classRegex.exec(content)) !== null) {
164
+ const className = match[1];
165
+ issues.push({
166
+ level: 'warning',
167
+ type: 'contracts',
168
+ message: `DTO '${className}' defined as class instead of record`,
169
+ solution: `Use 'public record ${className}' for immutable DTOs`
170
+ });
171
+ }
172
+
173
+ // 4. Classes should be sealed (unless abstract/base)
174
+ const unsealedClassRegex = /public\s+class\s+(\w+)(?!\s*:\s*\w+Base)/g;
175
+ while ((match = unsealedClassRegex.exec(content)) !== null) {
176
+ const className = match[1];
177
+ // Skip if already sealed
178
+ const lineStart = content.lastIndexOf('\n', match.index) + 1;
179
+ const lineEnd = content.indexOf('\n', match.index);
180
+ const line = content.substring(lineStart, lineEnd);
181
+
182
+ if (!line.includes('sealed') && !line.includes('abstract')) {
183
+ issues.push({
184
+ level: 'warning',
185
+ type: 'contracts',
186
+ message: `Class '${className}' should be sealed (unless designed for inheritance)`,
187
+ solution: `Change to 'public sealed class ${className}'`
188
+ });
189
+ }
190
+ }
191
+
192
+ // 5. PascalCase for constants (NOT UPPER_SNAKE_CASE)
193
+ const upperSnakeRegex = /const\s+\w+\s+([A-Z_][A-Z0-9_]+)\s*=/g;
194
+ while ((match = upperSnakeRegex.exec(content)) !== null) {
195
+ const constName = match[1];
196
+ if (constName.includes('_') && constName === constName.toUpperCase()) {
197
+ issues.push({
198
+ level: 'error',
199
+ type: 'contracts',
200
+ message: `Constant '${constName}' uses UPPER_SNAKE_CASE (anti-pattern in C#)`,
201
+ solution: `Use PascalCase: '${toPascalCase(constName)}'`
202
+ });
203
+ }
204
+ }
205
+
206
+ // 6. Methods returning Task must end with Async
207
+ const taskMethodRegex = /Task(?:<[^>]+>)?\s+(\w+)\s*\(/g;
208
+ while ((match = taskMethodRegex.exec(content)) !== null) {
209
+ const methodName = match[1];
210
+ if (!methodName.endsWith('Async') && !['get', 'set', 'init'].includes(methodName)) {
211
+ issues.push({
212
+ level: 'error',
213
+ type: 'contracts',
214
+ message: `Method '${methodName}' returns Task but doesn't end with 'Async'`,
215
+ solution: `Rename to '${methodName}Async'`
216
+ });
217
+ }
218
+ }
219
+
220
+ // 7. Enum members should be PascalCase (NOT UPPER_SNAKE_CASE)
221
+ const enumRegex = /enum\s+\w+\s*\{([^}]+)\}/gs;
222
+ while ((match = enumRegex.exec(content)) !== null) {
223
+ const enumBody = match[1];
224
+ const memberRegex = /\n\s*([A-Z_][A-Z0-9_]+)/g;
225
+ let memberMatch;
226
+
227
+ while ((memberMatch = memberRegex.exec(enumBody)) !== null) {
228
+ const memberName = memberMatch[1];
229
+ if (memberName.includes('_') && memberName === memberName.toUpperCase()) {
230
+ issues.push({
231
+ level: 'error',
232
+ type: 'contracts',
233
+ message: `Enum member '${memberName}' uses UPPER_SNAKE_CASE (must be PascalCase)`,
234
+ solution: `Use PascalCase: '${toPascalCase(memberName)}'`
235
+ });
236
+ }
237
+ }
238
+ }
239
+
240
+ return issues;
241
+ }
242
+
243
+ /**
244
+ * Check if a string is PascalCase
245
+ */
246
+ function isPascalCase(str) {
247
+ return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str);
248
+ }
249
+
250
+ /**
251
+ * Convert string to PascalCase
252
+ */
253
+ function toPascalCase(str) {
254
+ return str
255
+ .split('_')
256
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
257
+ .join('');
258
+ }