@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,269 +1,270 @@
1
- /**
2
- * MORPH-SPEC Validation Runner
3
- *
4
- * Unified orchestrator that runs the right validators based on the feature's
5
- * active agents and decisions. Called by task-done before marking tasks complete.
6
- *
7
- * MORPH-SPEC 3.0 - Phase A: Active Validation Pipeline
8
- */
9
-
10
- import { existsSync, readFileSync } from 'fs';
11
- import { join } from 'path';
12
- import chalk from 'chalk';
13
- import { loadState } from '../../core/state/state-manager.js';
14
-
15
- /**
16
- * Load agent → validators map from agents.json (data-driven)
17
- * @param {string} projectPath - Root path of the project
18
- * @returns {Object} Map of agent IDs to validator arrays
19
- */
20
- function loadAgentValidatorMap(projectPath) {
21
- try {
22
- const agentsPath = join(projectPath, '.morph/config/agents.json');
23
- const agentsConfig = JSON.parse(readFileSync(agentsPath, 'utf8'));
24
-
25
- const map = {};
26
- Object.entries(agentsConfig.agents || {}).forEach(([agentId, agent]) => {
27
- if (!agentId.startsWith('_comment') && agent.validators && agent.validators.length > 0) {
28
- map[agentId] = agent.validators;
29
- }
30
- });
31
-
32
- return map;
33
- } catch (err) {
34
- console.warn(chalk.yellow('⚠️ Failed to load agents.json - no validators will run'));
35
- console.warn(chalk.gray(` Run 'morph-spec init' to set up MORPH-SPEC configuration`));
36
- return {}; // Empty map = honest failure
37
- }
38
- }
39
-
40
- /**
41
- * Run all relevant validators for a feature
42
- *
43
- * @param {string} projectPath - Project root path
44
- * @param {string} featureName - Feature name from state.json
45
- * @param {Object} options - Options
46
- * @param {boolean} options.verbose - Show detailed output
47
- * @param {string[]} options.validators - Specific validators to run (overrides agent-based detection)
48
- * @returns {Object} { passed, errors, warnings, issues, summary }
49
- */
50
- export async function runValidation(projectPath, featureName, options = {}) {
51
- const result = {
52
- passed: true,
53
- errors: 0,
54
- warnings: 0,
55
- issues: [],
56
- summary: '',
57
- results: {} // Per-validator results for hooks integration
58
- };
59
-
60
- // Decision constraints support (stub - decision-constraint-loader removed as orphaned code)
61
- const constraints = {
62
- enabledValidators: [], // No constraint-based validators
63
- validators: {} // No validator-specific constraints
64
- };
65
-
66
- // Determine which validators to run
67
- const validatorIds = options.validators || detectValidators(featureName, projectPath);
68
-
69
- // Merge constraint-enabled validators
70
- validatorIds.push(...constraints.enabledValidators);
71
-
72
- if (validatorIds.length === 0) {
73
- result.summary = 'No validators applicable for this feature';
74
- return result;
75
- }
76
-
77
- if (options.verbose) {
78
- console.log(chalk.gray(`\n Running validators: ${validatorIds.join(', ')}`));
79
- if (constraints.enabledValidators.length > 0) {
80
- console.log(chalk.gray(` (+ ${constraints.enabledValidators.length} from decisions)`));
81
- }
82
- }
83
-
84
- // Always run contract compliance if contracts.cs exists
85
- const contractsPath = join(projectPath, '.morph/project/outputs', featureName, 'contracts.cs');
86
- if (existsSync(contractsPath)) {
87
- validatorIds.push('contract-compliance');
88
- }
89
-
90
- // Deduplicate
91
- const uniqueValidators = [...new Set(validatorIds)];
92
-
93
- // Run each validator
94
- for (const validatorId of uniqueValidators) {
95
- try {
96
- // Pass validator-specific constraints from decisions.md
97
- const validatorOptions = {
98
- ...options,
99
- constraints: constraints.validators[validatorId] || {}
100
- };
101
-
102
- const validatorResult = await runSingleValidator(validatorId, projectPath, featureName, validatorOptions);
103
-
104
- if (validatorResult) {
105
- result.errors += validatorResult.errors || 0;
106
- result.warnings += validatorResult.warnings || 0;
107
-
108
- if (validatorResult.issues) {
109
- result.issues.push(...validatorResult.issues);
110
- }
111
-
112
- // Store per-validator results for hooks
113
- result.results[validatorId] = {
114
- passed: (validatorResult.errors || 0) === 0,
115
- issues: validatorResult.issues || []
116
- };
117
- }
118
- } catch (err) {
119
- if (options.verbose) {
120
- console.log(chalk.yellow(` ⚠ Validator '${validatorId}' failed: ${err.message}`));
121
- }
122
- result.results[validatorId] = {
123
- passed: false,
124
- error: err.message
125
- };
126
- }
127
- }
128
-
129
- result.passed = result.errors === 0;
130
- result.summary = result.passed
131
- ? `✅ All validations passed (${result.warnings} warnings)`
132
- : `❌ ${result.errors} error(s), ${result.warnings} warning(s)`;
133
-
134
- return result;
135
- }
136
-
137
- /**
138
- * Detect which validators to run based on feature's active agents
139
- * @param {string} featureName - Feature name
140
- * @param {string} projectPath - Project root path (default: current directory)
141
- * @returns {string[]} Array of validator IDs to run
142
- */
143
- function detectValidators(featureName, projectPath = '.') {
144
- const state = loadState(false);
145
- if (!state || !state.features[featureName]) {
146
- return ['architecture', 'packages']; // Default validators
147
- }
148
-
149
- const feature = state.features[featureName];
150
- const agents = feature.activeAgents || [];
151
- const validatorSet = new Set();
152
-
153
- // Load agent → validators map from agents.json (data-driven)
154
- const agentValidatorMap = loadAgentValidatorMap(projectPath);
155
-
156
- for (const agentId of agents) {
157
- const validators = agentValidatorMap[agentId] || [];
158
- validators.forEach(v => validatorSet.add(v));
159
- }
160
-
161
- // Always include architecture and packages as baseline
162
- validatorSet.add('architecture');
163
- validatorSet.add('packages');
164
-
165
- return Array.from(validatorSet);
166
- }
167
-
168
- /**
169
- * Run a single validator by ID
170
- */
171
- async function runSingleValidator(validatorId, projectPath, featureName, options) {
172
- switch (validatorId) {
173
- case 'architecture': {
174
- const { validateArchitecture } = await import('./architecture/architecture-validator.js');
175
- return await validateArchitecture(projectPath, options);
176
- }
177
-
178
- case 'packages': {
179
- const { validatePackages } = await import('./packages/package-validator.js');
180
- return await validatePackages(projectPath, options);
181
- }
182
-
183
- case 'contrast': {
184
- const { validateContrast } = await import('./ui/ui-contrast-validator.js');
185
- return await validateContrast(projectPath, options);
186
- }
187
-
188
- case 'blazor': {
189
- const { validateBlazorPatterns } = await import('./blazor/blazor-validator.js');
190
- return await validateBlazorPatterns(projectPath, options);
191
- }
192
-
193
- case 'blazor-concurrency': {
194
- const { analyzeConcurrency } = await import('./blazor/blazor-concurrency-analyzer.js');
195
- return await analyzeConcurrency(projectPath, options);
196
- }
197
-
198
- case 'blazor-state': {
199
- const { validateState } = await import('./blazor/blazor-state-validator.js');
200
- return await validateState(projectPath, options);
201
- }
202
-
203
- case 'css': {
204
- const { validateCss } = await import('./css/css-validator.js');
205
- return await validateCss(projectPath, options);
206
- }
207
-
208
- case 'contract-compliance': {
209
- const { validateContracts } = await import('./contracts/contract-compliance-validator.js');
210
- return await validateContracts(projectPath, featureName, options);
211
- }
212
-
213
- case 'design-system': {
214
- const { validateDesignSystem } = await import('./design-system/design-system-validator.js');
215
- return await validateDesignSystem(projectPath, featureName, options);
216
- }
217
-
218
- default:
219
- if (options.verbose) {
220
- console.log(chalk.gray(` Unknown validator: ${validatorId}`));
221
- }
222
- return null;
223
- }
224
- }
225
-
226
- /**
227
- * Format validation results for console output
228
- */
229
- export function formatValidationResults(result) {
230
- if (result.passed && result.warnings === 0) {
231
- console.log(chalk.green('\n ✅ All validations passed!\n'));
232
- return;
233
- }
234
-
235
- if (result.passed && result.warnings > 0) {
236
- console.log(chalk.yellow(`\n ⚠️ Passed with ${result.warnings} warning(s)\n`));
237
- } else {
238
- console.log(chalk.red(`\n ❌ Validation FAILED: ${result.errors} error(s), ${result.warnings} warning(s)\n`));
239
- }
240
-
241
- // Group issues by level
242
- const errors = result.issues.filter(i => i.level === 'error');
243
- const warnings = result.issues.filter(i => i.level === 'warning');
244
-
245
- if (errors.length > 0) {
246
- console.log(chalk.red.bold(' Errors:'));
247
- for (const issue of errors.slice(0, 10)) {
248
- console.log(chalk.red(` ✗ ${issue.message}`));
249
- if (issue.file) console.log(chalk.gray(` ${issue.file}${issue.line ? ':' + issue.line : ''}`));
250
- if (issue.solution) console.log(chalk.cyan(` Fix: ${issue.solution}`));
251
- }
252
- if (errors.length > 10) {
253
- console.log(chalk.gray(` ... and ${errors.length - 10} more errors`));
254
- }
255
- }
256
-
257
- if (warnings.length > 0) {
258
- console.log(chalk.yellow('\n Warnings:'));
259
- for (const issue of warnings.slice(0, 5)) {
260
- console.log(chalk.yellow(` ⚠ ${issue.message}`));
261
- if (issue.file) console.log(chalk.gray(` ${issue.file}`));
262
- }
263
- if (warnings.length > 5) {
264
- console.log(chalk.gray(` ... and ${warnings.length - 5} more warnings`));
265
- }
266
- }
267
-
268
- console.log('');
269
- }
1
+ /**
2
+ * MORPH-SPEC Validation Runner
3
+ *
4
+ * Unified orchestrator that runs the right validators based on the feature's
5
+ * active agents and decisions. Called by task-done before marking tasks complete.
6
+ *
7
+ * MORPH-SPEC 3.0 - Phase A: Active Validation Pipeline
8
+ */
9
+
10
+ import { existsSync, readFileSync } from 'fs';
11
+ import { join } from 'path';
12
+ import chalk from 'chalk';
13
+ import { loadState } from '../../core/state/state-manager.js';
14
+ import { getAbsoluteOutputPath } from '../../core/paths/output-schema.js';
15
+
16
+ /**
17
+ * Load agent validators map from agents.json (data-driven)
18
+ * @param {string} projectPath - Root path of the project
19
+ * @returns {Object} Map of agent IDs to validator arrays
20
+ */
21
+ function loadAgentValidatorMap(projectPath) {
22
+ try {
23
+ const agentsPath = join(projectPath, '.morph/framework/agents.json');
24
+ const agentsConfig = JSON.parse(readFileSync(agentsPath, 'utf8'));
25
+
26
+ const map = {};
27
+ Object.entries(agentsConfig.agents || {}).forEach(([agentId, agent]) => {
28
+ if (!agentId.startsWith('_comment') && agent.validators && agent.validators.length > 0) {
29
+ map[agentId] = agent.validators;
30
+ }
31
+ });
32
+
33
+ return map;
34
+ } catch (err) {
35
+ console.warn(chalk.yellow('⚠️ Failed to load agents.json - no validators will run'));
36
+ console.warn(chalk.gray(` Run 'morph-spec init' to set up MORPH-SPEC configuration`));
37
+ return {}; // Empty map = honest failure
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Run all relevant validators for a feature
43
+ *
44
+ * @param {string} projectPath - Project root path
45
+ * @param {string} featureName - Feature name from state.json
46
+ * @param {Object} options - Options
47
+ * @param {boolean} options.verbose - Show detailed output
48
+ * @param {string[]} options.validators - Specific validators to run (overrides agent-based detection)
49
+ * @returns {Object} { passed, errors, warnings, issues, summary }
50
+ */
51
+ export async function runValidation(projectPath, featureName, options = {}) {
52
+ const result = {
53
+ passed: true,
54
+ errors: 0,
55
+ warnings: 0,
56
+ issues: [],
57
+ summary: '',
58
+ results: {} // Per-validator results for hooks integration
59
+ };
60
+
61
+ // Decision constraints support (stub - decision-constraint-loader removed as orphaned code)
62
+ const constraints = {
63
+ enabledValidators: [], // No constraint-based validators
64
+ validators: {} // No validator-specific constraints
65
+ };
66
+
67
+ // Determine which validators to run
68
+ const validatorIds = options.validators || detectValidators(featureName, projectPath);
69
+
70
+ // Merge constraint-enabled validators
71
+ validatorIds.push(...constraints.enabledValidators);
72
+
73
+ if (validatorIds.length === 0) {
74
+ result.summary = 'No validators applicable for this feature';
75
+ return result;
76
+ }
77
+
78
+ if (options.verbose) {
79
+ console.log(chalk.gray(`\n Running validators: ${validatorIds.join(', ')}`));
80
+ if (constraints.enabledValidators.length > 0) {
81
+ console.log(chalk.gray(` (+ ${constraints.enabledValidators.length} from decisions)`));
82
+ }
83
+ }
84
+
85
+ // Always run contract compliance if contracts.cs exists
86
+ const contractsPath = getAbsoluteOutputPath(projectPath, featureName, 'contracts');
87
+ if (existsSync(contractsPath)) {
88
+ validatorIds.push('contract-compliance');
89
+ }
90
+
91
+ // Deduplicate
92
+ const uniqueValidators = [...new Set(validatorIds)];
93
+
94
+ // Run each validator
95
+ for (const validatorId of uniqueValidators) {
96
+ try {
97
+ // Pass validator-specific constraints from decisions.md
98
+ const validatorOptions = {
99
+ ...options,
100
+ constraints: constraints.validators[validatorId] || {}
101
+ };
102
+
103
+ const validatorResult = await runSingleValidator(validatorId, projectPath, featureName, validatorOptions);
104
+
105
+ if (validatorResult) {
106
+ result.errors += validatorResult.errors || 0;
107
+ result.warnings += validatorResult.warnings || 0;
108
+
109
+ if (validatorResult.issues) {
110
+ result.issues.push(...validatorResult.issues);
111
+ }
112
+
113
+ // Store per-validator results for hooks
114
+ result.results[validatorId] = {
115
+ passed: (validatorResult.errors || 0) === 0,
116
+ issues: validatorResult.issues || []
117
+ };
118
+ }
119
+ } catch (err) {
120
+ if (options.verbose) {
121
+ console.log(chalk.yellow(` ⚠ Validator '${validatorId}' failed: ${err.message}`));
122
+ }
123
+ result.results[validatorId] = {
124
+ passed: false,
125
+ error: err.message
126
+ };
127
+ }
128
+ }
129
+
130
+ result.passed = result.errors === 0;
131
+ result.summary = result.passed
132
+ ? `✅ All validations passed (${result.warnings} warnings)`
133
+ : `❌ ${result.errors} error(s), ${result.warnings} warning(s)`;
134
+
135
+ return result;
136
+ }
137
+
138
+ /**
139
+ * Detect which validators to run based on feature's active agents
140
+ * @param {string} featureName - Feature name
141
+ * @param {string} projectPath - Project root path (default: current directory)
142
+ * @returns {string[]} Array of validator IDs to run
143
+ */
144
+ function detectValidators(featureName, projectPath = '.') {
145
+ const state = loadState(false);
146
+ if (!state || !state.features[featureName]) {
147
+ return ['architecture', 'packages']; // Default validators
148
+ }
149
+
150
+ const feature = state.features[featureName];
151
+ const agents = feature.activeAgents || [];
152
+ const validatorSet = new Set();
153
+
154
+ // Load agent → validators map from agents.json (data-driven)
155
+ const agentValidatorMap = loadAgentValidatorMap(projectPath);
156
+
157
+ for (const agentId of agents) {
158
+ const validators = agentValidatorMap[agentId] || [];
159
+ validators.forEach(v => validatorSet.add(v));
160
+ }
161
+
162
+ // Always include architecture and packages as baseline
163
+ validatorSet.add('architecture');
164
+ validatorSet.add('packages');
165
+
166
+ return Array.from(validatorSet);
167
+ }
168
+
169
+ /**
170
+ * Run a single validator by ID
171
+ */
172
+ async function runSingleValidator(validatorId, projectPath, featureName, options) {
173
+ switch (validatorId) {
174
+ case 'architecture': {
175
+ const { validateArchitecture } = await import('./architecture/architecture-validator.js');
176
+ return await validateArchitecture(projectPath, options);
177
+ }
178
+
179
+ case 'packages': {
180
+ const { validatePackages } = await import('./packages/package-validator.js');
181
+ return await validatePackages(projectPath, options);
182
+ }
183
+
184
+ case 'contrast': {
185
+ const { validateContrast } = await import('./ui/ui-contrast-validator.js');
186
+ return await validateContrast(projectPath, options);
187
+ }
188
+
189
+ case 'blazor': {
190
+ const { validateBlazorPatterns } = await import('./blazor/blazor-validator.js');
191
+ return await validateBlazorPatterns(projectPath, options);
192
+ }
193
+
194
+ case 'blazor-concurrency': {
195
+ const { analyzeConcurrency } = await import('./blazor/blazor-concurrency-analyzer.js');
196
+ return await analyzeConcurrency(projectPath, options);
197
+ }
198
+
199
+ case 'blazor-state': {
200
+ const { validateState } = await import('./blazor/blazor-state-validator.js');
201
+ return await validateState(projectPath, options);
202
+ }
203
+
204
+ case 'css': {
205
+ const { validateCss } = await import('./css/css-validator.js');
206
+ return await validateCss(projectPath, options);
207
+ }
208
+
209
+ case 'contract-compliance': {
210
+ const { validateContracts } = await import('./contracts/contract-compliance-validator.js');
211
+ return await validateContracts(projectPath, featureName, options);
212
+ }
213
+
214
+ case 'design-system': {
215
+ const { validateDesignSystem } = await import('./design-system/design-system-validator.js');
216
+ return await validateDesignSystem(projectPath, featureName, options);
217
+ }
218
+
219
+ default:
220
+ if (options.verbose) {
221
+ console.log(chalk.gray(` Unknown validator: ${validatorId}`));
222
+ }
223
+ return null;
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Format validation results for console output
229
+ */
230
+ export function formatValidationResults(result) {
231
+ if (result.passed && result.warnings === 0) {
232
+ console.log(chalk.green('\n ✅ All validations passed!\n'));
233
+ return;
234
+ }
235
+
236
+ if (result.passed && result.warnings > 0) {
237
+ console.log(chalk.yellow(`\n ⚠️ Passed with ${result.warnings} warning(s)\n`));
238
+ } else {
239
+ console.log(chalk.red(`\n ❌ Validation FAILED: ${result.errors} error(s), ${result.warnings} warning(s)\n`));
240
+ }
241
+
242
+ // Group issues by level
243
+ const errors = result.issues.filter(i => i.level === 'error');
244
+ const warnings = result.issues.filter(i => i.level === 'warning');
245
+
246
+ if (errors.length > 0) {
247
+ console.log(chalk.red.bold(' Errors:'));
248
+ for (const issue of errors.slice(0, 10)) {
249
+ console.log(chalk.red(`${issue.message}`));
250
+ if (issue.file) console.log(chalk.gray(` ${issue.file}${issue.line ? ':' + issue.line : ''}`));
251
+ if (issue.solution) console.log(chalk.cyan(` Fix: ${issue.solution}`));
252
+ }
253
+ if (errors.length > 10) {
254
+ console.log(chalk.gray(` ... and ${errors.length - 10} more errors`));
255
+ }
256
+ }
257
+
258
+ if (warnings.length > 0) {
259
+ console.log(chalk.yellow('\n Warnings:'));
260
+ for (const issue of warnings.slice(0, 5)) {
261
+ console.log(chalk.yellow(`${issue.message}`));
262
+ if (issue.file) console.log(chalk.gray(` ${issue.file}`));
263
+ }
264
+ if (warnings.length > 5) {
265
+ console.log(chalk.gray(` ... and ${warnings.length - 5} more warnings`));
266
+ }
267
+ }
268
+
269
+ console.log('');
270
+ }