@avi770/testteam 1.2.0 → 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 (300) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/README.md +53 -6
  3. package/agents/24-signup-onboarding-tester.ts +429 -0
  4. package/agents/25-crud-flow-tester.ts +302 -0
  5. package/agents/26-form-validator.ts +297 -0
  6. package/agents/27-search-filter-tester.ts +326 -0
  7. package/agents/28-navigation-routing-tester.ts +425 -0
  8. package/agents/29-responsive-interaction-tester.ts +350 -0
  9. package/agents/30-multi-user-scenario-tester.ts +319 -0
  10. package/agents/31-load-tester.ts +134 -0
  11. package/agents/32-memory-leak-detector.ts +194 -0
  12. package/agents/33-bundle-analyzer.ts +132 -0
  13. package/agents/34-xss-scanner.ts +191 -0
  14. package/agents/35-csrf-tester.ts +82 -0
  15. package/agents/36-auth-fuzzer.ts +194 -0
  16. package/agents/37-dependency-scanner.ts +176 -0
  17. package/agents/38-secrets-scanner.ts +137 -0
  18. package/agents/39-api-contract-tester.ts +199 -0
  19. package/agents/40-rate-limit-tester.ts +94 -0
  20. package/agents/41-api-pagination-tester.ts +97 -0
  21. package/agents/42-graphql-tester.ts +222 -0
  22. package/agents/43-data-consistency-checker.ts +205 -0
  23. package/agents/44-backup-recovery-tester.ts +152 -0
  24. package/agents/45-data-privacy-scanner.ts +125 -0
  25. package/agents/46-seo-auditor.ts +294 -0
  26. package/agents/47-social-preview-tester.ts +232 -0
  27. package/agents/48-lighthouse-auditor.ts +213 -0
  28. package/agents/49-i18n-tester.ts +198 -0
  29. package/agents/50-timezone-tester.ts +173 -0
  30. package/agents/51-error-recovery-tester.ts +155 -0
  31. package/agents/52-offline-mode-tester.ts +180 -0
  32. package/agents/53-graceful-degradation-tester.ts +156 -0
  33. package/agents/54-websocket-tester.ts +151 -0
  34. package/agents/55-realtime-sync-tester.ts +194 -0
  35. package/agents/56-file-upload-tester.ts +194 -0
  36. package/agents/57-export-tester.ts +174 -0
  37. package/agents/58-payment-flow-tester.ts +183 -0
  38. package/agents/59-ssl-tls-auditor.ts +141 -0
  39. package/agents/60-dns-cdn-tester.ts +117 -0
  40. package/agents/61-docker-health-checker.ts +111 -0
  41. package/agents/62-env-config-validator.ts +152 -0
  42. package/agents/63-log-quality-auditor.ts +136 -0
  43. package/agents/64-analytics-tracker-tester.ts +165 -0
  44. package/agents/65-gdpr-compliance-tester.ts +215 -0
  45. package/agents/66-soc2-control-validator.ts +210 -0
  46. package/agents/67-wcag-aaa-tester.ts +241 -0
  47. package/agents/68-dead-code-detector.ts +135 -0
  48. package/agents/69-type-safety-auditor.ts +164 -0
  49. package/agents/70-complexity-analyzer.ts +179 -0
  50. package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
  51. package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
  52. package/agents/__tests__/26-form-validator.test.ts +345 -0
  53. package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
  54. package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
  55. package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
  56. package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
  57. package/agents/__tests__/31-load-tester.test.ts +189 -0
  58. package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
  59. package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
  60. package/agents/__tests__/34-xss-scanner.test.ts +258 -0
  61. package/agents/__tests__/35-csrf-tester.test.ts +200 -0
  62. package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
  63. package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
  64. package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
  65. package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
  66. package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
  67. package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
  68. package/agents/__tests__/42-graphql-tester.test.ts +252 -0
  69. package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
  70. package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
  71. package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
  72. package/agents/__tests__/46-seo-auditor.test.ts +261 -0
  73. package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
  74. package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
  75. package/agents/__tests__/49-i18n-tester.test.ts +201 -0
  76. package/agents/__tests__/50-timezone-tester.test.ts +172 -0
  77. package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
  78. package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
  79. package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
  80. package/agents/__tests__/54-websocket-tester.test.ts +157 -0
  81. package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
  82. package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
  83. package/agents/__tests__/57-export-tester.test.ts +169 -0
  84. package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
  85. package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
  86. package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
  87. package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
  88. package/agents/__tests__/62-env-config-validator.test.ts +166 -0
  89. package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
  90. package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
  91. package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
  92. package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
  93. package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
  94. package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
  95. package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
  96. package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
  97. package/agents/__tests__/registry.test.ts +13 -13
  98. package/agents/registry.ts +146 -5
  99. package/core/__tests__/integration.test.ts +4 -4
  100. package/core/__tests__/orchestrator.test.ts +17 -16
  101. package/core/license.ts +208 -211
  102. package/core/orchestrator.ts +6 -4
  103. package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
  104. package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
  105. package/dist/agents/24-signup-onboarding-tester.js +357 -0
  106. package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
  107. package/dist/agents/25-crud-flow-tester.d.ts +11 -0
  108. package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
  109. package/dist/agents/25-crud-flow-tester.js +253 -0
  110. package/dist/agents/25-crud-flow-tester.js.map +1 -0
  111. package/dist/agents/26-form-validator.d.ts +12 -0
  112. package/dist/agents/26-form-validator.d.ts.map +1 -0
  113. package/dist/agents/26-form-validator.js +257 -0
  114. package/dist/agents/26-form-validator.js.map +1 -0
  115. package/dist/agents/27-search-filter-tester.d.ts +20 -0
  116. package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
  117. package/dist/agents/27-search-filter-tester.js +267 -0
  118. package/dist/agents/27-search-filter-tester.js.map +1 -0
  119. package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
  120. package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
  121. package/dist/agents/28-navigation-routing-tester.js +363 -0
  122. package/dist/agents/28-navigation-routing-tester.js.map +1 -0
  123. package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
  124. package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
  125. package/dist/agents/29-responsive-interaction-tester.js +272 -0
  126. package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
  127. package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
  128. package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
  129. package/dist/agents/30-multi-user-scenario-tester.js +254 -0
  130. package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
  131. package/dist/agents/31-load-tester.d.ts +12 -0
  132. package/dist/agents/31-load-tester.d.ts.map +1 -0
  133. package/dist/agents/31-load-tester.js +110 -0
  134. package/dist/agents/31-load-tester.js.map +1 -0
  135. package/dist/agents/32-memory-leak-detector.d.ts +12 -0
  136. package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
  137. package/dist/agents/32-memory-leak-detector.js +167 -0
  138. package/dist/agents/32-memory-leak-detector.js.map +1 -0
  139. package/dist/agents/33-bundle-analyzer.d.ts +10 -0
  140. package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
  141. package/dist/agents/33-bundle-analyzer.js +111 -0
  142. package/dist/agents/33-bundle-analyzer.js.map +1 -0
  143. package/dist/agents/34-xss-scanner.d.ts +11 -0
  144. package/dist/agents/34-xss-scanner.d.ts.map +1 -0
  145. package/dist/agents/34-xss-scanner.js +164 -0
  146. package/dist/agents/34-xss-scanner.js.map +1 -0
  147. package/dist/agents/35-csrf-tester.d.ts +11 -0
  148. package/dist/agents/35-csrf-tester.d.ts.map +1 -0
  149. package/dist/agents/35-csrf-tester.js +70 -0
  150. package/dist/agents/35-csrf-tester.js.map +1 -0
  151. package/dist/agents/36-auth-fuzzer.d.ts +13 -0
  152. package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
  153. package/dist/agents/36-auth-fuzzer.js +163 -0
  154. package/dist/agents/36-auth-fuzzer.js.map +1 -0
  155. package/dist/agents/37-dependency-scanner.d.ts +11 -0
  156. package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
  157. package/dist/agents/37-dependency-scanner.js +139 -0
  158. package/dist/agents/37-dependency-scanner.js.map +1 -0
  159. package/dist/agents/38-secrets-scanner.d.ts +11 -0
  160. package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
  161. package/dist/agents/38-secrets-scanner.js +116 -0
  162. package/dist/agents/38-secrets-scanner.js.map +1 -0
  163. package/dist/agents/39-api-contract-tester.d.ts +12 -0
  164. package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
  165. package/dist/agents/39-api-contract-tester.js +142 -0
  166. package/dist/agents/39-api-contract-tester.js.map +1 -0
  167. package/dist/agents/40-rate-limit-tester.d.ts +12 -0
  168. package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
  169. package/dist/agents/40-rate-limit-tester.js +79 -0
  170. package/dist/agents/40-rate-limit-tester.js.map +1 -0
  171. package/dist/agents/41-api-pagination-tester.d.ts +12 -0
  172. package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
  173. package/dist/agents/41-api-pagination-tester.js +79 -0
  174. package/dist/agents/41-api-pagination-tester.js.map +1 -0
  175. package/dist/agents/42-graphql-tester.d.ts +13 -0
  176. package/dist/agents/42-graphql-tester.d.ts.map +1 -0
  177. package/dist/agents/42-graphql-tester.js +187 -0
  178. package/dist/agents/42-graphql-tester.js.map +1 -0
  179. package/dist/agents/43-data-consistency-checker.d.ts +11 -0
  180. package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
  181. package/dist/agents/43-data-consistency-checker.js +176 -0
  182. package/dist/agents/43-data-consistency-checker.js.map +1 -0
  183. package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
  184. package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
  185. package/dist/agents/44-backup-recovery-tester.js +128 -0
  186. package/dist/agents/44-backup-recovery-tester.js.map +1 -0
  187. package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
  188. package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
  189. package/dist/agents/45-data-privacy-scanner.js +100 -0
  190. package/dist/agents/45-data-privacy-scanner.js.map +1 -0
  191. package/dist/agents/46-seo-auditor.d.ts +12 -0
  192. package/dist/agents/46-seo-auditor.d.ts.map +1 -0
  193. package/dist/agents/46-seo-auditor.js +275 -0
  194. package/dist/agents/46-seo-auditor.js.map +1 -0
  195. package/dist/agents/47-social-preview-tester.d.ts +11 -0
  196. package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
  197. package/dist/agents/47-social-preview-tester.js +219 -0
  198. package/dist/agents/47-social-preview-tester.js.map +1 -0
  199. package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
  200. package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
  201. package/dist/agents/48-lighthouse-auditor.js +192 -0
  202. package/dist/agents/48-lighthouse-auditor.js.map +1 -0
  203. package/dist/agents/49-i18n-tester.d.ts +13 -0
  204. package/dist/agents/49-i18n-tester.d.ts.map +1 -0
  205. package/dist/agents/49-i18n-tester.js +172 -0
  206. package/dist/agents/49-i18n-tester.js.map +1 -0
  207. package/dist/agents/50-timezone-tester.d.ts +11 -0
  208. package/dist/agents/50-timezone-tester.d.ts.map +1 -0
  209. package/dist/agents/50-timezone-tester.js +152 -0
  210. package/dist/agents/50-timezone-tester.js.map +1 -0
  211. package/dist/agents/51-error-recovery-tester.d.ts +11 -0
  212. package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
  213. package/dist/agents/51-error-recovery-tester.js +134 -0
  214. package/dist/agents/51-error-recovery-tester.js.map +1 -0
  215. package/dist/agents/52-offline-mode-tester.d.ts +12 -0
  216. package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
  217. package/dist/agents/52-offline-mode-tester.js +161 -0
  218. package/dist/agents/52-offline-mode-tester.js.map +1 -0
  219. package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
  220. package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
  221. package/dist/agents/53-graceful-degradation-tester.js +130 -0
  222. package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
  223. package/dist/agents/54-websocket-tester.d.ts +10 -0
  224. package/dist/agents/54-websocket-tester.d.ts.map +1 -0
  225. package/dist/agents/54-websocket-tester.js +132 -0
  226. package/dist/agents/54-websocket-tester.js.map +1 -0
  227. package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
  228. package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
  229. package/dist/agents/55-realtime-sync-tester.js +175 -0
  230. package/dist/agents/55-realtime-sync-tester.js.map +1 -0
  231. package/dist/agents/56-file-upload-tester.d.ts +12 -0
  232. package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
  233. package/dist/agents/56-file-upload-tester.js +166 -0
  234. package/dist/agents/56-file-upload-tester.js.map +1 -0
  235. package/dist/agents/57-export-tester.d.ts +11 -0
  236. package/dist/agents/57-export-tester.d.ts.map +1 -0
  237. package/dist/agents/57-export-tester.js +155 -0
  238. package/dist/agents/57-export-tester.js.map +1 -0
  239. package/dist/agents/58-payment-flow-tester.d.ts +11 -0
  240. package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
  241. package/dist/agents/58-payment-flow-tester.js +159 -0
  242. package/dist/agents/58-payment-flow-tester.js.map +1 -0
  243. package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
  244. package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
  245. package/dist/agents/59-ssl-tls-auditor.js +132 -0
  246. package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
  247. package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
  248. package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
  249. package/dist/agents/60-dns-cdn-tester.js +105 -0
  250. package/dist/agents/60-dns-cdn-tester.js.map +1 -0
  251. package/dist/agents/61-docker-health-checker.d.ts +10 -0
  252. package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
  253. package/dist/agents/61-docker-health-checker.js +95 -0
  254. package/dist/agents/61-docker-health-checker.js.map +1 -0
  255. package/dist/agents/62-env-config-validator.d.ts +10 -0
  256. package/dist/agents/62-env-config-validator.d.ts.map +1 -0
  257. package/dist/agents/62-env-config-validator.js +132 -0
  258. package/dist/agents/62-env-config-validator.js.map +1 -0
  259. package/dist/agents/63-log-quality-auditor.d.ts +9 -0
  260. package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
  261. package/dist/agents/63-log-quality-auditor.js +121 -0
  262. package/dist/agents/63-log-quality-auditor.js.map +1 -0
  263. package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
  264. package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
  265. package/dist/agents/64-analytics-tracker-tester.js +146 -0
  266. package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
  267. package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
  268. package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
  269. package/dist/agents/65-gdpr-compliance-tester.js +186 -0
  270. package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
  271. package/dist/agents/66-soc2-control-validator.d.ts +14 -0
  272. package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
  273. package/dist/agents/66-soc2-control-validator.js +178 -0
  274. package/dist/agents/66-soc2-control-validator.js.map +1 -0
  275. package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
  276. package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
  277. package/dist/agents/67-wcag-aaa-tester.js +207 -0
  278. package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
  279. package/dist/agents/68-dead-code-detector.d.ts +9 -0
  280. package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
  281. package/dist/agents/68-dead-code-detector.js +116 -0
  282. package/dist/agents/68-dead-code-detector.js.map +1 -0
  283. package/dist/agents/69-type-safety-auditor.d.ts +9 -0
  284. package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
  285. package/dist/agents/69-type-safety-auditor.js +148 -0
  286. package/dist/agents/69-type-safety-auditor.js.map +1 -0
  287. package/dist/agents/70-complexity-analyzer.d.ts +10 -0
  288. package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
  289. package/dist/agents/70-complexity-analyzer.js +154 -0
  290. package/dist/agents/70-complexity-analyzer.js.map +1 -0
  291. package/dist/agents/registry.d.ts +3 -3
  292. package/dist/agents/registry.d.ts.map +1 -1
  293. package/dist/agents/registry.js +146 -5
  294. package/dist/agents/registry.js.map +1 -1
  295. package/dist/core/license.js +2 -5
  296. package/dist/core/license.js.map +1 -1
  297. package/dist/core/orchestrator.d.ts.map +1 -1
  298. package/dist/core/orchestrator.js +6 -4
  299. package/dist/core/orchestrator.js.map +1 -1
  300. package/package.json +2 -2
@@ -0,0 +1,272 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual responsive interaction tests. */
5
+ const OP_TIMEOUT_MS = 3_000;
6
+ /** Breakpoints to test: mobile, tablet, desktop. */
7
+ const BREAKPOINTS = [
8
+ { name: 'mobile', width: 375, height: 812 },
9
+ { name: 'tablet', width: 768, height: 1024 },
10
+ { name: 'desktop', width: 1280, height: 800 },
11
+ ];
12
+ /** Selectors for hamburger/menu toggle buttons. */
13
+ const HAMBURGER_SELECTORS = [
14
+ 'button[aria-label*="menu" i]',
15
+ '.hamburger',
16
+ '[data-testid*="menu-toggle"]',
17
+ 'button:has(.ri-menu-line)',
18
+ ];
19
+ /** WCAG minimum touch target size in pixels. */
20
+ const MIN_TOUCH_TARGET_PX = 44;
21
+ export class ResponsiveInteractionTesterAgent extends BaseAgent {
22
+ agentId = 29;
23
+ agentName = 'Responsive Interaction Tester';
24
+ baseUrl = '';
25
+ async preFlight() {
26
+ if (!this.config.modules || this.config.modules.length === 0) {
27
+ throw new Error('ResponsiveInteractionTesterAgent requires at least one module in config.modules');
28
+ }
29
+ const { env } = await resolveEnvironment(this.config, this.phase);
30
+ this.baseUrl = env.baseUrl;
31
+ }
32
+ async execute() {
33
+ const findings = [];
34
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
35
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
36
+ const credentials = this.config.auth.credentials?.['admin'] ??
37
+ Object.values(this.config.auth.credentials ?? {})[0];
38
+ if (!credentials) {
39
+ findings.push({
40
+ id: `${this.agentId}-no-credentials`,
41
+ type: 'infra-issue',
42
+ severity: 'medium',
43
+ agentId: this.agentId,
44
+ module: 'responsive-interaction-tester',
45
+ description: 'No credentials configured — continuing without authentication',
46
+ });
47
+ }
48
+ const { chromium } = await import('playwright');
49
+ let browser = null;
50
+ try {
51
+ browser = await chromium.launch({ headless: true });
52
+ const page = await browser.newPage();
53
+ // Login at desktop size first
54
+ if (credentials) {
55
+ try {
56
+ await login(page, credentials, loginUrl);
57
+ }
58
+ catch (loginError) {
59
+ findings.push({
60
+ id: `${this.agentId}-login-failed`,
61
+ type: 'infra-issue',
62
+ severity: 'medium',
63
+ agentId: this.agentId,
64
+ module: 'responsive-interaction-tester',
65
+ description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
66
+ });
67
+ }
68
+ }
69
+ // Test first 3 modules to limit scope
70
+ const modulesToTest = this.config.modules.slice(0, 3);
71
+ for (const bp of BREAKPOINTS) {
72
+ await page.setViewportSize({ width: bp.width, height: bp.height });
73
+ for (const mod of modulesToTest) {
74
+ const fullUrl = mod.route.startsWith('http')
75
+ ? mod.route
76
+ : `${this.baseUrl}${mod.route}`;
77
+ try {
78
+ await Promise.race([
79
+ page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
80
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
81
+ ]);
82
+ }
83
+ catch {
84
+ continue; // Skip module if navigation fails
85
+ }
86
+ // Hamburger menu test (mobile/tablet only)
87
+ if (bp.name !== 'desktop') {
88
+ const hamburgerFindings = await this.testHamburgerMenu(page, bp.name, mod.id);
89
+ findings.push(...hamburgerFindings);
90
+ }
91
+ // Touch target test
92
+ const touchFindings = await this.testTouchTargets(page, bp.name, bp.width, mod.id);
93
+ findings.push(...touchFindings);
94
+ // Modal test
95
+ const modalFindings = await this.testModalOverflow(page, bp.name, bp.width, mod.id);
96
+ findings.push(...modalFindings);
97
+ // Horizontal scroll test
98
+ const scrollFindings = await this.testHorizontalScroll(page, bp.name, mod.id);
99
+ findings.push(...scrollFindings);
100
+ }
101
+ }
102
+ await page.close().catch(() => undefined);
103
+ }
104
+ catch (playwrightError) {
105
+ findings.push({
106
+ id: `${this.agentId}-playwright-failure`,
107
+ type: 'infra-issue',
108
+ severity: 'medium',
109
+ agentId: this.agentId,
110
+ module: 'responsive-interaction-tester',
111
+ description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
112
+ });
113
+ }
114
+ finally {
115
+ if (browser)
116
+ await browser.close().catch(() => undefined);
117
+ }
118
+ return findings;
119
+ }
120
+ /**
121
+ * Test hamburger menu: find toggle button, click it, verify nav panel opens.
122
+ */
123
+ async testHamburgerMenu(page, breakpoint, moduleId) {
124
+ const findings = [];
125
+ const selector = HAMBURGER_SELECTORS.join(', ');
126
+ try {
127
+ const hamburgerCount = await Promise.race([
128
+ page.locator(selector).count(),
129
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
130
+ ]);
131
+ if (hamburgerCount > 0) {
132
+ await Promise.race([
133
+ page.locator(selector).first().click(),
134
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
135
+ ]);
136
+ // Check if a navigation panel opened
137
+ const navPanel = await page
138
+ .locator('nav, [role="navigation"], [class*="sidebar"], [class*="drawer"]')
139
+ .count();
140
+ if (navPanel === 0) {
141
+ findings.push({
142
+ id: `${this.agentId}-hamburger-no-nav-${breakpoint}-${moduleId}`,
143
+ type: 'test-bug',
144
+ severity: 'medium',
145
+ agentId: this.agentId,
146
+ module: moduleId,
147
+ description: `Hamburger menu click did not open a navigation panel at ${breakpoint} in module ${moduleId}`,
148
+ });
149
+ }
150
+ }
151
+ }
152
+ catch {
153
+ // Timeout — non-critical
154
+ }
155
+ return findings;
156
+ }
157
+ /**
158
+ * Test touch targets: find clickable elements with dimensions < 44px.
159
+ */
160
+ async testTouchTargets(page, breakpoint, viewportWidth, moduleId) {
161
+ const findings = [];
162
+ try {
163
+ const smallTargets = await Promise.race([
164
+ page.evaluate((minSize) => {
165
+ const clickable = document.querySelectorAll('a, button, [role="button"], input, select');
166
+ const tooSmall = [];
167
+ for (const el of clickable) {
168
+ const rect = el.getBoundingClientRect();
169
+ if (rect.width > 0 && rect.height > 0) {
170
+ if (rect.width < minSize || rect.height < minSize) {
171
+ const tag = el.tagName.toLowerCase();
172
+ const id = el.id ? `#${el.id}` : '';
173
+ const cls = el.className
174
+ ? `.${String(el.className).split(' ')[0]}`
175
+ : '';
176
+ tooSmall.push(`${tag}${id}${cls} (${Math.round(rect.width)}x${Math.round(rect.height)})`);
177
+ }
178
+ }
179
+ }
180
+ return tooSmall.slice(0, 5); // Limit to first 5
181
+ }, MIN_TOUCH_TARGET_PX),
182
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
183
+ ]);
184
+ if (smallTargets.length > 0) {
185
+ findings.push({
186
+ id: `${this.agentId}-touch-target-${breakpoint}-${moduleId}`,
187
+ type: 'test-bug',
188
+ severity: 'medium',
189
+ agentId: this.agentId,
190
+ module: moduleId,
191
+ description: `Touch target too small at ${viewportWidth}px in module ${moduleId}: ${smallTargets.join(', ')}`,
192
+ });
193
+ }
194
+ }
195
+ catch {
196
+ // Timeout — non-critical
197
+ }
198
+ return findings;
199
+ }
200
+ /**
201
+ * Test modal overflow: look for a modal trigger, click it, check width.
202
+ */
203
+ async testModalOverflow(page, breakpoint, viewportWidth, moduleId) {
204
+ const findings = [];
205
+ try {
206
+ const modalTrigger = page.locator('[data-testid*="modal"], button:has-text("Open"), button:has-text("Details")');
207
+ const triggerCount = await Promise.race([
208
+ modalTrigger.count(),
209
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
210
+ ]);
211
+ if (triggerCount > 0) {
212
+ await modalTrigger.first().click().catch(() => undefined);
213
+ await page.waitForTimeout(500);
214
+ const modalOverflow = await page
215
+ .evaluate((vw) => {
216
+ const modals = document.querySelectorAll('[role="dialog"], .modal, [class*="modal"], [data-testid*="modal"]');
217
+ for (const modal of modals) {
218
+ const rect = modal.getBoundingClientRect();
219
+ if (rect.width > vw) {
220
+ return true;
221
+ }
222
+ }
223
+ return false;
224
+ }, viewportWidth)
225
+ .catch(() => false);
226
+ if (modalOverflow) {
227
+ findings.push({
228
+ id: `${this.agentId}-modal-overflow-${breakpoint}-${moduleId}`,
229
+ type: 'test-bug',
230
+ severity: 'medium',
231
+ agentId: this.agentId,
232
+ module: moduleId,
233
+ description: `Modal overflows at ${viewportWidth}px in module ${moduleId}`,
234
+ });
235
+ }
236
+ // Close modal (press Escape)
237
+ await page.keyboard.press('Escape').catch(() => undefined);
238
+ }
239
+ }
240
+ catch {
241
+ // Timeout — non-critical
242
+ }
243
+ return findings;
244
+ }
245
+ /**
246
+ * Test horizontal scrolling: check if scrollWidth > clientWidth.
247
+ */
248
+ async testHorizontalScroll(page, breakpoint, moduleId) {
249
+ const findings = [];
250
+ try {
251
+ const hasHorizontalScroll = await Promise.race([
252
+ page.evaluate(() => document.documentElement.scrollWidth > document.documentElement.clientWidth),
253
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
254
+ ]);
255
+ if (hasHorizontalScroll) {
256
+ findings.push({
257
+ id: `${this.agentId}-horizontal-scroll-${breakpoint}-${moduleId}`,
258
+ type: 'test-bug',
259
+ severity: 'high',
260
+ agentId: this.agentId,
261
+ module: moduleId,
262
+ description: `Horizontal scroll detected at ${breakpoint} in module ${moduleId}`,
263
+ });
264
+ }
265
+ }
266
+ catch {
267
+ // Timeout — non-critical
268
+ }
269
+ return findings;
270
+ }
271
+ }
272
+ //# sourceMappingURL=29-responsive-interaction-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"29-responsive-interaction-tester.js","sourceRoot":"","sources":["../../agents/29-responsive-interaction-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class MultiUserScenarioTesterAgent extends BaseAgent {
4
+ readonly agentId = 30;
5
+ readonly agentName = "Multi-User Scenario Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ /**
10
+ * Test 1: Both users navigate to the same module.
11
+ * Neither should be logged out (session conflict).
12
+ */
13
+ private testConcurrentSessions;
14
+ /**
15
+ * Test 2: Both users on the same page — check both render content.
16
+ */
17
+ private testSamePageAccess;
18
+ /**
19
+ * Test 3: User1 navigates to module A, User2 to module B.
20
+ * Verify each is on the correct page.
21
+ */
22
+ private testIndependentNavigation;
23
+ }
24
+ //# sourceMappingURL=30-multi-user-scenario-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"30-multi-user-scenario-tester.d.ts","sourceRoot":"","sources":["../../agents/30-multi-user-scenario-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,qBAAa,4BAA6B,SAAQ,SAAS;IACzD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,gCAAgC;IAClD,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAa1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAwI7C;;;OAGG;YACW,sBAAsB;IAkDpC;;OAEG;YACW,kBAAkB;IAwChC;;;OAGG;YACW,yBAAyB;CAsDxC"}
@@ -0,0 +1,254 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual multi-user operations. */
5
+ const OP_TIMEOUT_MS = 5_000;
6
+ export class MultiUserScenarioTesterAgent extends BaseAgent {
7
+ agentId = 30;
8
+ agentName = 'Multi-User Scenario Tester';
9
+ baseUrl = '';
10
+ async preFlight() {
11
+ const { env } = await resolveEnvironment(this.config, this.phase);
12
+ this.baseUrl = env.baseUrl;
13
+ // Check that we have at least some credentials
14
+ const credEntries = Object.values(this.config.auth.credentials ?? {});
15
+ if (credEntries.length === 0) {
16
+ throw new Error('MultiUserScenarioTesterAgent requires at least one credential set in config.auth.credentials');
17
+ }
18
+ }
19
+ async execute() {
20
+ const findings = [];
21
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
22
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
23
+ const credEntries = Object.values(this.config.auth.credentials ?? {});
24
+ const creds1 = credEntries[0];
25
+ const creds2 = credEntries.length > 1 ? credEntries[1] : credEntries[0];
26
+ const { chromium } = await import('playwright');
27
+ let browser = null;
28
+ let context1 = null;
29
+ let context2 = null;
30
+ try {
31
+ browser = await chromium.launch({ headless: true });
32
+ context1 = await browser.newContext();
33
+ context2 = await browser.newContext();
34
+ const page1 = await context1.newPage();
35
+ const page2 = await context2.newPage();
36
+ // Login user 1
37
+ let user1LoggedIn = false;
38
+ try {
39
+ await login(page1, creds1, loginUrl);
40
+ user1LoggedIn = true;
41
+ }
42
+ catch (loginError) {
43
+ findings.push({
44
+ id: `${this.agentId}-user1-login-failed`,
45
+ type: 'infra-issue',
46
+ severity: 'medium',
47
+ agentId: this.agentId,
48
+ module: 'multi-user',
49
+ description: `User 1 login failed: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
50
+ });
51
+ }
52
+ // Login user 2
53
+ let user2LoggedIn = false;
54
+ try {
55
+ await login(page2, creds2, loginUrl);
56
+ user2LoggedIn = true;
57
+ }
58
+ catch (loginError) {
59
+ findings.push({
60
+ id: `${this.agentId}-user2-login-failed`,
61
+ type: 'infra-issue',
62
+ severity: 'medium',
63
+ agentId: this.agentId,
64
+ module: 'multi-user',
65
+ description: `User 2 login failed: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
66
+ });
67
+ }
68
+ // If either login failed, return early
69
+ if (!user1LoggedIn || !user2LoggedIn) {
70
+ findings.push({
71
+ id: `${this.agentId}-login-incomplete`,
72
+ type: 'infra-issue',
73
+ severity: 'medium',
74
+ agentId: this.agentId,
75
+ module: 'multi-user',
76
+ description: 'One or both users failed to log in — skipping multi-user tests',
77
+ });
78
+ await page1.close().catch(() => undefined);
79
+ await page2.close().catch(() => undefined);
80
+ return findings;
81
+ }
82
+ const firstModule = this.config.modules?.[0];
83
+ const secondModule = this.config.modules?.[1];
84
+ if (!firstModule) {
85
+ findings.push({
86
+ id: `${this.agentId}-no-modules`,
87
+ type: 'infra-issue',
88
+ severity: 'medium',
89
+ agentId: this.agentId,
90
+ module: 'multi-user',
91
+ description: 'No modules configured — skipping multi-user tests',
92
+ });
93
+ await page1.close().catch(() => undefined);
94
+ await page2.close().catch(() => undefined);
95
+ return findings;
96
+ }
97
+ const mod1Url = firstModule.route.startsWith('http')
98
+ ? firstModule.route
99
+ : `${this.baseUrl}${firstModule.route}`;
100
+ // Test 1: Concurrent sessions
101
+ const concurrentFindings = await this.testConcurrentSessions(page1, page2, mod1Url);
102
+ findings.push(...concurrentFindings);
103
+ // Test 2: Same page access
104
+ const samePageFindings = await this.testSamePageAccess(page1, page2, mod1Url, firstModule.id);
105
+ findings.push(...samePageFindings);
106
+ // Test 3: Independent navigation (requires 2 modules)
107
+ if (secondModule) {
108
+ const mod2Url = secondModule.route.startsWith('http')
109
+ ? secondModule.route
110
+ : `${this.baseUrl}${secondModule.route}`;
111
+ const independentFindings = await this.testIndependentNavigation(page1, page2, mod1Url, mod2Url, firstModule.id, secondModule.id);
112
+ findings.push(...independentFindings);
113
+ }
114
+ await page1.close().catch(() => undefined);
115
+ await page2.close().catch(() => undefined);
116
+ }
117
+ catch (playwrightError) {
118
+ findings.push({
119
+ id: `${this.agentId}-playwright-failure`,
120
+ type: 'infra-issue',
121
+ severity: 'medium',
122
+ agentId: this.agentId,
123
+ module: 'multi-user',
124
+ description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
125
+ });
126
+ }
127
+ finally {
128
+ if (context1)
129
+ await context1.close().catch(() => undefined);
130
+ if (context2)
131
+ await context2.close().catch(() => undefined);
132
+ if (browser)
133
+ await browser.close().catch(() => undefined);
134
+ }
135
+ return findings;
136
+ }
137
+ /**
138
+ * Test 1: Both users navigate to the same module.
139
+ * Neither should be logged out (session conflict).
140
+ */
141
+ async testConcurrentSessions(page1, page2, moduleUrl) {
142
+ const findings = [];
143
+ try {
144
+ await Promise.race([
145
+ Promise.all([
146
+ page1.goto(moduleUrl, { waitUntil: 'domcontentloaded' }),
147
+ page2.goto(moduleUrl, { waitUntil: 'domcontentloaded' }),
148
+ ]),
149
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
150
+ ]);
151
+ const url1 = page1.url();
152
+ const url2 = page2.url();
153
+ const user1Redirected = url1.includes('/login') || url1.includes('/signin') || url1.includes('/auth');
154
+ const user2Redirected = url2.includes('/login') || url2.includes('/signin') || url2.includes('/auth');
155
+ if (user1Redirected || user2Redirected) {
156
+ findings.push({
157
+ id: `${this.agentId}-concurrent-session-conflict`,
158
+ type: 'test-bug',
159
+ severity: 'high',
160
+ agentId: this.agentId,
161
+ module: 'multi-user',
162
+ description: `Concurrent sessions not supported — user${user1Redirected ? '1' : '2'} was redirected to login`,
163
+ });
164
+ }
165
+ }
166
+ catch (error) {
167
+ findings.push({
168
+ id: `${this.agentId}-concurrent-error`,
169
+ type: 'test-bug',
170
+ severity: 'medium',
171
+ agentId: this.agentId,
172
+ module: 'multi-user',
173
+ description: `Concurrent session test failed: ${error instanceof Error ? error.message.split('\n')[0] : String(error)}`,
174
+ });
175
+ }
176
+ return findings;
177
+ }
178
+ /**
179
+ * Test 2: Both users on the same page — check both render content.
180
+ */
181
+ async testSamePageAccess(page1, page2, moduleUrl, moduleId) {
182
+ const findings = [];
183
+ try {
184
+ const body1 = await Promise.race([
185
+ page1.locator('body').innerText(),
186
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
187
+ ]);
188
+ const body2 = await Promise.race([
189
+ page2.locator('body').innerText(),
190
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
191
+ ]);
192
+ if (body1.trim().length === 0 || body2.trim().length === 0) {
193
+ findings.push({
194
+ id: `${this.agentId}-same-page-blank`,
195
+ type: 'test-bug',
196
+ severity: 'medium',
197
+ agentId: this.agentId,
198
+ module: moduleId,
199
+ description: `Same page access test: one or both users see a blank page for module ${moduleId}`,
200
+ });
201
+ }
202
+ }
203
+ catch {
204
+ // Timeout — non-critical
205
+ }
206
+ return findings;
207
+ }
208
+ /**
209
+ * Test 3: User1 navigates to module A, User2 to module B.
210
+ * Verify each is on the correct page.
211
+ */
212
+ async testIndependentNavigation(page1, page2, mod1Url, mod2Url, mod1Id, mod2Id) {
213
+ const findings = [];
214
+ try {
215
+ await Promise.race([
216
+ Promise.all([
217
+ page1.goto(mod1Url, { waitUntil: 'domcontentloaded' }),
218
+ page2.goto(mod2Url, { waitUntil: 'domcontentloaded' }),
219
+ ]),
220
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
221
+ ]);
222
+ const url1 = page1.url();
223
+ const url2 = page2.url();
224
+ // Extract path from URLs for comparison
225
+ const path1 = new URL(url1).pathname;
226
+ const path2 = new URL(url2).pathname;
227
+ const expectedPath1 = new URL(mod1Url).pathname;
228
+ const expectedPath2 = new URL(mod2Url).pathname;
229
+ // Check if sessions cross-contaminated
230
+ if (path1 === path2 && expectedPath1 !== expectedPath2) {
231
+ findings.push({
232
+ id: `${this.agentId}-session-isolation-failure`,
233
+ type: 'code-bug-security',
234
+ severity: 'critical',
235
+ agentId: this.agentId,
236
+ module: 'multi-user',
237
+ description: `Session isolation failure — both users ended up on the same path (${path1}) despite navigating to different modules`,
238
+ });
239
+ }
240
+ }
241
+ catch (navError) {
242
+ findings.push({
243
+ id: `${this.agentId}-independent-nav-error`,
244
+ type: 'test-bug',
245
+ severity: 'medium',
246
+ agentId: this.agentId,
247
+ module: 'multi-user',
248
+ description: `Independent navigation test failed: ${navError instanceof Error ? navError.message.split('\n')[0] : String(navError)}`,
249
+ });
250
+ }
251
+ return findings;
252
+ }
253
+ }
254
+ //# sourceMappingURL=30-multi-user-scenario-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"30-multi-user-scenario-tester.js","sourceRoot":"","sources":["../../agents/30-multi-user-scenario-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import type { Finding } from '../core/types';
3
+ export declare class LoadTesterAgent extends BaseAgent {
4
+ readonly agentId = 31;
5
+ readonly agentName = "Load Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ private discoverEndpoints;
10
+ private runConcurrent;
11
+ }
12
+ //# sourceMappingURL=31-load-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"31-load-tester.d.ts","sourceRoot":"","sources":["../../agents/31-load-tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA2B7C,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,iBAAiB;IACnC,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAK1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA2D7C,OAAO,CAAC,iBAAiB;YAQX,aAAa;CA4B5B"}