agentic-qe 2.3.5 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/.claude/agents/qe-a11y-ally.md +751 -0
  2. package/.claude/agents/qx-partner.md +120 -4
  3. package/.claude/skills/testability-scoring/SKILL.md +107 -6
  4. package/CHANGELOG.md +133 -0
  5. package/README.md +7 -6
  6. package/dist/agents/AccessibilityAllyAgent.d.ts +168 -0
  7. package/dist/agents/AccessibilityAllyAgent.d.ts.map +1 -0
  8. package/dist/agents/AccessibilityAllyAgent.js +462 -0
  9. package/dist/agents/AccessibilityAllyAgent.js.map +1 -0
  10. package/dist/agents/BaseAgent.d.ts +56 -49
  11. package/dist/agents/BaseAgent.d.ts.map +1 -1
  12. package/dist/agents/BaseAgent.js +208 -604
  13. package/dist/agents/BaseAgent.js.map +1 -1
  14. package/dist/agents/FlakyTestHunterAgent.d.ts +2 -2
  15. package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
  16. package/dist/agents/FlakyTestHunterAgent.js +8 -104
  17. package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
  18. package/dist/agents/SONAIntegration.d.ts +109 -0
  19. package/dist/agents/SONAIntegration.d.ts.map +1 -0
  20. package/dist/agents/SONAIntegration.js +167 -0
  21. package/dist/agents/SONAIntegration.js.map +1 -0
  22. package/dist/agents/TestExecutorAgent.d.ts +1 -1
  23. package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
  24. package/dist/agents/TestExecutorAgent.js +4 -46
  25. package/dist/agents/TestExecutorAgent.js.map +1 -1
  26. package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
  27. package/dist/agents/TestGeneratorAgent.js +15 -35
  28. package/dist/agents/TestGeneratorAgent.js.map +1 -1
  29. package/dist/agents/adapters/CoordinatorAdapter.d.ts +47 -0
  30. package/dist/agents/adapters/CoordinatorAdapter.d.ts.map +1 -0
  31. package/dist/agents/adapters/CoordinatorAdapter.js +266 -0
  32. package/dist/agents/adapters/CoordinatorAdapter.js.map +1 -0
  33. package/dist/agents/adapters/LearningEngineAdapter.d.ts +45 -0
  34. package/dist/agents/adapters/LearningEngineAdapter.d.ts.map +1 -0
  35. package/dist/agents/adapters/LearningEngineAdapter.js +279 -0
  36. package/dist/agents/adapters/LearningEngineAdapter.js.map +1 -0
  37. package/dist/agents/adapters/LifecycleManagerAdapter.d.ts +45 -0
  38. package/dist/agents/adapters/LifecycleManagerAdapter.d.ts.map +1 -0
  39. package/dist/agents/adapters/LifecycleManagerAdapter.js +128 -0
  40. package/dist/agents/adapters/LifecycleManagerAdapter.js.map +1 -0
  41. package/dist/agents/adapters/MemoryServiceAdapter.d.ts +96 -0
  42. package/dist/agents/adapters/MemoryServiceAdapter.d.ts.map +1 -0
  43. package/dist/agents/adapters/MemoryServiceAdapter.js +266 -0
  44. package/dist/agents/adapters/MemoryServiceAdapter.js.map +1 -0
  45. package/dist/agents/adapters/index.d.ts +14 -0
  46. package/dist/agents/adapters/index.d.ts.map +1 -0
  47. package/dist/agents/adapters/index.js +25 -0
  48. package/dist/agents/adapters/index.js.map +1 -0
  49. package/dist/agents/index.d.ts +3 -0
  50. package/dist/agents/index.d.ts.map +1 -1
  51. package/dist/agents/index.js +93 -2
  52. package/dist/agents/index.js.map +1 -1
  53. package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
  54. package/dist/agents/lifecycle/AgentLifecycleManager.js +12 -6
  55. package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
  56. package/dist/cli/init/agents.js +1 -1
  57. package/dist/cli/init/claude-config.js +2 -2
  58. package/dist/cli/init/database-init.js +1 -1
  59. package/dist/core/cache/BinaryCacheBuilder.d.ts +84 -0
  60. package/dist/core/cache/BinaryCacheBuilder.d.ts.map +1 -0
  61. package/dist/core/cache/BinaryCacheBuilder.js +225 -0
  62. package/dist/core/cache/BinaryCacheBuilder.js.map +1 -0
  63. package/dist/core/cache/BinaryCacheImpl.d.ts +161 -0
  64. package/dist/core/cache/BinaryCacheImpl.d.ts.map +1 -0
  65. package/dist/core/cache/BinaryCacheImpl.js +685 -0
  66. package/dist/core/cache/BinaryCacheImpl.js.map +1 -0
  67. package/dist/core/cache/BinaryCacheManager.d.ts +142 -0
  68. package/dist/core/cache/BinaryCacheManager.d.ts.map +1 -0
  69. package/dist/core/cache/BinaryCacheManager.js +354 -0
  70. package/dist/core/cache/BinaryCacheManager.js.map +1 -0
  71. package/dist/core/cache/BinaryCacheReader.d.ts +129 -0
  72. package/dist/core/cache/BinaryCacheReader.d.ts.map +1 -0
  73. package/dist/core/cache/BinaryCacheReader.js +243 -0
  74. package/dist/core/cache/BinaryCacheReader.js.map +1 -0
  75. package/dist/core/cache/BinaryMetadataCache.d.ts +777 -0
  76. package/dist/core/cache/BinaryMetadataCache.d.ts.map +1 -0
  77. package/dist/core/cache/BinaryMetadataCache.js +204 -0
  78. package/dist/core/cache/BinaryMetadataCache.js.map +1 -0
  79. package/dist/core/cache/CacheInvalidator.d.ts +103 -0
  80. package/dist/core/cache/CacheInvalidator.d.ts.map +1 -0
  81. package/dist/core/cache/CacheInvalidator.js +152 -0
  82. package/dist/core/cache/CacheInvalidator.js.map +1 -0
  83. package/dist/core/cache/CacheValidator.d.ts +69 -0
  84. package/dist/core/cache/CacheValidator.d.ts.map +1 -0
  85. package/dist/core/cache/CacheValidator.js +189 -0
  86. package/dist/core/cache/CacheValidator.js.map +1 -0
  87. package/dist/core/cache/MessagePackSerializer.d.ts +163 -0
  88. package/dist/core/cache/MessagePackSerializer.d.ts.map +1 -0
  89. package/dist/core/cache/MessagePackSerializer.js +274 -0
  90. package/dist/core/cache/MessagePackSerializer.js.map +1 -0
  91. package/dist/core/cache/index.d.ts +59 -0
  92. package/dist/core/cache/index.d.ts.map +1 -0
  93. package/dist/core/cache/index.js +111 -0
  94. package/dist/core/cache/index.js.map +1 -0
  95. package/dist/core/index.d.ts +2 -0
  96. package/dist/core/index.d.ts.map +1 -1
  97. package/dist/core/index.js +18 -0
  98. package/dist/core/index.js.map +1 -1
  99. package/dist/core/memory/AgentDBService.d.ts +30 -4
  100. package/dist/core/memory/AgentDBService.d.ts.map +1 -1
  101. package/dist/core/memory/AgentDBService.js +122 -12
  102. package/dist/core/memory/AgentDBService.js.map +1 -1
  103. package/dist/core/memory/CachedHNSWVectorMemory.d.ts +153 -0
  104. package/dist/core/memory/CachedHNSWVectorMemory.d.ts.map +1 -0
  105. package/dist/core/memory/CachedHNSWVectorMemory.js +329 -0
  106. package/dist/core/memory/CachedHNSWVectorMemory.js.map +1 -0
  107. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  108. package/dist/core/memory/PatternStoreFactory.d.ts +28 -0
  109. package/dist/core/memory/PatternStoreFactory.d.ts.map +1 -1
  110. package/dist/core/memory/PatternStoreFactory.js +68 -3
  111. package/dist/core/memory/PatternStoreFactory.js.map +1 -1
  112. package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
  113. package/dist/core/memory/RuVectorPatternStore.js +8 -2
  114. package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
  115. package/dist/core/memory/UnifiedMemoryCoordinator.d.ts +50 -0
  116. package/dist/core/memory/UnifiedMemoryCoordinator.d.ts.map +1 -1
  117. package/dist/core/memory/UnifiedMemoryCoordinator.js +206 -0
  118. package/dist/core/memory/UnifiedMemoryCoordinator.js.map +1 -1
  119. package/dist/core/memory/index.d.ts +2 -0
  120. package/dist/core/memory/index.d.ts.map +1 -1
  121. package/dist/core/memory/index.js +8 -1
  122. package/dist/core/memory/index.js.map +1 -1
  123. package/dist/core/optimization/RecursiveOptimizer.d.ts +233 -0
  124. package/dist/core/optimization/RecursiveOptimizer.d.ts.map +1 -0
  125. package/dist/core/optimization/RecursiveOptimizer.js +509 -0
  126. package/dist/core/optimization/RecursiveOptimizer.js.map +1 -0
  127. package/dist/core/platform/FileOperations.d.ts +124 -0
  128. package/dist/core/platform/FileOperations.d.ts.map +1 -0
  129. package/dist/core/platform/FileOperations.js +371 -0
  130. package/dist/core/platform/FileOperations.js.map +1 -0
  131. package/dist/core/platform/PlatformDetector.d.ts +53 -0
  132. package/dist/core/platform/PlatformDetector.d.ts.map +1 -0
  133. package/dist/core/platform/PlatformDetector.js +251 -0
  134. package/dist/core/platform/PlatformDetector.js.map +1 -0
  135. package/dist/core/platform/index.d.ts +12 -0
  136. package/dist/core/platform/index.d.ts.map +1 -0
  137. package/dist/core/platform/index.js +28 -0
  138. package/dist/core/platform/index.js.map +1 -0
  139. package/dist/core/strategies/AcceleratedLearningStrategy.d.ts +74 -0
  140. package/dist/core/strategies/AcceleratedLearningStrategy.d.ts.map +1 -0
  141. package/dist/core/strategies/AcceleratedLearningStrategy.js +200 -0
  142. package/dist/core/strategies/AcceleratedLearningStrategy.js.map +1 -0
  143. package/dist/core/strategies/AgentCoordinationStrategy.d.ts +157 -0
  144. package/dist/core/strategies/AgentCoordinationStrategy.d.ts.map +1 -0
  145. package/dist/core/strategies/AgentCoordinationStrategy.js +12 -0
  146. package/dist/core/strategies/AgentCoordinationStrategy.js.map +1 -0
  147. package/dist/core/strategies/AgentLearningStrategy.d.ts +200 -0
  148. package/dist/core/strategies/AgentLearningStrategy.d.ts.map +1 -0
  149. package/dist/core/strategies/AgentLearningStrategy.js +13 -0
  150. package/dist/core/strategies/AgentLearningStrategy.js.map +1 -0
  151. package/dist/core/strategies/AgentLifecycleStrategy.d.ts +116 -0
  152. package/dist/core/strategies/AgentLifecycleStrategy.d.ts.map +1 -0
  153. package/dist/core/strategies/AgentLifecycleStrategy.js +12 -0
  154. package/dist/core/strategies/AgentLifecycleStrategy.js.map +1 -0
  155. package/dist/core/strategies/AgentMemoryStrategy.d.ts +154 -0
  156. package/dist/core/strategies/AgentMemoryStrategy.d.ts.map +1 -0
  157. package/dist/core/strategies/AgentMemoryStrategy.js +13 -0
  158. package/dist/core/strategies/AgentMemoryStrategy.js.map +1 -0
  159. package/dist/core/strategies/DefaultCoordinationStrategy.d.ts +105 -0
  160. package/dist/core/strategies/DefaultCoordinationStrategy.d.ts.map +1 -0
  161. package/dist/core/strategies/DefaultCoordinationStrategy.js +332 -0
  162. package/dist/core/strategies/DefaultCoordinationStrategy.js.map +1 -0
  163. package/dist/core/strategies/DefaultLearningStrategy.d.ts +120 -0
  164. package/dist/core/strategies/DefaultLearningStrategy.d.ts.map +1 -0
  165. package/dist/core/strategies/DefaultLearningStrategy.js +365 -0
  166. package/dist/core/strategies/DefaultLearningStrategy.js.map +1 -0
  167. package/dist/core/strategies/DefaultLifecycleStrategy.d.ts +129 -0
  168. package/dist/core/strategies/DefaultLifecycleStrategy.d.ts.map +1 -0
  169. package/dist/core/strategies/DefaultLifecycleStrategy.js +297 -0
  170. package/dist/core/strategies/DefaultLifecycleStrategy.js.map +1 -0
  171. package/dist/core/strategies/DefaultMemoryStrategy.d.ts +91 -0
  172. package/dist/core/strategies/DefaultMemoryStrategy.d.ts.map +1 -0
  173. package/dist/core/strategies/DefaultMemoryStrategy.js +257 -0
  174. package/dist/core/strategies/DefaultMemoryStrategy.js.map +1 -0
  175. package/dist/core/strategies/DistributedMemoryStrategy.d.ts +85 -0
  176. package/dist/core/strategies/DistributedMemoryStrategy.d.ts.map +1 -0
  177. package/dist/core/strategies/DistributedMemoryStrategy.js +126 -0
  178. package/dist/core/strategies/DistributedMemoryStrategy.js.map +1 -0
  179. package/dist/core/strategies/SONALearningStrategy.d.ts +115 -0
  180. package/dist/core/strategies/SONALearningStrategy.d.ts.map +1 -0
  181. package/dist/core/strategies/SONALearningStrategy.js +656 -0
  182. package/dist/core/strategies/SONALearningStrategy.js.map +1 -0
  183. package/dist/core/strategies/TRMLearningStrategy.d.ts +162 -0
  184. package/dist/core/strategies/TRMLearningStrategy.d.ts.map +1 -0
  185. package/dist/core/strategies/TRMLearningStrategy.js +670 -0
  186. package/dist/core/strategies/TRMLearningStrategy.js.map +1 -0
  187. package/dist/core/strategies/index.d.ts +104 -0
  188. package/dist/core/strategies/index.d.ts.map +1 -0
  189. package/dist/core/strategies/index.js +68 -0
  190. package/dist/core/strategies/index.js.map +1 -0
  191. package/dist/learning/PerformanceOptimizer.js +2 -2
  192. package/dist/learning/PerformanceOptimizer.js.map +1 -1
  193. package/dist/learning/SONAFeedbackLoop.d.ts +168 -0
  194. package/dist/learning/SONAFeedbackLoop.d.ts.map +1 -0
  195. package/dist/learning/SONAFeedbackLoop.js +344 -0
  196. package/dist/learning/SONAFeedbackLoop.js.map +1 -0
  197. package/dist/learning/baselines/BaselineCollector.d.ts +1 -1
  198. package/dist/learning/baselines/BaselineCollector.js +1 -1
  199. package/dist/learning/baselines/StandardTaskSuite.d.ts +1 -1
  200. package/dist/learning/baselines/StandardTaskSuite.js +1 -1
  201. package/dist/learning/index.d.ts +2 -0
  202. package/dist/learning/index.d.ts.map +1 -1
  203. package/dist/learning/index.js +6 -1
  204. package/dist/learning/index.js.map +1 -1
  205. package/dist/mcp/handlers/base-handler.d.ts +28 -1
  206. package/dist/mcp/handlers/base-handler.d.ts.map +1 -1
  207. package/dist/mcp/handlers/base-handler.js +41 -0
  208. package/dist/mcp/handlers/base-handler.js.map +1 -1
  209. package/dist/mcp/server-instructions.d.ts +1 -1
  210. package/dist/mcp/server-instructions.js +1 -1
  211. package/dist/mcp/server.d.ts.map +1 -1
  212. package/dist/mcp/server.js +23 -16
  213. package/dist/mcp/server.js.map +1 -1
  214. package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
  215. package/dist/mcp/services/AgentRegistry.js +6 -1
  216. package/dist/mcp/services/AgentRegistry.js.map +1 -1
  217. package/dist/mcp/tools/qe/accessibility/accname-computation.d.ts +114 -0
  218. package/dist/mcp/tools/qe/accessibility/accname-computation.d.ts.map +1 -0
  219. package/dist/mcp/tools/qe/accessibility/accname-computation.js +566 -0
  220. package/dist/mcp/tools/qe/accessibility/accname-computation.js.map +1 -0
  221. package/dist/mcp/tools/qe/accessibility/apg-patterns.d.ts +103 -0
  222. package/dist/mcp/tools/qe/accessibility/apg-patterns.d.ts.map +1 -0
  223. package/dist/mcp/tools/qe/accessibility/apg-patterns.js +1028 -0
  224. package/dist/mcp/tools/qe/accessibility/apg-patterns.js.map +1 -0
  225. package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.d.ts +48 -0
  226. package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.d.ts.map +1 -0
  227. package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.js +565 -0
  228. package/dist/mcp/tools/qe/accessibility/en-301-549-mapping.js.map +1 -0
  229. package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.d.ts +117 -0
  230. package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.d.ts.map +1 -0
  231. package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.js +571 -0
  232. package/dist/mcp/tools/qe/accessibility/eu-accessibility-act.js.map +1 -0
  233. package/dist/mcp/tools/qe/accessibility/html-report-generator.d.ts +23 -0
  234. package/dist/mcp/tools/qe/accessibility/html-report-generator.d.ts.map +1 -0
  235. package/dist/mcp/tools/qe/accessibility/html-report-generator.js +1152 -0
  236. package/dist/mcp/tools/qe/accessibility/html-report-generator.js.map +1 -0
  237. package/dist/mcp/tools/qe/accessibility/index.d.ts +22 -0
  238. package/dist/mcp/tools/qe/accessibility/index.d.ts.map +1 -0
  239. package/dist/mcp/tools/qe/accessibility/index.js +38 -0
  240. package/dist/mcp/tools/qe/accessibility/index.js.map +1 -0
  241. package/dist/mcp/tools/qe/accessibility/markdown-report-generator.d.ts +18 -0
  242. package/dist/mcp/tools/qe/accessibility/markdown-report-generator.d.ts.map +1 -0
  243. package/dist/mcp/tools/qe/accessibility/markdown-report-generator.js +549 -0
  244. package/dist/mcp/tools/qe/accessibility/markdown-report-generator.js.map +1 -0
  245. package/dist/mcp/tools/qe/accessibility/remediation-code-generator.d.ts +139 -0
  246. package/dist/mcp/tools/qe/accessibility/remediation-code-generator.d.ts.map +1 -0
  247. package/dist/mcp/tools/qe/accessibility/remediation-code-generator.js +1300 -0
  248. package/dist/mcp/tools/qe/accessibility/remediation-code-generator.js.map +1 -0
  249. package/dist/mcp/tools/qe/accessibility/scan-comprehensive.d.ts +138 -0
  250. package/dist/mcp/tools/qe/accessibility/scan-comprehensive.d.ts.map +1 -0
  251. package/dist/mcp/tools/qe/accessibility/scan-comprehensive.js +1326 -0
  252. package/dist/mcp/tools/qe/accessibility/scan-comprehensive.js.map +1 -0
  253. package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.d.ts +50 -0
  254. package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.d.ts.map +1 -0
  255. package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.js +469 -0
  256. package/dist/mcp/tools/qe/accessibility/video-vision-analyzer.js.map +1 -0
  257. package/dist/mcp/tools/qe/accessibility/webvtt-generator.d.ts +193 -0
  258. package/dist/mcp/tools/qe/accessibility/webvtt-generator.d.ts.map +1 -0
  259. package/dist/mcp/tools/qe/accessibility/webvtt-generator.js +511 -0
  260. package/dist/mcp/tools/qe/accessibility/webvtt-generator.js.map +1 -0
  261. package/dist/mcp/tools.d.ts +1 -0
  262. package/dist/mcp/tools.d.ts.map +1 -1
  263. package/dist/mcp/tools.js +61 -0
  264. package/dist/mcp/tools.js.map +1 -1
  265. package/dist/output/AIActionSuggester.d.ts +98 -0
  266. package/dist/output/AIActionSuggester.d.ts.map +1 -0
  267. package/dist/output/AIActionSuggester.js +499 -0
  268. package/dist/output/AIActionSuggester.js.map +1 -0
  269. package/dist/output/CLIOutputHelper.d.ts +169 -0
  270. package/dist/output/CLIOutputHelper.d.ts.map +1 -0
  271. package/dist/output/CLIOutputHelper.js +320 -0
  272. package/dist/output/CLIOutputHelper.js.map +1 -0
  273. package/dist/output/OutputFormatter.d.ts +764 -0
  274. package/dist/output/OutputFormatter.d.ts.map +1 -0
  275. package/dist/output/OutputFormatter.js +125 -0
  276. package/dist/output/OutputFormatter.js.map +1 -0
  277. package/dist/output/OutputFormatterImpl.d.ts +131 -0
  278. package/dist/output/OutputFormatterImpl.d.ts.map +1 -0
  279. package/dist/output/OutputFormatterImpl.js +556 -0
  280. package/dist/output/OutputFormatterImpl.js.map +1 -0
  281. package/dist/output/examples.d.ts +38 -0
  282. package/dist/output/examples.d.ts.map +1 -0
  283. package/dist/output/examples.js +503 -0
  284. package/dist/output/examples.js.map +1 -0
  285. package/dist/output/index.d.ts +16 -0
  286. package/dist/output/index.d.ts.map +1 -0
  287. package/dist/output/index.js +58 -0
  288. package/dist/output/index.js.map +1 -0
  289. package/dist/providers/HybridRouter.d.ts +34 -3
  290. package/dist/providers/HybridRouter.d.ts.map +1 -1
  291. package/dist/providers/HybridRouter.js +69 -4
  292. package/dist/providers/HybridRouter.js.map +1 -1
  293. package/dist/providers/LLMProviderFactory.d.ts +68 -1
  294. package/dist/providers/LLMProviderFactory.d.ts.map +1 -1
  295. package/dist/providers/LLMProviderFactory.js +173 -6
  296. package/dist/providers/LLMProviderFactory.js.map +1 -1
  297. package/dist/providers/OpenRouterProvider.d.ts +150 -0
  298. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  299. package/dist/providers/OpenRouterProvider.js +545 -0
  300. package/dist/providers/OpenRouterProvider.js.map +1 -0
  301. package/dist/providers/RuvllmProvider.d.ts +130 -16
  302. package/dist/providers/RuvllmProvider.d.ts.map +1 -1
  303. package/dist/providers/RuvllmProvider.js +399 -83
  304. package/dist/providers/RuvllmProvider.js.map +1 -1
  305. package/dist/providers/index.d.ts +33 -4
  306. package/dist/providers/index.d.ts.map +1 -1
  307. package/dist/providers/index.js +72 -21
  308. package/dist/providers/index.js.map +1 -1
  309. package/dist/telemetry/instrumentation/agent.d.ts +1 -1
  310. package/dist/telemetry/instrumentation/agent.js +1 -1
  311. package/dist/telemetry/instrumentation/index.d.ts +1 -1
  312. package/dist/telemetry/instrumentation/index.js +1 -1
  313. package/dist/types/index.d.ts +2 -1
  314. package/dist/types/index.d.ts.map +1 -1
  315. package/dist/types/index.js +2 -0
  316. package/dist/types/index.js.map +1 -1
  317. package/dist/types/ruvllm.d.ts +97 -0
  318. package/dist/types/ruvllm.d.ts.map +1 -0
  319. package/dist/types/ruvllm.js +46 -0
  320. package/dist/types/ruvllm.js.map +1 -0
  321. package/dist/utils/ruvllm-loader.d.ts +94 -0
  322. package/dist/utils/ruvllm-loader.d.ts.map +1 -0
  323. package/dist/utils/ruvllm-loader.js +87 -0
  324. package/dist/utils/ruvllm-loader.js.map +1 -0
  325. package/docs/reference/agents.md +36 -1
  326. package/package.json +7 -2
@@ -0,0 +1,1152 @@
1
+ "use strict";
2
+ /**
3
+ * HTML Report Generator for Accessibility Scan Results
4
+ *
5
+ * Generates beautiful, comprehensive HTML reports with:
6
+ * - Executive summary with compliance score
7
+ * - Detailed violation listings with context
8
+ * - Context-aware remediation recommendations
9
+ * - ROI-based prioritization
10
+ * - Visual severity indicators
11
+ * - Print-friendly styling
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.generateHTMLReport = generateHTMLReport;
15
+ /**
16
+ * Generate comprehensive HTML accessibility report
17
+ */
18
+ function generateHTMLReport(result, options = {}) {
19
+ const { title = 'Accessibility Scan Report', includeCodeExamples = true, theme = 'light' } = options;
20
+ const timestamp = new Date().toISOString();
21
+ const formattedDate = new Date(timestamp).toLocaleString('en-US', {
22
+ year: 'numeric',
23
+ month: 'long',
24
+ day: 'numeric',
25
+ hour: '2-digit',
26
+ minute: '2-digit'
27
+ });
28
+ return `<!DOCTYPE html>
29
+ <html lang="en">
30
+ <head>
31
+ <meta charset="UTF-8">
32
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
33
+ <title>${escapeHtml(title)}</title>
34
+ <style>
35
+ ${getStyles(theme)}
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <div class="container">
40
+ ${generateHeader(result, formattedDate)}
41
+ ${generateExecutiveSummary(result)}
42
+ ${result.euAccessibilityAct ? generateEUComplianceSection(result) : ''}
43
+ ${result.videoElements && result.videoElements > 0 ? generateVideoSection(result.videoElements) : ''}
44
+ ${generateComplianceDetails(result)}
45
+ ${generateViolationsSection(result, includeCodeExamples)}
46
+ ${generateRemediationsSection(result, includeCodeExamples)}
47
+ ${generateFooter(result)}
48
+ </div>
49
+ </body>
50
+ </html>`;
51
+ }
52
+ /**
53
+ * Generate report header
54
+ */
55
+ function generateHeader(result, formattedDate) {
56
+ return `
57
+ <header class="report-header">
58
+ <h1>🔍 Accessibility Scan Report</h1>
59
+ <div class="header-meta">
60
+ <div class="meta-item">
61
+ <span class="meta-label">URL:</span>
62
+ <a href="${escapeHtml(result.url)}" target="_blank" class="meta-value">${escapeHtml(result.url)}</a>
63
+ </div>
64
+ <div class="meta-item">
65
+ <span class="meta-label">Scan ID:</span>
66
+ <span class="meta-value">${escapeHtml(result.scanId)}</span>
67
+ </div>
68
+ <div class="meta-item">
69
+ <span class="meta-label">Date:</span>
70
+ <span class="meta-value">${formattedDate}</span>
71
+ </div>
72
+ <div class="meta-item">
73
+ <span class="meta-label">WCAG Level:</span>
74
+ <span class="meta-value badge badge-level">${escapeHtml(result.compliance.level)}</span>
75
+ </div>
76
+ </div>
77
+ </header>`;
78
+ }
79
+ /**
80
+ * Generate executive summary
81
+ */
82
+ function generateExecutiveSummary(result) {
83
+ const statusClass = getStatusClass(result.compliance.status);
84
+ const scoreClass = getScoreClass(result.compliance.score);
85
+ const readinessIcon = result.compliance.productionReady ? '✅' : '❌';
86
+ return `
87
+ <section class="executive-summary">
88
+ <h2>📊 Executive Summary</h2>
89
+
90
+ <div class="summary-grid">
91
+ <div class="summary-card ${scoreClass}">
92
+ <div class="card-label">Compliance Score</div>
93
+ <div class="card-value">${result.compliance.score}/100</div>
94
+ <div class="card-description">Overall accessibility rating</div>
95
+ </div>
96
+
97
+ <div class="summary-card ${statusClass}">
98
+ <div class="card-label">Status</div>
99
+ <div class="card-value status-badge status-${result.compliance.status}">
100
+ ${formatStatus(result.compliance.status)}
101
+ </div>
102
+ <div class="card-description">WCAG ${result.compliance.level} compliance</div>
103
+ </div>
104
+
105
+ <div class="summary-card ${result.compliance.productionReady ? 'score-excellent' : 'score-poor'}">
106
+ <div class="card-label">Production Ready</div>
107
+ <div class="card-value">${readinessIcon} ${result.compliance.productionReady ? 'YES' : 'NO'}</div>
108
+ <div class="card-description">${result.compliance.productionReady ? 'Safe to deploy' : 'Fix critical issues first'}</div>
109
+ </div>
110
+
111
+ <div class="summary-card">
112
+ <div class="card-label">Total Violations</div>
113
+ <div class="card-value">${result.summary.total}</div>
114
+ <div class="card-description">Accessibility barriers detected</div>
115
+ </div>
116
+ </div>
117
+
118
+ <div class="violations-breakdown">
119
+ <h3>Violations by Severity</h3>
120
+ <div class="breakdown-grid">
121
+ ${generateSeverityBadge('critical', result.summary.critical)}
122
+ ${generateSeverityBadge('serious', result.summary.serious)}
123
+ ${generateSeverityBadge('moderate', result.summary.moderate)}
124
+ ${generateSeverityBadge('minor', result.summary.minor)}
125
+ </div>
126
+ </div>
127
+ </section>`;
128
+ }
129
+ /**
130
+ * Generate compliance details
131
+ */
132
+ function generateComplianceDetails(result) {
133
+ const principles = analyzePrinciples(result);
134
+ return `
135
+ <section class="compliance-details">
136
+ <h2>✓ WCAG 2.2 Principles Compliance</h2>
137
+
138
+ <div class="principles-grid">
139
+ ${Object.entries(principles).map(([principle, data]) => `
140
+ <div class="principle-card ${data.passing ? 'principle-pass' : 'principle-fail'}">
141
+ <div class="principle-header">
142
+ <span class="principle-icon">${data.passing ? '✅' : '❌'}</span>
143
+ <h3>${principle}</h3>
144
+ </div>
145
+ <div class="principle-status">${data.passing ? 'PASSES' : 'FAILS'}</div>
146
+ <div class="principle-issues">${data.issues} issue${data.issues !== 1 ? 's' : ''}</div>
147
+ </div>
148
+ `).join('')}
149
+ </div>
150
+ </section>`;
151
+ }
152
+ /**
153
+ * Generate violations section
154
+ */
155
+ function generateViolationsSection(result, includeCodeExamples) {
156
+ if (result.violations.length === 0) {
157
+ return `
158
+ <section class="violations-section">
159
+ <h2>🎉 No Violations Found</h2>
160
+ <p class="success-message">This page passes all WCAG ${result.compliance.level} accessibility checks!</p>
161
+ </section>`;
162
+ }
163
+ return `
164
+ <section class="violations-section">
165
+ <h2>⚠️ Accessibility Violations (${result.violations.length})</h2>
166
+
167
+ <div class="violations-list">
168
+ ${result.violations.map((violation, index) => `
169
+ <div class="violation-card severity-${violation.severity}" id="violation-${index}">
170
+ <div class="violation-header">
171
+ <span class="violation-number">#${index + 1}</span>
172
+ <span class="severity-badge severity-${violation.severity}">${violation.severity.toUpperCase()}</span>
173
+ <h3>${escapeHtml(violation.description)}</h3>
174
+ </div>
175
+
176
+ <div class="violation-meta">
177
+ <div class="meta-row">
178
+ <span class="meta-label">WCAG Criterion:</span>
179
+ <span class="meta-value">${violation.wcagCriterion} (Level ${violation.wcagLevel})</span>
180
+ </div>
181
+ <div class="meta-row">
182
+ <span class="meta-label">Impact:</span>
183
+ <span class="meta-value">${escapeHtml(violation.impact)}</span>
184
+ </div>
185
+ ${violation.userImpact ? `
186
+ <div class="meta-row">
187
+ <span class="meta-label">Affected Users:</span>
188
+ <span class="meta-value">${violation.userImpact.affectedUserPercentage}% (${violation.userImpact.disabilityTypes.join(', ')})</span>
189
+ </div>
190
+ ` : ''}
191
+ </div>
192
+
193
+ <div class="affected-elements">
194
+ <h4>Affected Elements (${violation.elements.length})</h4>
195
+ ${violation.elements.map((element, elemIndex) => `
196
+ <div class="element-item">
197
+ <div class="element-selector">
198
+ <code>${escapeHtml(element.selector)}</code>
199
+ </div>
200
+ ${includeCodeExamples ? `
201
+ <div class="element-html">
202
+ <pre><code>${escapeHtml(element.html)}</code></pre>
203
+ </div>
204
+ ` : ''}
205
+ ${element.context ? `
206
+ <div class="element-context">
207
+ <strong>Context:</strong> ${escapeHtml(element.context.purpose || 'Unknown')}
208
+ ${element.context.parentElement ? ` in &lt;${element.context.parentElement}&gt;` : ''}
209
+ </div>
210
+ ` : ''}
211
+ </div>
212
+ `).join('')}
213
+ </div>
214
+
215
+ <div class="how-to-fix">
216
+ <h4>📖 How to Fix</h4>
217
+ <p>${escapeHtml(violation.impact)}</p>
218
+ <p><strong>See Context-Aware Remediation Plan below for specific, copy-paste-ready solutions.</strong></p>
219
+ </div>
220
+ </div>
221
+ `).join('')}
222
+ </div>
223
+ </section>`;
224
+ }
225
+ /**
226
+ * Generate remediations section
227
+ */
228
+ function generateRemediationsSection(result, includeCodeExamples) {
229
+ if (!result.remediations || result.remediations.length === 0) {
230
+ return '';
231
+ }
232
+ // Sort by ROI descending
233
+ const sortedRemediations = [...result.remediations].sort((a, b) => b.roi - a.roi);
234
+ return `
235
+ <section class="remediations-section">
236
+ <h2>🔧 Context-Aware Remediation Plan</h2>
237
+ <p class="section-description">Prioritized by ROI (Impact / Effort ratio) - Fix high-ROI items first for maximum impact.</p>
238
+
239
+ <div class="remediations-list">
240
+ ${sortedRemediations.map((remediation, index) => {
241
+ const violation = result.violations.find(v => v.id === remediation.violationId);
242
+ if (!violation)
243
+ return '';
244
+ return `
245
+ <div class="remediation-card priority-${Math.floor(remediation.priority)}">
246
+ <div class="remediation-header">
247
+ <span class="remediation-rank">#${index + 1}</span>
248
+ <h3>Fix: ${escapeHtml(violation.description)}</h3>
249
+ <span class="roi-badge">ROI: ${remediation.roi.toFixed(2)}</span>
250
+ </div>
251
+
252
+ <div class="remediation-stats">
253
+ <div class="stat-item">
254
+ <span class="stat-label">Priority:</span>
255
+ <span class="stat-value">${remediation.priority.toFixed(1)}/10</span>
256
+ </div>
257
+ <div class="stat-item">
258
+ <span class="stat-label">Effort:</span>
259
+ <span class="stat-value">${remediation.estimatedEffort.hours}h (${remediation.estimatedEffort.complexity})</span>
260
+ </div>
261
+ <div class="stat-item">
262
+ <span class="stat-label">Impact:</span>
263
+ <span class="stat-value">${violation.userImpact?.affectedUserPercentage || 5}% users</span>
264
+ </div>
265
+ </div>
266
+
267
+ ${remediation.recommendations.map((rec, recIndex) => `
268
+ <div class="recommendation-item">
269
+ <div class="recommendation-header">
270
+ <span class="recommendation-priority">Priority ${rec.priority}</span>
271
+ <span class="recommendation-approach">${formatApproach(rec.approach)}</span>
272
+ <span class="recommendation-confidence">Confidence: ${(rec.confidence * 100).toFixed(0)}%</span>
273
+ </div>
274
+
275
+ <div class="recommendation-rationale">
276
+ <strong>Rationale:</strong> ${escapeHtml(rec.rationale)}
277
+ </div>
278
+
279
+ ${includeCodeExamples ? `
280
+ <div class="recommendation-code">
281
+ <h4>Solution Code:</h4>
282
+ <pre><code>${escapeHtml(rec.code)}</code></pre>
283
+ </div>
284
+ ` : ''}
285
+
286
+ <div class="recommendation-criteria">
287
+ <strong>WCAG Criteria Met:</strong> ${rec.wcagCriteria.join(', ')}
288
+ </div>
289
+ </div>
290
+ `).join('')}
291
+ </div>
292
+ `;
293
+ }).join('')}
294
+ </div>
295
+
296
+ <div class="total-effort">
297
+ <h3>📊 Total Remediation Effort</h3>
298
+ <div class="effort-summary">
299
+ <div class="effort-item">
300
+ <span class="effort-label">Total Time:</span>
301
+ <span class="effort-value">${calculateTotalEffort(result.remediations)}h</span>
302
+ </div>
303
+ <div class="effort-item">
304
+ <span class="effort-label">Team Size:</span>
305
+ <span class="effort-value">1 developer</span>
306
+ </div>
307
+ <div class="effort-item">
308
+ <span class="effort-label">Timeline:</span>
309
+ <span class="effort-value">${estimateTimeline(result.remediations)}</span>
310
+ </div>
311
+ </div>
312
+ </div>
313
+ </section>`;
314
+ }
315
+ /**
316
+ * Generate footer
317
+ */
318
+ function generateFooter(result) {
319
+ return `
320
+ <footer class="report-footer">
321
+ <div class="footer-content">
322
+ <div class="footer-section">
323
+ <h4>🤖 Generated by</h4>
324
+ <p>qe-a11y-ally Agent (Agentic QE Fleet v2.3.5)</p>
325
+ </div>
326
+ <div class="footer-section">
327
+ <h4>⚡ Performance</h4>
328
+ <p>Scan Time: ${(result.performance.scanTime / 1000).toFixed(2)}s | Elements: ${result.performance.elementsAnalyzed}</p>
329
+ </div>
330
+ <div class="footer-section">
331
+ <h4>📚 Resources</h4>
332
+ <p>
333
+ <a href="https://www.w3.org/WAI/WCAG22/quickref/" target="_blank">WCAG 2.2 Guidelines</a> |
334
+ <a href="https://github.com/dequelabs/axe-core" target="_blank">axe-core</a>
335
+ </p>
336
+ </div>
337
+ </div>
338
+ </footer>`;
339
+ }
340
+ /**
341
+ * Generate EU Accessibility Act compliance section
342
+ */
343
+ function generateEUComplianceSection(result) {
344
+ const eaa = result.euAccessibilityAct;
345
+ const statusIcon = eaa.status === 'compliant' ? '✓' :
346
+ eaa.status === 'partially-compliant' ? '⚠' : '✗';
347
+ const riskIcon = eaa.riskLevel === 'critical' ? '🔴' :
348
+ eaa.riskLevel === 'high' ? '🟠' :
349
+ eaa.riskLevel === 'moderate' ? '🟡' : '🟢';
350
+ return `
351
+ <section class="section">
352
+ <h2>🇪🇺 European Accessibility Act Compliance</h2>
353
+ <div class="eu-compliance-grid">
354
+ <div class="eu-stat">
355
+ <div class="eu-stat-label">Status</div>
356
+ <div class="eu-stat-value status-${eaa.status}">
357
+ ${statusIcon} ${eaa.status.toUpperCase().replace(/-/g, ' ')}
358
+ </div>
359
+ </div>
360
+ <div class="eu-stat">
361
+ <div class="eu-stat-label">Compliance Score</div>
362
+ <div class="eu-stat-value">${eaa.score}/100</div>
363
+ </div>
364
+ <div class="eu-stat">
365
+ <div class="eu-stat-label">Legal Risk</div>
366
+ <div class="eu-stat-value risk-${eaa.riskLevel}">
367
+ ${riskIcon} ${eaa.riskLevel.toUpperCase()}
368
+ </div>
369
+ </div>
370
+ <div class="eu-stat">
371
+ <div class="eu-stat-label">Days Until Deadline</div>
372
+ <div class="eu-stat-value ${eaa.daysUntilDeadline < 0 ? 'overdue' : eaa.daysUntilDeadline < 90 ? 'urgent' : ''}">
373
+ ${eaa.daysUntilDeadline < 0 ? 'OVERDUE' : `${eaa.daysUntilDeadline} days`}
374
+ </div>
375
+ </div>
376
+ </div>
377
+
378
+ <div class="eaa-info">
379
+ <p><strong>Directive (EU) 2019/882 - Compliance Deadline: June 28, 2025</strong></p>
380
+ <p>The European Accessibility Act requires that products and services be accessible to persons with disabilities. Non-compliance may result in penalties determined by member states.</p>
381
+ </div>
382
+
383
+ ${eaa.failedRequirements.length > 0 ? `
384
+ <div class="eaa-failures">
385
+ <h3>Failed EU Requirements (${eaa.failedRequirements.length})</h3>
386
+ ${eaa.failedRequirements.slice(0, 5).map(req => `
387
+ <div class="eaa-requirement">
388
+ <span class="severity-icon">${req.severity === 'critical' ? '❌' : req.severity === 'major' ? '⚠️' : 'ℹ️'}</span>
389
+ <strong>[${escapeHtml(req.article)}]</strong> ${escapeHtml(req.requirement)}
390
+ </div>
391
+ `).join('')}
392
+ ${eaa.failedRequirements.length > 5 ? `<p class="more-items">... and ${eaa.failedRequirements.length - 5} more</p>` : ''}
393
+ </div>
394
+ ` : ''}
395
+
396
+ ${eaa.recommendations.length > 0 ? `
397
+ <div class="eaa-recommendations">
398
+ <h3>Recommended Actions</h3>
399
+ ${eaa.recommendations.slice(0, 5).map(rec => {
400
+ const priorityIcon = rec.priority === 'critical' ? '🔴' :
401
+ rec.priority === 'high' ? '🟠' :
402
+ rec.priority === 'medium' ? '🟡' : '🟢';
403
+ return `
404
+ <div class="eaa-action">
405
+ <div class="action-priority">${priorityIcon} <strong>${rec.priority.toUpperCase()}</strong></div>
406
+ <div class="action-text">${escapeHtml(rec.action)}</div>
407
+ <div class="action-deadline">Deadline: ${escapeHtml(rec.deadline)}</div>
408
+ </div>
409
+ `;
410
+ }).join('')}
411
+ </div>
412
+ ` : ''}
413
+ </section>`;
414
+ }
415
+ /**
416
+ * Generate video caption recommendation section
417
+ */
418
+ function generateVideoSection(videoCount) {
419
+ return `
420
+ <section class="section video-section">
421
+ <h2>🎥 Video Accessibility</h2>
422
+ <div class="alert alert-info">
423
+ <p><strong>${videoCount} video element${videoCount > 1 ? 's' : ''} detected on this page.</strong></p>
424
+ <p>According to WCAG 2.2 Level AA and the European Accessibility Act:</p>
425
+ <ul>
426
+ <li><strong>1.2.2 Captions (Prerecorded)</strong> - Level A: Captions required for all prerecorded audio content</li>
427
+ <li><strong>1.2.4 Captions (Live)</strong> - Level AA: Captions required for all live audio content</li>
428
+ <li><strong>1.2.5 Audio Description</strong> - Level AA: Audio description for prerecorded video</li>
429
+ </ul>
430
+ </div>
431
+
432
+ <div class="video-recommendation">
433
+ <h3>Caption Requirements</h3>
434
+ <p>All videos must have synchronized captions in WebVTT format. Captions should:</p>
435
+ <ul>
436
+ <li>Be accurate and synchronized with audio</li>
437
+ <li>Include speaker identification for dialogue</li>
438
+ <li>Describe relevant sound effects: <code>[applause]</code>, <code>[door closes]</code></li>
439
+ <li>Indicate music: <code>♪ background music ♪</code></li>
440
+ <li>Follow WebVTT formatting guidelines (max 37 characters per line, 2 lines per cue)</li>
441
+ <li>Maintain reading speed of 160-180 words per minute</li>
442
+ </ul>
443
+
444
+ <h3>Example WebVTT Caption File</h3>
445
+ <pre><code>WEBVTT
446
+
447
+ 00:00:00.000 --> 00:00:03.500
448
+ &lt;v Speaker&gt;Welcome to our product demonstration.&lt;/v&gt;
449
+
450
+ 00:00:03.500 --> 00:00:07.000
451
+ &lt;v Speaker&gt;Today we'll show you three
452
+ amazing features.&lt;/v&gt;
453
+
454
+ 00:00:07.000 --> 00:00:10.000
455
+ ♪ Upbeat background music ♪</code></pre>
456
+
457
+ <p><strong>Tools for caption generation:</strong></p>
458
+ <ul>
459
+ <li><a href="https://www.youtube.com/editor" target="_blank">YouTube Studio</a> - Auto-generated captions</li>
460
+ <li><a href="https://www.rev.com/" target="_blank">Rev.com</a> - Professional caption services</li>
461
+ <li><a href="https://otter.ai/" target="_blank">Otter.ai</a> - AI-powered transcription</li>
462
+ </ul>
463
+ </div>
464
+ </section>`;
465
+ }
466
+ // Helper functions
467
+ function escapeHtml(unsafe) {
468
+ return unsafe
469
+ .replace(/&/g, '&amp;')
470
+ .replace(/</g, '&lt;')
471
+ .replace(/>/g, '&gt;')
472
+ .replace(/"/g, '&quot;')
473
+ .replace(/'/g, '&#039;');
474
+ }
475
+ function getStatusClass(status) {
476
+ switch (status) {
477
+ case 'compliant': return 'score-excellent';
478
+ case 'partially-compliant': return 'score-good';
479
+ case 'non-compliant': return 'score-poor';
480
+ default: return '';
481
+ }
482
+ }
483
+ function getScoreClass(score) {
484
+ if (score >= 90)
485
+ return 'score-excellent';
486
+ if (score >= 70)
487
+ return 'score-good';
488
+ if (score >= 50)
489
+ return 'score-fair';
490
+ return 'score-poor';
491
+ }
492
+ function formatStatus(status) {
493
+ return status.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
494
+ }
495
+ function formatApproach(approach) {
496
+ return approach.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
497
+ }
498
+ function generateSeverityBadge(severity, count) {
499
+ const icons = {
500
+ critical: '🔴',
501
+ serious: '🟠',
502
+ moderate: '🟡',
503
+ minor: '🔵'
504
+ };
505
+ return `
506
+ <div class="severity-stat severity-${severity}">
507
+ <span class="severity-icon">${icons[severity]}</span>
508
+ <span class="severity-label">${severity}</span>
509
+ <span class="severity-count">${count}</span>
510
+ </div>
511
+ `;
512
+ }
513
+ function analyzePrinciples(result) {
514
+ const principles = {
515
+ 'Perceivable': { passing: true, issues: 0 },
516
+ 'Operable': { passing: true, issues: 0 },
517
+ 'Understandable': { passing: true, issues: 0 },
518
+ 'Robust': { passing: true, issues: 0 }
519
+ };
520
+ result.violations.forEach(violation => {
521
+ const criterion = violation.wcagCriterion;
522
+ if (criterion.startsWith('1.')) {
523
+ principles.Perceivable.passing = false;
524
+ principles.Perceivable.issues++;
525
+ }
526
+ else if (criterion.startsWith('2.')) {
527
+ principles.Operable.passing = false;
528
+ principles.Operable.issues++;
529
+ }
530
+ else if (criterion.startsWith('3.')) {
531
+ principles.Understandable.passing = false;
532
+ principles.Understandable.issues++;
533
+ }
534
+ else if (criterion.startsWith('4.')) {
535
+ principles.Robust.passing = false;
536
+ principles.Robust.issues++;
537
+ }
538
+ });
539
+ return principles;
540
+ }
541
+ function calculateTotalEffort(remediations) {
542
+ return remediations.reduce((total, r) => total + r.estimatedEffort.hours, 0);
543
+ }
544
+ function estimateTimeline(remediations) {
545
+ const totalHours = calculateTotalEffort(remediations);
546
+ if (totalHours <= 8)
547
+ return `${Math.ceil(totalHours)} hours`;
548
+ if (totalHours <= 40)
549
+ return `${Math.ceil(totalHours / 8)} day${totalHours > 16 ? 's' : ''}`;
550
+ return `${Math.ceil(totalHours / 40)} week${totalHours > 80 ? 's' : ''}`;
551
+ }
552
+ function getStyles(theme) {
553
+ return `
554
+ * {
555
+ margin: 0;
556
+ padding: 0;
557
+ box-sizing: border-box;
558
+ }
559
+
560
+ body {
561
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
562
+ line-height: 1.6;
563
+ color: ${theme === 'dark' ? '#e0e0e0' : '#333'};
564
+ background: ${theme === 'dark' ? '#1a1a1a' : '#f5f7fa'};
565
+ padding: 20px;
566
+ }
567
+
568
+ .container {
569
+ max-width: 1200px;
570
+ margin: 0 auto;
571
+ background: ${theme === 'dark' ? '#2d2d2d' : 'white'};
572
+ border-radius: 12px;
573
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
574
+ overflow: hidden;
575
+ }
576
+
577
+ .report-header {
578
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
579
+ color: white;
580
+ padding: 40px;
581
+ }
582
+
583
+ .report-header h1 {
584
+ font-size: 2.5em;
585
+ margin-bottom: 20px;
586
+ }
587
+
588
+ .header-meta {
589
+ display: grid;
590
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
591
+ gap: 15px;
592
+ margin-top: 20px;
593
+ }
594
+
595
+ .meta-item {
596
+ background: rgba(255,255,255,0.1);
597
+ padding: 12px;
598
+ border-radius: 6px;
599
+ }
600
+
601
+ .meta-label {
602
+ font-weight: 600;
603
+ margin-right: 8px;
604
+ }
605
+
606
+ .meta-value {
607
+ color: rgba(255,255,255,0.9);
608
+ }
609
+
610
+ .meta-value a {
611
+ color: white;
612
+ text-decoration: none;
613
+ }
614
+
615
+ .badge-level {
616
+ background: rgba(255,255,255,0.2);
617
+ padding: 4px 12px;
618
+ border-radius: 12px;
619
+ font-size: 0.9em;
620
+ }
621
+
622
+ section {
623
+ padding: 40px;
624
+ border-bottom: 1px solid ${theme === 'dark' ? '#444' : '#e0e0e0'};
625
+ }
626
+
627
+ section:last-of-type {
628
+ border-bottom: none;
629
+ }
630
+
631
+ h2 {
632
+ font-size: 2em;
633
+ margin-bottom: 20px;
634
+ color: ${theme === 'dark' ? '#fff' : '#333'};
635
+ }
636
+
637
+ h3 {
638
+ font-size: 1.3em;
639
+ margin-bottom: 15px;
640
+ }
641
+
642
+ .summary-grid {
643
+ display: grid;
644
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
645
+ gap: 20px;
646
+ margin-bottom: 30px;
647
+ }
648
+
649
+ .summary-card {
650
+ background: ${theme === 'dark' ? '#3a3a3a' : '#f8f9fa'};
651
+ padding: 24px;
652
+ border-radius: 12px;
653
+ border-left: 4px solid #ccc;
654
+ }
655
+
656
+ .summary-card.score-excellent { border-left-color: #10b981; }
657
+ .summary-card.score-good { border-left-color: #f59e0b; }
658
+ .summary-card.score-fair { border-left-color: #ef4444; }
659
+ .summary-card.score-poor { border-left-color: #dc2626; }
660
+
661
+ .card-label {
662
+ font-size: 0.9em;
663
+ color: ${theme === 'dark' ? '#999' : '#666'};
664
+ text-transform: uppercase;
665
+ letter-spacing: 0.05em;
666
+ margin-bottom: 8px;
667
+ }
668
+
669
+ .card-value {
670
+ font-size: 2.5em;
671
+ font-weight: 700;
672
+ margin-bottom: 8px;
673
+ }
674
+
675
+ .card-description {
676
+ font-size: 0.9em;
677
+ color: ${theme === 'dark' ? '#999' : '#666'};
678
+ }
679
+
680
+ .status-badge {
681
+ display: inline-block;
682
+ padding: 8px 16px;
683
+ border-radius: 20px;
684
+ font-size: 0.7em;
685
+ font-weight: 600;
686
+ text-transform: uppercase;
687
+ }
688
+
689
+ .status-compliant { background: #d1fae5; color: #065f46; }
690
+ .status-partially-compliant { background: #fef3c7; color: #92400e; }
691
+ .status-non-compliant { background: #fee2e2; color: #991b1b; }
692
+
693
+ .violations-breakdown {
694
+ margin-top: 30px;
695
+ }
696
+
697
+ .breakdown-grid {
698
+ display: grid;
699
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
700
+ gap: 15px;
701
+ margin-top: 15px;
702
+ }
703
+
704
+ .severity-stat {
705
+ background: ${theme === 'dark' ? '#3a3a3a' : 'white'};
706
+ padding: 16px;
707
+ border-radius: 8px;
708
+ text-align: center;
709
+ border: 2px solid;
710
+ }
711
+
712
+ .severity-stat.severity-critical { border-color: #dc2626; }
713
+ .severity-stat.severity-serious { border-color: #f59e0b; }
714
+ .severity-stat.severity-moderate { border-color: #eab308; }
715
+ .severity-stat.severity-minor { border-color: #3b82f6; }
716
+
717
+ .severity-icon {
718
+ font-size: 2em;
719
+ display: block;
720
+ margin-bottom: 8px;
721
+ }
722
+
723
+ .severity-label {
724
+ display: block;
725
+ text-transform: capitalize;
726
+ font-weight: 600;
727
+ margin-bottom: 4px;
728
+ }
729
+
730
+ .severity-count {
731
+ display: block;
732
+ font-size: 1.5em;
733
+ font-weight: 700;
734
+ }
735
+
736
+ .principles-grid {
737
+ display: grid;
738
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
739
+ gap: 20px;
740
+ }
741
+
742
+ .principle-card {
743
+ padding: 20px;
744
+ border-radius: 8px;
745
+ border: 2px solid;
746
+ }
747
+
748
+ .principle-card.principle-pass {
749
+ border-color: #10b981;
750
+ background: ${theme === 'dark' ? '#1a3a2a' : '#f0fdf4'};
751
+ }
752
+
753
+ .principle-card.principle-fail {
754
+ border-color: #ef4444;
755
+ background: ${theme === 'dark' ? '#3a1a1a' : '#fef2f2'};
756
+ }
757
+
758
+ .principle-header {
759
+ display: flex;
760
+ align-items: center;
761
+ gap: 10px;
762
+ margin-bottom: 10px;
763
+ }
764
+
765
+ .principle-icon {
766
+ font-size: 1.5em;
767
+ }
768
+
769
+ .violation-card {
770
+ background: ${theme === 'dark' ? '#3a3a3a' : 'white'};
771
+ border-radius: 12px;
772
+ padding: 24px;
773
+ margin-bottom: 24px;
774
+ border-left: 4px solid;
775
+ }
776
+
777
+ .violation-card.severity-critical { border-left-color: #dc2626; }
778
+ .violation-card.severity-serious { border-left-color: #f59e0b; }
779
+ .violation-card.severity-moderate { border-left-color: #eab308; }
780
+ .violation-card.severity-minor { border-left-color: #3b82f6; }
781
+
782
+ .violation-header {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: 12px;
786
+ margin-bottom: 16px;
787
+ }
788
+
789
+ .violation-number {
790
+ background: ${theme === 'dark' ? '#555' : '#e0e0e0'};
791
+ padding: 4px 12px;
792
+ border-radius: 12px;
793
+ font-weight: 700;
794
+ }
795
+
796
+ .severity-badge {
797
+ padding: 4px 12px;
798
+ border-radius: 12px;
799
+ font-size: 0.75em;
800
+ font-weight: 700;
801
+ color: white;
802
+ }
803
+
804
+ .severity-badge.severity-critical { background: #dc2626; }
805
+ .severity-badge.severity-serious { background: #f59e0b; }
806
+ .severity-badge.severity-moderate { background: #eab308; }
807
+ .severity-badge.severity-minor { background: #3b82f6; }
808
+
809
+ .violation-meta {
810
+ margin: 20px 0;
811
+ }
812
+
813
+ .meta-row {
814
+ margin: 8px 0;
815
+ }
816
+
817
+ .meta-row .meta-label {
818
+ font-weight: 600;
819
+ margin-right: 8px;
820
+ }
821
+
822
+ .affected-elements {
823
+ margin: 20px 0;
824
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
825
+ padding: 16px;
826
+ border-radius: 8px;
827
+ }
828
+
829
+ .element-item {
830
+ margin: 12px 0;
831
+ padding: 12px;
832
+ background: ${theme === 'dark' ? '#3a3a3a' : 'white'};
833
+ border-radius: 6px;
834
+ }
835
+
836
+ .element-selector code {
837
+ color: #e83e8c;
838
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
839
+ padding: 2px 6px;
840
+ border-radius: 3px;
841
+ }
842
+
843
+ pre {
844
+ background: ${theme === 'dark' ? '#1a1a1a' : '#f5f5f5'};
845
+ padding: 12px;
846
+ border-radius: 6px;
847
+ overflow-x: auto;
848
+ margin: 8px 0;
849
+ }
850
+
851
+ code {
852
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
853
+ font-size: 0.9em;
854
+ }
855
+
856
+ .how-to-fix {
857
+ margin-top: 20px;
858
+ padding: 16px;
859
+ background: ${theme === 'dark' ? '#2a3a4a' : '#e3f2fd'};
860
+ border-radius: 8px;
861
+ }
862
+
863
+ .help-link {
864
+ color: #2563eb;
865
+ text-decoration: none;
866
+ font-weight: 600;
867
+ }
868
+
869
+ .help-link:hover {
870
+ text-decoration: underline;
871
+ }
872
+
873
+ .remediation-card {
874
+ background: ${theme === 'dark' ? '#3a3a3a' : 'white'};
875
+ border-radius: 12px;
876
+ padding: 24px;
877
+ margin-bottom: 24px;
878
+ border-left: 4px solid #3b82f6;
879
+ }
880
+
881
+ .remediation-header {
882
+ display: flex;
883
+ align-items: center;
884
+ gap: 12px;
885
+ margin-bottom: 16px;
886
+ }
887
+
888
+ .remediation-rank {
889
+ background: #3b82f6;
890
+ color: white;
891
+ padding: 4px 12px;
892
+ border-radius: 12px;
893
+ font-weight: 700;
894
+ }
895
+
896
+ .roi-badge {
897
+ margin-left: auto;
898
+ background: #10b981;
899
+ color: white;
900
+ padding: 6px 14px;
901
+ border-radius: 12px;
902
+ font-weight: 700;
903
+ }
904
+
905
+ .remediation-stats {
906
+ display: flex;
907
+ gap: 24px;
908
+ margin: 16px 0;
909
+ flex-wrap: wrap;
910
+ }
911
+
912
+ .stat-item {
913
+ display: flex;
914
+ gap: 8px;
915
+ }
916
+
917
+ .stat-label {
918
+ font-weight: 600;
919
+ }
920
+
921
+ .recommendation-item {
922
+ margin: 16px 0;
923
+ padding: 16px;
924
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
925
+ border-radius: 8px;
926
+ }
927
+
928
+ .recommendation-header {
929
+ display: flex;
930
+ gap: 12px;
931
+ margin-bottom: 12px;
932
+ flex-wrap: wrap;
933
+ }
934
+
935
+ .recommendation-priority,
936
+ .recommendation-approach,
937
+ .recommendation-confidence {
938
+ padding: 4px 10px;
939
+ border-radius: 12px;
940
+ font-size: 0.85em;
941
+ font-weight: 600;
942
+ }
943
+
944
+ .recommendation-priority { background: #dbeafe; color: #1e40af; }
945
+ .recommendation-approach { background: #fef3c7; color: #92400e; }
946
+ .recommendation-confidence { background: #d1fae5; color: #065f46; }
947
+
948
+ .total-effort {
949
+ margin-top: 30px;
950
+ padding: 24px;
951
+ background: ${theme === 'dark' ? '#2a3a4a' : '#f0f9ff'};
952
+ border-radius: 12px;
953
+ }
954
+
955
+ .effort-summary {
956
+ display: flex;
957
+ gap: 32px;
958
+ margin-top: 16px;
959
+ flex-wrap: wrap;
960
+ }
961
+
962
+ .effort-item {
963
+ display: flex;
964
+ gap: 8px;
965
+ }
966
+
967
+ .effort-label {
968
+ font-weight: 600;
969
+ }
970
+
971
+ .effort-value {
972
+ color: #2563eb;
973
+ font-weight: 700;
974
+ }
975
+
976
+ .report-footer {
977
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
978
+ padding: 30px 40px;
979
+ }
980
+
981
+ .footer-content {
982
+ display: grid;
983
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
984
+ gap: 20px;
985
+ }
986
+
987
+ .footer-section h4 {
988
+ margin-bottom: 10px;
989
+ }
990
+
991
+ .footer-section a {
992
+ color: #2563eb;
993
+ text-decoration: none;
994
+ }
995
+
996
+ .footer-section a:hover {
997
+ text-decoration: underline;
998
+ }
999
+
1000
+ /* EU Accessibility Act Compliance Styles */
1001
+ .eu-compliance-grid {
1002
+ display: grid;
1003
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1004
+ gap: 20px;
1005
+ margin: 20px 0;
1006
+ }
1007
+
1008
+ .eu-stat {
1009
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
1010
+ padding: 20px;
1011
+ border-radius: 8px;
1012
+ text-align: center;
1013
+ }
1014
+
1015
+ .eu-stat-label {
1016
+ font-size: 14px;
1017
+ color: ${theme === 'dark' ? '#9ca3af' : '#6b7280'};
1018
+ margin-bottom: 8px;
1019
+ }
1020
+
1021
+ .eu-stat-value {
1022
+ font-size: 24px;
1023
+ font-weight: 700;
1024
+ color: ${theme === 'dark' ? '#fff' : '#1f2937'};
1025
+ }
1026
+
1027
+ .eu-stat-value.overdue,
1028
+ .eu-stat-value.urgent {
1029
+ color: #dc2626;
1030
+ }
1031
+
1032
+ .eaa-info {
1033
+ background: ${theme === 'dark' ? '#1e3a8a' : '#dbeafe'};
1034
+ border-left: 4px solid #2563eb;
1035
+ padding: 15px;
1036
+ margin: 20px 0;
1037
+ border-radius: 4px;
1038
+ }
1039
+
1040
+ .eaa-failures,
1041
+ .eaa-recommendations {
1042
+ margin: 20px 0;
1043
+ }
1044
+
1045
+ .eaa-requirement {
1046
+ padding: 10px;
1047
+ margin: 10px 0;
1048
+ background: ${theme === 'dark' ? '#2a2a2a' : '#fef2f2'};
1049
+ border-left: 3px solid #dc2626;
1050
+ border-radius: 4px;
1051
+ }
1052
+
1053
+ .eaa-action {
1054
+ padding: 15px;
1055
+ margin: 10px 0;
1056
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
1057
+ border-radius: 8px;
1058
+ border-left: 4px solid currentColor;
1059
+ }
1060
+
1061
+ .action-priority {
1062
+ margin-bottom: 8px;
1063
+ font-size: 14px;
1064
+ }
1065
+
1066
+ .action-text {
1067
+ font-size: 16px;
1068
+ margin: 8px 0;
1069
+ }
1070
+
1071
+ .action-deadline {
1072
+ font-size: 14px;
1073
+ color: ${theme === 'dark' ? '#9ca3af' : '#6b7280'};
1074
+ margin-top: 8px;
1075
+ }
1076
+
1077
+ /* Video Section Styles */
1078
+ .video-section {
1079
+ margin: 30px 0;
1080
+ }
1081
+
1082
+ .alert {
1083
+ padding: 15px 20px;
1084
+ border-radius: 8px;
1085
+ margin: 20px 0;
1086
+ }
1087
+
1088
+ .alert-info {
1089
+ background: ${theme === 'dark' ? '#1e3a8a' : '#dbeafe'};
1090
+ border-left: 4px solid #2563eb;
1091
+ }
1092
+
1093
+ .video-recommendation {
1094
+ background: ${theme === 'dark' ? '#2a2a2a' : '#f8f9fa'};
1095
+ padding: 20px;
1096
+ border-radius: 8px;
1097
+ margin: 20px 0;
1098
+ }
1099
+
1100
+ .video-recommendation h3 {
1101
+ margin-top: 20px;
1102
+ margin-bottom: 10px;
1103
+ color: ${theme === 'dark' ? '#fff' : '#1f2937'};
1104
+ }
1105
+
1106
+ .video-recommendation ul {
1107
+ margin: 10px 0;
1108
+ padding-left: 20px;
1109
+ }
1110
+
1111
+ .video-recommendation li {
1112
+ margin: 5px 0;
1113
+ }
1114
+
1115
+ .video-recommendation pre {
1116
+ background: ${theme === 'dark' ? '#1f2937' : '#1f2937'};
1117
+ color: #10b981;
1118
+ padding: 15px;
1119
+ border-radius: 8px;
1120
+ overflow-x: auto;
1121
+ margin: 15px 0;
1122
+ }
1123
+
1124
+ .video-recommendation code {
1125
+ font-family: 'Courier New', monospace;
1126
+ font-size: 13px;
1127
+ line-height: 1.6;
1128
+ }
1129
+
1130
+ .more-items {
1131
+ font-style: italic;
1132
+ color: ${theme === 'dark' ? '#9ca3af' : '#6b7280'};
1133
+ margin: 10px 0;
1134
+ }
1135
+
1136
+ @media print {
1137
+ body {
1138
+ background: white;
1139
+ }
1140
+
1141
+ .container {
1142
+ box-shadow: none;
1143
+ }
1144
+
1145
+ .violation-card,
1146
+ .remediation-card {
1147
+ page-break-inside: avoid;
1148
+ }
1149
+ }
1150
+ `;
1151
+ }
1152
+ //# sourceMappingURL=html-report-generator.js.map