@polymorphism-tech/morph-spec 4.3.6 → 4.5.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 (375) hide show
  1. package/.morph/.morphversion +3 -3
  2. package/.morph/analytics/threads-log.jsonl +44 -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/framework/standards/integration/mcp/mcp-tools.md +384 -0
  7. package/.morph/{templates → framework/templates}/README.md +17 -17
  8. package/.morph/{templates → framework/templates}/REGISTRY.json +48 -233
  9. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  10. package/.morph/{templates → framework/templates}/context/CONTEXT-FEATURE.md +1 -1
  11. package/.morph/{templates → framework/templates}/context/CONTEXT.md +3 -3
  12. package/.morph/framework/templates/docs/clarifications.md +253 -0
  13. package/.morph/framework/templates/docs/onboarding.md +123 -0
  14. package/.morph/framework/templates/docs/schema-analysis.md +119 -0
  15. package/.morph/{templates → framework/templates}/docs/spec.md +149 -149
  16. package/.morph/framework/templates/docs/ui-components.md +124 -0
  17. package/.morph/framework/templates/docs/ui-design-system.md +76 -0
  18. package/.morph/framework/templates/docs/ui-flows.md +167 -0
  19. package/.morph/framework/templates/docs/ui-mockups.md +98 -0
  20. package/.morph/{templates → framework/templates}/examples/spec-examples.md +1 -1
  21. package/.morph/{templates → framework/templates}/infrastructure/github/README.md +11 -11
  22. package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  23. package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  24. package/.morph/{templates → framework/templates}/meta-prompts/validators/pre-commit-validator.md +1 -1
  25. package/.morph/logs/tool-failures.log +51 -0
  26. package/.morph/memory/pre-compact-2026-02-22T17-01-01-658Z.json +16 -0
  27. package/.morph/state.json +1 -1
  28. package/CLAUDE.md +20 -119
  29. package/README.md +20 -18
  30. package/bin/detect-agents.js +1 -1
  31. package/bin/morph-spec.js +116 -266
  32. package/bin/task-manager.cjs +2 -2
  33. package/bin/validate.js +1 -1
  34. package/claude-plugin.json +14 -0
  35. package/docs/claude-alignment-report.md +137 -0
  36. package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +512 -0
  37. package/docs/plans/2026-02-22-claude-settings.md +515 -0
  38. package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +728 -0
  39. package/docs/plans/2026-02-22-morph-spec-next.md +478 -0
  40. package/docs/plans/2026-02-22-native-alignment-design.md +199 -0
  41. package/docs/plans/2026-02-22-native-alignment-impl.md +925 -0
  42. package/docs/plans/2026-02-22-native-enrichment-design.md +244 -0
  43. package/docs/plans/2026-02-22-native-enrichment.md +735 -0
  44. package/framework/CLAUDE.md +77 -0
  45. package/framework/commands/morph-apply.md +9 -9
  46. package/framework/commands/morph-archive.md +8 -8
  47. package/framework/commands/morph-infra.md +1 -1
  48. package/framework/commands/morph-proposal.md +9 -9
  49. package/framework/commands/morph-status.md +3 -3
  50. package/framework/commands/morph-troubleshoot.md +1 -1
  51. package/framework/hooks/README.md +201 -282
  52. package/framework/hooks/claude-code/notification/approval-reminder.js +52 -0
  53. package/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
  54. package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
  55. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
  56. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
  57. package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
  58. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
  59. package/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
  60. package/framework/hooks/claude-code/statusline.py +239 -0
  61. package/framework/hooks/claude-code/statusline.sh +7 -0
  62. package/framework/hooks/claude-code/stop/validate-completion.js +88 -0
  63. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
  64. package/framework/hooks/shared/hook-response.js +45 -0
  65. package/framework/hooks/shared/phase-utils.js +129 -0
  66. package/framework/hooks/shared/state-reader.js +138 -0
  67. package/framework/hooks/shared/stdin-reader.js +26 -0
  68. package/framework/phases.json +145 -0
  69. package/framework/rules/csharp-standards.md +10 -0
  70. package/framework/rules/frontend-standards.md +14 -0
  71. package/framework/rules/infrastructure-standards.md +13 -0
  72. package/framework/rules/morph-workflow.md +86 -0
  73. package/framework/rules/testing-standards.md +11 -0
  74. package/framework/skills/level-0-meta/brainstorming.md +133 -0
  75. package/framework/skills/level-0-meta/code-review.md +12 -4
  76. package/framework/skills/level-0-meta/mcp-registry.json +207 -0
  77. package/framework/skills/level-0-meta/morph-checklist.md +9 -1
  78. package/framework/skills/level-0-meta/simulation-checklist.md +9 -1
  79. package/framework/skills/level-0-meta/tool-usage-guide.md +335 -0
  80. package/framework/skills/level-0-meta/verification-before-completion.md +145 -0
  81. package/framework/skills/level-1-workflows/morph-replicate.md +9 -1
  82. package/framework/skills/level-1-workflows/phase-clarify.md +65 -4
  83. package/framework/skills/level-1-workflows/phase-codebase-analysis.md +182 -0
  84. package/framework/skills/level-1-workflows/phase-design.md +342 -80
  85. package/framework/skills/level-1-workflows/phase-implement.md +254 -0
  86. package/framework/skills/level-1-workflows/phase-setup.md +76 -10
  87. package/framework/skills/level-1-workflows/phase-tasks.md +88 -7
  88. package/framework/skills/level-1-workflows/phase-uiux.md +95 -17
  89. package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +8 -1
  90. package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +8 -1
  91. package/framework/skills/level-2-domains/architecture/prompt-engineer.md +8 -1
  92. package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +8 -1
  93. package/framework/skills/level-2-domains/architecture/standards-architect.md +11 -4
  94. package/framework/skills/level-2-domains/backend/api-designer.md +8 -1
  95. package/framework/skills/level-2-domains/backend/dotnet-senior.md +8 -1
  96. package/framework/skills/level-2-domains/backend/ef-modeler.md +8 -1
  97. package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +9 -2
  98. package/framework/skills/level-2-domains/backend/ms-agent-expert.md +8 -1
  99. package/framework/skills/level-2-domains/frontend/blazor-builder.md +8 -1
  100. package/framework/skills/level-2-domains/frontend/nextjs-expert.md +8 -1
  101. package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +9 -2
  102. package/framework/skills/level-2-domains/infrastructure/azure-architect.md +8 -1
  103. package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +8 -1
  104. package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +8 -1
  105. package/framework/skills/level-2-domains/infrastructure/container-specialist.md +8 -1
  106. package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +8 -1
  107. package/framework/skills/level-2-domains/integrations/asaas-financial.md +8 -1
  108. package/framework/skills/level-2-domains/integrations/azure-identity.md +8 -1
  109. package/framework/skills/level-2-domains/integrations/clerk-auth.md +8 -1
  110. package/framework/skills/level-2-domains/integrations/{hangfire-orchestrator.md → hangfire-integration.md} +8 -1
  111. package/framework/skills/level-2-domains/integrations/resend-email.md +8 -1
  112. package/framework/skills/level-2-domains/quality/code-analyzer.md +10 -3
  113. package/framework/skills/level-2-domains/quality/testing-specialist.md +8 -1
  114. package/framework/standards/STANDARDS.json +812 -0
  115. package/framework/standards/ai-agents/team-orchestration.md +3 -3
  116. package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -0
  117. package/framework/standards/integration/mcp/mcp-tools.md +384 -0
  118. package/framework/templates/README.md +17 -17
  119. package/framework/templates/REGISTRY.json +48 -233
  120. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +172 -0
  121. package/framework/templates/context/CONTEXT-FEATURE.md +1 -1
  122. package/framework/templates/context/CONTEXT.md +3 -3
  123. package/framework/templates/docs/clarifications.md +253 -0
  124. package/framework/templates/docs/onboarding.md +123 -0
  125. package/framework/templates/docs/schema-analysis.md +119 -0
  126. package/framework/templates/docs/spec.md +149 -149
  127. package/framework/templates/docs/ui-components.md +124 -0
  128. package/framework/templates/docs/ui-design-system.md +76 -0
  129. package/framework/templates/docs/ui-flows.md +167 -0
  130. package/framework/templates/docs/ui-mockups.md +98 -0
  131. package/framework/templates/docs/user-stories.md +34 -0
  132. package/framework/templates/examples/spec-examples.md +1 -1
  133. package/framework/templates/infrastructure/github/README.md +11 -11
  134. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +2 -2
  135. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  136. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +1 -1
  137. package/framework/workflows/configs/express.json +45 -0
  138. package/framework/workflows/configs/spec-only.json +43 -0
  139. package/framework/workflows/docs/enforcement-pipeline.md +8 -8
  140. package/framework/workflows/docs/full-morph.md +3 -3
  141. package/package.json +3 -2
  142. package/scripts/generate-refs.js +336 -0
  143. package/scripts/generate-standards-registry.js +44 -0
  144. package/scripts/validate-real.mjs +255 -0
  145. package/src/commands/feature/create-story.js +362 -361
  146. package/src/commands/feature/shard-spec.js +225 -224
  147. package/src/commands/feature/sprint-status.js +1 -1
  148. package/src/commands/generation/generate-onboarding.js +169 -0
  149. package/src/commands/generation/generate.js +2 -2
  150. package/src/commands/mcp/mcp-setup.js +315 -0
  151. package/src/commands/project/changes.js +66 -0
  152. package/src/commands/project/checkpoint.js +209 -0
  153. package/src/commands/project/cost.js +179 -0
  154. package/src/commands/project/diff.js +278 -0
  155. package/src/commands/project/doctor.js +55 -7
  156. package/src/commands/project/init.js +318 -76
  157. package/src/commands/project/revert.js +173 -0
  158. package/src/commands/project/standards.js +80 -0
  159. package/src/commands/project/status.js +376 -0
  160. package/src/commands/project/update-agents.js +23 -0
  161. package/src/commands/project/update.js +63 -30
  162. package/src/commands/state/advance-phase.js +4 -3
  163. package/src/commands/state/state.js +10 -3
  164. package/src/commands/state/validate-phase.js +19 -2
  165. package/src/commands/templates/template-customize.js +4 -4
  166. package/src/commands/templates/template-render.js +1 -1
  167. package/src/commands/templates/template-show.js +1 -1
  168. package/src/commands/validation/validate-feature.js +359 -0
  169. package/src/core/orchestrator.js +3 -38
  170. package/src/core/paths/output-schema.js +135 -0
  171. package/src/core/state/state-manager.js +831 -592
  172. package/src/core/templates/template-registry.js +2 -2
  173. package/src/core/workflows/workflow-detector.js +17 -1
  174. package/src/lib/agents/micro-agent-factory.js +1 -1
  175. package/src/lib/context/context-bundler.js +2 -1
  176. package/src/lib/detectors/claude-config-detector.js +392 -0
  177. package/src/lib/detectors/conversation-analyzer.js +4 -4
  178. package/src/lib/detectors/design-system-detector.js +6 -5
  179. package/src/lib/detectors/standards-generator.js +2 -2
  180. package/src/lib/generators/context-generator.js +539 -538
  181. package/src/lib/generators/recap-generator.js +1 -1
  182. package/src/lib/generators/settings-generator.js +210 -0
  183. package/src/lib/hooks/hook-executor.js +1 -1
  184. package/src/lib/installers/mcp-installer.js +299 -0
  185. package/src/lib/learning/learning-system.js +3 -3
  186. package/src/lib/orchestration/team-orchestrator.js +1 -1
  187. package/src/lib/standards/standards-context-injector.js +7 -7
  188. package/src/lib/threads/thread-coordinator.js +1 -1
  189. package/src/lib/troubleshooting/troubleshoot-grep.js +1 -1
  190. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -273
  191. package/src/lib/validators/design-system/design-system-validator.js +1 -1
  192. package/src/lib/validators/spec-validator.js +258 -258
  193. package/src/lib/validators/validation-runner.js +270 -269
  194. package/src/utils/agents-installer.js +206 -0
  195. package/src/utils/claude-settings-manager.js +258 -0
  196. package/src/utils/file-copier.js +1 -1
  197. package/src/utils/hooks-installer.js +354 -28
  198. package/src/utils/skills-installer.js +74 -0
  199. package/.morph/project/context/detection-log.md +0 -16
  200. package/.morph/project/standards/inferred.md +0 -59
  201. package/framework/hooks/agent-stop/validate-and-continue.js +0 -96
  202. package/framework/hooks/agent-stop/validate-checkpoints.js +0 -101
  203. package/framework/hooks/agent-stop/validate-tests.js +0 -109
  204. package/framework/hooks/agent-teams/dispatch.js +0 -67
  205. package/framework/hooks/agent-teams/phase-advanced.js +0 -80
  206. package/framework/hooks/agent-teams/task-completed.js +0 -76
  207. package/framework/hooks/agent-teams/teammate-idle.js +0 -70
  208. package/src/commands/agents/agents-fuse.js +0 -97
  209. package/src/commands/agents/micro-agent.js +0 -112
  210. package/src/commands/agents/spawn-team.js +0 -237
  211. package/src/commands/agents/squad-template.js +0 -146
  212. package/src/commands/analytics/analytics.js +0 -176
  213. package/src/commands/context/context-prime.js +0 -63
  214. package/src/commands/context/core-four.js +0 -54
  215. package/src/commands/generation/generate-context.js +0 -40
  216. package/src/commands/project/detect-agents.js +0 -207
  217. package/src/commands/project/detect-workflow.js +0 -174
  218. package/src/commands/threads/thread-template.js +0 -103
  219. package/src/commands/threads/threads.js +0 -261
  220. package/src/commands/utils/session-summary.js +0 -291
  221. package/src/llm/analyzer.js +0 -215
  222. package/src/llm/few-shot-examples.js +0 -216
  223. package/src/llm/project-config-schema.json +0 -188
  224. package/src/llm/prompt-builder.js +0 -96
  225. /package/.morph/{project/context → context}/README.md +0 -0
  226. /package/.morph/{config → framework}/agents.json +0 -0
  227. /package/.morph/{standards → framework/standards}/ai-agents/blazor-ui.md +0 -0
  228. /package/.morph/{standards → framework/standards}/ai-agents/production.md +0 -0
  229. /package/.morph/{standards → framework/standards}/ai-agents/setup.md +0 -0
  230. /package/.morph/{standards → framework/standards}/ai-agents/workflows.md +0 -0
  231. /package/.morph/{standards → framework/standards}/architecture/ddd/aggregates.md +0 -0
  232. /package/.morph/{standards → framework/standards}/architecture/ddd/entities.md +0 -0
  233. /package/.morph/{standards → framework/standards}/architecture/ddd/value-objects.md +0 -0
  234. /package/.morph/{standards → framework/standards}/backend/api/minimal-api.md +0 -0
  235. /package/.morph/{standards → framework/standards}/backend/api/rest.md +0 -0
  236. /package/.morph/{standards → framework/standards}/backend/api/validation.md +0 -0
  237. /package/.morph/{standards → framework/standards}/backend/authentication/passkeys.md +0 -0
  238. /package/.morph/{standards → framework/standards}/backend/database/ef-core.md +0 -0
  239. /package/.morph/{standards → framework/standards}/backend/database/migrations.md +0 -0
  240. /package/.morph/{standards → framework/standards}/backend/database/postgresql/database.md +0 -0
  241. /package/.morph/{standards → framework/standards}/backend/database/repository-patterns.md +0 -0
  242. /package/.morph/{standards → framework/standards}/backend/database/vector-search-rag.md +0 -0
  243. /package/.morph/{standards → framework/standards}/backend/dotnet/async.md +0 -0
  244. /package/.morph/{standards → framework/standards}/backend/dotnet/core.md +0 -0
  245. /package/.morph/{standards → framework/standards}/backend/dotnet/di.md +0 -0
  246. /package/.morph/{standards → framework/standards}/backend/dotnet/program-cs-checklist.md +0 -0
  247. /package/.morph/{standards → framework/standards}/backend/integrations/asaas/asaas-api.md +0 -0
  248. /package/.morph/{standards → framework/standards}/backend/integrations/clerk/clerk-auth.md +0 -0
  249. /package/.morph/{standards → framework/standards}/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  250. /package/.morph/{standards → framework/standards}/backend/integrations/resend/resend-email.md +0 -0
  251. /package/.morph/{standards → framework/standards}/context/analytics.md +0 -0
  252. /package/.morph/{standards → framework/standards}/context/bundles.md +0 -0
  253. /package/.morph/{standards → framework/standards}/context/priming.md +0 -0
  254. /package/.morph/{standards → framework/standards}/core/architecture.md +0 -0
  255. /package/.morph/{standards → framework/standards}/core/coding.md +0 -0
  256. /package/.morph/{standards → framework/standards}/core/git-branching-strategy.md +0 -0
  257. /package/.morph/{standards → framework/standards}/core/git.md +0 -0
  258. /package/.morph/{standards → framework/standards}/core/testing.md +0 -0
  259. /package/.morph/{standards → framework/standards}/data/nosql/blob-storage.md +0 -0
  260. /package/.morph/{standards → framework/standards}/data/nosql/cache/redis.md +0 -0
  261. /package/.morph/{standards → framework/standards}/data/nosql/cosmos-db.md +0 -0
  262. /package/.morph/{standards → framework/standards}/data/vector-search/azure-ai-search.md +0 -0
  263. /package/.morph/{standards → framework/standards}/data/vector-search/rag-chunking.md +0 -0
  264. /package/.morph/{standards → framework/standards}/frontend/blazor/design-checklist.md +0 -0
  265. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui-setup.md +0 -0
  266. /package/.morph/{standards → framework/standards}/frontend/blazor/fluent-ui.md +0 -0
  267. /package/.morph/{standards → framework/standards}/frontend/blazor/html-conversion.md +0 -0
  268. /package/.morph/{standards → framework/standards}/frontend/blazor/lifecycle.md +0 -0
  269. /package/.morph/{standards → framework/standards}/frontend/blazor/pitfalls.md +0 -0
  270. /package/.morph/{standards → framework/standards}/frontend/blazor/state.md +0 -0
  271. /package/.morph/{standards → framework/standards}/frontend/design-system/animations.md +0 -0
  272. /package/.morph/{standards → framework/standards}/frontend/design-system/naming.md +0 -0
  273. /package/.morph/{standards → framework/standards}/frontend/nextjs/nextjs-patterns.md +0 -0
  274. /package/.morph/{standards → framework/standards}/infrastructure/azure/azure.md +0 -0
  275. /package/.morph/{standards → framework/standards}/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  276. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  277. /package/.morph/{standards → framework/standards}/infrastructure/azure/devops/local-development.md +0 -0
  278. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/functions.md +0 -0
  279. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/service-bus.md +0 -0
  280. /package/.morph/{standards → framework/standards}/infrastructure/azure/services/storage.md +0 -0
  281. /package/.morph/{standards → framework/standards}/infrastructure/docker/easypanel-deploy.md +0 -0
  282. /package/.morph/{standards → framework/standards}/infrastructure/supabase/mcp-setup.md +0 -0
  283. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-auth.md +0 -0
  284. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-pgvector.md +0 -0
  285. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-rls.md +0 -0
  286. /package/.morph/{standards → framework/standards}/infrastructure/supabase/supabase-storage.md +0 -0
  287. /package/.morph/{standards → framework/standards}/integration/api/graphql.md +0 -0
  288. /package/.morph/{standards → framework/standards}/integration/api/grpc.md +0 -0
  289. /package/.morph/{standards → framework/standards}/integration/api/rest-design.md +0 -0
  290. /package/.morph/{standards → framework/standards}/integration/event-driven/cqrs.md +0 -0
  291. /package/.morph/{standards → framework/standards}/integration/event-driven/event-sourcing.md +0 -0
  292. /package/.morph/{standards → framework/standards}/integration/event-driven/service-bus.md +0 -0
  293. /package/.morph/{standards → framework/standards}/observability/logging.md +0 -0
  294. /package/.morph/{standards → framework/standards}/observability/metrics.md +0 -0
  295. /package/.morph/{standards → framework/standards}/observability/monitoring.md +0 -0
  296. /package/.morph/{standards → framework/standards}/observability/tracing.md +0 -0
  297. /package/.morph/{standards → framework/standards}/workflows/parallel-execution.md +0 -0
  298. /package/.morph/{standards → framework/standards}/workflows/thread-management.md +0 -0
  299. /package/.morph/{templates → framework/templates}/.idea/morph-templates.xml +0 -0
  300. /package/.morph/{templates → framework/templates}/.vscode/morph-templates.code-snippets +0 -0
  301. /package/.morph/{templates → framework/templates}/IDE-SNIPPETS.md +0 -0
  302. /package/.morph/{templates → framework/templates}/code/dotnet/backend/repository.cs +0 -0
  303. /package/.morph/{templates → framework/templates}/code/dotnet/backend/service.cs +0 -0
  304. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Commands.cs +0 -0
  305. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Entities.cs +0 -0
  306. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/Queries.cs +0 -0
  307. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/README.md +0 -0
  308. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/api-contracts.cs +0 -0
  309. /package/.morph/{templates → framework/templates}/code/dotnet/contracts/contracts.cs +0 -0
  310. /package/.morph/{templates → framework/templates}/code/dotnet/database/migration.cs +0 -0
  311. /package/.morph/{templates → framework/templates}/code/dotnet/frontend/component.razor +0 -0
  312. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/agent.cs +0 -0
  313. /package/.morph/{templates → framework/templates}/code/dotnet/jobs/job.cs +0 -0
  314. /package/.morph/{templates → framework/templates}/code/dotnet/test.cs +0 -0
  315. /package/.morph/{templates → framework/templates}/code/sql/rls-policy.sql +0 -0
  316. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.sql +0 -0
  317. /package/.morph/{templates → framework/templates}/code/sql/supabase-migration.template.sql +0 -0
  318. /package/.morph/{templates → framework/templates}/code/typescript/contracts.ts +0 -0
  319. /package/.morph/{templates → framework/templates}/docs/proposal.md +0 -0
  320. /package/.morph/{templates → framework/templates}/examples/design-system-examples.md +0 -0
  321. /package/.morph/{templates → framework/templates}/feature/decisions.md +0 -0
  322. /package/.morph/{templates → framework/templates}/feature/recap.md +0 -0
  323. /package/.morph/{templates → framework/templates}/feature/tasks.md +0 -0
  324. /package/.morph/{templates → framework/templates}/infrastructure/azure/Dockerfile.example +0 -0
  325. /package/.morph/{templates → framework/templates}/infrastructure/azure/README.md +0 -0
  326. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-insights.bicep +0 -0
  327. /package/.morph/{templates → framework/templates}/infrastructure/azure/app-service.bicep +0 -0
  328. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app-env.bicep +0 -0
  329. /package/.morph/{templates → framework/templates}/infrastructure/azure/container-app.bicep +0 -0
  330. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy-checklist.md +0 -0
  331. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.ps1 +0 -0
  332. /package/.morph/{templates → framework/templates}/infrastructure/azure/deploy.sh +0 -0
  333. /package/.morph/{templates → framework/templates}/infrastructure/azure/key-vault.bicep +0 -0
  334. /package/.morph/{templates → framework/templates}/infrastructure/azure/main.bicep +0 -0
  335. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.dev.json +0 -0
  336. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.prod.json +0 -0
  337. /package/.morph/{templates → framework/templates}/infrastructure/azure/parameters.staging.json +0 -0
  338. /package/.morph/{templates → framework/templates}/infrastructure/azure/sql-database.bicep +0 -0
  339. /package/.morph/{templates → framework/templates}/infrastructure/azure/storage.bicep +0 -0
  340. /package/.morph/{templates → framework/templates}/infrastructure/docker/Dockerfile.template +0 -0
  341. /package/.morph/{templates → framework/templates}/infrastructure/docker/docker-compose.template.yml +0 -0
  342. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-api.dockerfile +0 -0
  343. /package/.morph/{templates → framework/templates}/infrastructure/docker/dockerfile-web.dockerfile +0 -0
  344. /package/.morph/{templates → framework/templates}/infrastructure/docker/easypanel.template.json +0 -0
  345. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -0
  346. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -0
  347. /package/.morph/{templates → framework/templates}/infrastructure/github/actions/health-check/action.yml.hbs +0 -0
  348. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -0
  349. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -0
  350. /package/.morph/{templates → framework/templates}/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -0
  351. /package/.morph/{templates → framework/templates}/integrations/asaas-client.cs +0 -0
  352. /package/.morph/{templates → framework/templates}/integrations/asaas-webhook.cs +0 -0
  353. /package/.morph/{templates → framework/templates}/integrations/azure-identity-config.cs +0 -0
  354. /package/.morph/{templates → framework/templates}/integrations/clerk-config.cs +0 -0
  355. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-agent.md +0 -0
  356. /package/.morph/{templates → framework/templates}/meta-prompts/fusion/fusion-aggregator.md +0 -0
  357. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-retry.md +0 -0
  358. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-validation.md +0 -0
  359. /package/.morph/{templates → framework/templates}/meta-prompts/hops/hop-wrapper.md +0 -0
  360. /package/.morph/{templates → framework/templates}/meta-prompts/parallel-workers/parallel-coordinator.md +0 -0
  361. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/backend-squad.md +0 -0
  362. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/frontend-squad.md +0 -0
  363. /package/.morph/{templates → framework/templates}/meta-prompts/squad-leaders/squad-leader.md +0 -0
  364. /package/.morph/{templates → framework/templates}/meta-prompts/validators/checkpoint-validator.md +0 -0
  365. /package/.morph/{templates → framework/templates}/saas/subscription.cs +0 -0
  366. /package/.morph/{templates → framework/templates}/saas/tenant.cs +0 -0
  367. /package/.morph/{templates → framework/templates}/state.template.json +0 -0
  368. /package/.morph/{templates → framework/templates}/ui/FluentDesignTheme.cs +0 -0
  369. /package/.morph/{templates → framework/templates}/ui/MudTheme.cs +0 -0
  370. /package/.morph/{templates → framework/templates}/ui/design-system.css +0 -0
  371. /package/framework/hooks/{commit-msg → git/commit-msg}/conventional-commits.sh +0 -0
  372. /package/framework/hooks/{pre-commit → git/pre-commit}/agents.sh +0 -0
  373. /package/framework/hooks/{pre-commit → git/pre-commit}/orchestrator.sh +0 -0
  374. /package/framework/hooks/{pre-commit → git/pre-commit}/specs.sh +0 -0
  375. /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
+ }