@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,177 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import type { ValidatedConfig } from '../../core/config';
3
+ import type { Phase } from '../../core/types';
4
+
5
+ function makeConfig(overrides: Partial<ValidatedConfig> = {}): ValidatedConfig {
6
+ return {
7
+ schemaVersion: 1, name: 'test',
8
+ projectRoot: '/fake/project',
9
+ auth: { loginUrl: '/login', credentials: { admin: { email: 'a@t.com', password: 's' } } },
10
+ modules: [{ id: 'dashboard', route: '/dashboard', sidebarIcon: true }],
11
+ environments: { alpha: { baseUrl: 'http://localhost:3000', seed: false } },
12
+ portals: [], breakpoints: [], integrations: [], workers: [], workflows: [],
13
+ accuracy: { enabled: false, decimalPrecision: 2, currencySymbol: '$', timezone: 'UTC' },
14
+ tenancy: { enabled: false, isolationField: 'firmId', testFirms: [] },
15
+ costBudget: { maxPerRun: 100, maxPerAgent: 10, alertThreshold: 0.8, onExceeded: 'abort' },
16
+ agentClassification: { blocking: [], advisory: [] },
17
+ thresholds: { unitCoverage: { lines: 80, functions: 80, branches: 80, statements: 80 }, lighthouse: { accessibility: 90, performance: 90, bestPractices: 90, seo: 90 }, apiResponseTime: 2000, bundleSizeLimit: 500000, maxConsoleErrors: 0 },
18
+ disabledAgents: [], disabledAgentSet: new Set<number>(),
19
+ ...overrides,
20
+ };
21
+ }
22
+
23
+ const fetchMock = vi.fn().mockResolvedValue({ ok: true, status: 200 });
24
+ vi.stubGlobal('fetch', fetchMock);
25
+
26
+ vi.mock('../../helpers/navigation', () => ({
27
+ login: vi.fn().mockResolvedValue(undefined),
28
+ waitForSectionLoad: vi.fn().mockResolvedValue(undefined),
29
+ navigateToSection: vi.fn().mockResolvedValue(undefined),
30
+ switchPortal: vi.fn().mockResolvedValue(undefined),
31
+ }));
32
+
33
+ const existsSyncMock = vi.fn();
34
+ const readFileSyncMock = vi.fn();
35
+ const readdirSyncMock = vi.fn();
36
+
37
+ vi.mock('node:fs', () => ({
38
+ existsSync: (...args: unknown[]) => existsSyncMock(...args),
39
+ readFileSync: (...args: unknown[]) => readFileSyncMock(...args),
40
+ readdirSync: (...args: unknown[]) => readdirSyncMock(...args),
41
+ }));
42
+
43
+ const { ComplexityAnalyzerAgent } = await import('../70-complexity-analyzer');
44
+
45
+ function createAgent(config: ValidatedConfig = makeConfig(), phase: Phase = 'beta') {
46
+ return new ComplexityAnalyzerAgent(config, phase, '/tmp/test-run');
47
+ }
48
+
49
+ describe('ComplexityAnalyzerAgent', () => {
50
+ beforeEach(() => {
51
+ existsSyncMock.mockReset().mockReturnValue(true);
52
+ readFileSyncMock.mockReset();
53
+ readdirSyncMock.mockReset();
54
+ });
55
+
56
+ it('has agentId 70 and correct name', () => {
57
+ const agent = createAgent();
58
+ expect(agent.agentId).toBe(70);
59
+ expect(agent.agentName).toBe('Complexity Analyzer');
60
+ });
61
+
62
+ it('reports no src dir', async () => {
63
+ existsSyncMock.mockReturnValue(false);
64
+ const agent = createAgent();
65
+ const result = await agent.run();
66
+ const finding = result.findings.find(f => f.id.includes('no-src-dir'));
67
+ expect(finding).toBeDefined();
68
+ });
69
+
70
+ it('reports files over 500 lines as low', async () => {
71
+ readdirSyncMock.mockReturnValue([
72
+ { name: 'big.ts', isFile: () => true, isDirectory: () => false },
73
+ ]);
74
+ readFileSyncMock.mockReturnValue(Array(600).fill('const x = 1;').join('\n'));
75
+ const agent = createAgent();
76
+ const result = await agent.run();
77
+ const finding = result.findings.find(f => f.id.includes('long-file'));
78
+ expect(finding).toBeDefined();
79
+ expect(finding!.severity).toBe('low');
80
+ });
81
+
82
+ it('reports files over 1000 lines as medium', async () => {
83
+ readdirSyncMock.mockReturnValue([
84
+ { name: 'huge.ts', isFile: () => true, isDirectory: () => false },
85
+ ]);
86
+ readFileSyncMock.mockReturnValue(Array(1100).fill('const x = 1;').join('\n'));
87
+ const agent = createAgent();
88
+ const result = await agent.run();
89
+ const finding = result.findings.find(f => f.id.includes('very-long-file'));
90
+ expect(finding).toBeDefined();
91
+ expect(finding!.severity).toBe('medium');
92
+ });
93
+
94
+ it('reports complex functions with >15 branches', async () => {
95
+ readdirSyncMock.mockReturnValue([
96
+ { name: 'complex.ts', isFile: () => true, isDirectory: () => false },
97
+ ]);
98
+ const branches = Array(20).fill(' if (x) { y++; }').join('\n');
99
+ readFileSyncMock.mockReturnValue(`function complexFn() {\n${branches}\n}`);
100
+ const agent = createAgent();
101
+ const result = await agent.run();
102
+ const finding = result.findings.find(f => f.id.includes('complex-function'));
103
+ expect(finding).toBeDefined();
104
+ expect(finding!.severity).toBe('medium');
105
+ });
106
+
107
+ it('no findings for simple code', async () => {
108
+ readdirSyncMock.mockReturnValue([
109
+ { name: 'simple.ts', isFile: () => true, isDirectory: () => false },
110
+ ]);
111
+ readFileSyncMock.mockReturnValue('function simple() {\n return 1;\n}');
112
+ const agent = createAgent();
113
+ const result = await agent.run();
114
+ const complexFinding = result.findings.find(f => f.id.includes('complex-function'));
115
+ expect(complexFinding).toBeUndefined();
116
+ });
117
+
118
+ it('skips test files', async () => {
119
+ readdirSyncMock.mockReturnValue([
120
+ { name: 'app.test.ts', isFile: () => true, isDirectory: () => false },
121
+ ]);
122
+ const agent = createAgent();
123
+ const result = await agent.run();
124
+ expect(result.status).toBeDefined();
125
+ });
126
+
127
+ it('limits complex function findings to 10', async () => {
128
+ readdirSyncMock.mockReturnValue([
129
+ { name: 'complex.ts', isFile: () => true, isDirectory: () => false },
130
+ ]);
131
+ const funcs = Array.from({ length: 15 }, (_, i) => {
132
+ const branches = Array(20).fill(' if (x) { y++; }').join('\n');
133
+ return `function fn${i}() {\n${branches}\n}`;
134
+ }).join('\n');
135
+ readFileSyncMock.mockReturnValue(funcs);
136
+ const agent = createAgent();
137
+ const result = await agent.run();
138
+ const complexFindings = result.findings.filter(f => f.id.match(/complex-function-\d+/));
139
+ expect(complexFindings.length).toBe(10);
140
+ const summary = result.findings.find(f => f.id.includes('complex-functions-summary'));
141
+ expect(summary).toBeDefined();
142
+ });
143
+
144
+ it('adds evidence with scan stats', async () => {
145
+ readdirSyncMock.mockReturnValue([
146
+ { name: 'app.ts', isFile: () => true, isDirectory: () => false },
147
+ ]);
148
+ readFileSyncMock.mockReturnValue('const x = 1;');
149
+ const agent = createAgent();
150
+ const result = await agent.run();
151
+ expect(result.evidence.length).toBeGreaterThan(0);
152
+ });
153
+
154
+ it('recurses into subdirectories', async () => {
155
+ readdirSyncMock
156
+ .mockReturnValueOnce([
157
+ { name: 'sub', isFile: () => false, isDirectory: () => true },
158
+ ])
159
+ .mockReturnValueOnce([
160
+ { name: 'helper.ts', isFile: () => true, isDirectory: () => false },
161
+ ]);
162
+ readFileSyncMock.mockReturnValue('const x = 1;');
163
+ const agent = createAgent();
164
+ const result = await agent.run();
165
+ expect(result.status).toBeDefined();
166
+ });
167
+
168
+ it('handles empty file', async () => {
169
+ readdirSyncMock.mockReturnValue([
170
+ { name: 'empty.ts', isFile: () => true, isDirectory: () => false },
171
+ ]);
172
+ readFileSyncMock.mockReturnValue('');
173
+ const agent = createAgent();
174
+ const result = await agent.run();
175
+ expect(result.status).toBeDefined();
176
+ });
177
+ });
@@ -7,8 +7,8 @@ import {
7
7
  } from '../registry';
8
8
 
9
9
  describe('AGENT_TIERS', () => {
10
- it('should contain exactly 23 agents', () => {
11
- expect(Object.keys(AGENT_TIERS)).toHaveLength(23);
10
+ it('should contain exactly 70 agents', () => {
11
+ expect(Object.keys(AGENT_TIERS)).toHaveLength(70);
12
12
  });
13
13
 
14
14
  it('should have 8 free-tier agents', () => {
@@ -16,14 +16,14 @@ describe('AGENT_TIERS', () => {
16
16
  expect(freeAgents).toHaveLength(8);
17
17
  });
18
18
 
19
- it('should have 9 pro-tier agents', () => {
19
+ it('should have 26 pro-tier agents', () => {
20
20
  const proAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'pro');
21
- expect(proAgents).toHaveLength(9);
21
+ expect(proAgents).toHaveLength(26);
22
22
  });
23
23
 
24
- it('should have 6 enterprise-tier agents', () => {
24
+ it('should have 36 enterprise-tier agents', () => {
25
25
  const entAgents = Object.entries(AGENT_TIERS).filter(([, t]) => t === 'enterprise');
26
- expect(entAgents).toHaveLength(6);
26
+ expect(entAgents).toHaveLength(36);
27
27
  });
28
28
 
29
29
  it('should classify known agents correctly', () => {
@@ -52,8 +52,8 @@ describe('getAgentTier', () => {
52
52
 
53
53
  describe('isAgentAvailable', () => {
54
54
  const freeAgents = [1, 2, 3, 4, 5, 9, 10, 11];
55
- const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23];
56
- const enterpriseAgents = [14, 16, 17, 18, 19, 20];
55
+ const proAgents = [6, 7, 8, 12, 13, 15, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 37, 38, 46, 48, 62, 68, 69, 70];
56
+ const enterpriseAgents = [14, 16, 17, 18, 19, 20, 30, 34, 35, 36, 39, 40, 41, 42, 43, 44, 45, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67];
57
57
 
58
58
  describe('free license', () => {
59
59
  it('should allow free-tier agents', () => {
@@ -113,10 +113,10 @@ describe('isAgentAvailable', () => {
113
113
  // ---------------------------------------------------------------------------
114
114
 
115
115
  describe('registerAllAgents', () => {
116
- // We need to test that registerAllAgents creates 23 agents and registers them all.
116
+ // We need to test that registerAllAgents creates 70 agents and registers them all.
117
117
  // We mock the orchestrator's registerAgent method.
118
118
 
119
- it('registers all 23 agents with the orchestrator', async () => {
119
+ it('registers all 70 agents with the orchestrator', async () => {
120
120
  // We need to dynamically import to avoid circular dependencies with mocked modules
121
121
  // Instead, test the function signature by checking it registers the right count
122
122
  const { registerAllAgents } = await import('../registry');
@@ -158,13 +158,13 @@ describe('registerAllAgents', () => {
158
158
  '/tmp/run',
159
159
  );
160
160
 
161
- expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(23);
161
+ expect(mockOrchestrator.registerAgent).toHaveBeenCalledTimes(70);
162
162
 
163
- // Verify agent IDs 1-23 are all registered
163
+ // Verify agent IDs 1-70 are all registered
164
164
  const registeredIds = mockOrchestrator.registerAgent.mock.calls.map(
165
165
  (call: unknown[]) => call[0],
166
166
  );
167
- for (let i = 1; i <= 23; i++) {
167
+ for (let i = 1; i <= 70; i++) {
168
168
  expect(registeredIds).toContain(i);
169
169
  }
170
170
  });
@@ -8,8 +8,8 @@ export type LicenseTier = 'free' | 'pro' | 'enterprise';
8
8
  /**
9
9
  * Maps each agent number to its license tier.
10
10
  * - free (8 agents): core testing pipeline
11
- * - pro (9 agents): advanced testing capabilities
12
- * - enterprise (6 agents): full platform auditing
11
+ * - pro (26 agents): advanced testing capabilities
12
+ * - enterprise (36 agents): full platform auditing
13
13
  */
14
14
  export const AGENT_TIERS: Record<number, LicenseTier> = {
15
15
  /* ── Free tier (8) ── */
@@ -22,7 +22,7 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
22
22
  10: 'free', // Reporter
23
23
  11: 'free', // Fixer
24
24
 
25
- /* ── Pro tier (9) ── */
25
+ /* ── Pro tier (26) ── */
26
26
  6: 'pro', // API Exerciser
27
27
  7: 'pro', // Security Scout
28
28
  8: 'pro', // A11y Guardian
@@ -32,14 +32,61 @@ export const AGENT_TIERS: Record<number, LicenseTier> = {
32
32
  21: 'pro', // State & Session Tester
33
33
  22: 'pro', // Email Notification Verifier
34
34
  23: 'pro', // Migration Tester
35
+ 24: 'pro', // Signup & Onboarding Tester
36
+ 25: 'pro', // CRUD Flow Tester
37
+ 26: 'pro', // Form Validator
38
+ 27: 'pro', // Search & Filter Tester
39
+ 28: 'pro', // Navigation & Routing Tester
40
+ 29: 'pro', // Responsive Interaction Tester
41
+ 31: 'pro', // Load Tester
42
+ 32: 'pro', // Memory Leak Detector
43
+ 33: 'pro', // Bundle Analyzer
44
+ 37: 'pro', // Dependency Scanner
45
+ 38: 'pro', // Secrets Scanner
46
+ 46: 'pro', // SEO Auditor
47
+ 48: 'pro', // Lighthouse Auditor
48
+ 62: 'pro', // Env Config Validator
49
+ 68: 'pro', // Dead Code Detector
50
+ 69: 'pro', // Type Safety Auditor
51
+ 70: 'pro', // Complexity Analyzer
35
52
 
36
- /* ── Enterprise tier (6) ── */
53
+ /* ── Enterprise tier (36) ── */
37
54
  14: 'enterprise', // Data Integrity Auditor
38
55
  16: 'enterprise', // Chaos Agent
39
56
  17: 'enterprise', // Documentation Validator
40
57
  18: 'enterprise', // Integration Watchdog
41
58
  19: 'enterprise', // Tenant Isolation Auditor
42
59
  20: 'enterprise', // Workflow Completion Tester
60
+ 30: 'enterprise', // Multi-User Scenario Tester
61
+ 34: 'enterprise', // XSS Scanner
62
+ 35: 'enterprise', // CSRF Tester
63
+ 36: 'enterprise', // Auth Fuzzer
64
+ 39: 'enterprise', // API Contract Tester
65
+ 40: 'enterprise', // Rate Limit Tester
66
+ 41: 'enterprise', // API Pagination Tester
67
+ 42: 'enterprise', // GraphQL Tester
68
+ 43: 'enterprise', // Data Consistency Checker
69
+ 44: 'enterprise', // Backup Recovery Tester
70
+ 45: 'enterprise', // Data Privacy Scanner
71
+ 47: 'enterprise', // Social Preview Tester
72
+ 49: 'enterprise', // i18n Tester
73
+ 50: 'enterprise', // Timezone Tester
74
+ 51: 'enterprise', // Error Recovery Tester
75
+ 52: 'enterprise', // Offline Mode Tester
76
+ 53: 'enterprise', // Graceful Degradation Tester
77
+ 54: 'enterprise', // WebSocket Tester
78
+ 55: 'enterprise', // Realtime Sync Tester
79
+ 56: 'enterprise', // File Upload Tester
80
+ 57: 'enterprise', // Export Tester
81
+ 58: 'enterprise', // Payment Flow Tester
82
+ 59: 'enterprise', // SSL/TLS Auditor
83
+ 60: 'enterprise', // DNS/CDN Tester
84
+ 61: 'enterprise', // Docker Health Checker
85
+ 63: 'enterprise', // Log Quality Auditor
86
+ 64: 'enterprise', // Analytics Tracker Tester
87
+ 65: 'enterprise', // GDPR Compliance Tester
88
+ 66: 'enterprise', // SOC2 Control Validator
89
+ 67: 'enterprise', // WCAG AAA Tester
43
90
  };
44
91
 
45
92
  /** Returns the tier classification for a given agent number. */
@@ -91,9 +138,56 @@ import { WorkflowCompletionTesterAgent } from './20-workflow-completion-tester';
91
138
  import { StateSessionTesterAgent } from './21-state-session-tester';
92
139
  import { EmailNotificationVerifierAgent } from './22-email-notification-verifier';
93
140
  import { MigrationTesterAgent } from './23-migration-tester';
141
+ import { CrudFlowTesterAgent } from './25-crud-flow-tester';
142
+ import { FormValidatorAgent } from './26-form-validator';
143
+ import { SignupOnboardingTesterAgent } from './24-signup-onboarding-tester';
144
+ import { NavigationRoutingTesterAgent } from './28-navigation-routing-tester';
145
+ import { SearchFilterTesterAgent } from './27-search-filter-tester';
146
+ import { ResponsiveInteractionTesterAgent } from './29-responsive-interaction-tester';
147
+ import { MultiUserScenarioTesterAgent } from './30-multi-user-scenario-tester';
148
+ import { LoadTesterAgent } from './31-load-tester';
149
+ import { MemoryLeakDetectorAgent } from './32-memory-leak-detector';
150
+ import { BundleAnalyzerAgent } from './33-bundle-analyzer';
151
+ import { XssScannerAgent } from './34-xss-scanner';
152
+ import { CsrfTesterAgent } from './35-csrf-tester';
153
+ import { AuthFuzzerAgent } from './36-auth-fuzzer';
154
+ import { DependencyScannerAgent } from './37-dependency-scanner';
155
+ import { SecretsScannerAgent } from './38-secrets-scanner';
156
+ import { ApiContractTesterAgent } from './39-api-contract-tester';
157
+ import { RateLimitTesterAgent } from './40-rate-limit-tester';
158
+ import { ApiPaginationTesterAgent } from './41-api-pagination-tester';
159
+ import { GraphqlTesterAgent } from './42-graphql-tester';
160
+ import { DataConsistencyCheckerAgent } from './43-data-consistency-checker';
161
+ import { BackupRecoveryTesterAgent } from './44-backup-recovery-tester';
162
+ import { DataPrivacyScannerAgent } from './45-data-privacy-scanner';
163
+ import { SeoAuditorAgent } from './46-seo-auditor';
164
+ import { SocialPreviewTesterAgent } from './47-social-preview-tester';
165
+ import { LighthouseAuditorAgent } from './48-lighthouse-auditor';
166
+ import { I18nTesterAgent } from './49-i18n-tester';
167
+ import { TimezoneTesterAgent } from './50-timezone-tester';
168
+ import { ErrorRecoveryTesterAgent } from './51-error-recovery-tester';
169
+ import { OfflineModeTesterAgent } from './52-offline-mode-tester';
170
+ import { GracefulDegradationTesterAgent } from './53-graceful-degradation-tester';
171
+ import { WebSocketTesterAgent } from './54-websocket-tester';
172
+ import { RealtimeSyncTesterAgent } from './55-realtime-sync-tester';
173
+ import { FileUploadTesterAgent } from './56-file-upload-tester';
174
+ import { ExportTesterAgent } from './57-export-tester';
175
+ import { PaymentFlowTesterAgent } from './58-payment-flow-tester';
176
+ import { SslTlsAuditorAgent } from './59-ssl-tls-auditor';
177
+ import { DnsCdnTesterAgent } from './60-dns-cdn-tester';
178
+ import { DockerHealthCheckerAgent } from './61-docker-health-checker';
179
+ import { EnvConfigValidatorAgent } from './62-env-config-validator';
180
+ import { LogQualityAuditorAgent } from './63-log-quality-auditor';
181
+ import { AnalyticsTrackerTesterAgent } from './64-analytics-tracker-tester';
182
+ import { GdprComplianceTesterAgent } from './65-gdpr-compliance-tester';
183
+ import { Soc2ControlValidatorAgent } from './66-soc2-control-validator';
184
+ import { WcagAaaTesterAgent } from './67-wcag-aaa-tester';
185
+ import { DeadCodeDetectorAgent } from './68-dead-code-detector';
186
+ import { TypeSafetyAuditorAgent } from './69-type-safety-auditor';
187
+ import { ComplexityAnalyzerAgent } from './70-complexity-analyzer';
94
188
 
95
189
  /**
96
- * Register all 23 agents with the orchestrator.
190
+ * Register all 70 agents with the orchestrator.
97
191
  * Each agent is instantiated with the validated config, phase, and run directory.
98
192
  * Since agents may run in different phases, we register them for all phases
99
193
  * and the orchestrator handles dispatching only the ones needed per phase.
@@ -128,6 +222,53 @@ export function registerAllAgents(
128
222
  new StateSessionTesterAgent(config, phase, runDir),
129
223
  new EmailNotificationVerifierAgent(config, phase, runDir),
130
224
  new MigrationTesterAgent(config, phase, runDir),
225
+ new SignupOnboardingTesterAgent(config, phase, runDir),
226
+ new CrudFlowTesterAgent(config, phase, runDir),
227
+ new FormValidatorAgent(config, phase, runDir),
228
+ new SearchFilterTesterAgent(config, phase, runDir),
229
+ new NavigationRoutingTesterAgent(config, phase, runDir),
230
+ new ResponsiveInteractionTesterAgent(config, phase, runDir),
231
+ new MultiUserScenarioTesterAgent(config, phase, runDir),
232
+ new LoadTesterAgent(config, phase, runDir),
233
+ new MemoryLeakDetectorAgent(config, phase, runDir),
234
+ new BundleAnalyzerAgent(config, phase, runDir),
235
+ new XssScannerAgent(config, phase, runDir),
236
+ new CsrfTesterAgent(config, phase, runDir),
237
+ new AuthFuzzerAgent(config, phase, runDir),
238
+ new DependencyScannerAgent(config, phase, runDir),
239
+ new SecretsScannerAgent(config, phase, runDir),
240
+ new ApiContractTesterAgent(config, phase, runDir),
241
+ new RateLimitTesterAgent(config, phase, runDir),
242
+ new ApiPaginationTesterAgent(config, phase, runDir),
243
+ new GraphqlTesterAgent(config, phase, runDir),
244
+ new DataConsistencyCheckerAgent(config, phase, runDir),
245
+ new BackupRecoveryTesterAgent(config, phase, runDir),
246
+ new DataPrivacyScannerAgent(config, phase, runDir),
247
+ new SeoAuditorAgent(config, phase, runDir),
248
+ new SocialPreviewTesterAgent(config, phase, runDir),
249
+ new LighthouseAuditorAgent(config, phase, runDir),
250
+ new I18nTesterAgent(config, phase, runDir),
251
+ new TimezoneTesterAgent(config, phase, runDir),
252
+ new ErrorRecoveryTesterAgent(config, phase, runDir),
253
+ new OfflineModeTesterAgent(config, phase, runDir),
254
+ new GracefulDegradationTesterAgent(config, phase, runDir),
255
+ new WebSocketTesterAgent(config, phase, runDir),
256
+ new RealtimeSyncTesterAgent(config, phase, runDir),
257
+ new FileUploadTesterAgent(config, phase, runDir),
258
+ new ExportTesterAgent(config, phase, runDir),
259
+ new PaymentFlowTesterAgent(config, phase, runDir),
260
+ new SslTlsAuditorAgent(config, phase, runDir),
261
+ new DnsCdnTesterAgent(config, phase, runDir),
262
+ new DockerHealthCheckerAgent(config, phase, runDir),
263
+ new EnvConfigValidatorAgent(config, phase, runDir),
264
+ new LogQualityAuditorAgent(config, phase, runDir),
265
+ new AnalyticsTrackerTesterAgent(config, phase, runDir),
266
+ new GdprComplianceTesterAgent(config, phase, runDir),
267
+ new Soc2ControlValidatorAgent(config, phase, runDir),
268
+ new WcagAaaTesterAgent(config, phase, runDir),
269
+ new DeadCodeDetectorAgent(config, phase, runDir),
270
+ new TypeSafetyAuditorAgent(config, phase, runDir),
271
+ new ComplexityAnalyzerAgent(config, phase, runDir),
131
272
  ];
132
273
 
133
274
  for (const agent of agents) {
@@ -169,20 +169,20 @@ describe('Sample Platform — TestTeam Integration', () => {
169
169
  });
170
170
 
171
171
  describe('Orchestrator.dryRun with sample config', () => {
172
- it('returns agent IDs [1, 2, 23, 3, 4, 5] for alpha phase', () => {
172
+ it('returns agent IDs [1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70] for alpha phase', () => {
173
173
  const validated = validateConfig(sampleConfig);
174
174
  const orchestrator = new Orchestrator(validated);
175
175
  const plan = orchestrator.dryRun('alpha');
176
176
 
177
- expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 3, 4, 5]);
177
+ expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]);
178
178
  });
179
179
 
180
- it('returns agent IDs [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22] for beta phase', () => {
180
+ it('returns all 59 agent IDs for beta phase', () => {
181
181
  const validated = validateConfig(sampleConfig);
182
182
  const orchestrator = new Orchestrator(validated);
183
183
  const plan = orchestrator.dryRun('beta');
184
184
 
185
- expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
185
+ expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
186
186
  });
187
187
 
188
188
  it('marks all alpha agents as unregistered when no agents are registered', () => {
@@ -62,21 +62,21 @@ describe('Orchestrator', () => {
62
62
  const orchestrator = new Orchestrator(stubConfig);
63
63
  const plan = orchestrator.dryRun('alpha');
64
64
 
65
- expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 3, 4, 5]);
65
+ expect(plan.map(e => e.agentId)).toEqual([1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]);
66
66
  });
67
67
 
68
68
  it('returns the correct agent IDs for beta', () => {
69
69
  const orchestrator = new Orchestrator(stubConfig);
70
70
  const plan = orchestrator.dryRun('beta');
71
71
 
72
- expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
72
+ expect(plan.map(e => e.agentId)).toEqual([5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
73
73
  });
74
74
 
75
75
  it('returns the correct agent IDs for uat', () => {
76
76
  const orchestrator = new Orchestrator(stubConfig);
77
77
  const plan = orchestrator.dryRun('uat');
78
78
 
79
- expect(plan.map(e => e.agentId)).toEqual([5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
79
+ expect(plan.map(e => e.agentId)).toEqual([5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
80
80
  });
81
81
 
82
82
  it('returns the correct agent IDs for release', () => {
@@ -163,12 +163,12 @@ describe('Orchestrator', () => {
163
163
 
164
164
  it('skips unregistered agents and includes them in skippedAgents', async () => {
165
165
  const orchestrator = new Orchestrator(stubConfig, tmpDir);
166
- // Register only agent 1, not 2, 23, 3, 4, 5
166
+ // Register only agent 1, not the others in alpha dispatch
167
167
  orchestrator.registerAgent(1, createMockAgent(1));
168
168
 
169
169
  const result = await orchestrator.runPhase('alpha');
170
170
 
171
- expect(result.skippedAgents).toEqual(expect.arrayContaining([2, 23, 3, 4, 5]));
171
+ expect(result.skippedAgents).toEqual(expect.arrayContaining([2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70]));
172
172
  expect(result.skippedAgents).not.toContain(1);
173
173
  });
174
174
 
@@ -255,7 +255,7 @@ describe('Orchestrator', () => {
255
255
 
256
256
  it('free tier blocks beta phase', async () => {
257
257
  const orchestrator = createOrchestratorWithTier('free');
258
- registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
258
+ registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
259
259
 
260
260
  const result = await orchestrator.runPhase('beta');
261
261
 
@@ -266,7 +266,7 @@ describe('Orchestrator', () => {
266
266
 
267
267
  it('free tier blocks uat phase', async () => {
268
268
  const orchestrator = createOrchestratorWithTier('free');
269
- registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
269
+ registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
270
270
 
271
271
  const result = await orchestrator.runPhase('uat');
272
272
 
@@ -321,8 +321,8 @@ describe('Orchestrator', () => {
321
321
 
322
322
  it('free tier skips pro agents with info finding', async () => {
323
323
  const orchestrator = createOrchestratorWithTier('free');
324
- // Alpha phase: [1, 2, 23, 3, 4, 5]. Agent 23 is pro tier.
325
- registerPhaseAgents(orchestrator, [1, 2, 23, 3, 4, 5]);
324
+ // Alpha phase: [1, 2, 23, 24, 3, 4, 5]. Agent 23 and 24 are pro tier.
325
+ registerPhaseAgents(orchestrator, [1, 2, 23, 24, 3, 4, 5]);
326
326
 
327
327
  const result = await orchestrator.runPhase('alpha');
328
328
 
@@ -360,11 +360,11 @@ describe('Orchestrator', () => {
360
360
  it('pro tier skips enterprise agents with info finding', async () => {
361
361
  const orchestrator = createOrchestratorWithTier('pro');
362
362
  // Beta phase includes enterprise agents: 14, 16, 18, 19
363
- registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
363
+ registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
364
364
 
365
365
  const result = await orchestrator.runPhase('beta');
366
366
 
367
- // Enterprise agents 14, 16, 18, 19 should be skipped
367
+ // Enterprise agents 14, 16, 18, 19, 30 should be skipped
368
368
  expect(result.skippedAgents).toContain(14);
369
369
  expect(result.skippedAgents).toContain(16);
370
370
  expect(result.skippedAgents).toContain(18);
@@ -384,7 +384,7 @@ describe('Orchestrator', () => {
384
384
  it('pro tier allows all phases but gates enterprise agents', async () => {
385
385
  const orchestrator = createOrchestratorWithTier('pro');
386
386
  // UAT includes enterprise agents: 14, 18, 19, 20
387
- registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17]);
387
+ registerPhaseAgents(orchestrator, [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
388
388
 
389
389
  const result = await orchestrator.runPhase('uat');
390
390
 
@@ -397,12 +397,13 @@ describe('Orchestrator', () => {
397
397
  expect(result.agentResults[18].status).toBe('skipped');
398
398
  expect(result.agentResults[19].status).toBe('skipped');
399
399
  expect(result.agentResults[20].status).toBe('skipped');
400
+ expect(result.agentResults[30].status).toBe('skipped');
400
401
  });
401
402
 
402
403
  it('enterprise tier allows all agents', async () => {
403
404
  const orchestrator = createOrchestratorWithTier('enterprise');
404
405
  // Beta phase: all agents should run
405
- registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]);
406
+ registerPhaseAgents(orchestrator, [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]);
406
407
 
407
408
  const result = await orchestrator.runPhase('beta');
408
409
 
@@ -430,7 +431,7 @@ describe('Orchestrator', () => {
430
431
  orchestrator._getLicenseTier = () => 'enterprise';
431
432
 
432
433
  // Register all alpha agents
433
- for (const id of [1, 2, 23, 3, 4, 5]) {
434
+ for (const id of [1, 2, 23, 24, 3, 4, 5]) {
434
435
  orchestrator.registerAgent(id, createMockAgent(id, { durationMs: 100000 }));
435
436
  }
436
437
 
@@ -450,7 +451,7 @@ describe('Orchestrator', () => {
450
451
 
451
452
  const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
452
453
 
453
- for (const id of [1, 2, 23, 3, 4, 5]) {
454
+ for (const id of [1, 2, 23, 24, 3, 4, 5]) {
454
455
  orchestrator.registerAgent(id, createMockAgent(id, { durationMs: 100000 }));
455
456
  }
456
457
 
@@ -466,7 +467,7 @@ describe('Orchestrator', () => {
466
467
  orchestrator._getLicenseTier = () => 'enterprise';
467
468
 
468
469
  // Beta phase has parallel-safe agents: 6, 7, 8, 12, 13, etc.
469
- for (const id of [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22]) {
470
+ for (const id of [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]) {
470
471
  orchestrator.registerAgent(id, createMockAgent(id));
471
472
  }
472
473