@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,273 +1,274 @@
1
- /**
2
- * Contract Compliance Validator
3
- *
4
- * Parses contracts.cs from feature outputs and verifies that the project code
5
- * actually implements all defined interfaces, methods, DTOs, and enums.
6
- *
7
- * MORPH-SPEC 3.0 - Phase A: Active Validation Pipeline
8
- */
9
-
10
- import { readFileSync, existsSync } from 'fs';
11
- import { join } from 'path';
12
- import { glob } from 'glob';
13
- import chalk from 'chalk';
14
-
15
- /**
16
- * Validate that contracts.cs interfaces are implemented in project code
17
- *
18
- * @param {string} projectPath - Project root path
19
- * @param {string} featureName - Feature name
20
- * @param {Object} options - Options
21
- * @returns {Object} { status, errors, warnings, issues, coverage }
22
- */
23
- export async function validateContracts(projectPath, featureName, options = {}) {
24
- const contractsPath = join(projectPath, '.morph/project/outputs', featureName, 'contracts.cs');
25
-
26
- if (!existsSync(contractsPath)) {
27
- return {
28
- status: 'ok',
29
- errors: 0,
30
- warnings: 0,
31
- issues: [],
32
- coverage: null,
33
- message: 'No contracts.cs found — skipping'
34
- };
35
- }
36
-
37
- const contractsContent = readFileSync(contractsPath, 'utf-8');
38
- const contracts = parseContracts(contractsContent);
39
-
40
- if (contracts.interfaces.length === 0 && contracts.records.length === 0 && contracts.enums.length === 0) {
41
- return {
42
- status: 'ok',
43
- errors: 0,
44
- warnings: 1,
45
- issues: [{ level: 'warning', message: 'contracts.cs exists but no interfaces/records/enums found' }],
46
- coverage: null
47
- };
48
- }
49
-
50
- // Find all .cs files in the project (excluding .morph outputs, bin, obj)
51
- const csFiles = await glob('**/*.cs', {
52
- cwd: projectPath,
53
- ignore: ['.morph/**', '**/bin/**', '**/obj/**', '**/node_modules/**']
54
- });
55
-
56
- const projectCode = {};
57
- for (const file of csFiles) {
58
- const fullPath = join(projectPath, file);
59
- try {
60
- projectCode[file] = readFileSync(fullPath, 'utf-8');
61
- } catch {
62
- // Skip unreadable files
63
- }
64
- }
65
-
66
- const issues = [];
67
- let implemented = 0;
68
- let total = 0;
69
- const interfaceResults = [];
70
-
71
- // Validate interfaces
72
- for (const iface of contracts.interfaces) {
73
- total++;
74
- const result = validateInterface(iface, projectCode, options);
75
- interfaceResults.push(result);
76
-
77
- if (result.implemented) {
78
- implemented++;
79
- if (options.verbose) {
80
- console.log(chalk.green(` ✓ ${iface.name} → ${result.implementingClass} (${result.implementedMethods}/${result.totalMethods} methods)`));
81
- }
82
- } else {
83
- issues.push({
84
- level: 'error',
85
- message: `Interface ${iface.name} not implemented in project code`,
86
- solution: `Create a class that implements ${iface.name} with all ${iface.methods.length} method(s)`
87
- });
88
- }
89
-
90
- // Check for missing methods
91
- for (const method of result.missingMethods || []) {
92
- issues.push({
93
- level: 'error',
94
- message: `Method ${method} missing from ${result.implementingClass || iface.name} implementation`,
95
- file: result.implementingFile,
96
- solution: `Add method ${method} to the class implementing ${iface.name}`
97
- });
98
- }
99
- }
100
-
101
- // Validate records/DTOs
102
- for (const record of contracts.records) {
103
- total++;
104
- const found = Object.entries(projectCode).some(([, content]) =>
105
- new RegExp(`(class|record|struct)\\s+${escapeRegex(record.name)}`, 'g').test(content)
106
- );
107
-
108
- if (found) {
109
- implemented++;
110
- if (options.verbose) {
111
- console.log(chalk.green(` ✓ ${record.name} (${record.type})`));
112
- }
113
- } else {
114
- issues.push({
115
- level: 'warning',
116
- message: `${record.type} ${record.name} defined in contracts but not found in project code`,
117
- solution: `Create ${record.type} ${record.name} matching the contract definition`
118
- });
119
- }
120
- }
121
-
122
- // Validate enums
123
- for (const enumDef of contracts.enums) {
124
- total++;
125
- const found = Object.entries(projectCode).some(([, content]) =>
126
- new RegExp(`enum\\s+${escapeRegex(enumDef.name)}`, 'g').test(content)
127
- );
128
-
129
- if (found) {
130
- implemented++;
131
- if (options.verbose) {
132
- console.log(chalk.green(` ✓ ${enumDef.name} (enum)`));
133
- }
134
- } else {
135
- issues.push({
136
- level: 'warning',
137
- message: `Enum ${enumDef.name} defined in contracts but not found in project code`,
138
- solution: `Create enum ${enumDef.name} matching the contract definition`
139
- });
140
- }
141
- }
142
-
143
- const coveragePercent = total > 0 ? Math.round((implemented / total) * 100) : 100;
144
- const errors = issues.filter(i => i.level === 'error').length;
145
- const warnings = issues.filter(i => i.level === 'warning').length;
146
-
147
- if (options.verbose) {
148
- console.log(chalk.cyan(`\n Contract coverage: ${coveragePercent}% (${implemented}/${total})`));
149
- }
150
-
151
- return {
152
- status: errors > 0 ? 'error' : 'ok',
153
- errors,
154
- warnings,
155
- issues,
156
- coverage: {
157
- percentage: coveragePercent,
158
- implemented,
159
- total,
160
- interfaces: interfaceResults
161
- }
162
- };
163
- }
164
-
165
- /**
166
- * Parse contracts.cs content and extract interfaces, records, and enums
167
- */
168
- function parseContracts(content) {
169
- const interfaces = [];
170
- const records = [];
171
- const enums = [];
172
-
173
- // Extract interfaces with their methods
174
- const interfaceRegex = /public\s+interface\s+(I\w+)(?:\s*:\s*[\w<>,\s]+)?\s*\{([^}]*)\}/gs;
175
- let match;
176
-
177
- while ((match = interfaceRegex.exec(content)) !== null) {
178
- const name = match[1];
179
- const body = match[2];
180
- const methods = extractMethods(body);
181
-
182
- interfaces.push({ name, methods });
183
- }
184
-
185
- // Extract records/classes (DTOs)
186
- const recordRegex = /public\s+(record|class|struct)\s+(\w+)/g;
187
- while ((match = recordRegex.exec(content)) !== null) {
188
- const type = match[1];
189
- const name = match[2];
190
- // Skip interface names that were already captured
191
- if (!name.startsWith('I') || !interfaces.some(i => i.name === name)) {
192
- records.push({ type, name });
193
- }
194
- }
195
-
196
- // Extract enums
197
- const enumRegex = /public\s+enum\s+(\w+)/g;
198
- while ((match = enumRegex.exec(content)) !== null) {
199
- enums.push({ name: match[1] });
200
- }
201
-
202
- return { interfaces, records, enums };
203
- }
204
-
205
- /**
206
- * Extract method signatures from an interface body
207
- */
208
- function extractMethods(body) {
209
- const methods = [];
210
-
211
- // Match method signatures like: Task<Result> DoSomethingAsync(params);
212
- const methodRegex = /(?:Task<[^>]+>|Task|void|string|int|bool|decimal|[\w<>[\],\s?]+)\s+(\w+)\s*\(/g;
213
- let match;
214
-
215
- while ((match = methodRegex.exec(body)) !== null) {
216
- const methodName = match[1];
217
- // Skip property getters/setters
218
- if (!['get', 'set', 'init'].includes(methodName)) {
219
- methods.push(methodName);
220
- }
221
- }
222
-
223
- return methods;
224
- }
225
-
226
- /**
227
- * Validate that an interface is implemented in project code
228
- */
229
- function validateInterface(iface, projectCode, options) {
230
- const result = {
231
- name: iface.name,
232
- implemented: false,
233
- implementingClass: null,
234
- implementingFile: null,
235
- totalMethods: iface.methods.length,
236
- implementedMethods: 0,
237
- missingMethods: []
238
- };
239
-
240
- // Search for classes implementing this interface
241
- const implRegex = new RegExp(`class\\s+(\\w+)\\s*(?:<[^>]*>)?\\s*:\\s*[^{]*${escapeRegex(iface.name)}`, 'g');
242
-
243
- for (const [file, content] of Object.entries(projectCode)) {
244
- const match = implRegex.exec(content);
245
- if (match) {
246
- result.implemented = true;
247
- result.implementingClass = match[1];
248
- result.implementingFile = file;
249
-
250
- // Check which methods are implemented
251
- for (const method of iface.methods) {
252
- const methodExists = new RegExp(`(public|protected|private|internal)?\\s*(async\\s+)?\\S+\\s+${escapeRegex(method)}\\s*\\(`, 'g').test(content);
253
- if (methodExists) {
254
- result.implementedMethods++;
255
- } else {
256
- result.missingMethods.push(method);
257
- }
258
- }
259
-
260
- break; // Found the implementation
261
- }
262
- implRegex.lastIndex = 0; // Reset for next file
263
- }
264
-
265
- return result;
266
- }
267
-
268
- /**
269
- * Escape special regex characters in a string
270
- */
271
- function escapeRegex(str) {
272
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
273
- }
1
+ /**
2
+ * Contract Compliance Validator
3
+ *
4
+ * Parses contracts.cs from feature outputs and verifies that the project code
5
+ * actually implements all defined interfaces, methods, DTOs, and enums.
6
+ *
7
+ * MORPH-SPEC 3.0 - Phase A: Active Validation Pipeline
8
+ */
9
+
10
+ import { readFileSync, existsSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { glob } from 'glob';
13
+ import chalk from 'chalk';
14
+ import { getAbsoluteOutputPath } from '../../../core/paths/output-schema.js';
15
+
16
+ /**
17
+ * Validate that contracts.cs interfaces are implemented in project code
18
+ *
19
+ * @param {string} projectPath - Project root path
20
+ * @param {string} featureName - Feature name
21
+ * @param {Object} options - Options
22
+ * @returns {Object} { status, errors, warnings, issues, coverage }
23
+ */
24
+ export async function validateContracts(projectPath, featureName, options = {}) {
25
+ const contractsPath = getAbsoluteOutputPath(projectPath, featureName, 'contracts');
26
+
27
+ if (!existsSync(contractsPath)) {
28
+ return {
29
+ status: 'ok',
30
+ errors: 0,
31
+ warnings: 0,
32
+ issues: [],
33
+ coverage: null,
34
+ message: 'No contracts.cs found — skipping'
35
+ };
36
+ }
37
+
38
+ const contractsContent = readFileSync(contractsPath, 'utf-8');
39
+ const contracts = parseContracts(contractsContent);
40
+
41
+ if (contracts.interfaces.length === 0 && contracts.records.length === 0 && contracts.enums.length === 0) {
42
+ return {
43
+ status: 'ok',
44
+ errors: 0,
45
+ warnings: 1,
46
+ issues: [{ level: 'warning', message: 'contracts.cs exists but no interfaces/records/enums found' }],
47
+ coverage: null
48
+ };
49
+ }
50
+
51
+ // Find all .cs files in the project (excluding .morph outputs, bin, obj)
52
+ const csFiles = await glob('**/*.cs', {
53
+ cwd: projectPath,
54
+ ignore: ['.morph/**', '**/bin/**', '**/obj/**', '**/node_modules/**']
55
+ });
56
+
57
+ const projectCode = {};
58
+ for (const file of csFiles) {
59
+ const fullPath = join(projectPath, file);
60
+ try {
61
+ projectCode[file] = readFileSync(fullPath, 'utf-8');
62
+ } catch {
63
+ // Skip unreadable files
64
+ }
65
+ }
66
+
67
+ const issues = [];
68
+ let implemented = 0;
69
+ let total = 0;
70
+ const interfaceResults = [];
71
+
72
+ // Validate interfaces
73
+ for (const iface of contracts.interfaces) {
74
+ total++;
75
+ const result = validateInterface(iface, projectCode, options);
76
+ interfaceResults.push(result);
77
+
78
+ if (result.implemented) {
79
+ implemented++;
80
+ if (options.verbose) {
81
+ console.log(chalk.green(` ✓ ${iface.name} → ${result.implementingClass} (${result.implementedMethods}/${result.totalMethods} methods)`));
82
+ }
83
+ } else {
84
+ issues.push({
85
+ level: 'error',
86
+ message: `Interface ${iface.name} not implemented in project code`,
87
+ solution: `Create a class that implements ${iface.name} with all ${iface.methods.length} method(s)`
88
+ });
89
+ }
90
+
91
+ // Check for missing methods
92
+ for (const method of result.missingMethods || []) {
93
+ issues.push({
94
+ level: 'error',
95
+ message: `Method ${method} missing from ${result.implementingClass || iface.name} implementation`,
96
+ file: result.implementingFile,
97
+ solution: `Add method ${method} to the class implementing ${iface.name}`
98
+ });
99
+ }
100
+ }
101
+
102
+ // Validate records/DTOs
103
+ for (const record of contracts.records) {
104
+ total++;
105
+ const found = Object.entries(projectCode).some(([, content]) =>
106
+ new RegExp(`(class|record|struct)\\s+${escapeRegex(record.name)}`, 'g').test(content)
107
+ );
108
+
109
+ if (found) {
110
+ implemented++;
111
+ if (options.verbose) {
112
+ console.log(chalk.green(` ✓ ${record.name} (${record.type})`));
113
+ }
114
+ } else {
115
+ issues.push({
116
+ level: 'warning',
117
+ message: `${record.type} ${record.name} defined in contracts but not found in project code`,
118
+ solution: `Create ${record.type} ${record.name} matching the contract definition`
119
+ });
120
+ }
121
+ }
122
+
123
+ // Validate enums
124
+ for (const enumDef of contracts.enums) {
125
+ total++;
126
+ const found = Object.entries(projectCode).some(([, content]) =>
127
+ new RegExp(`enum\\s+${escapeRegex(enumDef.name)}`, 'g').test(content)
128
+ );
129
+
130
+ if (found) {
131
+ implemented++;
132
+ if (options.verbose) {
133
+ console.log(chalk.green(` ✓ ${enumDef.name} (enum)`));
134
+ }
135
+ } else {
136
+ issues.push({
137
+ level: 'warning',
138
+ message: `Enum ${enumDef.name} defined in contracts but not found in project code`,
139
+ solution: `Create enum ${enumDef.name} matching the contract definition`
140
+ });
141
+ }
142
+ }
143
+
144
+ const coveragePercent = total > 0 ? Math.round((implemented / total) * 100) : 100;
145
+ const errors = issues.filter(i => i.level === 'error').length;
146
+ const warnings = issues.filter(i => i.level === 'warning').length;
147
+
148
+ if (options.verbose) {
149
+ console.log(chalk.cyan(`\n Contract coverage: ${coveragePercent}% (${implemented}/${total})`));
150
+ }
151
+
152
+ return {
153
+ status: errors > 0 ? 'error' : 'ok',
154
+ errors,
155
+ warnings,
156
+ issues,
157
+ coverage: {
158
+ percentage: coveragePercent,
159
+ implemented,
160
+ total,
161
+ interfaces: interfaceResults
162
+ }
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Parse contracts.cs content and extract interfaces, records, and enums
168
+ */
169
+ function parseContracts(content) {
170
+ const interfaces = [];
171
+ const records = [];
172
+ const enums = [];
173
+
174
+ // Extract interfaces with their methods
175
+ const interfaceRegex = /public\s+interface\s+(I\w+)(?:\s*:\s*[\w<>,\s]+)?\s*\{([^}]*)\}/gs;
176
+ let match;
177
+
178
+ while ((match = interfaceRegex.exec(content)) !== null) {
179
+ const name = match[1];
180
+ const body = match[2];
181
+ const methods = extractMethods(body);
182
+
183
+ interfaces.push({ name, methods });
184
+ }
185
+
186
+ // Extract records/classes (DTOs)
187
+ const recordRegex = /public\s+(record|class|struct)\s+(\w+)/g;
188
+ while ((match = recordRegex.exec(content)) !== null) {
189
+ const type = match[1];
190
+ const name = match[2];
191
+ // Skip interface names that were already captured
192
+ if (!name.startsWith('I') || !interfaces.some(i => i.name === name)) {
193
+ records.push({ type, name });
194
+ }
195
+ }
196
+
197
+ // Extract enums
198
+ const enumRegex = /public\s+enum\s+(\w+)/g;
199
+ while ((match = enumRegex.exec(content)) !== null) {
200
+ enums.push({ name: match[1] });
201
+ }
202
+
203
+ return { interfaces, records, enums };
204
+ }
205
+
206
+ /**
207
+ * Extract method signatures from an interface body
208
+ */
209
+ function extractMethods(body) {
210
+ const methods = [];
211
+
212
+ // Match method signatures like: Task<Result> DoSomethingAsync(params);
213
+ const methodRegex = /(?:Task<[^>]+>|Task|void|string|int|bool|decimal|[\w<>[\],\s?]+)\s+(\w+)\s*\(/g;
214
+ let match;
215
+
216
+ while ((match = methodRegex.exec(body)) !== null) {
217
+ const methodName = match[1];
218
+ // Skip property getters/setters
219
+ if (!['get', 'set', 'init'].includes(methodName)) {
220
+ methods.push(methodName);
221
+ }
222
+ }
223
+
224
+ return methods;
225
+ }
226
+
227
+ /**
228
+ * Validate that an interface is implemented in project code
229
+ */
230
+ function validateInterface(iface, projectCode, options) {
231
+ const result = {
232
+ name: iface.name,
233
+ implemented: false,
234
+ implementingClass: null,
235
+ implementingFile: null,
236
+ totalMethods: iface.methods.length,
237
+ implementedMethods: 0,
238
+ missingMethods: []
239
+ };
240
+
241
+ // Search for classes implementing this interface
242
+ const implRegex = new RegExp(`class\\s+(\\w+)\\s*(?:<[^>]*>)?\\s*:\\s*[^{]*${escapeRegex(iface.name)}`, 'g');
243
+
244
+ for (const [file, content] of Object.entries(projectCode)) {
245
+ const match = implRegex.exec(content);
246
+ if (match) {
247
+ result.implemented = true;
248
+ result.implementingClass = match[1];
249
+ result.implementingFile = file;
250
+
251
+ // Check which methods are implemented
252
+ for (const method of iface.methods) {
253
+ const methodExists = new RegExp(`(public|protected|private|internal)?\\s*(async\\s+)?\\S+\\s+${escapeRegex(method)}\\s*\\(`, 'g').test(content);
254
+ if (methodExists) {
255
+ result.implementedMethods++;
256
+ } else {
257
+ result.missingMethods.push(method);
258
+ }
259
+ }
260
+
261
+ break; // Found the implementation
262
+ }
263
+ implRegex.lastIndex = 0; // Reset for next file
264
+ }
265
+
266
+ return result;
267
+ }
268
+
269
+ /**
270
+ * Escape special regex characters in a string
271
+ */
272
+ function escapeRegex(str) {
273
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
274
+ }
@@ -34,7 +34,7 @@ export async function validateDesignSystem(projectPath, featureName = null, opti
34
34
  result.issues.push({
35
35
  level: 'error',
36
36
  message: 'No design system found',
37
- solution: 'Create a design system at .morph/project/design-system.md or run design system generator'
37
+ solution: 'Create a design system at .morph/context/design-system.md or run design system generator'
38
38
  });
39
39
  return result;
40
40
  }