@avi770/testteam 1.2.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 (325) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +167 -0
  4. package/agents/01-analyst.ts +100 -0
  5. package/agents/02-seed-architect.ts +59 -0
  6. package/agents/03-test-generator.ts +191 -0
  7. package/agents/04-unit-runner.ts +160 -0
  8. package/agents/05-browser-crawler.ts +790 -0
  9. package/agents/06-api-exerciser.ts +311 -0
  10. package/agents/07-security-scout.ts +188 -0
  11. package/agents/08-a11y-guardian.ts +212 -0
  12. package/agents/09-healer.ts +228 -0
  13. package/agents/10-reporter.ts +266 -0
  14. package/agents/11-fixer.ts +253 -0
  15. package/agents/12-ux-inspector.ts +444 -0
  16. package/agents/13-performance-profiler.ts +271 -0
  17. package/agents/14-data-integrity-auditor.ts +417 -0
  18. package/agents/15-regression-sentinel.ts +307 -0
  19. package/agents/16-chaos-agent.ts +228 -0
  20. package/agents/17-documentation-validator.ts +266 -0
  21. package/agents/18-integration-watchdog.ts +178 -0
  22. package/agents/19-tenant-isolation-auditor.ts +199 -0
  23. package/agents/20-workflow-completion-tester.ts +203 -0
  24. package/agents/21-state-session-tester.ts +262 -0
  25. package/agents/22-email-notification-verifier.ts +244 -0
  26. package/agents/23-migration-tester.ts +80 -0
  27. package/agents/__tests__/01-analyst.test.ts +188 -0
  28. package/agents/__tests__/02-seed-architect.test.ts +152 -0
  29. package/agents/__tests__/03-test-generator-full.test.ts +321 -0
  30. package/agents/__tests__/03-test-generator.test.ts +318 -0
  31. package/agents/__tests__/04-unit-runner.test.ts +320 -0
  32. package/agents/__tests__/05-browser-crawler-beta.test.ts +492 -0
  33. package/agents/__tests__/05-browser-crawler-release.test.ts +412 -0
  34. package/agents/__tests__/05-browser-crawler-uat.test.ts +578 -0
  35. package/agents/__tests__/05-browser-crawler.test.ts +518 -0
  36. package/agents/__tests__/06-api-exerciser.test.ts +619 -0
  37. package/agents/__tests__/07-security-scout.test.ts +382 -0
  38. package/agents/__tests__/08-a11y-guardian.test.ts +530 -0
  39. package/agents/__tests__/09-healer.test.ts +384 -0
  40. package/agents/__tests__/10-reporter.test.ts +366 -0
  41. package/agents/__tests__/11-fixer.test.ts +406 -0
  42. package/agents/__tests__/12-ux-inspector-extended.test.ts +465 -0
  43. package/agents/__tests__/12-ux-inspector.test.ts +443 -0
  44. package/agents/__tests__/13-performance-profiler.test.ts +411 -0
  45. package/agents/__tests__/14-data-integrity-auditor-extended.test.ts +573 -0
  46. package/agents/__tests__/14-data-integrity-auditor.test.ts +407 -0
  47. package/agents/__tests__/15-regression-sentinel.test.ts +657 -0
  48. package/agents/__tests__/16-chaos-agent.test.ts +427 -0
  49. package/agents/__tests__/17-documentation-validator.test.ts +402 -0
  50. package/agents/__tests__/18-integration-watchdog.test.ts +263 -0
  51. package/agents/__tests__/19-tenant-isolation-auditor.test.ts +400 -0
  52. package/agents/__tests__/20-workflow-completion-tester.test.ts +586 -0
  53. package/agents/__tests__/21-state-session-tester.test.ts +374 -0
  54. package/agents/__tests__/22-email-notification-verifier.test.ts +441 -0
  55. package/agents/__tests__/23-migration-tester.test.ts +145 -0
  56. package/agents/__tests__/base-agent.test.ts +188 -0
  57. package/agents/__tests__/registry.test.ts +218 -0
  58. package/agents/base-agent.ts +77 -0
  59. package/agents/registry.ts +136 -0
  60. package/baselines/api-schemas/.gitkeep +0 -0
  61. package/baselines/performance/.gitkeep +0 -0
  62. package/baselines/screenshots/.gitkeep +0 -0
  63. package/bin/testteam.js +10 -0
  64. package/core/__tests__/ci-output.test.ts +430 -0
  65. package/core/__tests__/cli.test.ts +387 -0
  66. package/core/__tests__/config.test.ts +78 -0
  67. package/core/__tests__/cost-tracker.test.ts +158 -0
  68. package/core/__tests__/evidence.test.ts +265 -0
  69. package/core/__tests__/fix-loop.test.ts +210 -0
  70. package/core/__tests__/health-check.test.ts +44 -0
  71. package/core/__tests__/init.test.ts +609 -0
  72. package/core/__tests__/integration.test.ts +204 -0
  73. package/core/__tests__/license-gen.test.ts +227 -0
  74. package/core/__tests__/license.test.ts +326 -0
  75. package/core/__tests__/multi-browser.test.ts +278 -0
  76. package/core/__tests__/orchestrator.test.ts +519 -0
  77. package/core/__tests__/phase-gate.test.ts +43 -0
  78. package/core/__tests__/report-html.test.ts +398 -0
  79. package/core/__tests__/report-upload.test.ts +325 -0
  80. package/core/__tests__/run-counter.test.ts +234 -0
  81. package/core/ci-output.ts +240 -0
  82. package/core/cli.ts +232 -0
  83. package/core/config.ts +178 -0
  84. package/core/cost-tracker.ts +59 -0
  85. package/core/evidence.ts +132 -0
  86. package/core/fix-loop.ts +85 -0
  87. package/core/health-check.ts +54 -0
  88. package/core/init.ts +546 -0
  89. package/core/license-gen.ts +212 -0
  90. package/core/license.ts +211 -0
  91. package/core/messages.ts +67 -0
  92. package/core/multi-browser.ts +136 -0
  93. package/core/orchestrator.ts +354 -0
  94. package/core/phase-gate.ts +55 -0
  95. package/core/report-html.ts +657 -0
  96. package/core/report-upload.ts +188 -0
  97. package/core/run-counter.ts +175 -0
  98. package/core/types.ts +57 -0
  99. package/dist/agents/01-analyst.d.ts +11 -0
  100. package/dist/agents/01-analyst.d.ts.map +1 -0
  101. package/dist/agents/01-analyst.js +75 -0
  102. package/dist/agents/01-analyst.js.map +1 -0
  103. package/dist/agents/02-seed-architect.d.ts +11 -0
  104. package/dist/agents/02-seed-architect.d.ts.map +1 -0
  105. package/dist/agents/02-seed-architect.js +51 -0
  106. package/dist/agents/02-seed-architect.js.map +1 -0
  107. package/dist/agents/03-test-generator.d.ts +9 -0
  108. package/dist/agents/03-test-generator.d.ts.map +1 -0
  109. package/dist/agents/03-test-generator.js +167 -0
  110. package/dist/agents/03-test-generator.js.map +1 -0
  111. package/dist/agents/04-unit-runner.d.ts +9 -0
  112. package/dist/agents/04-unit-runner.d.ts.map +1 -0
  113. package/dist/agents/04-unit-runner.js +113 -0
  114. package/dist/agents/04-unit-runner.js.map +1 -0
  115. package/dist/agents/05-browser-crawler.d.ts +30 -0
  116. package/dist/agents/05-browser-crawler.d.ts.map +1 -0
  117. package/dist/agents/05-browser-crawler.js +685 -0
  118. package/dist/agents/05-browser-crawler.js.map +1 -0
  119. package/dist/agents/06-api-exerciser.d.ts +23 -0
  120. package/dist/agents/06-api-exerciser.d.ts.map +1 -0
  121. package/dist/agents/06-api-exerciser.js +253 -0
  122. package/dist/agents/06-api-exerciser.js.map +1 -0
  123. package/dist/agents/07-security-scout.d.ts +11 -0
  124. package/dist/agents/07-security-scout.d.ts.map +1 -0
  125. package/dist/agents/07-security-scout.js +142 -0
  126. package/dist/agents/07-security-scout.js.map +1 -0
  127. package/dist/agents/08-a11y-guardian.d.ts +13 -0
  128. package/dist/agents/08-a11y-guardian.d.ts.map +1 -0
  129. package/dist/agents/08-a11y-guardian.js +176 -0
  130. package/dist/agents/08-a11y-guardian.js.map +1 -0
  131. package/dist/agents/09-healer.d.ts +33 -0
  132. package/dist/agents/09-healer.d.ts.map +1 -0
  133. package/dist/agents/09-healer.js +167 -0
  134. package/dist/agents/09-healer.js.map +1 -0
  135. package/dist/agents/10-reporter.d.ts +26 -0
  136. package/dist/agents/10-reporter.d.ts.map +1 -0
  137. package/dist/agents/10-reporter.js +215 -0
  138. package/dist/agents/10-reporter.js.map +1 -0
  139. package/dist/agents/11-fixer.d.ts +26 -0
  140. package/dist/agents/11-fixer.d.ts.map +1 -0
  141. package/dist/agents/11-fixer.js +195 -0
  142. package/dist/agents/11-fixer.js.map +1 -0
  143. package/dist/agents/12-ux-inspector.d.ts +15 -0
  144. package/dist/agents/12-ux-inspector.d.ts.map +1 -0
  145. package/dist/agents/12-ux-inspector.js +364 -0
  146. package/dist/agents/12-ux-inspector.js.map +1 -0
  147. package/dist/agents/13-performance-profiler.d.ts +13 -0
  148. package/dist/agents/13-performance-profiler.d.ts.map +1 -0
  149. package/dist/agents/13-performance-profiler.js +216 -0
  150. package/dist/agents/13-performance-profiler.js.map +1 -0
  151. package/dist/agents/14-data-integrity-auditor.d.ts +12 -0
  152. package/dist/agents/14-data-integrity-auditor.d.ts.map +1 -0
  153. package/dist/agents/14-data-integrity-auditor.js +356 -0
  154. package/dist/agents/14-data-integrity-auditor.js.map +1 -0
  155. package/dist/agents/15-regression-sentinel.d.ts +25 -0
  156. package/dist/agents/15-regression-sentinel.d.ts.map +1 -0
  157. package/dist/agents/15-regression-sentinel.js +251 -0
  158. package/dist/agents/15-regression-sentinel.js.map +1 -0
  159. package/dist/agents/16-chaos-agent.d.ts +9 -0
  160. package/dist/agents/16-chaos-agent.d.ts.map +1 -0
  161. package/dist/agents/16-chaos-agent.js +207 -0
  162. package/dist/agents/16-chaos-agent.js.map +1 -0
  163. package/dist/agents/17-documentation-validator.d.ts +31 -0
  164. package/dist/agents/17-documentation-validator.d.ts.map +1 -0
  165. package/dist/agents/17-documentation-validator.js +246 -0
  166. package/dist/agents/17-documentation-validator.js.map +1 -0
  167. package/dist/agents/18-integration-watchdog.d.ts +10 -0
  168. package/dist/agents/18-integration-watchdog.d.ts.map +1 -0
  169. package/dist/agents/18-integration-watchdog.js +138 -0
  170. package/dist/agents/18-integration-watchdog.js.map +1 -0
  171. package/dist/agents/19-tenant-isolation-auditor.d.ts +9 -0
  172. package/dist/agents/19-tenant-isolation-auditor.d.ts.map +1 -0
  173. package/dist/agents/19-tenant-isolation-auditor.js +166 -0
  174. package/dist/agents/19-tenant-isolation-auditor.js.map +1 -0
  175. package/dist/agents/20-workflow-completion-tester.d.ts +12 -0
  176. package/dist/agents/20-workflow-completion-tester.d.ts.map +1 -0
  177. package/dist/agents/20-workflow-completion-tester.js +159 -0
  178. package/dist/agents/20-workflow-completion-tester.js.map +1 -0
  179. package/dist/agents/21-state-session-tester.d.ts +10 -0
  180. package/dist/agents/21-state-session-tester.d.ts.map +1 -0
  181. package/dist/agents/21-state-session-tester.js +233 -0
  182. package/dist/agents/21-state-session-tester.js.map +1 -0
  183. package/dist/agents/22-email-notification-verifier.d.ts +11 -0
  184. package/dist/agents/22-email-notification-verifier.d.ts.map +1 -0
  185. package/dist/agents/22-email-notification-verifier.js +199 -0
  186. package/dist/agents/22-email-notification-verifier.js.map +1 -0
  187. package/dist/agents/23-migration-tester.d.ts +10 -0
  188. package/dist/agents/23-migration-tester.d.ts.map +1 -0
  189. package/dist/agents/23-migration-tester.js +74 -0
  190. package/dist/agents/23-migration-tester.js.map +1 -0
  191. package/dist/agents/base-agent.d.ts +19 -0
  192. package/dist/agents/base-agent.d.ts.map +1 -0
  193. package/dist/agents/base-agent.js +67 -0
  194. package/dist/agents/base-agent.js.map +1 -0
  195. package/dist/agents/registry.d.ts +29 -0
  196. package/dist/agents/registry.d.ts.map +1 -0
  197. package/dist/agents/registry.js +117 -0
  198. package/dist/agents/registry.js.map +1 -0
  199. package/dist/core/ci-output.d.ts +35 -0
  200. package/dist/core/ci-output.d.ts.map +1 -0
  201. package/dist/core/ci-output.js +193 -0
  202. package/dist/core/ci-output.js.map +1 -0
  203. package/dist/core/cli.d.ts +11 -0
  204. package/dist/core/cli.d.ts.map +1 -0
  205. package/dist/core/cli.js +197 -0
  206. package/dist/core/cli.js.map +1 -0
  207. package/dist/core/config.d.ts +111 -0
  208. package/dist/core/config.d.ts.map +1 -0
  209. package/dist/core/config.js +42 -0
  210. package/dist/core/config.js.map +1 -0
  211. package/dist/core/cost-tracker.d.ts +22 -0
  212. package/dist/core/cost-tracker.d.ts.map +1 -0
  213. package/dist/core/cost-tracker.js +41 -0
  214. package/dist/core/cost-tracker.js.map +1 -0
  215. package/dist/core/evidence.d.ts +28 -0
  216. package/dist/core/evidence.d.ts.map +1 -0
  217. package/dist/core/evidence.js +95 -0
  218. package/dist/core/evidence.js.map +1 -0
  219. package/dist/core/fix-loop.d.ts +29 -0
  220. package/dist/core/fix-loop.d.ts.map +1 -0
  221. package/dist/core/fix-loop.js +70 -0
  222. package/dist/core/fix-loop.js.map +1 -0
  223. package/dist/core/health-check.d.ts +21 -0
  224. package/dist/core/health-check.d.ts.map +1 -0
  225. package/dist/core/health-check.js +26 -0
  226. package/dist/core/health-check.js.map +1 -0
  227. package/dist/core/init.d.ts +2 -0
  228. package/dist/core/init.d.ts.map +1 -0
  229. package/dist/core/init.js +435 -0
  230. package/dist/core/init.js.map +1 -0
  231. package/dist/core/license-gen.d.ts +12 -0
  232. package/dist/core/license-gen.d.ts.map +1 -0
  233. package/dist/core/license-gen.js +169 -0
  234. package/dist/core/license-gen.js.map +1 -0
  235. package/dist/core/license.d.ts +33 -0
  236. package/dist/core/license.d.ts.map +1 -0
  237. package/dist/core/license.js +170 -0
  238. package/dist/core/license.js.map +1 -0
  239. package/dist/core/messages.d.ts +10 -0
  240. package/dist/core/messages.d.ts.map +1 -0
  241. package/dist/core/messages.js +47 -0
  242. package/dist/core/messages.js.map +1 -0
  243. package/dist/core/multi-browser.d.ts +36 -0
  244. package/dist/core/multi-browser.d.ts.map +1 -0
  245. package/dist/core/multi-browser.js +88 -0
  246. package/dist/core/multi-browser.js.map +1 -0
  247. package/dist/core/orchestrator.d.ts +48 -0
  248. package/dist/core/orchestrator.d.ts.map +1 -0
  249. package/dist/core/orchestrator.js +291 -0
  250. package/dist/core/orchestrator.js.map +1 -0
  251. package/dist/core/phase-gate.d.ts +4 -0
  252. package/dist/core/phase-gate.d.ts.map +1 -0
  253. package/dist/core/phase-gate.js +39 -0
  254. package/dist/core/phase-gate.js.map +1 -0
  255. package/dist/core/report-html.d.ts +9 -0
  256. package/dist/core/report-html.d.ts.map +1 -0
  257. package/dist/core/report-html.js +617 -0
  258. package/dist/core/report-html.js.map +1 -0
  259. package/dist/core/report-upload.d.ts +16 -0
  260. package/dist/core/report-upload.d.ts.map +1 -0
  261. package/dist/core/report-upload.js +124 -0
  262. package/dist/core/report-upload.js.map +1 -0
  263. package/dist/core/run-counter.d.ts +40 -0
  264. package/dist/core/run-counter.d.ts.map +1 -0
  265. package/dist/core/run-counter.js +120 -0
  266. package/dist/core/run-counter.js.map +1 -0
  267. package/dist/core/types.d.ts +53 -0
  268. package/dist/core/types.d.ts.map +1 -0
  269. package/dist/core/types.js +2 -0
  270. package/dist/core/types.js.map +1 -0
  271. package/dist/helpers/api-client.d.ts +30 -0
  272. package/dist/helpers/api-client.d.ts.map +1 -0
  273. package/dist/helpers/api-client.js +77 -0
  274. package/dist/helpers/api-client.js.map +1 -0
  275. package/dist/helpers/element-discovery.d.ts +18 -0
  276. package/dist/helpers/element-discovery.d.ts.map +1 -0
  277. package/dist/helpers/element-discovery.js +82 -0
  278. package/dist/helpers/element-discovery.js.map +1 -0
  279. package/dist/helpers/env-resolver.d.ts +29 -0
  280. package/dist/helpers/env-resolver.d.ts.map +1 -0
  281. package/dist/helpers/env-resolver.js +51 -0
  282. package/dist/helpers/env-resolver.js.map +1 -0
  283. package/dist/helpers/form-filler.d.ts +13 -0
  284. package/dist/helpers/form-filler.d.ts.map +1 -0
  285. package/dist/helpers/form-filler.js +98 -0
  286. package/dist/helpers/form-filler.js.map +1 -0
  287. package/dist/helpers/modal-handler.d.ts +16 -0
  288. package/dist/helpers/modal-handler.d.ts.map +1 -0
  289. package/dist/helpers/modal-handler.js +95 -0
  290. package/dist/helpers/modal-handler.js.map +1 -0
  291. package/dist/helpers/navigation.d.ts +37 -0
  292. package/dist/helpers/navigation.d.ts.map +1 -0
  293. package/dist/helpers/navigation.js +83 -0
  294. package/dist/helpers/navigation.js.map +1 -0
  295. package/dist/helpers/quality-gate.d.ts +17 -0
  296. package/dist/helpers/quality-gate.d.ts.map +1 -0
  297. package/dist/helpers/quality-gate.js +144 -0
  298. package/dist/helpers/quality-gate.js.map +1 -0
  299. package/dist/helpers/screenshot.d.ts +24 -0
  300. package/dist/helpers/screenshot.d.ts.map +1 -0
  301. package/dist/helpers/screenshot.js +76 -0
  302. package/dist/helpers/screenshot.js.map +1 -0
  303. package/dist/helpers/seed-validator.d.ts +15 -0
  304. package/dist/helpers/seed-validator.d.ts.map +1 -0
  305. package/dist/helpers/seed-validator.js +53 -0
  306. package/dist/helpers/seed-validator.js.map +1 -0
  307. package/helpers/__tests__/api-client.test.ts +199 -0
  308. package/helpers/__tests__/element-discovery.test.ts +202 -0
  309. package/helpers/__tests__/form-filler-extended.test.ts +212 -0
  310. package/helpers/__tests__/form-filler.test.ts +99 -0
  311. package/helpers/__tests__/modal-handler.test.ts +152 -0
  312. package/helpers/__tests__/navigation.test.ts +214 -0
  313. package/helpers/__tests__/quality-gate.test.ts +117 -0
  314. package/helpers/__tests__/screenshot.test.ts +139 -0
  315. package/helpers/__tests__/seed-validator.test.ts +114 -0
  316. package/helpers/api-client.ts +111 -0
  317. package/helpers/element-discovery.ts +105 -0
  318. package/helpers/env-resolver.ts +69 -0
  319. package/helpers/form-filler.ts +126 -0
  320. package/helpers/modal-handler.ts +108 -0
  321. package/helpers/navigation.ts +100 -0
  322. package/helpers/quality-gate.ts +180 -0
  323. package/helpers/screenshot.ts +111 -0
  324. package/helpers/seed-validator.ts +70 -0
  325. package/package.json +88 -0
@@ -0,0 +1,617 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /** Determine the overall verdict from phase gate results. */
4
+ function determineVerdict(gateResults) {
5
+ const hasBlockingFailures = gateResults.some((g) => g.failedBlockingAgents.length > 0);
6
+ if (hasBlockingFailures)
7
+ return 'FAIL';
8
+ const hasAdvisoryFailures = gateResults.some((g) => g.advisoryResults.some((r) => r.status === 'failed'));
9
+ if (hasAdvisoryFailures)
10
+ return 'CONDITIONAL';
11
+ return 'PASS';
12
+ }
13
+ /** Format milliseconds into a human-readable duration string. */
14
+ function formatDuration(ms) {
15
+ if (ms < 1000)
16
+ return `${ms}ms`;
17
+ const seconds = Math.floor(ms / 1000);
18
+ if (seconds < 60)
19
+ return `${seconds}s`;
20
+ const minutes = Math.floor(seconds / 60);
21
+ const remainingSeconds = seconds % 60;
22
+ return `${minutes}m ${remainingSeconds}s`;
23
+ }
24
+ /** Compute total duration from all agent results. */
25
+ function computeTotalDuration(agentResults) {
26
+ let total = 0;
27
+ for (const result of agentResults.values()) {
28
+ total += result.durationMs;
29
+ }
30
+ return total;
31
+ }
32
+ /** Escape HTML special characters. */
33
+ function escapeHtml(text) {
34
+ return text
35
+ .replace(/&/g, '&amp;')
36
+ .replace(/</g, '&lt;')
37
+ .replace(/>/g, '&gt;')
38
+ .replace(/"/g, '&quot;')
39
+ .replace(/'/g, '&#039;');
40
+ }
41
+ /** Map verdict to CSS class suffix. */
42
+ function verdictClass(verdict) {
43
+ switch (verdict) {
44
+ case 'PASS': return 'pass';
45
+ case 'CONDITIONAL': return 'warn';
46
+ case 'FAIL': return 'fail';
47
+ }
48
+ }
49
+ /** Map agent status to CSS class suffix. */
50
+ function statusClass(status) {
51
+ switch (status) {
52
+ case 'passed': return 'pass';
53
+ case 'failed': return 'fail';
54
+ case 'skipped': return 'skip';
55
+ case 'running': return 'warn';
56
+ case 'pending': return 'skip';
57
+ }
58
+ }
59
+ /** Map severity to CSS class suffix. */
60
+ function severityClass(severity) {
61
+ switch (severity) {
62
+ case 'critical': return 'fail';
63
+ case 'high': return 'fail';
64
+ case 'medium': return 'warn';
65
+ case 'low': return 'pass';
66
+ case 'info': return 'info';
67
+ }
68
+ }
69
+ /** Map phase gate passed boolean to CSS class suffix. */
70
+ function phaseClass(gate) {
71
+ if (!gate)
72
+ return 'skip';
73
+ if (!gate.passed)
74
+ return 'fail';
75
+ const hasAdvisoryFail = gate.advisoryResults.some((r) => r.status === 'failed');
76
+ if (hasAdvisoryFail)
77
+ return 'warn';
78
+ return 'pass';
79
+ }
80
+ /** Ordered severity levels for grouping findings. */
81
+ const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
82
+ /** The four phases in pipeline order. */
83
+ const PHASE_ORDER = ['alpha', 'beta', 'uat', 'release'];
84
+ /** Determine the agent tier label based on agentId convention. */
85
+ function agentTier(agentId) {
86
+ if (agentId <= 3)
87
+ return 'core';
88
+ if (agentId <= 9)
89
+ return 'specialist';
90
+ if (agentId <= 15)
91
+ return 'advanced';
92
+ return 'extended';
93
+ }
94
+ function buildCss() {
95
+ return `
96
+ :root {
97
+ --bg: #1a1b26;
98
+ --bg-surface: #24283b;
99
+ --bg-surface2: #2f3349;
100
+ --text: #c0caf5;
101
+ --text-muted: #565f89;
102
+ --border: #3b4261;
103
+ --pass: #9ece6a;
104
+ --warn: #e0af68;
105
+ --fail: #f7768e;
106
+ --info: #7aa2f7;
107
+ --skip: #565f89;
108
+ }
109
+
110
+ * { margin: 0; padding: 0; box-sizing: border-box; }
111
+
112
+ body {
113
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
114
+ background: var(--bg);
115
+ color: var(--text);
116
+ line-height: 1.6;
117
+ padding: 2rem;
118
+ max-width: 1200px;
119
+ margin: 0 auto;
120
+ }
121
+
122
+ h1, h2, h3 { font-weight: 600; }
123
+ h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
124
+ h2 { font-size: 1.3rem; margin-bottom: 1rem; color: var(--text); border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; }
125
+
126
+ .header {
127
+ background: var(--bg-surface);
128
+ border-radius: 8px;
129
+ padding: 1.5rem 2rem;
130
+ margin-bottom: 2rem;
131
+ border: 1px solid var(--border);
132
+ }
133
+
134
+ .header-meta {
135
+ display: grid;
136
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
137
+ gap: 0.75rem;
138
+ margin-top: 1rem;
139
+ }
140
+
141
+ .header-meta dt { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); }
142
+ .header-meta dd { font-size: 1rem; font-weight: 500; }
143
+
144
+ .badge {
145
+ display: inline-block;
146
+ padding: 0.15rem 0.6rem;
147
+ border-radius: 4px;
148
+ font-size: 0.8rem;
149
+ font-weight: 600;
150
+ text-transform: uppercase;
151
+ letter-spacing: 0.03em;
152
+ cursor: default;
153
+ }
154
+ .badge-pass { background: color-mix(in srgb, var(--pass) 20%, transparent); color: var(--pass); }
155
+ .badge-warn { background: color-mix(in srgb, var(--warn) 20%, transparent); color: var(--warn); }
156
+ .badge-fail { background: color-mix(in srgb, var(--fail) 20%, transparent); color: var(--fail); }
157
+ .badge-skip { background: color-mix(in srgb, var(--skip) 20%, transparent); color: var(--skip); }
158
+ .badge-info { background: color-mix(in srgb, var(--info) 20%, transparent); color: var(--info); }
159
+
160
+ /* Severity filter badges */
161
+ .filter-badge { cursor: pointer; user-select: none; }
162
+ .filter-badge:hover { opacity: 0.8; }
163
+ .filter-badge.active { outline: 2px solid currentColor; outline-offset: 2px; }
164
+
165
+ .section {
166
+ background: var(--bg-surface);
167
+ border-radius: 8px;
168
+ padding: 1.5rem 2rem;
169
+ margin-bottom: 2rem;
170
+ border: 1px solid var(--border);
171
+ }
172
+
173
+ /* Phase gate pipeline */
174
+ .pipeline {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ gap: 0;
179
+ flex-wrap: wrap;
180
+ margin-top: 1rem;
181
+ }
182
+
183
+ .phase-node {
184
+ display: flex;
185
+ flex-direction: column;
186
+ align-items: center;
187
+ gap: 0.5rem;
188
+ }
189
+
190
+ .phase-circle {
191
+ width: 48px;
192
+ height: 48px;
193
+ border-radius: 50%;
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ font-weight: 700;
198
+ font-size: 0.7rem;
199
+ text-transform: uppercase;
200
+ }
201
+ .phase-circle-pass { background: var(--pass); color: var(--bg); }
202
+ .phase-circle-warn { background: var(--warn); color: var(--bg); }
203
+ .phase-circle-fail { background: var(--fail); color: var(--bg); }
204
+ .phase-circle-skip { background: var(--bg-surface2); color: var(--text-muted); border: 2px dashed var(--border); }
205
+
206
+ .phase-label {
207
+ font-size: 0.75rem;
208
+ text-transform: uppercase;
209
+ letter-spacing: 0.05em;
210
+ color: var(--text-muted);
211
+ }
212
+
213
+ .phase-arrow {
214
+ width: 40px;
215
+ height: 2px;
216
+ background: var(--border);
217
+ margin: 0 0.25rem;
218
+ margin-bottom: 1.5rem;
219
+ }
220
+
221
+ /* Table */
222
+ table {
223
+ width: 100%;
224
+ border-collapse: collapse;
225
+ font-size: 0.9rem;
226
+ }
227
+ thead th {
228
+ text-align: left;
229
+ padding: 0.75rem;
230
+ border-bottom: 2px solid var(--border);
231
+ font-size: 0.75rem;
232
+ text-transform: uppercase;
233
+ letter-spacing: 0.05em;
234
+ color: var(--text-muted);
235
+ }
236
+ tbody td {
237
+ padding: 0.6rem 0.75rem;
238
+ border-bottom: 1px solid var(--border);
239
+ vertical-align: top;
240
+ }
241
+ tbody tr:hover { background: var(--bg-surface2); }
242
+
243
+ /* Collapsible sections — pure CSS */
244
+ .collapsible > input[type="checkbox"] { display: none; }
245
+ .collapsible > label {
246
+ display: block;
247
+ cursor: pointer;
248
+ user-select: none;
249
+ padding: 0.5rem 0;
250
+ font-weight: 600;
251
+ }
252
+ .collapsible > label::before {
253
+ content: '\\25B6';
254
+ display: inline-block;
255
+ margin-right: 0.5rem;
256
+ font-size: 0.7rem;
257
+ transition: transform 0.15s;
258
+ }
259
+ .collapsible > input:checked + label::before {
260
+ transform: rotate(90deg);
261
+ }
262
+ .collapsible > .content {
263
+ max-height: 0;
264
+ overflow: hidden;
265
+ transition: max-height 0.2s ease-out;
266
+ }
267
+ .collapsible > input:checked ~ .content {
268
+ max-height: 5000px;
269
+ }
270
+
271
+ /* Agent detail rows */
272
+ .agent-detail {
273
+ background: var(--bg);
274
+ border-radius: 4px;
275
+ padding: 0.75rem;
276
+ margin: 0.5rem 0;
277
+ font-size: 0.85rem;
278
+ }
279
+ .agent-detail p { margin-bottom: 0.25rem; }
280
+
281
+ /* Findings */
282
+ .finding-card {
283
+ background: var(--bg);
284
+ border-radius: 6px;
285
+ padding: 1rem;
286
+ margin-bottom: 0.75rem;
287
+ border-left: 3px solid var(--border);
288
+ }
289
+ .finding-card-critical { border-left-color: var(--fail); }
290
+ .finding-card-high { border-left-color: var(--fail); }
291
+ .finding-card-medium { border-left-color: var(--warn); }
292
+ .finding-card-low { border-left-color: var(--pass); }
293
+ .finding-card-info { border-left-color: var(--info); }
294
+
295
+ .finding-header {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 0.5rem;
299
+ margin-bottom: 0.5rem;
300
+ }
301
+ .finding-desc { font-size: 0.9rem; margin-bottom: 0.25rem; }
302
+ .finding-meta { font-size: 0.8rem; color: var(--text-muted); }
303
+
304
+ .filter-bar { display: flex; gap: 0.5rem; margin-bottom: 1rem; flex-wrap: wrap; }
305
+
306
+ /* Print styles */
307
+ @media print {
308
+ body { background: #fff; color: #222; padding: 1rem; }
309
+ .section, .header { background: #f9f9f9; border-color: #ddd; }
310
+ .badge-pass { background: #d4edda; color: #155724; }
311
+ .badge-warn { background: #fff3cd; color: #856404; }
312
+ .badge-fail { background: #f8d7da; color: #721c24; }
313
+ .badge-info { background: #d1ecf1; color: #0c5460; }
314
+ .collapsible > .content { max-height: none !important; }
315
+ }
316
+
317
+ .empty-state {
318
+ text-align: center;
319
+ padding: 2rem;
320
+ color: var(--text-muted);
321
+ font-style: italic;
322
+ }
323
+ `;
324
+ }
325
+ function buildJs() {
326
+ return `
327
+ document.addEventListener('DOMContentLoaded', function() {
328
+ var filterBadges = document.querySelectorAll('.filter-badge');
329
+ var findingCards = document.querySelectorAll('.finding-card');
330
+ var activeFilters = new Set();
331
+
332
+ filterBadges.forEach(function(badge) {
333
+ badge.addEventListener('click', function() {
334
+ var severity = this.getAttribute('data-severity');
335
+ if (!severity) return;
336
+
337
+ if (activeFilters.has(severity)) {
338
+ activeFilters.delete(severity);
339
+ this.classList.remove('active');
340
+ } else {
341
+ activeFilters.add(severity);
342
+ this.classList.add('active');
343
+ }
344
+
345
+ findingCards.forEach(function(card) {
346
+ var cardSev = card.getAttribute('data-severity');
347
+ if (activeFilters.size === 0) {
348
+ card.style.display = '';
349
+ } else {
350
+ card.style.display = activeFilters.has(cardSev) ? '' : 'none';
351
+ }
352
+ });
353
+ });
354
+ });
355
+
356
+ // Expandable agent rows
357
+ var expandBtns = document.querySelectorAll('.expand-agent');
358
+ expandBtns.forEach(function(btn) {
359
+ btn.addEventListener('click', function() {
360
+ var targetId = this.getAttribute('data-target');
361
+ if (!targetId) return;
362
+ var detail = document.getElementById(targetId);
363
+ if (!detail) return;
364
+ var isHidden = detail.style.display === 'none' || detail.style.display === '';
365
+ detail.style.display = isHidden ? 'table-row' : 'none';
366
+ this.textContent = isHidden ? '\\u25BC' : '\\u25B6';
367
+ });
368
+ });
369
+ });
370
+ `;
371
+ }
372
+ /** Build the phase gate pipeline visualization. */
373
+ function buildPipelineHtml(gateResults) {
374
+ const gateMap = new Map();
375
+ for (const gate of gateResults) {
376
+ gateMap.set(gate.phase, gate);
377
+ }
378
+ const nodes = [];
379
+ for (let i = 0; i < PHASE_ORDER.length; i++) {
380
+ const phase = PHASE_ORDER[i];
381
+ const gate = gateMap.get(phase);
382
+ const cls = phaseClass(gate);
383
+ const icon = cls === 'pass' ? '&#10003;' : cls === 'fail' ? '&#10007;' : cls === 'warn' ? '!' : '&#8212;';
384
+ nodes.push(`
385
+ <div class="phase-node">
386
+ <div class="phase-circle phase-circle-${cls}">${icon}</div>
387
+ <span class="phase-label">${escapeHtml(phase)}</span>
388
+ </div>
389
+ `);
390
+ if (i < PHASE_ORDER.length - 1) {
391
+ nodes.push('<div class="phase-arrow"></div>');
392
+ }
393
+ }
394
+ return `<div class="pipeline">${nodes.join('')}</div>`;
395
+ }
396
+ /** Build the agent results table. */
397
+ function buildAgentTableHtml(agentResults) {
398
+ const sorted = Array.from(agentResults.values()).sort((a, b) => a.agentId - b.agentId);
399
+ if (sorted.length === 0) {
400
+ return '<p class="empty-state">No agent results recorded.</p>';
401
+ }
402
+ const rows = [];
403
+ for (const result of sorted) {
404
+ const cls = statusClass(result.status);
405
+ const detailId = `agent-detail-${result.agentId}`;
406
+ rows.push(`
407
+ <tr>
408
+ <td><button class="expand-agent badge badge-info" data-target="${detailId}" style="cursor:pointer;border:none;min-width:1.5rem;">&#9654;</button></td>
409
+ <td>${result.agentId}</td>
410
+ <td>${escapeHtml(result.agentName)}</td>
411
+ <td>${escapeHtml(result.phase)}</td>
412
+ <td><span class="badge badge-${cls}">${escapeHtml(result.status)}</span></td>
413
+ <td>${formatDuration(result.durationMs)}</td>
414
+ <td>${result.findings.length}</td>
415
+ <td>${agentTier(result.agentId)}</td>
416
+ </tr>
417
+ <tr id="${detailId}" style="display:none;">
418
+ <td colspan="8">
419
+ <div class="agent-detail">
420
+ <p><strong>Summary:</strong> ${escapeHtml(result.summary)}</p>
421
+ ${result.findings.length > 0
422
+ ? `<p><strong>Findings:</strong></p>
423
+ <ul>${result.findings.map((f) => `<li><span class="badge badge-${severityClass(f.severity)}">${escapeHtml(f.severity)}</span> ${escapeHtml(f.module)}: ${escapeHtml(f.description)}</li>`).join('')}</ul>`
424
+ : '<p>No findings.</p>'}
425
+ </div>
426
+ </td>
427
+ </tr>
428
+ `);
429
+ }
430
+ return `
431
+ <table>
432
+ <thead>
433
+ <tr>
434
+ <th></th>
435
+ <th>#</th>
436
+ <th>Name</th>
437
+ <th>Phase</th>
438
+ <th>Status</th>
439
+ <th>Duration</th>
440
+ <th>Findings</th>
441
+ <th>Tier</th>
442
+ </tr>
443
+ </thead>
444
+ <tbody>
445
+ ${rows.join('')}
446
+ </tbody>
447
+ </table>
448
+ `;
449
+ }
450
+ /** Build the findings section grouped by severity. */
451
+ function buildFindingsHtml(agentResults) {
452
+ const allFindings = [];
453
+ for (const result of agentResults.values()) {
454
+ for (const finding of result.findings) {
455
+ allFindings.push({ ...finding, agentName: result.agentName });
456
+ }
457
+ }
458
+ if (allFindings.length === 0) {
459
+ return '<p class="empty-state">No findings — all clear.</p>';
460
+ }
461
+ // Filter bar
462
+ const severityCounts = new Map();
463
+ for (const f of allFindings) {
464
+ severityCounts.set(f.severity, (severityCounts.get(f.severity) ?? 0) + 1);
465
+ }
466
+ const filterBar = `<div class="filter-bar">${SEVERITY_ORDER.map((sev) => {
467
+ const count = severityCounts.get(sev) ?? 0;
468
+ if (count === 0)
469
+ return '';
470
+ return `<span class="badge badge-${severityClass(sev)} filter-badge" data-severity="${sev}">${sev} (${count})</span>`;
471
+ }).join('')}</div>`;
472
+ // Group by severity
473
+ const groups = [];
474
+ for (const severity of SEVERITY_ORDER) {
475
+ const group = allFindings.filter((f) => f.severity === severity);
476
+ if (group.length === 0)
477
+ continue;
478
+ const cards = group.map((f) => {
479
+ const location = f.file
480
+ ? `${escapeHtml(f.file)}${f.line ? `:${f.line}` : ''}`
481
+ : '';
482
+ const evidenceLink = f.screenshot
483
+ ? `<span class="finding-meta">Evidence: ${escapeHtml(f.screenshot)}</span>`
484
+ : '';
485
+ return `
486
+ <div class="finding-card finding-card-${severity}" data-severity="${severity}">
487
+ <div class="finding-header">
488
+ <span class="badge badge-${severityClass(severity)}">${escapeHtml(severity)}</span>
489
+ <span style="font-weight:600;">${escapeHtml(f.module)}</span>
490
+ <span class="finding-meta">Agent: ${escapeHtml(f.agentName)} (#${f.agentId})</span>
491
+ </div>
492
+ <p class="finding-desc">${escapeHtml(f.description)}</p>
493
+ ${location ? `<p class="finding-meta">Location: ${location}</p>` : ''}
494
+ ${evidenceLink}
495
+ </div>
496
+ `;
497
+ }).join('');
498
+ const sectionId = `findings-${severity}`;
499
+ groups.push(`
500
+ <div class="collapsible">
501
+ <input type="checkbox" id="${sectionId}" checked>
502
+ <label for="${sectionId}">${severity.toUpperCase()} (${group.length})</label>
503
+ <div class="content">${cards}</div>
504
+ </div>
505
+ `);
506
+ }
507
+ return filterBar + groups.join('');
508
+ }
509
+ /** Build an optional coverage summary section. */
510
+ function buildCoverageHtml(agentResults) {
511
+ // Extract coverage data from known specialist agents if present
512
+ const coverageAgent = agentResults.get(4); // Coverage agent
513
+ const securityAgent = agentResults.get(7); // Security agent
514
+ const a11yAgent = agentResults.get(8); // Accessibility agent
515
+ const items = [];
516
+ if (coverageAgent) {
517
+ items.push(`
518
+ <div>
519
+ <dt>Unit Coverage</dt>
520
+ <dd>${escapeHtml(coverageAgent.summary)}</dd>
521
+ </div>
522
+ `);
523
+ }
524
+ if (securityAgent) {
525
+ items.push(`
526
+ <div>
527
+ <dt>Security</dt>
528
+ <dd><span class="badge badge-${statusClass(securityAgent.status)}">${escapeHtml(securityAgent.status)}</span> ${escapeHtml(securityAgent.summary)}</dd>
529
+ </div>
530
+ `);
531
+ }
532
+ if (a11yAgent) {
533
+ items.push(`
534
+ <div>
535
+ <dt>Accessibility</dt>
536
+ <dd><span class="badge badge-${statusClass(a11yAgent.status)}">${escapeHtml(a11yAgent.status)}</span> ${escapeHtml(a11yAgent.summary)}</dd>
537
+ </div>
538
+ `);
539
+ }
540
+ if (items.length === 0) {
541
+ return '<p class="empty-state">No coverage data available.</p>';
542
+ }
543
+ return `<dl class="header-meta">${items.join('')}</dl>`;
544
+ }
545
+ /**
546
+ * Generates a self-contained HTML report from test run results.
547
+ *
548
+ * The output file contains all CSS and JS inline — no external dependencies.
549
+ * It can be opened directly from the filesystem in any modern browser.
550
+ */
551
+ export function generateHTMLReport(state, outputPath) {
552
+ const verdict = determineVerdict(state.gateResults);
553
+ const totalDuration = computeTotalDuration(state.agentResults);
554
+ const commitHash = process.env['GIT_COMMIT'] ?? process.env['GITHUB_SHA'] ?? 'unknown';
555
+ const html = `<!DOCTYPE html>
556
+ <html lang="en">
557
+ <head>
558
+ <meta charset="UTF-8">
559
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
560
+ <title>TestTeam Report — ${escapeHtml(state.runId)}</title>
561
+ <style>${buildCss()}</style>
562
+ </head>
563
+ <body>
564
+ <div class="header">
565
+ <h1>TestTeam Report</h1>
566
+ <dl class="header-meta">
567
+ <div>
568
+ <dt>Run ID</dt>
569
+ <dd>${escapeHtml(state.runId)}</dd>
570
+ </div>
571
+ <div>
572
+ <dt>Date</dt>
573
+ <dd>${escapeHtml(state.startedAt)}</dd>
574
+ </div>
575
+ <div>
576
+ <dt>Commit</dt>
577
+ <dd><code>${escapeHtml(commitHash)}</code></dd>
578
+ </div>
579
+ <div>
580
+ <dt>Duration</dt>
581
+ <dd>${formatDuration(totalDuration)}</dd>
582
+ </div>
583
+ <div>
584
+ <dt>Verdict</dt>
585
+ <dd><span class="badge badge-${verdictClass(verdict)}">${verdict}</span></dd>
586
+ </div>
587
+ </dl>
588
+ </div>
589
+
590
+ <div class="section">
591
+ <h2>Phase Gate Summary</h2>
592
+ ${buildPipelineHtml(state.gateResults)}
593
+ </div>
594
+
595
+ <div class="section">
596
+ <h2>Agent Results</h2>
597
+ ${buildAgentTableHtml(state.agentResults)}
598
+ </div>
599
+
600
+ <div class="section">
601
+ <h2>Findings</h2>
602
+ ${buildFindingsHtml(state.agentResults)}
603
+ </div>
604
+
605
+ <div class="section">
606
+ <h2>Coverage Summary</h2>
607
+ ${buildCoverageHtml(state.agentResults)}
608
+ </div>
609
+
610
+ <script>${buildJs()}</script>
611
+ </body>
612
+ </html>`;
613
+ const dir = path.dirname(outputPath);
614
+ fs.mkdirSync(dir, { recursive: true });
615
+ fs.writeFileSync(outputPath, html, 'utf-8');
616
+ }
617
+ //# sourceMappingURL=report-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-html.js","sourceRoot":"","sources":["../../core/report-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface UploadConfig {
2
+ provider: 's3' | 'azure-blob' | 'local';
3
+ bucket?: string;
4
+ region?: string;
5
+ prefix?: string;
6
+ connectionString?: string;
7
+ }
8
+ export interface UploadResult {
9
+ url: string;
10
+ provider: string;
11
+ size: number;
12
+ timestamp: number;
13
+ }
14
+ export declare function uploadReport(htmlPath: string, config: UploadConfig): Promise<UploadResult>;
15
+ export declare function getDefaultUploadConfig(): UploadConfig;
16
+ //# sourceMappingURL=report-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-upload.d.ts","sourceRoot":"","sources":["../../core/report-upload.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAoID,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED,wBAAgB,sBAAsB,IAAI,YAAY,CAKrD"}