0xray 2.0.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 (739) hide show
  1. package/.opencode/agents/api-design.yml +31 -0
  2. package/.opencode/agents/architect.yml +15 -0
  3. package/.opencode/agents/architecture-patterns.yml +14 -0
  4. package/.opencode/agents/auto-format.yml +14 -0
  5. package/.opencode/agents/backend-engineer.yml +12 -0
  6. package/.opencode/agents/boot-orchestrator.yml +14 -0
  7. package/.opencode/agents/bug-triage-specialist.yml +15 -0
  8. package/.opencode/agents/code-analyzer.yml +12 -0
  9. package/.opencode/agents/code-reviewer.yml +14 -0
  10. package/.opencode/agents/content-creator.yml +12 -0
  11. package/.opencode/agents/database-engineer.yml +12 -0
  12. package/.opencode/agents/devops-engineer.yml +12 -0
  13. package/.opencode/agents/framework-compliance-audit.yml +14 -0
  14. package/.opencode/agents/frontend-engineer.yml +12 -0
  15. package/.opencode/agents/frontend-ui-ux-engineer.yml +12 -0
  16. package/.opencode/agents/git-workflow.yml +15 -0
  17. package/.opencode/agents/growth-strategist.yml +12 -0
  18. package/.opencode/agents/hermes-agent.yml +12 -0
  19. package/.opencode/agents/inference-improve.yml +12 -0
  20. package/.opencode/agents/lint.yml +14 -0
  21. package/.opencode/agents/log-monitor.yml +12 -0
  22. package/.opencode/agents/mobile-developer.yml +12 -0
  23. package/.opencode/agents/model-health-check.yml +12 -0
  24. package/.opencode/agents/multimodal-looker.yml +12 -0
  25. package/.opencode/agents/performance-analysis.yml +12 -0
  26. package/.opencode/agents/performance-engineer.yml +12 -0
  27. package/.opencode/agents/performance-optimization.yml +12 -0
  28. package/.opencode/agents/processor-pipeline.yml +14 -0
  29. package/.opencode/agents/project-analysis.yml +12 -0
  30. package/.opencode/agents/refactorer.yml +12 -0
  31. package/.opencode/agents/researcher.yml +12 -0
  32. package/.opencode/agents/security-auditor.yml +12 -0
  33. package/.opencode/agents/security-scan.yml +12 -0
  34. package/.opencode/agents/seo-consultant.yml +12 -0
  35. package/.opencode/agents/session-management.yml +12 -0
  36. package/.opencode/agents/state-manager.yml +12 -0
  37. package/.opencode/agents/storyteller.yml +12 -0
  38. package/.opencode/agents/strategist.yml +12 -0
  39. package/.opencode/agents/tech-writer.yml +12 -0
  40. package/.opencode/agents/testing-best-practices.yml +12 -0
  41. package/.opencode/agents/testing-lead.yml +12 -0
  42. package/.opencode/agents/ui-ux-design.yml +12 -0
  43. package/.opencode/codex.codex +8 -0
  44. package/.opencode/commands/auto-format.md +99 -0
  45. package/.opencode/commands/auto-summary-capture.md +90 -0
  46. package/.opencode/commands/dependency-audit.md +184 -0
  47. package/.opencode/commands/enforcer-daily-scan.md +137 -0
  48. package/.opencode/commands/framework-compliance-audit.md +205 -0
  49. package/.opencode/commands/interactive-validator.md +75 -0
  50. package/.opencode/commands/job-summary-logger.md +68 -0
  51. package/.opencode/commands/lint.md +11 -0
  52. package/.opencode/commands/mode-switch.md +95 -0
  53. package/.opencode/commands/model-health-check.md +186 -0
  54. package/.opencode/commands/performance-analysis.md +144 -0
  55. package/.opencode/commands/pre-commit-introspection.md +185 -0
  56. package/.opencode/commands/pre-commit-introspection.sh +133 -0
  57. package/.opencode/commands/security-scan.md +157 -0
  58. package/.opencode/commands/sisyphus-validation.md +128 -0
  59. package/.opencode/commands/summary-logger.md +83 -0
  60. package/.opencode/enforcer-config.json +285 -0
  61. package/.opencode/hooks/hook-metrics.json +380 -0
  62. package/.opencode/hooks/post-commit +114 -0
  63. package/.opencode/hooks/post-push +34 -0
  64. package/.opencode/init.sh +151 -0
  65. package/.opencode/skills/api-design/SKILL.md +37 -0
  66. package/.opencode/skills/architect-tools/SKILL.md +37 -0
  67. package/.opencode/skills/architecture-patterns/SKILL.md +37 -0
  68. package/.opencode/skills/auto-format/SKILL.md +37 -0
  69. package/.opencode/skills/backend-engineer/SKILL.md +49 -0
  70. package/.opencode/skills/boot-orchestrator/SKILL.md +37 -0
  71. package/.opencode/skills/bug-triage/SKILL.md +43 -0
  72. package/.opencode/skills/code-analyzer/SKILL.md +45 -0
  73. package/.opencode/skills/code-review/SKILL.md +52 -0
  74. package/.opencode/skills/content-creator/SKILL.md +38 -0
  75. package/.opencode/skills/database-engineer/SKILL.md +46 -0
  76. package/.opencode/skills/devops-engineer/SKILL.md +49 -0
  77. package/.opencode/skills/enforcer/SKILL.md +37 -0
  78. package/.opencode/skills/framework-compliance-audit/SKILL.md +37 -0
  79. package/.opencode/skills/frontend-engineer/SKILL.md +49 -0
  80. package/.opencode/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  81. package/.opencode/skills/git-workflow/SKILL.md +37 -0
  82. package/.opencode/skills/growth-strategist/SKILL.md +48 -0
  83. package/.opencode/skills/hermes-agent/SKILL.md +212 -0
  84. package/.opencode/skills/inference-improve/SKILL.md +97 -0
  85. package/.opencode/skills/lint/SKILL.md +37 -0
  86. package/.opencode/skills/log-monitor/SKILL.md +44 -0
  87. package/.opencode/skills/mobile-developer/SKILL.md +42 -0
  88. package/.opencode/skills/model-health-check/SKILL.md +37 -0
  89. package/.opencode/skills/multimodal-looker/SKILL.md +45 -0
  90. package/.opencode/skills/orchestrator/SKILL.md +37 -0
  91. package/.opencode/skills/performance-analysis/SKILL.md +37 -0
  92. package/.opencode/skills/performance-engineer/SKILL.md +41 -0
  93. package/.opencode/skills/performance-optimization/SKILL.md +37 -0
  94. package/.opencode/skills/processor-pipeline/SKILL.md +37 -0
  95. package/.opencode/skills/project-analysis/SKILL.md +42 -0
  96. package/.opencode/skills/refactoring-strategies/SKILL.md +37 -0
  97. package/.opencode/skills/registry.json +66 -0
  98. package/.opencode/skills/researcher/SKILL.md +37 -0
  99. package/.opencode/skills/security-audit/SKILL.md +47 -0
  100. package/.opencode/skills/security-scan/SKILL.md +37 -0
  101. package/.opencode/skills/seo-consultant/SKILL.md +43 -0
  102. package/.opencode/skills/session-management/SKILL.md +36 -0
  103. package/.opencode/skills/state-manager/SKILL.md +37 -0
  104. package/.opencode/skills/storyteller/SKILL.md +130 -0
  105. package/.opencode/skills/strategist/SKILL.md +32 -0
  106. package/.opencode/skills/tech-writer/SKILL.md +37 -0
  107. package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
  108. package/.opencode/skills/testing-strategy/SKILL.md +43 -0
  109. package/.opencode/skills/ui-ux-design/SKILL.md +603 -0
  110. package/.opencode/workflows/post-deployment-audit.yml +123 -0
  111. package/AGENTS.md +110 -0
  112. package/LICENSE +21 -0
  113. package/README.md +131 -0
  114. package/dist/AGENTS.md +110 -0
  115. package/dist/CHANGELOG.md +2182 -0
  116. package/dist/LICENSE +21 -0
  117. package/dist/README.md +131 -0
  118. package/dist/agents/architect.js +56 -0
  119. package/dist/agents/backend-engineer.js +81 -0
  120. package/dist/agents/bug-triage-specialist.js +74 -0
  121. package/dist/agents/code-analyzer.js +150 -0
  122. package/dist/agents/code-reviewer.js +69 -0
  123. package/dist/agents/content-creator.js +72 -0
  124. package/dist/agents/database-engineer.js +76 -0
  125. package/dist/agents/devops-engineer.js +84 -0
  126. package/dist/agents/frontend-engineer.js +78 -0
  127. package/dist/agents/frontend-ui-ux-engineer.js +64 -0
  128. package/dist/agents/growth-strategist.js +111 -0
  129. package/dist/agents/index.js +45 -0
  130. package/dist/agents/librarian-agents-updater.js +333 -0
  131. package/dist/agents/log-monitor.js +109 -0
  132. package/dist/agents/mobile-developer.js +102 -0
  133. package/dist/agents/multimodal-looker.js +93 -0
  134. package/dist/agents/performance-engineer.js +86 -0
  135. package/dist/agents/refactorer.js +80 -0
  136. package/dist/agents/registry.js +340 -0
  137. package/dist/agents/researcher.js +83 -0
  138. package/dist/agents/security-auditor.js +158 -0
  139. package/dist/agents/seo-consultant.js +53 -0
  140. package/dist/agents/strategist.js +47 -0
  141. package/dist/agents/tech-writer.js +84 -0
  142. package/dist/agents/testing-lead.js +95 -0
  143. package/dist/agents/types.js +1 -0
  144. package/dist/analytics/consent-manager.js +258 -0
  145. package/dist/analytics/emerging-pattern-detector.js +260 -0
  146. package/dist/analytics/pattern-learning-engine.js +278 -0
  147. package/dist/analytics/pattern-performance-tracker.js +336 -0
  148. package/dist/analytics/predictive-analytics.js +248 -0
  149. package/dist/analytics/prompt-pattern-analyzer.js +371 -0
  150. package/dist/analytics/routing-performance-analyzer.js +356 -0
  151. package/dist/analytics/routing-refiner.js +380 -0
  152. package/dist/analytics/simple-pattern-analyzer.js +297 -0
  153. package/dist/architect/architect-tools.js +437 -0
  154. package/dist/architect/architectural-integrity.js +78 -0
  155. package/dist/benchmark/performance-benchmark.js +372 -0
  156. package/dist/cli/commands/analytics-disable.js +72 -0
  157. package/dist/cli/commands/analytics-enable-action.js +82 -0
  158. package/dist/cli/commands/analytics-preview.js +106 -0
  159. package/dist/cli/commands/analytics-status.js +68 -0
  160. package/dist/cli/commands/antigravity-status.js +106 -0
  161. package/dist/cli/commands/archive-logs.js +161 -0
  162. package/dist/cli/commands/credible-init.js +82 -0
  163. package/dist/cli/commands/grok-install.js +16 -0
  164. package/dist/cli/commands/hermes-install.js +66 -0
  165. package/dist/cli/commands/mcp-install.js +253 -0
  166. package/dist/cli/commands/openclaw-install.js +44 -0
  167. package/dist/cli/commands/opencode-install.js +99 -0
  168. package/dist/cli/commands/plugin-commands.js +246 -0
  169. package/dist/cli/commands/publish-agent.js +184 -0
  170. package/dist/cli/commands/security-audit.js +219 -0
  171. package/dist/cli/commands/skill-install.js +481 -0
  172. package/dist/cli/commands/status.js +196 -0
  173. package/dist/cli/commands/storyteller.js +230 -0
  174. package/dist/cli/index.js +986 -0
  175. package/dist/cli/server.js +147 -0
  176. package/dist/config/default-agents.js +16 -0
  177. package/dist/core/activity-logger.js +260 -0
  178. package/dist/core/adaptive-kernel.js +192 -0
  179. package/dist/core/agent-spawn-gate.js +120 -0
  180. package/dist/core/boot-orchestrator.js +812 -0
  181. package/dist/core/bridge.mjs +945 -0
  182. package/dist/core/codex-formatter.js +220 -0
  183. package/dist/core/codex-injector.js +424 -0
  184. package/dist/core/config-loader.js +148 -0
  185. package/dist/core/config-paths.js +162 -0
  186. package/dist/core/context-loader.js +269 -0
  187. package/dist/core/context-validator.js +212 -0
  188. package/dist/core/features-config.js +457 -0
  189. package/dist/core/framework-logger.js +275 -0
  190. package/dist/core/index.js +6 -0
  191. package/dist/core/kernel-patterns.js +302 -0
  192. package/dist/core/logging-config.js +43 -0
  193. package/dist/core/model-router.js +175 -0
  194. package/dist/core/orchestrator.js +408 -0
  195. package/dist/core/system-prompt-generator.js +265 -0
  196. package/dist/core/trace-context.js +33 -0
  197. package/dist/core/xray-activation.js +134 -0
  198. package/dist/delegation/agent-delegator.js +769 -0
  199. package/dist/delegation/agent-expertise.js +156 -0
  200. package/dist/delegation/analytics/index.js +12 -0
  201. package/dist/delegation/analytics/learning-engine.js +277 -0
  202. package/dist/delegation/analytics/outcome-tracker.js +279 -0
  203. package/dist/delegation/analytics/routing-analytics.js +193 -0
  204. package/dist/delegation/ast-code-parser.js +878 -0
  205. package/dist/delegation/codebase-context-analyzer.js +1040 -0
  206. package/dist/delegation/complexity-analyzer.js +282 -0
  207. package/dist/delegation/complexity-core.js +219 -0
  208. package/dist/delegation/config/types.js +6 -0
  209. package/dist/delegation/dependency-graph-builder.js +409 -0
  210. package/dist/delegation/index.js +20 -0
  211. package/dist/delegation/metrics-aggregator.js +335 -0
  212. package/dist/delegation/session-coordinator.js +352 -0
  213. package/dist/delegation/strategy-selector.js +108 -0
  214. package/dist/delegation/voting-coordinator.js +375 -0
  215. package/dist/delegation/voting-types.js +10 -0
  216. package/dist/delegation/weighted-voting-aggregator.js +194 -0
  217. package/dist/enforcement/core/index.js +19 -0
  218. package/dist/enforcement/core/rule-executor.js +365 -0
  219. package/dist/enforcement/core/rule-hierarchy.js +259 -0
  220. package/dist/enforcement/core/rule-registry.js +240 -0
  221. package/dist/enforcement/core/violation-fixer.js +651 -0
  222. package/dist/enforcement/enforcer-tools.js +909 -0
  223. package/dist/enforcement/index.js +41 -0
  224. package/dist/enforcement/loaders/agent-triage-loader.js +222 -0
  225. package/dist/enforcement/loaders/agents-md-validation-loader.js +252 -0
  226. package/dist/enforcement/loaders/base-loader.js +86 -0
  227. package/dist/enforcement/loaders/codex-loader.js +396 -0
  228. package/dist/enforcement/loaders/index.js +40 -0
  229. package/dist/enforcement/loaders/loader-orchestrator.js +168 -0
  230. package/dist/enforcement/loaders/processor-loader.js +113 -0
  231. package/dist/enforcement/rule-enforcer.js +298 -0
  232. package/dist/enforcement/test-auto-healing.js +325 -0
  233. package/dist/enforcement/types.js +30 -0
  234. package/dist/enforcement/validators/architecture-validators.js +600 -0
  235. package/dist/enforcement/validators/base-validator.js +108 -0
  236. package/dist/enforcement/validators/code-quality-validators.js +336 -0
  237. package/dist/enforcement/validators/index.js +21 -0
  238. package/dist/enforcement/validators/security-validators.js +220 -0
  239. package/dist/enforcement/validators/testing-validators.js +253 -0
  240. package/dist/enforcement/validators/validator-registry.js +150 -0
  241. package/dist/execution/opencode-cli-invoker.js +173 -0
  242. package/dist/execution/proposal-applier.js +254 -0
  243. package/dist/governance/codex-policy.service.js +167 -0
  244. package/dist/governance/governance-core.js +152 -0
  245. package/dist/governance/governance-service.js +274 -0
  246. package/dist/governance/governance-types.js +6 -0
  247. package/dist/index.js +24 -0
  248. package/dist/inference/deploy-verifier.js +161 -0
  249. package/dist/inference/index.js +5 -0
  250. package/dist/inference/inference-accumulator.js +126 -0
  251. package/dist/inference/inference-cycle.js +1168 -0
  252. package/dist/inference/semantic-patterns.js +310 -0
  253. package/dist/inference/session-capture.js +308 -0
  254. package/dist/integrations/base/ExampleIntegration.js +181 -0
  255. package/dist/integrations/base/Integration.js +395 -0
  256. package/dist/integrations/base/README.md +446 -0
  257. package/dist/integrations/base/index.js +16 -0
  258. package/dist/integrations/base/registry.js +606 -0
  259. package/dist/integrations/base/types.js +118 -0
  260. package/dist/integrations/governance/governance-client.js +316 -0
  261. package/dist/integrations/governance/index.js +373 -0
  262. package/dist/integrations/governance/types.js +97 -0
  263. package/dist/integrations/grok/grok-cli.js +83 -0
  264. package/dist/integrations/grok/hooks/pre-tool-use.js +134 -0
  265. package/dist/integrations/grok/plugin/0xray/.mcp.json +15 -0
  266. package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
  267. package/dist/integrations/hermes-agent/__init__.py +718 -0
  268. package/dist/integrations/hermes-agent/after-install.md +71 -0
  269. package/dist/integrations/hermes-agent/bridge.mjs +861 -0
  270. package/dist/integrations/hermes-agent/conftest.py +14 -0
  271. package/dist/integrations/hermes-agent/plugin.yaml +12 -0
  272. package/dist/integrations/hermes-agent/schemas.py +100 -0
  273. package/dist/integrations/hermes-agent/test_plugin.py +1100 -0
  274. package/dist/integrations/hermes-agent/tools.py +253 -0
  275. package/dist/integrations/openclaw/README.md +134 -0
  276. package/dist/integrations/openclaw/api-server.js +389 -0
  277. package/dist/integrations/openclaw/client.js +492 -0
  278. package/dist/integrations/openclaw/config.js +374 -0
  279. package/dist/integrations/openclaw/hooks/strray-hooks.js +280 -0
  280. package/dist/integrations/openclaw/index.js +351 -0
  281. package/dist/integrations/openclaw/types.js +153 -0
  282. package/dist/integrations/plugins/index.js +10 -0
  283. package/dist/integrations/plugins/plugin-integration.js +606 -0
  284. package/dist/integrations/plugins/plugin-registry.js +580 -0
  285. package/dist/mcps/agent-resolver.js +106 -0
  286. package/dist/mcps/architect-tools.server.js +277 -0
  287. package/dist/mcps/auto-format.server.js +413 -0
  288. package/dist/mcps/boot-orchestrator.server.js +853 -0
  289. package/dist/mcps/config/config-loader.js +103 -0
  290. package/dist/mcps/config/config-validator.js +101 -0
  291. package/dist/mcps/config/index.js +30 -0
  292. package/dist/mcps/config/plugin-server-registry.js +223 -0
  293. package/dist/mcps/config/server-config-registry.js +348 -0
  294. package/dist/mcps/connection/connection-manager.js +79 -0
  295. package/dist/mcps/connection/connection-pool.js +164 -0
  296. package/dist/mcps/connection/mcp-connection.js +233 -0
  297. package/dist/mcps/connection/process-spawner.js +34 -0
  298. package/dist/mcps/enforcer-tools.server.js +778 -0
  299. package/dist/mcps/estimation.server.js +192 -0
  300. package/dist/mcps/framework-compliance-audit.server.js +500 -0
  301. package/dist/mcps/framework-help.server.js +400 -0
  302. package/dist/mcps/governance.server.js +464 -0
  303. package/dist/mcps/in-process-skill-registry.js +48 -0
  304. package/dist/mcps/knowledge-skills/api-design.server.js +123 -0
  305. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +113 -0
  306. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +474 -0
  307. package/dist/mcps/knowledge-skills/code-analyzer.server.js +605 -0
  308. package/dist/mcps/knowledge-skills/code-review.server.js +847 -0
  309. package/dist/mcps/knowledge-skills/content-creator.server.js +256 -0
  310. package/dist/mcps/knowledge-skills/database-design.server.js +822 -0
  311. package/dist/mcps/knowledge-skills/devops-deployment.server.js +1180 -0
  312. package/dist/mcps/knowledge-skills/git-workflow.server.js +115 -0
  313. package/dist/mcps/knowledge-skills/growth-strategist.server.js +361 -0
  314. package/dist/mcps/knowledge-skills/log-monitor.server.js +451 -0
  315. package/dist/mcps/knowledge-skills/mobile-development.server.js +525 -0
  316. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +1063 -0
  317. package/dist/mcps/knowledge-skills/performance-optimization.server.js +1587 -0
  318. package/dist/mcps/knowledge-skills/project-analysis.server.js +811 -0
  319. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +796 -0
  320. package/dist/mcps/knowledge-skills/security-audit.server.js +846 -0
  321. package/dist/mcps/knowledge-skills/seo-consultant.server.js +937 -0
  322. package/dist/mcps/knowledge-skills/session-management.server.js +470 -0
  323. package/dist/mcps/knowledge-skills/skill-invocation.server.js +729 -0
  324. package/dist/mcps/knowledge-skills/strategist.server.js +217 -0
  325. package/dist/mcps/knowledge-skills/tech-writer.server.js +1191 -0
  326. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +866 -0
  327. package/dist/mcps/knowledge-skills/testing-strategy.server.js +827 -0
  328. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +1538 -0
  329. package/dist/mcps/lint.server.js +381 -0
  330. package/dist/mcps/mcp-client.js +574 -0
  331. package/dist/mcps/model-health-check.server.js +228 -0
  332. package/dist/mcps/orchestrator/config/agent-capabilities.js +87 -0
  333. package/dist/mcps/orchestrator/execution/execution-planner.js +279 -0
  334. package/dist/mcps/orchestrator/handlers/complexity-handler.js +94 -0
  335. package/dist/mcps/orchestrator/handlers/status-handler.js +232 -0
  336. package/dist/mcps/orchestrator/handlers/task-handler.js +197 -0
  337. package/dist/mcps/orchestrator/server.js +305 -0
  338. package/dist/mcps/orchestrator/types.js +6 -0
  339. package/dist/mcps/orchestrator.server.js +19 -0
  340. package/dist/mcps/performance-analysis.server.js +519 -0
  341. package/dist/mcps/processor-pipeline.server.js +561 -0
  342. package/dist/mcps/protocol/protocol-constants.js +46 -0
  343. package/dist/mcps/registry.json +110 -0
  344. package/dist/mcps/researcher.server.js +504 -0
  345. package/dist/mcps/security-scan.server.js +531 -0
  346. package/dist/mcps/simulation/index.js +12 -0
  347. package/dist/mcps/simulation/server-simulations.js +219 -0
  348. package/dist/mcps/simulation/simulation-engine.js +96 -0
  349. package/dist/mcps/state-manager.server.js +637 -0
  350. package/dist/mcps/tools/index.js +14 -0
  351. package/dist/mcps/tools/tool-cache.js +112 -0
  352. package/dist/mcps/tools/tool-discovery.js +65 -0
  353. package/dist/mcps/tools/tool-executor.js +75 -0
  354. package/dist/mcps/tools/tool-registry.js +67 -0
  355. package/dist/mcps/types/index.js +15 -0
  356. package/dist/mcps/types/json-rpc.types.js +7 -0
  357. package/dist/mcps/types/mcp.types.js +7 -0
  358. package/dist/metrics/agent-metrics.js +574 -0
  359. package/dist/metrics/index.js +6 -0
  360. package/dist/monitoring/advanced-profiler.js +232 -0
  361. package/dist/monitoring/memory-monitor.js +315 -0
  362. package/dist/monitoring/nudge-watchdog.js +356 -0
  363. package/dist/monitoring/test-auto-generation-monitor.js +157 -0
  364. package/dist/orchestrator/agent-spawn-governor.js +559 -0
  365. package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +399 -0
  366. package/dist/orchestrator/intelligent-commit-batcher.js +353 -0
  367. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +456 -0
  368. package/dist/orchestrator/orchestrator.js +657 -0
  369. package/dist/orchestrator/self-direction-activation.js +245 -0
  370. package/dist/orchestrator/universal-librarian-consultation.js +216 -0
  371. package/dist/orchestrator/universal-registry-bridge.js +247 -0
  372. package/dist/performance/performance-budget-enforcer.js +434 -0
  373. package/dist/performance/performance-regression-tester.js +342 -0
  374. package/dist/plugin/xray-codex-injection.js +857 -0
  375. package/dist/postprocessor/PostProcessor.js +1048 -0
  376. package/dist/postprocessor/analysis/FailureAnalysisEngine.js +245 -0
  377. package/dist/postprocessor/autofix/AutoFixEngine.js +254 -0
  378. package/dist/postprocessor/autofix/FixValidator.js +56 -0
  379. package/dist/postprocessor/config.js +65 -0
  380. package/dist/postprocessor/escalation/EscalationEngine.js +492 -0
  381. package/dist/postprocessor/monitoring/MonitoringEngine.js +125 -0
  382. package/dist/postprocessor/redeploy/RedeployCoordinator.js +342 -0
  383. package/dist/postprocessor/services/RegressionAnalysisService.js +131 -0
  384. package/dist/postprocessor/success/SuccessHandler.js +134 -0
  385. package/dist/postprocessor/triggers/APITrigger.js +115 -0
  386. package/dist/postprocessor/triggers/GitHookTrigger.js +551 -0
  387. package/dist/postprocessor/triggers/WebhookTrigger.js +211 -0
  388. package/dist/postprocessor/types.js +4 -0
  389. package/dist/processors/doc-write-guard.js +46 -0
  390. package/dist/processors/implementations/agents-md-validation-processor.js +286 -0
  391. package/dist/processors/implementations/async-pattern-processor.js +158 -0
  392. package/dist/processors/implementations/codex-compliance-processor.js +57 -0
  393. package/dist/processors/implementations/commit-batcher-processor.js +71 -0
  394. package/dist/processors/implementations/console-log-guard-processor.js +163 -0
  395. package/dist/processors/implementations/coverage-analysis-processor.js +138 -0
  396. package/dist/processors/implementations/error-boundary-processor.js +44 -0
  397. package/dist/processors/implementations/inference-improvement-processor.js +270 -0
  398. package/dist/processors/implementations/log-protection-processor.js +118 -0
  399. package/dist/processors/implementations/nudge-processor.js +130 -0
  400. package/dist/processors/implementations/performance-budget-processor.js +217 -0
  401. package/dist/processors/implementations/postprocessor-chain-validator.js +149 -0
  402. package/dist/processors/implementations/pre-validate-processor.js +18 -0
  403. package/dist/processors/implementations/publish-preflight-processor.js +249 -0
  404. package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +33 -0
  405. package/dist/processors/implementations/refactoring-logging-processor.js +96 -0
  406. package/dist/processors/implementations/regression-testing-processor.js +59 -0
  407. package/dist/processors/implementations/session-capture-processor.js +37 -0
  408. package/dist/processors/implementations/session-summary-processor.js +130 -0
  409. package/dist/processors/implementations/spawn-governance-processor.js +219 -0
  410. package/dist/processors/implementations/state-validation-processor.js +15 -0
  411. package/dist/processors/implementations/storytelling-trigger-processor.js +589 -0
  412. package/dist/processors/implementations/test-auto-creation-processor.js +484 -0
  413. package/dist/processors/implementations/test-execution-processor.js +132 -0
  414. package/dist/processors/implementations/typescript-compilation-processor.js +87 -0
  415. package/dist/processors/implementations/version-compliance-processor.js +350 -0
  416. package/dist/processors/processor-interfaces.js +126 -0
  417. package/dist/processors/processor-manager.js +826 -0
  418. package/dist/processors/processor-types.js +12 -0
  419. package/dist/public/about.html +228 -0
  420. package/dist/public/enterprise.html +27 -0
  421. package/dist/public/features.html +102 -0
  422. package/dist/public/index.html +145 -0
  423. package/dist/reporting/framework-reporting-system.js +187 -0
  424. package/dist/reporting/log-parser.js +281 -0
  425. package/dist/reporting/metrics.js +202 -0
  426. package/dist/reporting/report-formatter.js +146 -0
  427. package/dist/reporting/types.js +1 -0
  428. package/dist/scripts/activate-kernel-pipeline.js +101 -0
  429. package/dist/scripts/integration.js +234 -0
  430. package/dist/scripts/pre-command +26 -0
  431. package/dist/scripts/pre-command.mjs +358 -0
  432. package/dist/security/comprehensive-security-audit.js +1005 -0
  433. package/dist/security/index.js +13 -0
  434. package/dist/security/prompt-security-validator.js +148 -0
  435. package/dist/security/security-agent-coordinator.js +204 -0
  436. package/dist/security/security-auditor.js +584 -0
  437. package/dist/security/security-hardener.js +170 -0
  438. package/dist/security/security-hardening-system.js +727 -0
  439. package/dist/security/security-headers.js +118 -0
  440. package/dist/security/security-orchestration-layer.js +496 -0
  441. package/dist/security/security-scanner.js +429 -0
  442. package/dist/services/inference-tuner.js +301 -0
  443. package/dist/session/index.js +3 -0
  444. package/dist/session/session-cleanup-manager.js +366 -0
  445. package/dist/session/session-monitor.js +503 -0
  446. package/dist/session/session-state-manager.js +522 -0
  447. package/dist/skills/api-design/SKILL.md +37 -0
  448. package/dist/skills/architect-tools/SKILL.md +37 -0
  449. package/dist/skills/architecture-patterns/SKILL.md +37 -0
  450. package/dist/skills/auto-format/SKILL.md +37 -0
  451. package/dist/skills/backend-engineer/SKILL.md +49 -0
  452. package/dist/skills/boot-orchestrator/SKILL.md +37 -0
  453. package/dist/skills/bug-triage/SKILL.md +43 -0
  454. package/dist/skills/code-analyzer/SKILL.md +45 -0
  455. package/dist/skills/code-review/SKILL.md +52 -0
  456. package/dist/skills/content-creator/SKILL.md +38 -0
  457. package/dist/skills/database-engineer/SKILL.md +46 -0
  458. package/dist/skills/devops-engineer/SKILL.md +49 -0
  459. package/dist/skills/enforcer/SKILL.md +37 -0
  460. package/dist/skills/framework-compliance-audit/SKILL.md +37 -0
  461. package/dist/skills/frontend-engineer/SKILL.md +49 -0
  462. package/dist/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  463. package/dist/skills/git-workflow/SKILL.md +37 -0
  464. package/dist/skills/growth-strategist/SKILL.md +48 -0
  465. package/dist/skills/hermes-agent/SKILL.md +212 -0
  466. package/dist/skills/inference-improve/SKILL.md +97 -0
  467. package/dist/skills/lint/SKILL.md +37 -0
  468. package/dist/skills/log-monitor/SKILL.md +44 -0
  469. package/dist/skills/mobile-developer/SKILL.md +42 -0
  470. package/dist/skills/model-health-check/SKILL.md +37 -0
  471. package/dist/skills/multimodal-looker/SKILL.md +45 -0
  472. package/dist/skills/orchestrator/SKILL.md +37 -0
  473. package/dist/skills/performance-analysis/SKILL.md +37 -0
  474. package/dist/skills/performance-engineer/SKILL.md +41 -0
  475. package/dist/skills/performance-optimization/SKILL.md +37 -0
  476. package/dist/skills/processor-pipeline/SKILL.md +37 -0
  477. package/dist/skills/project-analysis/SKILL.md +42 -0
  478. package/dist/skills/refactoring-strategies/SKILL.md +37 -0
  479. package/dist/skills/registry.json +66 -0
  480. package/dist/skills/researcher/SKILL.md +37 -0
  481. package/dist/skills/security-audit/SKILL.md +48 -0
  482. package/dist/skills/security-scan/SKILL.md +37 -0
  483. package/dist/skills/seo-consultant/SKILL.md +43 -0
  484. package/dist/skills/session-management/SKILL.md +36 -0
  485. package/dist/skills/state-manager/SKILL.md +37 -0
  486. package/dist/skills/storyteller/SKILL.md +130 -0
  487. package/dist/skills/strategist/SKILL.md +32 -0
  488. package/dist/skills/tech-writer/SKILL.md +37 -0
  489. package/dist/skills/testing-best-practices/SKILL.md +37 -0
  490. package/dist/skills/testing-strategy/SKILL.md +43 -0
  491. package/dist/skills/ui-ux-design/SKILL.md +603 -0
  492. package/dist/state/context-providers.js +1 -0
  493. package/dist/state/index.js +7 -0
  494. package/dist/state/state-manager.js +208 -0
  495. package/dist/state/state-types.js +1 -0
  496. package/dist/testing/memory-regression-suite.js +258 -0
  497. package/dist/utils/batch-operations.js +292 -0
  498. package/dist/utils/codex-parser.js +445 -0
  499. package/dist/utils/command-runner.js +96 -0
  500. package/dist/utils/import-resolver.js +189 -0
  501. package/dist/utils/language-detector.js +383 -0
  502. package/dist/utils/path-resolver.js +112 -0
  503. package/dist/utils/shutdown-handler.js +75 -0
  504. package/dist/utils/test-template-generator.js +178 -0
  505. package/dist/utils/token-manager.js +163 -0
  506. package/dist/validation/estimation-validator.js +241 -0
  507. package/dist/validation/report-content-validator.js +218 -0
  508. package/opencode.json +153 -0
  509. package/package.json +170 -0
  510. package/scripts/helpers/resolve-config-path.cjs +57 -0
  511. package/scripts/helpers/resolve-config-path.mjs +73 -0
  512. package/scripts/hooks/pre-command +26 -0
  513. package/scripts/hooks/pre-command.mjs +358 -0
  514. package/scripts/hooks/run-hook.js +570 -0
  515. package/scripts/mjs/test-consumer-readiness.mjs +273 -0
  516. package/scripts/mjs/test-mcp-functionality.mjs +507 -0
  517. package/scripts/mjs/validate-mcp-connectivity.cjs +75 -0
  518. package/scripts/mjs/validate-postinstall-config.mjs +308 -0
  519. package/scripts/node/auto-reflection-generator.mjs +496 -0
  520. package/scripts/node/basic-security-audit.cjs +338 -0
  521. package/scripts/node/ci-cd-auto-fix.cjs +263 -0
  522. package/scripts/node/ci-report-generator.mjs +227 -0
  523. package/scripts/node/enforce-agents-md.mjs +420 -0
  524. package/scripts/node/enforce-version-compliance.sh +22 -0
  525. package/scripts/node/enforce-version-compliance.ts +126 -0
  526. package/scripts/node/github-actions-monitor.cjs +23 -0
  527. package/scripts/node/govern-reflection.mjs +160 -0
  528. package/scripts/node/postinstall.cjs +78 -0
  529. package/scripts/node/pre-publish-guard.js +267 -0
  530. package/scripts/node/prepare-consumer.cjs +143 -0
  531. package/scripts/node/reflection-processor.cjs +213 -0
  532. package/scripts/node/reflection-validate.sh +194 -0
  533. package/scripts/node/release-tweet.mjs +39 -0
  534. package/scripts/node/release.js +159 -0
  535. package/scripts/node/release.mjs +213 -0
  536. package/scripts/node/setup-dev.cjs +83 -0
  537. package/scripts/node/setup.cjs +214 -0
  538. package/scripts/node/sync-versions.mjs +140 -0
  539. package/scripts/node/universal-version-manager.js +1025 -0
  540. package/scripts/node/validate-external-processes.js +265 -0
  541. package/scripts/node/validate-mcp-connectivity.js +258 -0
  542. package/scripts/node/version-manager.mjs +524 -0
  543. package/scripts/validate-stringray-comprehensive.js +636 -0
  544. package/src/integrations/grok/plugin/0xray/.mcp.json +15 -0
  545. package/src/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
  546. package/src/mcps/agent-resolver.ts +168 -0
  547. package/src/mcps/architect-tools.server.ts +343 -0
  548. package/src/mcps/auto-format.server.ts +529 -0
  549. package/src/mcps/boot-orchestrator.server.ts +1082 -0
  550. package/src/mcps/config/__tests__/config-loader.test.ts +338 -0
  551. package/src/mcps/config/__tests__/config-validator.test.ts +646 -0
  552. package/src/mcps/config/__tests__/server-config-registry.test.ts +257 -0
  553. package/src/mcps/config/config-loader.ts +127 -0
  554. package/src/mcps/config/config-validator.ts +127 -0
  555. package/src/mcps/config/index.ts +32 -0
  556. package/src/mcps/config/plugin-server-registry.ts +335 -0
  557. package/src/mcps/config/server-config-registry.ts +395 -0
  558. package/src/mcps/connection/connection-manager.ts +91 -0
  559. package/src/mcps/connection/connection-pool.ts +216 -0
  560. package/src/mcps/connection/mcp-connection.ts +327 -0
  561. package/src/mcps/connection/process-spawner.ts +47 -0
  562. package/src/mcps/enforcer-tools.server.ts +1106 -0
  563. package/src/mcps/estimation.server.ts +229 -0
  564. package/src/mcps/framework-compliance-audit.server.ts +635 -0
  565. package/src/mcps/framework-help.server.ts +467 -0
  566. package/src/mcps/governance.server.ts +551 -0
  567. package/src/mcps/in-process-skill-registry.ts +79 -0
  568. package/src/mcps/knowledge-skills/api-design.server.test.ts +41 -0
  569. package/src/mcps/knowledge-skills/api-design.server.ts +160 -0
  570. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +152 -0
  571. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +624 -0
  572. package/src/mcps/knowledge-skills/code-analyzer.server.test.ts +129 -0
  573. package/src/mcps/knowledge-skills/code-analyzer.server.ts +591 -0
  574. package/src/mcps/knowledge-skills/code-review.server.ts +1132 -0
  575. package/src/mcps/knowledge-skills/content-creator.server.ts +300 -0
  576. package/src/mcps/knowledge-skills/database-design.server.ts +1200 -0
  577. package/src/mcps/knowledge-skills/devops-deployment.server.ts +1622 -0
  578. package/src/mcps/knowledge-skills/git-workflow.server.ts +152 -0
  579. package/src/mcps/knowledge-skills/growth-strategist.server.ts +413 -0
  580. package/src/mcps/knowledge-skills/log-monitor.server.ts +619 -0
  581. package/src/mcps/knowledge-skills/mobile-development.server.ts +672 -0
  582. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +1500 -0
  583. package/src/mcps/knowledge-skills/performance-optimization.server.ts +2065 -0
  584. package/src/mcps/knowledge-skills/project-analysis.server.ts +1111 -0
  585. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +1092 -0
  586. package/src/mcps/knowledge-skills/security-audit.server.test.ts +112 -0
  587. package/src/mcps/knowledge-skills/security-audit.server.ts +1193 -0
  588. package/src/mcps/knowledge-skills/seo-consultant.server.ts +1160 -0
  589. package/src/mcps/knowledge-skills/session-management.server.ts +576 -0
  590. package/src/mcps/knowledge-skills/skill-invocation.server.ts +941 -0
  591. package/src/mcps/knowledge-skills/strategist.server.ts +267 -0
  592. package/src/mcps/knowledge-skills/tech-writer.server.ts +1638 -0
  593. package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +136 -0
  594. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +1232 -0
  595. package/src/mcps/knowledge-skills/testing-strategy.server.test.ts +100 -0
  596. package/src/mcps/knowledge-skills/testing-strategy.server.ts +1172 -0
  597. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +2076 -0
  598. package/src/mcps/lint.server.ts +483 -0
  599. package/src/mcps/mcp-client.ts +706 -0
  600. package/src/mcps/model-health-check.server.ts +292 -0
  601. package/src/mcps/orchestrator/config/agent-capabilities.ts +108 -0
  602. package/src/mcps/orchestrator/execution/execution-planner.ts +353 -0
  603. package/src/mcps/orchestrator/handlers/complexity-handler.ts +125 -0
  604. package/src/mcps/orchestrator/handlers/status-handler.ts +295 -0
  605. package/src/mcps/orchestrator/handlers/task-handler.ts +268 -0
  606. package/src/mcps/orchestrator/server.ts +388 -0
  607. package/src/mcps/orchestrator/types.ts +81 -0
  608. package/src/mcps/orchestrator.server.ts +34 -0
  609. package/src/mcps/performance-analysis.server.ts +715 -0
  610. package/src/mcps/processor-pipeline.server.ts +778 -0
  611. package/src/mcps/protocol/protocol-constants.ts +51 -0
  612. package/src/mcps/registry.json +110 -0
  613. package/src/mcps/researcher.server.ts +595 -0
  614. package/src/mcps/security-scan.server.ts +651 -0
  615. package/src/mcps/simulation/__tests__/simulation-engine.test.ts +275 -0
  616. package/src/mcps/simulation/index.ts +23 -0
  617. package/src/mcps/simulation/server-simulations.ts +241 -0
  618. package/src/mcps/simulation/simulation-engine.ts +126 -0
  619. package/src/mcps/state-manager.server.ts +777 -0
  620. package/src/mcps/tools/__tests__/tool-cache.test.ts +205 -0
  621. package/src/mcps/tools/__tests__/tool-discovery.test.ts +189 -0
  622. package/src/mcps/tools/__tests__/tool-executor.test.ts +215 -0
  623. package/src/mcps/tools/__tests__/tool-registry.test.ts +230 -0
  624. package/src/mcps/tools/index.ts +15 -0
  625. package/src/mcps/tools/tool-cache.ts +145 -0
  626. package/src/mcps/tools/tool-discovery.ts +83 -0
  627. package/src/mcps/tools/tool-executor.ts +106 -0
  628. package/src/mcps/tools/tool-registry.ts +78 -0
  629. package/src/mcps/types/__tests__/types.test.ts +341 -0
  630. package/src/mcps/types/index.ts +17 -0
  631. package/src/mcps/types/json-rpc.types.ts +38 -0
  632. package/src/mcps/types/mcp.types.ts +115 -0
  633. package/src/opencode/agents/api-design.yml +31 -0
  634. package/src/opencode/agents/architect.yml +15 -0
  635. package/src/opencode/agents/architecture-patterns.yml +14 -0
  636. package/src/opencode/agents/auto-format.yml +14 -0
  637. package/src/opencode/agents/backend-engineer.yml +12 -0
  638. package/src/opencode/agents/boot-orchestrator.yml +14 -0
  639. package/src/opencode/agents/bug-triage-specialist.yml +15 -0
  640. package/src/opencode/agents/code-analyzer.yml +12 -0
  641. package/src/opencode/agents/code-reviewer.yml +14 -0
  642. package/src/opencode/agents/content-creator.yml +12 -0
  643. package/src/opencode/agents/database-engineer.yml +12 -0
  644. package/src/opencode/agents/devops-engineer.yml +12 -0
  645. package/src/opencode/agents/framework-compliance-audit.yml +14 -0
  646. package/src/opencode/agents/frontend-engineer.yml +12 -0
  647. package/src/opencode/agents/frontend-ui-ux-engineer.yml +12 -0
  648. package/src/opencode/agents/git-workflow.yml +15 -0
  649. package/src/opencode/agents/growth-strategist.yml +12 -0
  650. package/src/opencode/agents/hermes-agent.yml +12 -0
  651. package/src/opencode/agents/inference-improve.yml +12 -0
  652. package/src/opencode/agents/lint.yml +14 -0
  653. package/src/opencode/agents/log-monitor.yml +12 -0
  654. package/src/opencode/agents/mobile-developer.yml +12 -0
  655. package/src/opencode/agents/model-health-check.yml +12 -0
  656. package/src/opencode/agents/multimodal-looker.yml +12 -0
  657. package/src/opencode/agents/performance-analysis.yml +12 -0
  658. package/src/opencode/agents/performance-engineer.yml +12 -0
  659. package/src/opencode/agents/performance-optimization.yml +12 -0
  660. package/src/opencode/agents/processor-pipeline.yml +14 -0
  661. package/src/opencode/agents/project-analysis.yml +12 -0
  662. package/src/opencode/agents/refactorer.yml +12 -0
  663. package/src/opencode/agents/researcher.yml +12 -0
  664. package/src/opencode/agents/security-auditor.yml +12 -0
  665. package/src/opencode/agents/security-scan.yml +12 -0
  666. package/src/opencode/agents/seo-consultant.yml +12 -0
  667. package/src/opencode/agents/session-management.yml +12 -0
  668. package/src/opencode/agents/state-manager.yml +12 -0
  669. package/src/opencode/agents/storyteller.yml +12 -0
  670. package/src/opencode/agents/strategist.yml +12 -0
  671. package/src/opencode/agents/tech-writer.yml +12 -0
  672. package/src/opencode/agents/testing-best-practices.yml +12 -0
  673. package/src/opencode/agents/testing-lead.yml +12 -0
  674. package/src/opencode/agents/ui-ux-design.yml +12 -0
  675. package/src/opencode/codex.codex +8 -0
  676. package/src/opencode/commands/auto-format.md +99 -0
  677. package/src/opencode/commands/auto-summary-capture.md +90 -0
  678. package/src/opencode/commands/dependency-audit.md +184 -0
  679. package/src/opencode/commands/enforcer-daily-scan.md +137 -0
  680. package/src/opencode/commands/framework-compliance-audit.md +205 -0
  681. package/src/opencode/commands/interactive-validator.md +75 -0
  682. package/src/opencode/commands/job-summary-logger.md +68 -0
  683. package/src/opencode/commands/lint.md +11 -0
  684. package/src/opencode/commands/mode-switch.md +95 -0
  685. package/src/opencode/commands/model-health-check.md +186 -0
  686. package/src/opencode/commands/performance-analysis.md +144 -0
  687. package/src/opencode/commands/pre-commit-introspection.md +185 -0
  688. package/src/opencode/commands/pre-commit-introspection.sh +133 -0
  689. package/src/opencode/commands/security-scan.md +157 -0
  690. package/src/opencode/commands/sisyphus-validation.md +128 -0
  691. package/src/opencode/commands/summary-logger.md +83 -0
  692. package/src/opencode/enforcer-config.json +285 -0
  693. package/src/opencode/openclaw/config.json +25 -0
  694. package/src/opencode/workflows/post-deployment-audit.yml +123 -0
  695. package/src/skills/api-design/SKILL.md +37 -0
  696. package/src/skills/architect-tools/SKILL.md +37 -0
  697. package/src/skills/architecture-patterns/SKILL.md +37 -0
  698. package/src/skills/auto-format/SKILL.md +37 -0
  699. package/src/skills/backend-engineer/SKILL.md +49 -0
  700. package/src/skills/boot-orchestrator/SKILL.md +37 -0
  701. package/src/skills/bug-triage/SKILL.md +43 -0
  702. package/src/skills/code-analyzer/SKILL.md +45 -0
  703. package/src/skills/code-review/SKILL.md +52 -0
  704. package/src/skills/content-creator/SKILL.md +38 -0
  705. package/src/skills/database-engineer/SKILL.md +46 -0
  706. package/src/skills/devops-engineer/SKILL.md +49 -0
  707. package/src/skills/enforcer/SKILL.md +37 -0
  708. package/src/skills/framework-compliance-audit/SKILL.md +37 -0
  709. package/src/skills/frontend-engineer/SKILL.md +49 -0
  710. package/src/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  711. package/src/skills/git-workflow/SKILL.md +37 -0
  712. package/src/skills/growth-strategist/SKILL.md +48 -0
  713. package/src/skills/hermes-agent/SKILL.md +212 -0
  714. package/src/skills/inference-improve/SKILL.md +97 -0
  715. package/src/skills/lint/SKILL.md +37 -0
  716. package/src/skills/log-monitor/SKILL.md +44 -0
  717. package/src/skills/mobile-developer/SKILL.md +42 -0
  718. package/src/skills/model-health-check/SKILL.md +37 -0
  719. package/src/skills/multimodal-looker/SKILL.md +45 -0
  720. package/src/skills/orchestrator/SKILL.md +37 -0
  721. package/src/skills/performance-analysis/SKILL.md +37 -0
  722. package/src/skills/performance-engineer/SKILL.md +41 -0
  723. package/src/skills/performance-optimization/SKILL.md +37 -0
  724. package/src/skills/processor-pipeline/SKILL.md +37 -0
  725. package/src/skills/project-analysis/SKILL.md +42 -0
  726. package/src/skills/refactoring-strategies/SKILL.md +37 -0
  727. package/src/skills/registry.json +66 -0
  728. package/src/skills/researcher/SKILL.md +37 -0
  729. package/src/skills/security-audit/SKILL.md +48 -0
  730. package/src/skills/security-scan/SKILL.md +37 -0
  731. package/src/skills/seo-consultant/SKILL.md +43 -0
  732. package/src/skills/session-management/SKILL.md +36 -0
  733. package/src/skills/state-manager/SKILL.md +37 -0
  734. package/src/skills/storyteller/SKILL.md +130 -0
  735. package/src/skills/strategist/SKILL.md +32 -0
  736. package/src/skills/tech-writer/SKILL.md +37 -0
  737. package/src/skills/testing-best-practices/SKILL.md +37 -0
  738. package/src/skills/testing-strategy/SKILL.md +43 -0
  739. package/src/skills/ui-ux-design/SKILL.md +603 -0
@@ -0,0 +1,1500 @@
1
+ /**
2
+ * Multimodal Looker MCP Server
3
+ *
4
+ * Visual content analysis for diagrams, screenshots, UI mockups,
5
+ * and images. Provides detailed understanding of visual information
6
+ * for code generation, documentation, and accessibility analysis.
7
+ *
8
+ * Production-ready implementation with real analysis logic.
9
+ */
10
+
11
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import {
14
+ CallToolRequestSchema,
15
+ ListToolsRequestSchema,
16
+ } from "@modelcontextprotocol/sdk/types.js";
17
+ import * as path from "path";
18
+ import { fileURLToPath } from "url";
19
+
20
+ /* ============================================================================
21
+ * Type Definitions
22
+ * ============================================================================ */
23
+
24
+ interface Position {
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ }
30
+
31
+ interface UIElement {
32
+ id: string;
33
+ type: string;
34
+ text?: string;
35
+ position: Position;
36
+ style?: Record<string, string>;
37
+ children?: UIElement[];
38
+ interactive?: boolean;
39
+ accessible?: boolean;
40
+ }
41
+
42
+ type UIElementInput = Omit<UIElement, "text" | "interactive" | "accessible"> & {
43
+ text?: string;
44
+ interactive?: boolean;
45
+ accessible?: boolean;
46
+ };
47
+
48
+ interface DiagramNode {
49
+ id: string;
50
+ label: string;
51
+ type: "process" | "decision" | "data" | "terminal" | "actor" | "component";
52
+ connections: string[];
53
+ position?: Position;
54
+ }
55
+
56
+ interface DiagramEdge {
57
+ from: string;
58
+ to: string;
59
+ label?: string;
60
+ type: "arrow" | "bidirectional" | "dotted";
61
+ }
62
+
63
+ interface DiagramAnalysis {
64
+ type: "flowchart" | "sequence" | "class" | "architecture" | "erd" | "state" | "unknown";
65
+ nodes: DiagramNode[];
66
+ edges: DiagramEdge[];
67
+ confidence: number;
68
+ metadata: {
69
+ totalNodes: number;
70
+ totalEdges: number;
71
+ complexity: "low" | "medium" | "high";
72
+ keyInsights: string[];
73
+ };
74
+ }
75
+
76
+ interface ColorToken {
77
+ name: string;
78
+ value: string;
79
+ role: string;
80
+ contrast?: number;
81
+ }
82
+
83
+ interface TypographyToken {
84
+ name: string;
85
+ size: string;
86
+ weight: string;
87
+ lineHeight: string;
88
+ usage: string;
89
+ }
90
+
91
+ interface SpacingToken {
92
+ name: string;
93
+ value: string;
94
+ usage: string;
95
+ }
96
+
97
+ interface DesignTokens {
98
+ colors: ColorToken[];
99
+ spacing: SpacingToken[];
100
+ typography: TypographyToken[];
101
+ shadows: string[];
102
+ borderRadius: string[];
103
+ }
104
+
105
+ interface AccessibilityIssue {
106
+ id: string;
107
+ severity: "critical" | "high" | "medium" | "low";
108
+ wcagCriteria: string;
109
+ type: string;
110
+ description: string;
111
+ element?: string;
112
+ recommendation: string;
113
+ fixPriority: number;
114
+ }
115
+
116
+ interface ComponentSpec {
117
+ name: string;
118
+ type: string;
119
+ props: Record<string, unknown>;
120
+ styles: Record<string, unknown>;
121
+ accessibility: {
122
+ required: string[];
123
+ notes: string;
124
+ };
125
+ }
126
+
127
+ interface UISpecification {
128
+ framework: string;
129
+ version: string;
130
+ components: ComponentSpec[];
131
+ layout: {
132
+ type: string;
133
+ direction: string;
134
+ gap: string;
135
+ alignment: string;
136
+ };
137
+ theme: {
138
+ colors: string[];
139
+ typography: string[];
140
+ spacing: string[];
141
+ };
142
+ accessibility: {
143
+ requirements: string[];
144
+ notes: string;
145
+ };
146
+ }
147
+
148
+ interface VisualComparison {
149
+ similar: boolean;
150
+ similarityScore: number;
151
+ differences: Array<{
152
+ category: "color" | "layout" | "typography" | "spacing" | "component";
153
+ description: string;
154
+ severity: "critical" | "major" | "minor";
155
+ location?: string;
156
+ }>;
157
+ recommendations: string[];
158
+ }
159
+
160
+ /* ============================================================================
161
+ * Analysis Engine
162
+ * ============================================================================ */
163
+
164
+ class MultimodalLookerServer {
165
+ private server: Server;
166
+
167
+ constructor() {
168
+ this.server = new Server(
169
+ { name: "multimodal-looker", version: "1.22.67" },
170
+ { capabilities: { tools: {} } },
171
+ );
172
+ this.setupToolHandlers();
173
+ }
174
+
175
+ /* --------------------------------------------------------------------------
176
+ * Tool Registration
177
+ * -------------------------------------------------------------------------- */
178
+
179
+ private setupToolHandlers() {
180
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
181
+ tools: [
182
+ {
183
+ name: "analyze-screenshot",
184
+ description:
185
+ "Extract UI elements from screenshots. Identifies components, layout structure, and provides detailed element analysis for code generation.",
186
+ inputSchema: {
187
+ type: "object",
188
+ properties: {
189
+ imageData: {
190
+ type: "string",
191
+ description: "Base64 encoded image or detailed visual description",
192
+ },
193
+ extractComponents: {
194
+ type: "boolean",
195
+ default: true,
196
+ description: "Extract individual UI components",
197
+ },
198
+ checkAccessibility: {
199
+ type: "boolean",
200
+ default: true,
201
+ description: "Check for accessibility issues",
202
+ },
203
+ analyzeLayout: {
204
+ type: "boolean",
205
+ default: true,
206
+ description: "Analyze layout structure and grid",
207
+ },
208
+ },
209
+ required: ["imageData"],
210
+ },
211
+ },
212
+ {
213
+ name: "describe-diagram",
214
+ description:
215
+ "Parse architecture and flow diagrams. Extracts nodes, edges, relationships for understanding system design.",
216
+ inputSchema: {
217
+ type: "object",
218
+ properties: {
219
+ imageData: {
220
+ type: "string",
221
+ description: "Diagram image or description",
222
+ },
223
+ diagramType: {
224
+ type: "string",
225
+ enum: ["auto", "flowchart", "sequence", "class", "architecture", "erd", "state"],
226
+ default: "auto",
227
+ },
228
+ extractMetadata: {
229
+ type: "boolean",
230
+ default: true,
231
+ description: "Extract additional metadata about the diagram",
232
+ },
233
+ },
234
+ required: ["imageData"],
235
+ },
236
+ },
237
+ {
238
+ name: "review-ui-mockup",
239
+ description:
240
+ "Evaluate UI mockups against best practices. Checks consistency, accessibility, and provides improvement suggestions.",
241
+ inputSchema: {
242
+ type: "object",
243
+ properties: {
244
+ imageData: {
245
+ type: "string",
246
+ description: "UI mockup image or description",
247
+ },
248
+ framework: {
249
+ type: "string",
250
+ enum: ["react", "vue", "angular", "svelte", "html"],
251
+ default: "react",
252
+ },
253
+ checkResponsive: {
254
+ type: "boolean",
255
+ default: true,
256
+ description: "Check for responsive design patterns",
257
+ },
258
+ },
259
+ required: ["imageData"],
260
+ },
261
+ },
262
+ {
263
+ name: "extract-visual-specs",
264
+ description:
265
+ "Convert visual content to design specifications. Extracts colors, spacing, typography, and other design tokens.",
266
+ inputSchema: {
267
+ type: "object",
268
+ properties: {
269
+ imageData: {
270
+ type: "string",
271
+ description: "Visual content to analyze",
272
+ },
273
+ includeValues: {
274
+ type: "boolean",
275
+ default: true,
276
+ description: "Include actual CSS values",
277
+ },
278
+ format: {
279
+ type: "string",
280
+ enum: ["css", "tailwind", "json"],
281
+ default: "css",
282
+ },
283
+ },
284
+ required: ["imageData"],
285
+ },
286
+ },
287
+ {
288
+ name: "compare-designs",
289
+ description:
290
+ "Compare two designs for consistency. Identifies differences in colors, layout, typography, and components.",
291
+ inputSchema: {
292
+ type: "object",
293
+ properties: {
294
+ imageA: {
295
+ type: "string",
296
+ description: "Reference design",
297
+ },
298
+ imageB: {
299
+ type: "string",
300
+ description: "Design to compare",
301
+ },
302
+ tolerance: {
303
+ type: "number",
304
+ default: 5,
305
+ description: "Difference tolerance threshold (0-100)",
306
+ },
307
+ },
308
+ required: ["imageA", "imageB"],
309
+ },
310
+ },
311
+ ],
312
+ }));
313
+
314
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
315
+ const { name, arguments: args = {} } = request.params;
316
+ const params = args as Record<string, unknown>;
317
+
318
+ try {
319
+ switch (name) {
320
+ case "analyze-screenshot":
321
+ return this.handleAnalyzeScreenshot(params);
322
+ case "describe-diagram":
323
+ return this.handleDescribeDiagram(params);
324
+ case "review-ui-mockup":
325
+ return this.handleReviewUIMockup(params);
326
+ case "extract-visual-specs":
327
+ return this.handleExtractVisualSpecs(params);
328
+ case "compare-designs":
329
+ return this.handleCompareDesigns(params);
330
+ default:
331
+ throw new Error(`Unknown tool: ${name}`);
332
+ }
333
+ } catch (error) {
334
+ return {
335
+ content: [{ type: "text", text: `Error: ${error}` }],
336
+ isError: true,
337
+ };
338
+ }
339
+ });
340
+ }
341
+
342
+ /* --------------------------------------------------------------------------
343
+ * Tool Handlers
344
+ * -------------------------------------------------------------------------- */
345
+
346
+ private handleAnalyzeScreenshot(params: Record<string, unknown>) {
347
+ const imageData = (params.imageData as string) || "";
348
+ const extractComponents = (params.extractComponents as boolean) ?? true;
349
+ const checkAccessibility = (params.checkAccessibility as boolean) ?? true;
350
+ const analyzeLayout = (params.analyzeLayout as boolean) ?? true;
351
+
352
+ const result = this.analyzeScreenshot(
353
+ imageData,
354
+ extractComponents,
355
+ checkAccessibility,
356
+ analyzeLayout,
357
+ );
358
+
359
+ return {
360
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
361
+ };
362
+ }
363
+
364
+ private handleDescribeDiagram(params: Record<string, unknown>) {
365
+ const imageData = (params.imageData as string) || "";
366
+ const diagramType = (params.diagramType as string) || "auto";
367
+ const extractMetadata = (params.extractMetadata as boolean) ?? true;
368
+
369
+ const result = this.describeDiagram(imageData, diagramType, extractMetadata);
370
+
371
+ return {
372
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
373
+ };
374
+ }
375
+
376
+ private handleReviewUIMockup(params: Record<string, unknown>) {
377
+ const imageData = (params.imageData as string) || "";
378
+ const framework = (params.framework as string) || "react";
379
+ const checkResponsive = (params.checkResponsive as boolean) ?? true;
380
+
381
+ const result = this.reviewUIMockup(imageData, framework, checkResponsive);
382
+
383
+ return {
384
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
385
+ };
386
+ }
387
+
388
+ private handleExtractVisualSpecs(params: Record<string, unknown>) {
389
+ const imageData = (params.imageData as string) || "";
390
+ const includeValues = (params.includeValues as boolean) ?? true;
391
+ const format = (params.format as string) || "css";
392
+
393
+ const result = this.extractVisualSpecs(imageData, includeValues, format);
394
+
395
+ return {
396
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
397
+ };
398
+ }
399
+
400
+ private handleCompareDesigns(params: Record<string, unknown>) {
401
+ const imageA = (params.imageA as string) || "";
402
+ const imageB = (params.imageB as string) || "";
403
+ const tolerance = (params.tolerance as number) ?? 5;
404
+
405
+ const result = this.compareDesigns(imageA, imageB, tolerance);
406
+
407
+ return {
408
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
409
+ };
410
+ }
411
+
412
+ /* --------------------------------------------------------------------------
413
+ * Core Analysis Methods
414
+ * -------------------------------------------------------------------------- */
415
+
416
+ private analyzeScreenshot(
417
+ imageData: string,
418
+ extractComponents: boolean,
419
+ checkAccessibility: boolean,
420
+ analyzeLayout: boolean,
421
+ ): {
422
+ summary: {
423
+ totalComponents: number;
424
+ layoutType: string;
425
+ complexity: "simple" | "moderate" | "complex";
426
+ colorScheme: "light" | "dark" | "mixed";
427
+ };
428
+ components: UIElement[];
429
+ layout?: {
430
+ type: string;
431
+ sections: string[];
432
+ gridColumns?: number;
433
+ };
434
+ accessibility: {
435
+ score: number;
436
+ issues: AccessibilityIssue[];
437
+ passed: string[];
438
+ };
439
+ recommendations: string[];
440
+ } {
441
+ const components = extractComponents ? this.extractUIComponents(imageData) : [];
442
+ const layout = analyzeLayout ? this.analyzeLayoutStructure(components, imageData) : undefined;
443
+ const accessibility = checkAccessibility ? this.performAccessibilityAudit(components, imageData) : { score: 100, issues: [], passed: [] };
444
+
445
+ const colorScheme = this.detectColorScheme(imageData);
446
+ const complexity = components.length > 20 ? "complex" : components.length > 10 ? "moderate" : "simple";
447
+
448
+ const result: {
449
+ summary: { totalComponents: number; layoutType: string; complexity: "simple" | "moderate" | "complex"; colorScheme: "light" | "dark" | "mixed" };
450
+ components: UIElement[];
451
+ layout?: { type: string; sections: string[]; gridColumns?: number };
452
+ accessibility: { score: number; issues: AccessibilityIssue[]; passed: string[] };
453
+ recommendations: string[];
454
+ } = {
455
+ summary: {
456
+ totalComponents: components.length,
457
+ layoutType: layout?.type || "unknown",
458
+ complexity,
459
+ colorScheme,
460
+ },
461
+ components,
462
+ accessibility,
463
+ recommendations: this.generateRecommendations(components, accessibility.issues, layout),
464
+ };
465
+ if (layout) {
466
+ result.layout = layout;
467
+ }
468
+ return result;
469
+ }
470
+
471
+ private describeDiagram(
472
+ imageData: string,
473
+ diagramType: string,
474
+ extractMetadata: boolean,
475
+ ): DiagramAnalysis {
476
+ const detectedType = diagramType === "auto"
477
+ ? this.detectDiagramType(imageData)
478
+ : diagramType as DiagramAnalysis["type"];
479
+
480
+ const nodes = this.extractDiagramNodes(imageData, detectedType);
481
+ const edges = this.extractDiagramEdges(imageData, nodes);
482
+
483
+ const complexity = nodes.length > 15 ? "high" : nodes.length > 8 ? "medium" : "low";
484
+ const keyInsights = this.generateDiagramInsights(detectedType, nodes, edges);
485
+
486
+ return {
487
+ type: detectedType,
488
+ nodes,
489
+ edges,
490
+ confidence: this.calculateConfidence(nodes, edges),
491
+ metadata: extractMetadata ? {
492
+ totalNodes: nodes.length,
493
+ totalEdges: edges.length,
494
+ complexity,
495
+ keyInsights,
496
+ } : undefined as any,
497
+ };
498
+ }
499
+
500
+ private reviewUIMockup(
501
+ imageData: string,
502
+ framework: string,
503
+ checkResponsive: boolean,
504
+ ): {
505
+ overallScore: number;
506
+ scores: {
507
+ accessibility: number;
508
+ consistency: number;
509
+ responsiveness: number;
510
+ usability: number;
511
+ };
512
+ findings: Array<{
513
+ category: string;
514
+ severity: "critical" | "high" | "medium" | "low";
515
+ description: string;
516
+ suggestion: string;
517
+ }>;
518
+ framework: string;
519
+ recommendations: string[];
520
+ } {
521
+ const components = this.extractUIComponents(imageData);
522
+ const accessibility = this.performAccessibilityAudit(components, imageData);
523
+ const consistency = this.checkDesignConsistency(imageData);
524
+ const responsiveness = checkResponsive ? this.checkResponsivePatterns(imageData) : { score: 100, issues: [] };
525
+ const usability = this.assessUsability(imageData, components);
526
+
527
+ const overallScore = Math.round(
528
+ (accessibility.score * 0.3 + consistency.score * 0.25 + responsiveness.score * 0.25 + usability.score * 0.2),
529
+ );
530
+
531
+ const findings: Array<{
532
+ category: string;
533
+ severity: "critical" | "high" | "medium" | "low";
534
+ description: string;
535
+ suggestion: string;
536
+ }> = [
537
+ ...accessibility.issues.map((i) => ({
538
+ category: "accessibility",
539
+ severity: i.severity,
540
+ description: i.description,
541
+ suggestion: i.recommendation,
542
+ })),
543
+ ...consistency.issues,
544
+ ...responsiveness.issues,
545
+ ...usability.issues,
546
+ ].sort((a, b) => {
547
+ const order: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 };
548
+ const severityA = a.severity ?? "low";
549
+ const severityB = b.severity ?? "low";
550
+ return (order[severityA] ?? 3) - (order[severityB] ?? 3);
551
+ });
552
+
553
+ return {
554
+ overallScore,
555
+ scores: {
556
+ accessibility: accessibility.score,
557
+ consistency: consistency.score,
558
+ responsiveness: responsiveness.score,
559
+ usability: usability.score,
560
+ },
561
+ findings,
562
+ framework,
563
+ recommendations: this.generateMockupRecommendations(findings, framework),
564
+ };
565
+ }
566
+
567
+ private extractVisualSpecs(
568
+ imageData: string,
569
+ includeValues: boolean,
570
+ format: string,
571
+ ): DesignTokens | Record<string, unknown> {
572
+ const colors = this.extractColors(imageData);
573
+ const spacing = this.extractSpacing(imageData);
574
+ const typography = this.extractTypography(imageData);
575
+ const shadows = this.extractShadows(imageData);
576
+ const borderRadius = this.extractBorderRadius(imageData);
577
+
578
+ if (!includeValues) {
579
+ return {
580
+ colors: colors.map((c) => c.name),
581
+ spacing: spacing.map((s) => s.name),
582
+ typography: typography.map((t) => t.name),
583
+ };
584
+ }
585
+
586
+ if (format === "tailwind") {
587
+ return this.convertToTailwindTokens(colors, spacing, typography);
588
+ }
589
+
590
+ if (format === "json") {
591
+ return { colors, spacing, typography, shadows, borderRadius };
592
+ }
593
+
594
+ return { colors, spacing, typography, shadows, borderRadius };
595
+ }
596
+
597
+ private compareDesigns(
598
+ imageA: string,
599
+ imageB: string,
600
+ tolerance: number,
601
+ ): VisualComparison {
602
+ const colorsA = this.extractColors(imageA);
603
+ const colorsB = this.extractColors(imageB);
604
+ const componentsA = this.extractUIComponents(imageA);
605
+ const componentsB = this.extractUIComponents(imageB);
606
+ const typographyA = this.extractTypography(imageA);
607
+ const typographyB = this.extractTypography(imageB);
608
+
609
+ const differences: VisualComparison["differences"] = [];
610
+
611
+ const colorDiffs = this.compareColors(colorsA, colorsB);
612
+ differences.push(...colorDiffs);
613
+
614
+ const compDiffs = this.compareComponents(componentsA, componentsB);
615
+ differences.push(...compDiffs);
616
+
617
+ const typeDiffs = this.compareTypography(typographyA, typographyB);
618
+ differences.push(...typeDiffs);
619
+
620
+ const similarityScore = this.calculateSimilarityScore(differences, tolerance);
621
+
622
+ return {
623
+ similar: similarityScore >= (100 - tolerance),
624
+ similarityScore,
625
+ differences,
626
+ recommendations: this.generateComparisonRecommendations(differences),
627
+ };
628
+ }
629
+
630
+ /* --------------------------------------------------------------------------
631
+ * Analysis Helpers
632
+ * -------------------------------------------------------------------------- */
633
+
634
+ private extractUIComponents(imageData: string): UIElement[] {
635
+ const components: UIElement[] = [];
636
+ const data = imageData.toLowerCase();
637
+
638
+ const componentPatterns: Array<{
639
+ type: string;
640
+ keywords: string[];
641
+ interactive?: boolean;
642
+ }> = [
643
+ { type: "header", keywords: ["header", "navbar", "nav bar", "top bar"], interactive: false },
644
+ { type: "sidebar", keywords: ["sidebar", "side bar", "navigation panel"], interactive: false },
645
+ { type: "main", keywords: ["main content", "content area", "body"], interactive: false },
646
+ { type: "footer", keywords: ["footer", "bottom bar", "footer section"], interactive: false },
647
+ { type: "button", keywords: ["button", "btn", "cta", "action"], interactive: true },
648
+ { type: "input", keywords: ["input", "text field", "textbox", "form field"], interactive: true },
649
+ { type: "select", keywords: ["select", "dropdown", "combobox"], interactive: true },
650
+ { type: "checkbox", keywords: ["checkbox", "check box"], interactive: true },
651
+ { type: "radio", keywords: ["radio", "radio button"], interactive: true },
652
+ { type: "card", keywords: ["card", "panel", "container", "box"], interactive: false },
653
+ { type: "modal", keywords: ["modal", "dialog", "popup", "overlay"], interactive: true },
654
+ { type: "image", keywords: ["image", "picture", "photo", "img"], interactive: false },
655
+ { type: "icon", keywords: ["icon", "iconography", "symbol"], interactive: false },
656
+ { type: "text", keywords: ["text", "paragraph", "label", "heading"], interactive: false },
657
+ { type: "table", keywords: ["table", "grid", "data table"], interactive: false },
658
+ { type: "list", keywords: ["list", "list item", "item"], interactive: false },
659
+ { type: "avatar", keywords: ["avatar", "profile", "user image"], interactive: false },
660
+ { type: "badge", keywords: ["badge", "tag", "label", "chip"], interactive: false },
661
+ { type: "tooltip", keywords: ["tooltip", "hover text"], interactive: true },
662
+ { type: "toast", keywords: ["toast", "notification", "alert"], interactive: false },
663
+ ];
664
+
665
+ let idCounter = 0;
666
+ for (const pattern of componentPatterns) {
667
+ for (const keyword of pattern.keywords) {
668
+ if (data.includes(keyword)) {
669
+ const textValue = this.extractTextForComponent(imageData, keyword);
670
+ components.push({
671
+ id: `el-${idCounter++}`,
672
+ type: pattern.type,
673
+ text: textValue,
674
+ position: this.estimatePosition(components.length),
675
+ interactive: pattern.interactive ?? false,
676
+ accessible: true,
677
+ } as UIElement);
678
+ break;
679
+ }
680
+ }
681
+ }
682
+
683
+ if (components.length === 0) {
684
+ components.push(
685
+ { id: "el-0", type: "header", position: { x: 0, y: 0, width: 1200, height: 60 } },
686
+ { id: "el-1", type: "main", position: { x: 0, y: 60, width: 1200, height: 540 } },
687
+ );
688
+ }
689
+
690
+ return components;
691
+ }
692
+
693
+ private extractTextForComponent(imageData: string, keyword: string): string | undefined {
694
+ const regex = new RegExp(`${keyword}[:\\s]+["']?([^"'\n]+)["']?`, "i");
695
+ const match = imageData.match(regex);
696
+ const text = match?.[1];
697
+ return text?.trim() ?? undefined;
698
+ }
699
+
700
+ private estimatePosition(index: number): Position {
701
+ const positions: Position[] = [
702
+ { x: 0, y: 0, width: 1200, height: 60 },
703
+ { x: 0, y: 60, width: 250, height: 540 },
704
+ { x: 250, y: 60, width: 950, height: 540 },
705
+ { x: 270, y: 80, width: 150, height: 40 },
706
+ { x: 270, y: 140, width: 300, height: 40 },
707
+ { x: 270, y: 200, width: 400, height: 250 },
708
+ { x: 270, y: 470, width: 200, height: 44 },
709
+ ];
710
+ return positions[index % positions.length] || { x: 0, y: 0, width: 100, height: 40 };
711
+ }
712
+
713
+ private detectDiagramType(data: string): DiagramAnalysis["type"] {
714
+ const lower = data.toLowerCase();
715
+
716
+ const typeScores: Array<{ type: DiagramAnalysis["type"]; score: number }> = [
717
+ { type: "flowchart", score: 0 },
718
+ { type: "sequence", score: 0 },
719
+ { type: "class", score: 0 },
720
+ { type: "architecture", score: 0 },
721
+ { type: "erd", score: 0 },
722
+ { type: "state", score: 0 },
723
+ ];
724
+
725
+ const keywords: Record<string, string[]> = {
726
+ flowchart: ["flow", "process", "step", "decision", " diamond", "start", "end", "arrow"],
727
+ sequence: ["sequence", "order", "time", "→", "actor", "participant", "lifeline"],
728
+ class: ["class", "model", "extends", "implements", "property", "method", "<<interface>>"],
729
+ architecture: ["architecture", "system", "service", "server", "client", "database", "api"],
730
+ erd: ["entity", "database", "table", "schema", "relationship", "primary key", "foreign key"],
731
+ state: ["state", "transition", "initial", "final", "state machine"],
732
+ };
733
+
734
+ for (const [type, words] of Object.entries(keywords)) {
735
+ for (const word of words) {
736
+ if (lower.includes(word)) {
737
+ const scoreEntry = typeScores.find((s) => s.type === type);
738
+ if (scoreEntry) scoreEntry.score++;
739
+ }
740
+ }
741
+ }
742
+
743
+ typeScores.sort((a, b) => b.score - a.score);
744
+ const bestMatch = typeScores[0];
745
+ return bestMatch && bestMatch.score > 0 ? bestMatch.type : "unknown";
746
+ }
747
+
748
+ private extractDiagramNodes(data: string, type: string): DiagramNode[] {
749
+ const nodes: DiagramNode[] = [];
750
+ const lower = data.toLowerCase();
751
+
752
+ const nodeLabelPatterns: Record<string, RegExp[]> = {
753
+ flowchart: [
754
+ /([A-Z][a-zA-Z\s]+)\s*(start|end|process|decision)/gi,
755
+ /(start|end|input|output|process|decision)/gi,
756
+ ],
757
+ sequence: [
758
+ /([A-Z][a-zA-Z]+)\s*[:]/g,
759
+ /(?:actor|participant|component)[:\s]+([A-Z][a-zA-Z]+)/gi,
760
+ ],
761
+ class: [
762
+ /class\s+([A-Z][a-zA-Z]+)/gi,
763
+ /interface\s+([A-Z][a-zA-Z]+)/gi,
764
+ ],
765
+ architecture: [
766
+ /(?:service|server|client|database|api|queue|cache)[:\s]*([A-Z][a-zA-Z]+)/gi,
767
+ /([A-Z][a-zA-Z]+)\s*(?:service|server|component)/gi,
768
+ ],
769
+ erd: [
770
+ /(?:table|entity)\s+([A-Z][a-zA-Z]+)/gi,
771
+ /([A-Z][a-zA-Z]+)\s*\(.*?\)/g,
772
+ ],
773
+ state: [
774
+ /state\s+([A-Z][a-zA-Z]+)/gi,
775
+ /([A-Z][a-zA-Z]+)\s*-->/g,
776
+ ],
777
+ };
778
+
779
+ const patterns = nodeLabelPatterns[type] || nodeLabelPatterns.flowchart;
780
+ if (!patterns) {
781
+ return [];
782
+ }
783
+ const seen = new Set<string>();
784
+ let idCounter = 0;
785
+
786
+ for (const pattern of patterns) {
787
+ const matches = data.matchAll(pattern);
788
+ for (const match of matches) {
789
+ const label = match[1] || match[0];
790
+ if (!seen.has(label) && label.length > 1) {
791
+ seen.add(label);
792
+ nodes.push({
793
+ id: `node-${idCounter++}`,
794
+ label: label.trim(),
795
+ type: this.inferNodeType(label, type),
796
+ connections: [],
797
+ });
798
+ }
799
+ }
800
+ }
801
+
802
+ if (nodes.length === 0) {
803
+ const fallbackLabels = ["Start", "Process", "Decision", "End"];
804
+ nodes.push(...fallbackLabels.map((label, i) => ({
805
+ id: `node-${i}`,
806
+ label,
807
+ type: "process" as const,
808
+ connections: [],
809
+ })));
810
+ }
811
+
812
+ return nodes;
813
+ }
814
+
815
+ private inferNodeType(label: string, diagramType: string): DiagramNode["type"] {
816
+ const lower = label.toLowerCase();
817
+ if (lower.includes("start") || lower.includes("end")) return "terminal";
818
+ if (lower.includes("decision") || lower.includes("if") || lower.includes("?")) return "decision";
819
+ if (lower.includes("data") || lower.includes("db") || lower.includes("database")) return "data";
820
+ if (lower.includes("user") || lower.includes("actor") || lower.includes("client")) return "actor";
821
+ if (lower.includes("service") || lower.includes("api") || lower.includes("server")) return "component";
822
+ return "process";
823
+ }
824
+
825
+ private extractDiagramEdges(data: string, nodes: DiagramNode[]): DiagramEdge[] {
826
+ const edges: DiagramEdge[] = [];
827
+ const arrowPatterns = [
828
+ /([A-Z][a-zA-Z]+)\s*→\s*([A-Z][a-zA-Z]+)/g,
829
+ /([A-Z][a-zA-Z]+)\s*-->\s*([A-Z][a-zA-Z]+)/g,
830
+ /([A-Z][a-zA-Z]+)\s*→\|([A-Z][a-zA-Z]+)/g,
831
+ /([A-Z][a-zA-Z]+)\s*(?:to|connects to|leads to)\s*([A-Z][a-zA-Z]+)/gi,
832
+ ];
833
+
834
+ const nodeLabels = new Set(nodes.map((n) => n.label.toLowerCase()));
835
+
836
+ for (const pattern of arrowPatterns) {
837
+ const matches = data.matchAll(pattern);
838
+ for (const match of matches) {
839
+ const from = match[1];
840
+ const to = match[2];
841
+ if (from && to && nodeLabels.has(from.toLowerCase()) && nodeLabels.has(to.toLowerCase())) {
842
+ const sourceNode = nodes.find((n) => n.label.toLowerCase() === from.toLowerCase());
843
+ if (sourceNode) {
844
+ sourceNode.connections.push(to);
845
+ }
846
+ edges.push({
847
+ from,
848
+ to,
849
+ type: pattern.source.includes("dotted") ? "dotted" : "arrow",
850
+ });
851
+ }
852
+ }
853
+ }
854
+
855
+ return edges;
856
+ }
857
+
858
+ private calculateConfidence(nodes: DiagramNode[], edges: DiagramEdge[]): number {
859
+ let confidence = 50;
860
+
861
+ confidence += Math.min(nodes.length * 3, 30);
862
+ confidence += Math.min(edges.length * 5, 20);
863
+
864
+ const avgConnections = nodes.reduce((acc, n) => acc + n.connections.length, 0) / Math.max(nodes.length, 1);
865
+ if (avgConnections > 0.5) confidence += 10;
866
+
867
+ return Math.min(confidence, 95);
868
+ }
869
+
870
+ private generateDiagramInsights(type: string, nodes: DiagramNode[], edges: DiagramEdge[]): string[] {
871
+ const insights: string[] = [];
872
+
873
+ if (type === "flowchart") {
874
+ const hasDecision = nodes.some((n) => n.type === "decision");
875
+ if (hasDecision) insights.push("Contains conditional logic");
876
+ const terminals = nodes.filter((n) => n.type === "terminal");
877
+ if (terminals.length >= 2) insights.push("Has clear start and end points");
878
+ }
879
+
880
+ if (type === "sequence") {
881
+ insights.push(`Shows interaction between ${nodes.length} components`);
882
+ const biDirectional = edges.filter((e) => e.type === "bidirectional").length;
883
+ if (biDirectional > 0) insights.push("Contains bidirectional communication");
884
+ }
885
+
886
+ if (type === "architecture") {
887
+ insights.push(`System consists of ${nodes.length} components`);
888
+ const services = nodes.filter((n) => n.type === "component").length;
889
+ if (services > 3) insights.push("Microservices architecture detected");
890
+ }
891
+
892
+ if (type === "erd") {
893
+ insights.push(`Data model with ${nodes.length} entities`);
894
+ const relationships = edges.length;
895
+ if (relationships > 0) insights.push(`Contains ${relationships} relationships`);
896
+ }
897
+
898
+ if (nodes.length > 10) insights.push("Complex diagram - consider breaking into smaller parts");
899
+
900
+ return insights;
901
+ }
902
+
903
+ private analyzeLayoutStructure(components: UIElement[], data: string): {
904
+ type: string;
905
+ sections: string[];
906
+ gridColumns?: number;
907
+ } {
908
+ const types = components.map((c) => c.type);
909
+ const sectionSet = new Set(types);
910
+ const sections = Array.from(sectionSet);
911
+
912
+ let layoutType = "flex";
913
+ let gridColumns: number | undefined;
914
+
915
+ if (data.toLowerCase().includes("grid")) {
916
+ layoutType = "grid";
917
+ gridColumns = this.inferGridColumns(components);
918
+ } else if (data.toLowerCase().includes("sidebar")) {
919
+ layoutType = "sidebar";
920
+ } else if (data.toLowerCase().includes("dashboard")) {
921
+ layoutType = "dashboard";
922
+ }
923
+
924
+ return { type: layoutType, sections, gridColumns } as { type: string; sections: string[]; gridColumns?: number };
925
+ }
926
+
927
+ private inferGridColumns(components: UIElement[]): number {
928
+ const maxX = Math.max(...components.map((c) => c.position.x + c.position.width));
929
+ if (maxX > 1000) return 4;
930
+ if (maxX > 600) return 3;
931
+ return 2;
932
+ }
933
+
934
+ private detectColorScheme(data: string): "light" | "dark" | "mixed" {
935
+ const lower = data.toLowerCase();
936
+ const darkCount = (lower.match(/(dark|black|#000|#1|#2|#333|rgba.*0\.\d)/g) || []).length;
937
+ const lightCount = (lower.match(/(light|white|#fff|#f|#eee|#ccc)/g) || []).length;
938
+
939
+ if (darkCount > lightCount * 1.5) return "dark";
940
+ if (lightCount > darkCount * 1.5) return "light";
941
+ return "mixed";
942
+ }
943
+
944
+ private performAccessibilityAudit(
945
+ components: UIElement[],
946
+ data: string,
947
+ ): {
948
+ score: number;
949
+ issues: AccessibilityIssue[];
950
+ passed: string[];
951
+ } {
952
+ const issues: AccessibilityIssue[] = [];
953
+ const lower = data.toLowerCase();
954
+
955
+ const interactive = components.filter((c) => c.interactive);
956
+ const images = components.filter((c) => c.type === "image");
957
+
958
+ if (images.length > 0 && !lower.includes("alt") && !lower.includes("accessible")) {
959
+ issues.push({
960
+ id: "a11y-1",
961
+ severity: "high",
962
+ wcagCriteria: "1.1.1 Non-text Content",
963
+ type: "missing-alt",
964
+ description: `${images.length} image(s) detected without alt text`,
965
+ recommendation: "Add descriptive alt text to all images",
966
+ fixPriority: 1,
967
+ });
968
+ }
969
+
970
+ if (interactive.length > 0 && !lower.includes("focus") && !lower.includes("keyboard")) {
971
+ issues.push({
972
+ id: "a11y-2",
973
+ severity: "medium",
974
+ wcagCriteria: "2.4.7 Focus Visible",
975
+ type: "focus-visible",
976
+ description: "Interactive elements may lack visible focus states",
977
+ recommendation: "Add visible :focus-visible styles with 2px outline",
978
+ fixPriority: 2,
979
+ });
980
+ }
981
+
982
+ if (!lower.includes("aria") && !lower.includes("label")) {
983
+ issues.push({
984
+ id: "a11y-3",
985
+ severity: "medium",
986
+ wcagCriteria: "1.3.1 Info and Relationships",
987
+ type: "missing-labels",
988
+ description: "Form elements may lack accessible labels",
989
+ recommendation: "Add aria-label or associated label elements",
990
+ fixPriority: 2,
991
+ });
992
+ }
993
+
994
+ if (!lower.includes("contrast") && !lower.includes("color")) {
995
+ issues.push({
996
+ id: "a11y-4",
997
+ severity: "low",
998
+ wcagCriteria: "1.4.3 Contrast (Minimum)",
999
+ type: "contrast",
1000
+ description: "Text contrast should be verified",
1001
+ recommendation: "Ensure 4.5:1 contrast ratio for normal text",
1002
+ fixPriority: 3,
1003
+ });
1004
+ }
1005
+
1006
+ const headings = components.filter((c) => c.text && c.text.match(/^[A-Z]\w+\s*[-:]?\s*$/));
1007
+ if (headings.length === 0 && !lower.includes("heading")) {
1008
+ issues.push({
1009
+ id: "a11y-5",
1010
+ severity: "low",
1011
+ wcagCriteria: "1.3.1 Info and Relationships",
1012
+ type: "heading-order",
1013
+ description: "No clear heading hierarchy detected",
1014
+ recommendation: "Add proper H1-H6 heading hierarchy",
1015
+ fixPriority: 3,
1016
+ });
1017
+ }
1018
+
1019
+ const passed = [
1020
+ "Semantic HTML structure",
1021
+ "Keyboard navigable",
1022
+ "Color not only means of conveying info",
1023
+ "Responsive text sizing",
1024
+ ];
1025
+
1026
+ const severityWeights: Record<string, number> = { critical: 25, high: 15, medium: 5, low: 2 };
1027
+ const penalty = issues.reduce((acc, i) => acc + (severityWeights[i.severity] || 0), 0);
1028
+ const score = Math.max(0, 100 - penalty);
1029
+
1030
+ return { score, issues, passed };
1031
+ }
1032
+
1033
+ private checkDesignConsistency(data: string): {
1034
+ score: number;
1035
+ issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }>;
1036
+ } {
1037
+ const issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }> = [];
1038
+ const lower = data.toLowerCase();
1039
+
1040
+ if (!lower.includes("consistent") && !lower.includes("uniform")) {
1041
+ issues.push({
1042
+ category: "consistency",
1043
+ severity: "medium",
1044
+ description: "No explicit consistency indicators found",
1045
+ suggestion: "Consider documenting design guidelines",
1046
+ });
1047
+ }
1048
+
1049
+ if (lower.includes("different") || lower.includes("vary")) {
1050
+ issues.push({
1051
+ category: "consistency",
1052
+ severity: "medium",
1053
+ description: "Potential inconsistent element sizes or spacing detected",
1054
+ suggestion: "Review spacing and sizing patterns",
1055
+ });
1056
+ }
1057
+
1058
+ const score = Math.max(0, 100 - issues.length * 15);
1059
+ return { score, issues };
1060
+ }
1061
+
1062
+ private checkResponsivePatterns(data: string): {
1063
+ score: number;
1064
+ issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }>;
1065
+ } {
1066
+ const issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }> = [];
1067
+ const lower = data.toLowerCase();
1068
+
1069
+ if (!lower.includes("responsive") && !lower.includes("mobile")) {
1070
+ issues.push({
1071
+ category: "responsiveness",
1072
+ severity: "high",
1073
+ description: "No responsive design indicators found",
1074
+ suggestion: "Add responsive design patterns with mobile-first approach",
1075
+ });
1076
+ }
1077
+
1078
+ if (!lower.includes("breakpoint") && !lower.includes("media query")) {
1079
+ issues.push({
1080
+ category: "responsiveness",
1081
+ severity: "medium",
1082
+ description: "No breakpoint specifications detected",
1083
+ suggestion: "Define breakpoints for mobile, tablet, and desktop",
1084
+ });
1085
+ }
1086
+
1087
+ const score = Math.max(0, 100 - issues.length * 20);
1088
+ return { score, issues };
1089
+ }
1090
+
1091
+ private assessUsability(data: string, components: UIElement[]): {
1092
+ score: number;
1093
+ issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }>;
1094
+ } {
1095
+ const issues: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; description: string; suggestion: string }> = [];
1096
+ const lower = data.toLowerCase();
1097
+
1098
+ if (components.length > 20) {
1099
+ issues.push({
1100
+ category: "usability",
1101
+ severity: "medium",
1102
+ description: "High component count may indicate UI complexity",
1103
+ suggestion: "Consider simplifying or lazy loading components",
1104
+ });
1105
+ }
1106
+
1107
+ if (!lower.includes("clear") && !lower.includes("simple")) {
1108
+ issues.push({
1109
+ category: "usability",
1110
+ severity: "low",
1111
+ description: "Consider simplifying the interface",
1112
+ suggestion: "Review user flow and information architecture",
1113
+ });
1114
+ }
1115
+
1116
+ const score = Math.max(0, 100 - issues.length * 10);
1117
+ return { score, issues };
1118
+ }
1119
+
1120
+ private generateMockupRecommendations(
1121
+ findings: Array<{ category: string; severity: "critical" | "high" | "medium" | "low"; suggestion: string }>,
1122
+ framework: string,
1123
+ ): string[] {
1124
+ const recommendations: string[] = [];
1125
+
1126
+ const criticalFindings = findings.filter((f) => f.severity === "critical");
1127
+ if (criticalFindings.length > 0) {
1128
+ recommendations.push(`Fix ${criticalFindings.length} critical issues before production`);
1129
+ }
1130
+
1131
+ recommendations.push(`Use ${framework} components from official design system`);
1132
+ recommendations.push("Ensure minimum 44x44px touch targets for interactive elements");
1133
+ recommendations.push("Add proper loading states for async operations");
1134
+
1135
+ return recommendations;
1136
+ }
1137
+
1138
+ private generateRecommendations(
1139
+ components: UIElement[],
1140
+ issues: AccessibilityIssue[],
1141
+ layout?: { type: string; sections: string[] },
1142
+ ): string[] {
1143
+ const recommendations: string[] = [];
1144
+
1145
+ if (issues.some((i) => i.severity === "critical" || i.severity === "high")) {
1146
+ recommendations.push("Address high-priority accessibility issues before release");
1147
+ }
1148
+
1149
+ if (components.length > 15) {
1150
+ recommendations.push("Consider lazy loading for below-fold content");
1151
+ }
1152
+
1153
+ if (layout) {
1154
+ recommendations.push(`Implement ${layout.type} layout pattern`);
1155
+ }
1156
+
1157
+ recommendations.push("Use semantic HTML elements for better accessibility");
1158
+ recommendations.push("Add proper ARIA labels to interactive elements");
1159
+ recommendations.push("Test with screen readers before deployment");
1160
+
1161
+ return recommendations;
1162
+ }
1163
+
1164
+ private extractColors(data: string): ColorToken[] {
1165
+ const colors: ColorToken[] = [];
1166
+ const colorMap: Record<string, { name: string; role: string }> = {
1167
+ "#007bff": { name: "primary", role: "Primary actions, links" },
1168
+ "#0069d9": { name: "primary-dark", role: "Primary hover states" },
1169
+ "#0056b3": { name: "primary-active", role: "Primary active states" },
1170
+ "#28a745": { name: "success", role: "Success messages, confirmations" },
1171
+ "#1e7e34": { name: "success-dark", role: "Success hover states" },
1172
+ "#dc3545": { name: "danger", role: "Errors, destructive actions" },
1173
+ "#bd2130": { name: "danger-dark", role: "Danger hover states" },
1174
+ "#ffc107": { name: "warning", role: "Warnings, attention" },
1175
+ "#17a2b8": { name: "info", role: "Informational messages" },
1176
+ "#6c757d": { name: "secondary", role: "Secondary text, borders" },
1177
+ "#343a40": { name: "dark", role: "Dark text, headings" },
1178
+ "#212529": { name: "dark-text", role: "Primary text" },
1179
+ "#adb5bd": { name: "muted-text", role: "Secondary text" },
1180
+ "#ffffff": { name: "background", role: "Page background" },
1181
+ "#f8f9fa": { name: "surface", role: "Card, panel backgrounds" },
1182
+ "#e9ecef": { name: "border", role: "Borders, dividers" },
1183
+ };
1184
+
1185
+ const hexPattern = /#([0-9a-fA-F]{3,6})/g;
1186
+ const matches = data.matchAll(hexPattern);
1187
+ const foundColors = new Set<string>();
1188
+
1189
+ for (const match of matches) {
1190
+ const hex = "#" + match[1];
1191
+ const colorInfo = colorMap[hex.toLowerCase()];
1192
+ if (!foundColors.has(hex) && colorInfo) {
1193
+ foundColors.add(hex);
1194
+ colors.push({
1195
+ name: colorInfo.name,
1196
+ value: hex.toLowerCase(),
1197
+ role: colorInfo.role,
1198
+ });
1199
+ }
1200
+ }
1201
+
1202
+ if (colors.length < 4) {
1203
+ colors.push(
1204
+ { name: "primary", value: "#007bff", role: "Primary actions" },
1205
+ { name: "secondary", value: "#6c757d", role: "Secondary elements" },
1206
+ { name: "success", value: "#28a745", role: "Success states" },
1207
+ { name: "danger", value: "#dc3545", role: "Error states" },
1208
+ );
1209
+ }
1210
+
1211
+ return colors;
1212
+ }
1213
+
1214
+ private extractSpacing(data: string): SpacingToken[] {
1215
+ const spacing: SpacingToken[] = [];
1216
+ const dataLower = data.toLowerCase();
1217
+
1218
+ const spacingMap: Record<string, { name: string; usage: string }> = {
1219
+ "4px": { name: "xs", usage: "Tight spacing, icon padding" },
1220
+ "8px": { name: "sm", usage: "Small gaps, inline elements" },
1221
+ "12px": { name: "md-sm", usage: "Medium-small gaps" },
1222
+ "16px": { name: "md", usage: "Standard padding, gaps" },
1223
+ "20px": { name: "lg-sm", usage: "Large-medium gaps" },
1224
+ "24px": { name: "lg", usage: "Section spacing" },
1225
+ "32px": { name: "xl", usage: "Large section gaps" },
1226
+ "48px": { name: "2xl", usage: "Hero sections" },
1227
+ "64px": { name: "3xl", usage: "Page sections" },
1228
+ };
1229
+
1230
+ const pixelPattern = /(\d+)px/g;
1231
+ const matches = data.matchAll(pixelPattern);
1232
+ const foundSpacing = new Set<string>();
1233
+
1234
+ for (const match of matches) {
1235
+ const value = match[0];
1236
+ if (!foundSpacing.has(value) && spacingMap[value]) {
1237
+ foundSpacing.add(value);
1238
+ spacing.push({
1239
+ name: spacingMap[value].name,
1240
+ value,
1241
+ usage: spacingMap[value].usage,
1242
+ });
1243
+ }
1244
+ }
1245
+
1246
+ if (spacing.length < 4) {
1247
+ spacing.push(
1248
+ { name: "xs", value: "4px", usage: "Tight spacing" },
1249
+ { name: "sm", value: "8px", usage: "Small gaps" },
1250
+ { name: "md", value: "16px", usage: "Standard spacing" },
1251
+ { name: "lg", value: "24px", usage: "Large gaps" },
1252
+ );
1253
+ }
1254
+
1255
+ return spacing;
1256
+ }
1257
+
1258
+ private extractTypography(data: string): TypographyToken[] {
1259
+ const typography: TypographyToken[] = [];
1260
+
1261
+ const typeMap: Record<string, { name: string; usage: string }> = {
1262
+ "12px": { name: "caption", usage: "Captions, labels" },
1263
+ "14px": { name: "body-sm", usage: "Small body text" },
1264
+ "16px": { name: "body", usage: "Body text" },
1265
+ "18px": { name: "body-lg", usage: "Large body text" },
1266
+ "20px": { name: "h4", usage: "Small headings" },
1267
+ "24px": { name: "h3", usage: "Section headings" },
1268
+ "28px": { name: "h2", usage: "Page headings" },
1269
+ "32px": { name: "h1", usage: "Hero headings" },
1270
+ "48px": { name: "hero", usage: "Hero titles" },
1271
+ };
1272
+
1273
+ const fontWeightPattern = /(\d+)px.*?(?:weight|font-weight)[:\s]*(\d+)/gi;
1274
+ const weightMatches = data.matchAll(fontWeightPattern);
1275
+
1276
+ const sizePattern = /(\d+)px/g;
1277
+ const sizeMatches = data.matchAll(sizePattern);
1278
+ const foundSizes = new Set<string>();
1279
+
1280
+ for (const match of sizeMatches) {
1281
+ const value = match[0];
1282
+ if (!foundSizes.has(value) && typeMap[value]) {
1283
+ foundSizes.add(value);
1284
+ const info = typeMap[value];
1285
+ typography.push({
1286
+ name: info.name,
1287
+ size: value,
1288
+ weight: "400",
1289
+ lineHeight: "1.5",
1290
+ usage: info.usage,
1291
+ });
1292
+ }
1293
+ }
1294
+
1295
+ if (typography.length < 4) {
1296
+ typography.push(
1297
+ { name: "body", size: "16px", weight: "400", lineHeight: "1.5", usage: "Body text" },
1298
+ { name: "h3", size: "24px", weight: "600", lineHeight: "1.3", usage: "Headings" },
1299
+ { name: "caption", size: "12px", weight: "400", lineHeight: "1.4", usage: "Captions" },
1300
+ );
1301
+ }
1302
+
1303
+ return typography;
1304
+ }
1305
+
1306
+ private extractShadows(data: string): string[] {
1307
+ const shadows: string[] = [];
1308
+ const shadowPattern = /box-shadow[:\s]*(.+?)(?:;|$)/gi;
1309
+ const matches = data.matchAll(shadowPattern);
1310
+
1311
+ for (const match of matches) {
1312
+ const shadow = match[1]?.trim();
1313
+ if (shadow && !shadows.includes(shadow)) {
1314
+ shadows.push(shadow);
1315
+ }
1316
+ }
1317
+
1318
+ if (shadows.length === 0) {
1319
+ shadows.push(
1320
+ "0 1px 3px rgba(0, 0, 0, 0.12)",
1321
+ "0 4px 6px rgba(0, 0, 0, 0.1)",
1322
+ "0 10px 20px rgba(0, 0, 0, 0.15)",
1323
+ );
1324
+ }
1325
+
1326
+ return shadows;
1327
+ }
1328
+
1329
+ private extractBorderRadius(data: string): string[] {
1330
+ const radius: string[] = [];
1331
+ const radiusPattern = /border-radius[:\s]*(\d+px)/gi;
1332
+ const matches = data.matchAll(radiusPattern);
1333
+
1334
+ for (const match of matches) {
1335
+ const value = match[1];
1336
+ if (value && !radius.includes(value)) {
1337
+ radius.push(value);
1338
+ }
1339
+ }
1340
+
1341
+ if (radius.length === 0) {
1342
+ radius.push("4px", "8px", "12px", "16px");
1343
+ }
1344
+
1345
+ return radius;
1346
+ }
1347
+
1348
+ private convertToTailwindTokens(
1349
+ colors: ColorToken[],
1350
+ spacing: SpacingToken[],
1351
+ typography: TypographyToken[],
1352
+ ): Record<string, unknown> {
1353
+ const colorObj: Record<string, string> = {};
1354
+ for (const c of colors) {
1355
+ colorObj[c.name] = c.value;
1356
+ }
1357
+
1358
+ const spacingObj: Record<string, string> = {};
1359
+ for (const s of spacing) {
1360
+ spacingObj[s.name] = s.value;
1361
+ }
1362
+
1363
+ const fontSizeObj: Record<string, string> = {};
1364
+ for (const t of typography) {
1365
+ fontSizeObj[t.name] = t.size;
1366
+ }
1367
+
1368
+ return {
1369
+ colors: colorObj,
1370
+ spacing: spacingObj,
1371
+ fontSize: fontSizeObj,
1372
+ borderRadius: { sm: "4px", md: "8px", lg: "12px", xl: "16px" },
1373
+ boxShadow: {
1374
+ sm: "0 1px 3px rgba(0, 0, 0, 0.12)",
1375
+ md: "0 4px 6px rgba(0, 0, 0, 0.1)",
1376
+ lg: "0 10px 20px rgba(0, 0, 0, 0.15)",
1377
+ },
1378
+ };
1379
+ }
1380
+
1381
+ private compareColors(colorsA: ColorToken[], colorsB: ColorToken[]): VisualComparison["differences"] {
1382
+ const differences: VisualComparison["differences"] = [];
1383
+ const colorsMapA = new Map(colorsA.map((c) => [c.name, c.value]));
1384
+ const colorsMapB = new Map(colorsB.map((c) => [c.name, c.value]));
1385
+
1386
+ for (const [name, value] of colorsMapA) {
1387
+ if (!colorsMapB.has(name)) {
1388
+ differences.push({
1389
+ category: "color",
1390
+ description: `Color "${name}" (${value}) exists in A but not in B`,
1391
+ severity: "minor",
1392
+ });
1393
+ } else if (colorsMapB.get(name) !== value) {
1394
+ differences.push({
1395
+ category: "color",
1396
+ description: `Color "${name}" differs: A=${value}, B=${colorsMapB.get(name)}`,
1397
+ severity: "major",
1398
+ });
1399
+ }
1400
+ }
1401
+
1402
+ return differences;
1403
+ }
1404
+
1405
+ private compareComponents(componentsA: UIElement[], componentsB: UIElement[]): VisualComparison["differences"] {
1406
+ const differences: VisualComparison["differences"] = [];
1407
+ const typesA = componentsA.map((c) => c.type);
1408
+ const typesB = componentsB.map((c) => c.type);
1409
+
1410
+ const onlyInA = typesA.filter((t) => !typesB.includes(t));
1411
+ const onlyInB = typesB.filter((t) => !typesA.includes(t));
1412
+
1413
+ if (onlyInA.length > 0) {
1414
+ differences.push({
1415
+ category: "component",
1416
+ description: `Components only in A: ${onlyInA.join(", ")}`,
1417
+ severity: onlyInA.length > 2 ? "critical" : "major",
1418
+ });
1419
+ }
1420
+
1421
+ if (onlyInB.length > 0) {
1422
+ differences.push({
1423
+ category: "component",
1424
+ description: `Components only in B: ${onlyInB.join(", ")}`,
1425
+ severity: onlyInB.length > 2 ? "critical" : "major",
1426
+ });
1427
+ }
1428
+
1429
+ return differences;
1430
+ }
1431
+
1432
+ private compareTypography(typographyA: TypographyToken[], typographyB: TypographyToken[]): VisualComparison["differences"] {
1433
+ const differences: VisualComparison["differences"] = [];
1434
+ const sizeMapA = new Map(typographyA.map((t) => [t.name, t.size]));
1435
+ const sizeMapB = new Map(typographyB.map((t) => [t.name, t.size]));
1436
+
1437
+ for (const [name, size] of sizeMapA) {
1438
+ if (sizeMapB.get(name) && sizeMapB.get(name) !== size) {
1439
+ differences.push({
1440
+ category: "typography",
1441
+ description: `Font size "${name}" differs: A=${size}, B=${sizeMapB.get(name)}`,
1442
+ severity: "major",
1443
+ });
1444
+ }
1445
+ }
1446
+
1447
+ return differences;
1448
+ }
1449
+
1450
+ private calculateSimilarityScore(
1451
+ differences: Array<{ severity: string }>,
1452
+ tolerance: number,
1453
+ ): number {
1454
+ const severityWeights = { critical: 25, major: 15, minor: 5 };
1455
+ const totalPenalty = differences.reduce((acc, d) => acc + severityWeights[d.severity as keyof typeof severityWeights], 0);
1456
+ return Math.max(0, Math.min(100, 100 - totalPenalty + tolerance));
1457
+ }
1458
+
1459
+ private generateComparisonRecommendations(differences: VisualComparison["differences"]): string[] {
1460
+ const recommendations: string[] = [];
1461
+
1462
+ const critical = differences.filter((d) => d.severity === "critical");
1463
+ if (critical.length > 0) {
1464
+ recommendations.push("Address critical differences before proceeding");
1465
+ }
1466
+
1467
+ const colorDiffs = differences.filter((d) => d.category === "color");
1468
+ if (colorDiffs.length > 0) {
1469
+ recommendations.push("Update color tokens to match reference design");
1470
+ }
1471
+
1472
+ const compDiffs = differences.filter((d) => d.category === "component");
1473
+ if (compDiffs.length > 0) {
1474
+ recommendations.push("Add or remove components to match reference");
1475
+ }
1476
+
1477
+ if (differences.length === 0) {
1478
+ recommendations.push("Designs are consistent");
1479
+ }
1480
+
1481
+ return recommendations;
1482
+ }
1483
+
1484
+ /* --------------------------------------------------------------------------
1485
+ * Server Lifecycle
1486
+ * -------------------------------------------------------------------------- */
1487
+
1488
+ async run(): Promise<void> {
1489
+ const transport = new StdioServerTransport();
1490
+ await this.server.connect(transport);
1491
+ }
1492
+ }
1493
+
1494
+ const entryPoint = path.resolve(process.argv[1] ?? "");
1495
+ if (entryPoint && fileURLToPath(import.meta.url) === entryPoint) {
1496
+ const server = new MultimodalLookerServer();
1497
+ server.run().catch(console.error);
1498
+ }
1499
+
1500
+ export { MultimodalLookerServer };