qa360 2.1.7 → 2.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 (906) hide show
  1. package/.BETA_TESTING_FEEDBACK.md +256 -0
  2. package/.claude/settings.local.json +154 -0
  3. package/.editorconfig +21 -0
  4. package/.github/CODEOWNERS +23 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
  6. package/.github/ISSUE_TEMPLATE/feedback_dx.yml +121 -0
  7. package/.github/dependabot.yml +35 -0
  8. package/.github/workflows/mcp-dx.yml +106 -0
  9. package/.github/workflows/release.yml +26 -0
  10. package/.github/workflows/test.yml +93 -0
  11. package/.nvmrc +1 -0
  12. package/.qa360-artifacts/.gitkeep +0 -0
  13. package/.qa360-artifacts/baselines/.gitkeep +0 -0
  14. package/.qa360-artifacts/cache/.gitkeep +0 -0
  15. package/.qa360-artifacts/reports/.gitkeep +0 -0
  16. package/.qa360-artifacts/screenshots/.gitkeep +0 -0
  17. package/.qa360-baselines/www_xyqo_ai.baseline.json +33 -0
  18. package/CHANGELOG.md +234 -0
  19. package/CODEOWNERS +43 -0
  20. package/CONTRIBUTING.md +273 -0
  21. package/NOVICE_USER_GUIDE.md +272 -0
  22. package/QUICK_START.md +191 -0
  23. package/README.md +191 -163
  24. package/adapters/README.md +46 -0
  25. package/check-branches.sh +32 -0
  26. package/cli/.qa360/keys/ed25519.key +1 -0
  27. package/cli/.qa360/keys/ed25519.pub +1 -0
  28. package/cli/CHANGELOG.md +84 -0
  29. package/cli/LICENSE +24 -0
  30. package/cli/README.md +222 -0
  31. package/cli/examples/README.md +160 -0
  32. package/cli/package.json +76 -0
  33. package/cli/scripts/bundle-for-npm.sh +51 -0
  34. package/cli/scripts/validate-package.js +116 -0
  35. package/cli/src/__tests__/commands/doctor.test.ts +108 -0
  36. package/cli/src/__tests__/index.test.ts +15 -0
  37. package/cli/src/cli-minimal.ts +44 -0
  38. package/cli/src/commands/__tests__/crawl.test.ts +412 -0
  39. package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +156 -0
  40. package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +494 -0
  41. package/cli/src/commands/__tests__/e2e.test.ts +187 -0
  42. package/cli/src/commands/__tests__/flakiness.test.ts +528 -0
  43. package/cli/src/commands/__tests__/generate.test.ts +507 -0
  44. package/cli/src/commands/__tests__/history.integration.test.ts +358 -0
  45. package/cli/src/commands/__tests__/history.test.ts +433 -0
  46. package/cli/src/commands/__tests__/monitor-realworld.test.ts +199 -0
  47. package/cli/src/commands/__tests__/monitor.test.ts +81 -0
  48. package/cli/src/commands/__tests__/ollama.test.ts +529 -0
  49. package/cli/src/commands/__tests__/repair.test.ts +225 -0
  50. package/cli/src/commands/__tests__/report.integration.test.ts +167 -0
  51. package/cli/src/commands/__tests__/report.test.ts +294 -0
  52. package/cli/src/commands/__tests__/report.vitest.ts +288 -0
  53. package/cli/src/commands/__tests__/retry.test.ts +78 -0
  54. package/cli/src/commands/__tests__/run.integration.test.ts +240 -0
  55. package/cli/src/commands/__tests__/run.test.ts +346 -0
  56. package/cli/src/commands/__tests__/run.vitest.ts +301 -0
  57. package/cli/src/commands/__tests__/secrets.test.ts +114 -0
  58. package/cli/src/commands/__tests__/serve.test.ts +80 -0
  59. package/cli/src/commands/__tests__/verify.test.ts +103 -0
  60. package/cli/src/commands/ai.ts +702 -0
  61. package/cli/src/commands/ask.ts +678 -0
  62. package/cli/src/commands/coverage.ts +305 -0
  63. package/cli/src/commands/crawl.ts +155 -0
  64. package/cli/src/commands/doctor.ts +610 -0
  65. package/cli/src/commands/examples.ts +248 -0
  66. package/cli/src/commands/explain.ts +710 -0
  67. package/cli/src/commands/flakiness.ts +560 -0
  68. package/cli/src/commands/generate.ts +566 -0
  69. package/cli/src/commands/history.ts +914 -0
  70. package/cli/src/commands/init.ts +777 -0
  71. package/cli/src/commands/monitor.ts +270 -0
  72. package/cli/src/commands/ollama.ts +337 -0
  73. package/cli/src/commands/pack.ts +497 -0
  74. package/cli/src/commands/regression.ts +400 -0
  75. package/cli/src/commands/repair.ts +356 -0
  76. package/cli/src/commands/report.ts +463 -0
  77. package/cli/src/commands/retry.ts +380 -0
  78. package/cli/src/commands/run.ts +218 -0
  79. package/cli/src/commands/scan.ts +177 -0
  80. package/cli/src/commands/secrets.ts +340 -0
  81. package/cli/src/commands/serve.ts +194 -0
  82. package/cli/src/commands/slo.ts +387 -0
  83. package/cli/src/commands/verify-temp-note.md +11 -0
  84. package/cli/src/commands/verify.ts +322 -0
  85. package/cli/src/generators/index.ts +6 -0
  86. package/cli/src/generators/json-reporter.ts +15 -0
  87. package/cli/src/generators/test-generator.ts +90 -0
  88. package/cli/src/index.ts +289 -0
  89. package/cli/src/scanners/dom-scanner.ts +360 -0
  90. package/cli/src/scanners/index.ts +5 -0
  91. package/cli/src/types/scan.ts +84 -0
  92. package/cli/src/utils/config.ts +145 -0
  93. package/cli/tsconfig.bundle.json +12 -0
  94. package/cli/tsconfig.json +23 -0
  95. package/cli/vitest.config.ts +59 -0
  96. package/core/LICENSE +24 -0
  97. package/core/README.md +64 -0
  98. package/core/package.json +81 -0
  99. package/core/src/__tests__/adapters-contract/adapters-contract.test.md +156 -0
  100. package/core/src/__tests__/index.test.ts +31 -0
  101. package/core/src/__tests__/integration/phase3.test.ts +405 -0
  102. package/core/src/__tests__/pack/validator.test.ts +312 -0
  103. package/core/src/__tests__/secrets/crypto.test.ts +190 -0
  104. package/core/src/__tests__/secrets/manager.test.ts +316 -0
  105. package/core/src/__tests__/security/redactor-phase3.test.ts +233 -0
  106. package/core/src/__tests__/serve/health-checker.test.ts +155 -0
  107. package/core/src/__tests__/serve/process-manager.test.ts +213 -0
  108. package/core/src/__tests__/serve/server.test.ts +103 -0
  109. package/core/src/__tests__/vault/cas.test.ts +178 -0
  110. package/core/src/__tests__/vault/vault.test.ts +296 -0
  111. package/core/src/adapters/__tests__/fixtures/jest-coverage.json +8 -0
  112. package/core/src/adapters/__tests__/fixtures/jest-results.json +41 -0
  113. package/core/src/adapters/__tests__/fixtures/pytest-junit.xml +16 -0
  114. package/core/src/adapters/__tests__/fixtures/vitest-coverage.json +8 -0
  115. package/core/src/adapters/__tests__/fixtures/vitest-results.json +50 -0
  116. package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +452 -0
  117. package/core/src/adapters/__tests__/jest-adapter.test.ts +276 -0
  118. package/core/src/adapters/__tests__/k6-perf.test.ts +538 -0
  119. package/core/src/adapters/__tests__/osv-deps.test.ts +471 -0
  120. package/core/src/adapters/__tests__/playwright-native-api.test.ts +792 -0
  121. package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +431 -0
  122. package/core/src/adapters/__tests__/playwright-ui.test.ts +1073 -0
  123. package/core/src/adapters/__tests__/pytest-adapter.test.ts +207 -0
  124. package/core/src/adapters/__tests__/semgrep-sast.test.ts +436 -0
  125. package/core/src/adapters/__tests__/vitest-adapter.test.ts +208 -0
  126. package/core/src/adapters/__tests__/zap-dast.test.ts +453 -0
  127. package/core/src/adapters/gitleaks-secrets.ts +521 -0
  128. package/core/src/adapters/jest-adapter.ts +306 -0
  129. package/core/src/adapters/k6-perf.ts +479 -0
  130. package/core/src/adapters/osv-deps.ts +467 -0
  131. package/core/src/adapters/playwright-native-adapter.ts +472 -0
  132. package/core/src/adapters/playwright-native-api.ts +619 -0
  133. package/core/src/adapters/playwright-ui.ts +1088 -0
  134. package/core/src/adapters/pytest-adapter.ts +472 -0
  135. package/core/src/adapters/semgrep-sast.ts +410 -0
  136. package/core/src/adapters/unit-test-types.ts +106 -0
  137. package/core/src/adapters/vitest-adapter.ts +295 -0
  138. package/core/src/adapters/zap-dast.ts +551 -0
  139. package/core/src/ai/__tests__/deepseek-provider.test.ts +586 -0
  140. package/core/src/ai/__tests__/ollama-provider.test.ts +641 -0
  141. package/core/src/ai/anthropic-provider.ts +262 -0
  142. package/core/src/ai/deepseek-provider.ts +315 -0
  143. package/core/src/ai/index.ts +87 -0
  144. package/core/src/ai/llm-client.ts +52 -0
  145. package/core/src/ai/mock-provider.ts +146 -0
  146. package/core/src/ai/ollama-provider.ts +269 -0
  147. package/core/src/ai/openai-provider.ts +240 -0
  148. package/core/src/ai/provider-factory.ts +408 -0
  149. package/core/src/artifacts/README.md +78 -0
  150. package/core/src/artifacts/index.ts +16 -0
  151. package/core/src/artifacts/ui-artifacts.ts +412 -0
  152. package/core/src/assertions/__tests__/engine.test.ts +360 -0
  153. package/core/src/assertions/engine.ts +577 -0
  154. package/core/src/assertions/index.ts +13 -0
  155. package/core/src/assertions/types.ts +229 -0
  156. package/core/src/auth/__tests__/api-key-provider.test.ts +282 -0
  157. package/core/src/auth/__tests__/auth-manager.test.ts +430 -0
  158. package/core/src/auth/__tests__/basic-auth-provider.test.ts +364 -0
  159. package/core/src/auth/__tests__/cloud-providers.test.ts +751 -0
  160. package/core/src/auth/__tests__/jwt-provider.test.ts +400 -0
  161. package/core/src/auth/__tests__/oauth2-provider.test.ts +383 -0
  162. package/core/src/auth/__tests__/totp-provider.test.ts +294 -0
  163. package/core/src/auth/__tests__/ui-login-provider.test.ts +323 -0
  164. package/core/src/auth/api-key-provider.ts +75 -0
  165. package/core/src/auth/aws-iam-provider.ts +212 -0
  166. package/core/src/auth/azure-ad-provider.ts +126 -0
  167. package/core/src/auth/basic-auth-provider.ts +133 -0
  168. package/core/src/auth/gcp-adc-provider.ts +146 -0
  169. package/core/src/auth/index.ts +342 -0
  170. package/core/src/auth/jwt-provider.ts +193 -0
  171. package/core/src/auth/manager.ts +281 -0
  172. package/core/src/auth/oauth2-provider.ts +141 -0
  173. package/core/src/auth/totp-provider.ts +163 -0
  174. package/core/src/auth/ui-login-provider.ts +242 -0
  175. package/core/src/cache/__tests__/lru-cache.test.ts +564 -0
  176. package/core/src/cache/index.ts +13 -0
  177. package/core/src/cache/lru-cache.ts +536 -0
  178. package/core/src/crawler/__tests__/journey-generator.test.ts +344 -0
  179. package/core/src/crawler/__tests__/selector-generator.test.ts +211 -0
  180. package/core/src/crawler/index.ts +335 -0
  181. package/core/src/crawler/journey-generator.ts +471 -0
  182. package/core/src/crawler/page-analyzer.ts +857 -0
  183. package/core/src/crawler/selector-generator.ts +280 -0
  184. package/core/src/crawler/types.ts +475 -0
  185. package/core/src/dashboard/__tests__/real-world.test.ts +430 -0
  186. package/core/src/dashboard/__tests__/server.test.ts +283 -0
  187. package/core/src/dashboard/__tests__/types.test.ts +208 -0
  188. package/core/src/dashboard/assets.ts +692 -0
  189. package/core/src/dashboard/index.ts +17 -0
  190. package/core/src/dashboard/server.ts +401 -0
  191. package/core/src/dashboard/types.ts +78 -0
  192. package/core/src/discoverer/__tests__/test-discoverer.test.ts +444 -0
  193. package/core/src/discoverer/index.ts +374 -0
  194. package/core/src/fixtures/__tests__/loader.test.ts +246 -0
  195. package/core/src/fixtures/__tests__/resolver.test.ts +334 -0
  196. package/core/src/fixtures/index.ts +9 -0
  197. package/core/src/fixtures/loader.ts +189 -0
  198. package/core/src/fixtures/resolver.ts +221 -0
  199. package/core/src/fixtures/types.ts +86 -0
  200. package/core/src/flakiness/__tests__/flakiness.test.ts +554 -0
  201. package/core/src/flakiness/index.ts +536 -0
  202. package/core/src/generation/__tests__/code-formatter.test.ts +170 -0
  203. package/core/src/generation/__tests__/code-generator-contract.test.ts +207 -0
  204. package/core/src/generation/__tests__/code-generator.test.ts +586 -0
  205. package/core/src/generation/__tests__/crawler-pack-generator.test.ts +479 -0
  206. package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +718 -0
  207. package/core/src/generation/__tests__/generation-integration.test.ts +655 -0
  208. package/core/src/generation/__tests__/pack-generator.test.ts +408 -0
  209. package/core/src/generation/__tests__/prompt-builder.test.ts +200 -0
  210. package/core/src/generation/__tests__/real-provider-integration.test.ts +414 -0
  211. package/core/src/generation/__tests__/source-analyzer.test.ts +774 -0
  212. package/core/src/generation/__tests__/test-optimizer.test.ts +255 -0
  213. package/core/src/generation/code-formatter.ts +408 -0
  214. package/core/src/generation/code-generator.ts +470 -0
  215. package/core/src/generation/crawler-pack-generator.ts +289 -0
  216. package/core/src/generation/generator.ts +113 -0
  217. package/core/src/generation/index.ts +59 -0
  218. package/core/src/generation/pack-generator.ts +527 -0
  219. package/core/src/generation/prompt-builder.ts +772 -0
  220. package/core/src/generation/source-analyzer.ts +830 -0
  221. package/core/src/generation/test-optimizer.ts +474 -0
  222. package/core/src/generation/types.ts +217 -0
  223. package/core/src/hooks/__tests__/compose.test.ts +636 -0
  224. package/core/src/hooks/__tests__/runner.test.ts +478 -0
  225. package/core/src/hooks/compose.ts +268 -0
  226. package/core/src/hooks/runner.ts +364 -0
  227. package/core/src/index.ts +255 -0
  228. package/core/src/pack/__tests__/migrator.test.ts +594 -0
  229. package/core/src/pack/__tests__/validator.test.ts +759 -0
  230. package/core/src/pack/migrator.ts +353 -0
  231. package/core/src/pack/validator.ts +359 -0
  232. package/core/src/pack-v2/__tests__/loader.test.ts +533 -0
  233. package/core/src/pack-v2/__tests__/migrator.test.ts +455 -0
  234. package/core/src/pack-v2/__tests__/validator.test.ts +609 -0
  235. package/core/src/pack-v2/index.ts +41 -0
  236. package/core/src/pack-v2/loader.ts +358 -0
  237. package/core/src/pack-v2/migrator.ts +540 -0
  238. package/core/src/pack-v2/validator.ts +726 -0
  239. package/core/src/parallel/README.md +143 -0
  240. package/core/src/parallel/index.ts +16 -0
  241. package/core/src/parallel/parallel-runner.ts +282 -0
  242. package/core/src/pom/__tests__/loader.test.ts +378 -0
  243. package/core/src/pom/base-page.ts +425 -0
  244. package/core/src/pom/index.ts +45 -0
  245. package/core/src/pom/loader.ts +480 -0
  246. package/core/src/pom/types.ts +146 -0
  247. package/core/src/proof/__tests__/proof-roundtrip.test.ts +149 -0
  248. package/core/src/proof/__tests__/schema-validation-manual.mjs +211 -0
  249. package/core/src/proof/__tests__/schema-validation.test.ts +336 -0
  250. package/core/src/proof/__tests__/signer.test.ts +486 -0
  251. package/core/src/proof/__tests__/temporal-regression.test.ts +537 -0
  252. package/core/src/proof/__tests__/verifier-advanced.test.ts +588 -0
  253. package/core/src/proof/__tests__/verifier.test.ts +413 -0
  254. package/core/src/proof/bundle.ts +290 -0
  255. package/core/src/proof/canonicalize.ts +116 -0
  256. package/core/src/proof/index.ts +74 -0
  257. package/core/src/proof/schema.ts +285 -0
  258. package/core/src/proof/signer.ts +293 -0
  259. package/core/src/proof/verifier.ts +380 -0
  260. package/core/src/regression/__tests__/detector.test.ts +396 -0
  261. package/core/src/regression/__tests__/trend-analyzer.test.ts +300 -0
  262. package/core/src/regression/detector.ts +629 -0
  263. package/core/src/regression/index.ts +34 -0
  264. package/core/src/regression/trend-analyzer.ts +468 -0
  265. package/core/src/regression/types.ts +295 -0
  266. package/core/src/regression/vault.ts +419 -0
  267. package/core/src/repair/__tests__/repairer.test.ts +572 -0
  268. package/core/src/repair/__tests__/types.test.ts +302 -0
  269. package/core/src/repair/engine/__tests__/fixer.test.ts +482 -0
  270. package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +395 -0
  271. package/core/src/repair/engine/fixer.ts +271 -0
  272. package/core/src/repair/engine/suggestion-engine.ts +234 -0
  273. package/core/src/repair/index.ts +53 -0
  274. package/core/src/repair/repairer.ts +376 -0
  275. package/core/src/repair/types.ts +119 -0
  276. package/core/src/repair/utils/__tests__/error-analyzer.test.ts +454 -0
  277. package/core/src/repair/utils/error-analyzer.ts +308 -0
  278. package/core/src/reporting/README.md +144 -0
  279. package/core/src/reporting/html-reporter.ts +835 -0
  280. package/core/src/reporting/index.ts +16 -0
  281. package/core/src/retry/README.md +192 -0
  282. package/core/src/retry/__tests__/flakiness-integration.test.ts +475 -0
  283. package/core/src/retry/__tests__/retry-engine.test.ts +424 -0
  284. package/core/src/retry/flakiness-integration.ts +267 -0
  285. package/core/src/retry/index.ts +48 -0
  286. package/core/src/retry/retry-engine.ts +368 -0
  287. package/core/src/retry/types.ts +208 -0
  288. package/core/src/retry/vault.ts +413 -0
  289. package/core/src/runner/__tests__/flakiness-integration.test.ts +566 -0
  290. package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +218 -0
  291. package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +199 -0
  292. package/core/src/runner/__tests__/phase3-runner.test.ts +1118 -0
  293. package/core/src/runner/e2e-helpers.ts +216 -0
  294. package/core/src/runner/phase3-runner.ts +1236 -0
  295. package/core/src/schemas/gherkin-report.json +122 -0
  296. package/core/src/secrets/__tests__/crypto.test.ts +180 -0
  297. package/core/src/secrets/crypto.ts +289 -0
  298. package/core/src/secrets/manager.ts +272 -0
  299. package/core/src/security/__tests__/hardening.test.ts +480 -0
  300. package/core/src/security/redaction-patterns-extended.ts +278 -0
  301. package/core/src/security/redactor.ts +326 -0
  302. package/core/src/self-healing/assertion-healer.ts +485 -0
  303. package/core/src/self-healing/engine.ts +626 -0
  304. package/core/src/self-healing/index.ts +33 -0
  305. package/core/src/self-healing/selector-healer.ts +488 -0
  306. package/core/src/self-healing/types.ts +193 -0
  307. package/core/src/serve/diagnostics-collector.ts +201 -0
  308. package/core/src/serve/health-checker.ts +274 -0
  309. package/core/src/serve/index.ts +9 -0
  310. package/core/src/serve/metrics-collector.ts +386 -0
  311. package/core/src/serve/process-manager.ts +265 -0
  312. package/core/src/serve/server.ts +230 -0
  313. package/core/src/slo/config.ts +408 -0
  314. package/core/src/slo/index.ts +68 -0
  315. package/core/src/slo/sli-calculator.ts +474 -0
  316. package/core/src/slo/slo-tracker.ts +481 -0
  317. package/core/src/slo/types.ts +408 -0
  318. package/core/src/slo/vault.ts +600 -0
  319. package/core/src/tui/__tests__/monitor.test.ts +336 -0
  320. package/core/src/tui/__tests__/real-world.test.ts +376 -0
  321. package/core/src/tui/__tests__/renderer.test.ts +201 -0
  322. package/core/src/tui/__tests__/types.test.ts +295 -0
  323. package/core/src/tui/index.ts +19 -0
  324. package/core/src/tui/monitor.ts +331 -0
  325. package/core/src/tui/renderer.ts +269 -0
  326. package/core/src/tui/types.ts +68 -0
  327. package/core/src/types/pack-v1.ts +305 -0
  328. package/core/src/types/pack-v2.ts +501 -0
  329. package/core/src/types/trust-score.ts +258 -0
  330. package/core/src/vault/__tests__/flakiness-vault.test.ts +562 -0
  331. package/core/src/vault/__tests__/vault.test.ts +259 -0
  332. package/core/src/vault/cas.ts +323 -0
  333. package/core/src/vault/index.ts +1361 -0
  334. package/core/src/vault/schema.sql +168 -0
  335. package/core/src/visual/README.md +185 -0
  336. package/core/src/visual/index.ts +14 -0
  337. package/core/src/visual/visual-regression.ts +347 -0
  338. package/core/src/watch/__tests__/watch-mode.test.ts +192 -0
  339. package/core/src/watch/index.ts +14 -0
  340. package/core/src/watch/watch-mode.ts +565 -0
  341. package/core/tsconfig.json +12 -0
  342. package/core/vitest.config.ts +52 -0
  343. package/docs/ARCHITECTURE.md +901 -0
  344. package/docs/AUDIT-GLOBAL-DEC2025.md +271 -0
  345. package/docs/BETA_TESTING.md +257 -0
  346. package/docs/BETA_TESTING_PLAN.md +727 -0
  347. package/docs/CERTIFICATION-REPORT.md +142 -0
  348. package/docs/COMPLETE_AUDIT_REFACTORING.md +965 -0
  349. package/docs/DEVELOPMENT.md +545 -0
  350. package/docs/DEVELOPMENT_HISTORY.md +345 -0
  351. package/docs/LIMITATIONS.md +176 -0
  352. package/docs/MIGRATION.md +303 -0
  353. package/docs/OPTION_3_4_EXPLORATION.md +1257 -0
  354. package/docs/PHASE1_PERFORMANCE.md +144 -0
  355. package/docs/QA360_Cloud.postman_collection.json +89 -0
  356. package/docs/QA360_TESTING_PHILOSOPHY.md +769 -0
  357. package/docs/QA_TEST_PLAN.md +727 -0
  358. package/docs/README.md +50 -0
  359. package/docs/STATUS.md +198 -0
  360. package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +615 -0
  361. package/docs/USER_GUIDE.md +687 -0
  362. package/docs/WORK-DONE-ADAPTER-TESTS.md +136 -0
  363. package/docs/adapters-security.md +485 -0
  364. package/docs/architecture-diagram.mmd +168 -0
  365. package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +396 -0
  366. package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +324 -0
  367. package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +644 -0
  368. package/docs/archive/ARCH-01_NEXT_STEPS.md +60 -0
  369. package/docs/archive/BRANCH_PROTECTION.md +183 -0
  370. package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +222 -0
  371. package/docs/archive/HANDOFF_TEST-01.md +669 -0
  372. package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +372 -0
  373. package/docs/archive/NODE_UPGRADE_GUIDE.md +188 -0
  374. package/docs/archive/PHASE1_COMPLETION.md +386 -0
  375. package/docs/archive/PHASE2_COMPLETION.md +404 -0
  376. package/docs/archive/PHASE3_AND_4_FINAL.md +360 -0
  377. package/docs/archive/PHASE3_COMPLETE.md +301 -0
  378. package/docs/archive/PHASE3_STATUS.md +255 -0
  379. package/docs/archive/PRE-WEEK2-AUDIT.md +364 -0
  380. package/docs/archive/README.md +16 -0
  381. package/docs/archive/SCHEMA_AJV_2020_FIX.md +245 -0
  382. package/docs/archive/TEST-01_AUDIT_REPORT.md +240 -0
  383. package/docs/archive/TEST-01_COVERAGE_PLAN.md +423 -0
  384. package/docs/archive/obsolete-proposals/dom-element-discovery-mode.md +250 -0
  385. package/docs/archive/obsolete-proposals/qa360-comprehensive-test-plan.md +1249 -0
  386. package/docs/archive/obsolete-proposals/qa360-quick-start-guide.md +298 -0
  387. package/docs/archive/obsolete-proposals/technical-plan-dom-discovery.md +870 -0
  388. package/docs/budgets-advanced.md +308 -0
  389. package/docs/examples/history-export-gc.md +285 -0
  390. package/docs/examples/pack-v2-complete.yaml +158 -0
  391. package/docs/examples/pack-v2-quickstart.yaml +24 -0
  392. package/docs/examples/pack-v2-ui-login.yaml +81 -0
  393. package/docs/examples/qa360-report.json +50 -0
  394. package/docs/history.md +565 -0
  395. package/docs/hooks.md +304 -0
  396. package/docs/llm-providers.md +512 -0
  397. package/docs/mcp-server.md +651 -0
  398. package/docs/mcp-tools.md +1131 -0
  399. package/docs/pack-v1.md +383 -0
  400. package/docs/pack-v2.md +558 -0
  401. package/docs/page-objects.md +366 -0
  402. package/docs/proofs.md +670 -0
  403. package/docs/quickstart-5min.md +257 -0
  404. package/docs/readiness-ci.md +654 -0
  405. package/docs/rfc/README.md +20 -0
  406. package/docs/rfc/proof-bundle-v1.md +787 -0
  407. package/docs/secrets.md +392 -0
  408. package/docs/serve.md +494 -0
  409. package/docs/unit-test-adapters.md +168 -0
  410. package/docs/vault.md +491 -0
  411. package/e2e/qa360-e2e.test.ts +696 -0
  412. package/e2e/vitest.config.ts +18 -0
  413. package/examples/README.md +30 -140
  414. package/examples/ci/docker-compose-serve.yml +375 -0
  415. package/examples/ci/github-actions-serve.yml +345 -0
  416. package/examples/ci/gitlab-ci-serve.yml +407 -0
  417. package/examples/datasets/README.md +101 -0
  418. package/examples/datasets/b2bshop.ts +155 -0
  419. package/examples/datasets/index.ts +57 -0
  420. package/examples/datasets/reqres.ts +195 -0
  421. package/examples/fixtures-demo/fixtures/users.yml +39 -0
  422. package/examples/fixtures-demo/pack.yml +71 -0
  423. package/examples/future-api/README.md +16 -0
  424. package/examples/future-api/diag.js +7 -0
  425. package/examples/future-api/health.js +4 -0
  426. package/examples/future-api/packs.js +13 -0
  427. package/examples/future-api/runpack.js +10 -0
  428. package/examples/generation/README.md +148 -0
  429. package/examples/generation/pack-generator-example.js +115 -0
  430. package/examples/generation/source-analyzer-example.js +115 -0
  431. package/examples/httpbin/pack.yml +59 -0
  432. package/examples/load-testing/mcp-load.yml +115 -0
  433. package/examples/load-testing/mcp-stdio.yml +95 -0
  434. package/examples/mcp/claude-desktop-config.json +33 -0
  435. package/examples/mcp/claude-desktop.json +16 -0
  436. package/examples/mcp/conversation-sample.md +131 -0
  437. package/examples/mcp/demo-60s.md +330 -0
  438. package/examples/mcp/sample-conversation.jsonl +21 -0
  439. package/examples/mcp/vscode-settings.json +22 -0
  440. package/examples/pack-v2-complete.yml +242 -0
  441. package/examples/pack-v2-examples.md +244 -0
  442. package/examples/pack-v2-quickstart.yml +55 -0
  443. package/examples/packs-business/ecommerce-api.yml +121 -0
  444. package/examples/packs-business/saas-dashboard-ui.yml +133 -0
  445. package/examples/packs-conformance/compose-multi.yml +174 -0
  446. package/examples/packs-conformance/full.yml +152 -0
  447. package/examples/packs-conformance/heavy-artifacts.yml +152 -0
  448. package/examples/packs-conformance/minimal.yml +71 -0
  449. package/examples/packs-conformance/secrets-missing.yml +97 -0
  450. package/examples/packs-conformance/timeouts.yml +77 -0
  451. package/examples/pom-demo/README.md +104 -0
  452. package/examples/pom-demo/pack.yml +60 -0
  453. package/examples/pom-demo/pages/DashboardPage.page.ts +73 -0
  454. package/examples/pom-demo/pages/LoginPage.page.ts +76 -0
  455. package/examples/proofs/e2e-playwright-proof.json +75 -0
  456. package/examples/proofs/httpbin-proof.json +69 -0
  457. package/examples/proofs/multi-adapter-proof.json +117 -0
  458. package/examples/proofs/test-proof.json +26 -0
  459. package/examples/restful-api-dev/README.md +102 -0
  460. package/examples/restful-api-dev/restful-api-advanced.yml +29 -0
  461. package/examples/restful-api-dev/restful-api-basic.yml +29 -0
  462. package/examples/web-lite/.github/workflows/qa360-phase3.yml +73 -0
  463. package/examples/web-lite/api-mock/server.js +258 -0
  464. package/examples/web-lite/pack.yml +71 -0
  465. package/examples/web-lite/services.yml +43 -0
  466. package/examples/web-lite/web-content/healthz +1 -0
  467. package/examples/web-lite/web-content/index.html +259 -0
  468. package/package.json +55 -45
  469. package/packages/mcp/CHANGELOG.md +109 -0
  470. package/packages/mcp/IMPLEMENTATION_SUMMARY.md +350 -0
  471. package/packages/mcp/LICENSE +21 -0
  472. package/packages/mcp/QUICK_START.md +291 -0
  473. package/packages/mcp/README.md +294 -0
  474. package/packages/mcp/TELEMETRY.md +220 -0
  475. package/packages/mcp/package.json +91 -0
  476. package/packages/mcp/scripts/generate-sbom-fallback.cjs +84 -0
  477. package/packages/mcp/scripts/safe-postinstall.cjs +32 -0
  478. package/packages/mcp/src/__tests__/contract.test.ts +902 -0
  479. package/packages/mcp/src/cli/cli.ts +137 -0
  480. package/packages/mcp/src/cli/doctor.ts +286 -0
  481. package/packages/mcp/src/cli/fix.ts +99 -0
  482. package/packages/mcp/src/cli/init.ts +233 -0
  483. package/packages/mcp/src/cli/postinstall.ts +14 -0
  484. package/packages/mcp/src/cli/reset.ts +44 -0
  485. package/packages/mcp/src/cli/telemetry.ts +166 -0
  486. package/packages/mcp/src/cli/test-dx.ts +94 -0
  487. package/packages/mcp/src/cli/uninstall.ts +80 -0
  488. package/packages/mcp/src/cli/up.ts +178 -0
  489. package/packages/mcp/src/index.ts +12 -0
  490. package/packages/mcp/src/scripts/e2e-local.ts +337 -0
  491. package/packages/mcp/src/scripts/verify-settings.ts +242 -0
  492. package/packages/mcp/src/security/audit.ts +244 -0
  493. package/packages/mcp/src/security/manager.ts +242 -0
  494. package/packages/mcp/src/server/full-server.ts +212 -0
  495. package/packages/mcp/src/server/minimal-server.ts +134 -0
  496. package/packages/mcp/src/tools/history.ts +388 -0
  497. package/packages/mcp/src/tools/pack.ts +449 -0
  498. package/packages/mcp/src/tools/registry.ts +638 -0
  499. package/packages/mcp/src/tools/report.ts +100 -0
  500. package/packages/mcp/src/tools/run.ts +268 -0
  501. package/packages/mcp/src/tools/secrets.ts +198 -0
  502. package/packages/mcp/src/tools/serve.ts +221 -0
  503. package/packages/mcp/src/tools/triage.ts +532 -0
  504. package/packages/mcp/src/tools/types.ts +26 -0
  505. package/packages/mcp/src/tools/vault.ts +164 -0
  506. package/packages/mcp/src/tools/verify.ts +166 -0
  507. package/packages/mcp/src/types/index.ts +311 -0
  508. package/packages/mcp/src/types/mcp-stubs.ts +83 -0
  509. package/packages/mcp/tsconfig.json +16 -0
  510. package/playwright.config.ts +20 -0
  511. package/pnpm-workspace.yaml +4 -0
  512. package/run-test-and-push.sh +20 -0
  513. package/scripts/build-proof-cli.sh +110 -0
  514. package/scripts/ci/check-windows-paths.js +92 -0
  515. package/scripts/ci/invariants.sh +124 -0
  516. package/scripts/ci/make-final-bundle.js +106 -0
  517. package/scripts/ci/mcp-run-multipack.js +305 -0
  518. package/scripts/ci/run-pack-suite.sh +103 -0
  519. package/scripts/ci/run-phase7-final.sh +190 -0
  520. package/scripts/ci/slo-assert.js +158 -0
  521. package/scripts/ci/test-fault-tolerance.sh +301 -0
  522. package/scripts/install-mcp.sh +66 -0
  523. package/scripts/mcp-smoke.mjs +27 -0
  524. package/scripts/smoke.sh +26 -0
  525. package/scripts/stress-test.js +288 -0
  526. package/scripts/sync-version.mjs +50 -0
  527. package/scripts/validate-examples.mjs +404 -0
  528. package/scripts/validation/simple-pack-check.sh +51 -0
  529. package/scripts/validation/validate-universal-pack.mjs +77 -0
  530. package/scripts/verify-persistence.js +127 -0
  531. package/test-pack.yaml +43 -0
  532. package/test-results/.last-run.json +4 -0
  533. package/test-runner.mjs +87 -0
  534. package/tests/artifacts.spec.js +147 -0
  535. package/tests/contracts.spec.js +239 -0
  536. package/tests/e2e/assertions.test.mjs +370 -0
  537. package/tests/e2e/crawler.test.mjs +451 -0
  538. package/tests/e2e/playwright-plus-plus.test.mjs +604 -0
  539. package/tests/e2e/proof-bundle.test.mjs +258 -0
  540. package/tests/e2e/real-world/saucedemo.test.mjs +714 -0
  541. package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +760 -0
  542. package/tests/e2e/ui-actions.test.mjs +546 -0
  543. package/tests/gherkin.e2e.spec.ts +310 -0
  544. package/tests/no-console-errors.spec.js +136 -0
  545. package/tests/pdf.spec.ts +252 -0
  546. package/tests/run-pack.spec.ts +58 -0
  547. package/tsconfig.base.json +15 -0
  548. package/tsconfig.build.json +8 -0
  549. package/tsconfig.json +37 -0
  550. package/tsconfig.test.json +18 -0
  551. package/typedoc.json +37 -0
  552. package/ui/README.md +50 -0
  553. package/verify-proof.mjs +60 -0
  554. package/dist/cli-minimal.d.ts +0 -6
  555. package/dist/cli-minimal.js +0 -36
  556. package/dist/commands/ai.d.ts +0 -43
  557. package/dist/commands/ai.js +0 -616
  558. package/dist/commands/ask.d.ts +0 -94
  559. package/dist/commands/ask.js +0 -582
  560. package/dist/commands/coverage.d.ts +0 -8
  561. package/dist/commands/coverage.js +0 -252
  562. package/dist/commands/crawl.d.ts +0 -24
  563. package/dist/commands/crawl.js +0 -121
  564. package/dist/commands/doctor.d.ts +0 -54
  565. package/dist/commands/doctor.js +0 -513
  566. package/dist/commands/examples.d.ts +0 -33
  567. package/dist/commands/examples.js +0 -193
  568. package/dist/commands/explain.d.ts +0 -27
  569. package/dist/commands/explain.js +0 -630
  570. package/dist/commands/flakiness.d.ts +0 -73
  571. package/dist/commands/flakiness.js +0 -435
  572. package/dist/commands/generate.d.ts +0 -66
  573. package/dist/commands/generate.js +0 -438
  574. package/dist/commands/history.d.ts +0 -76
  575. package/dist/commands/history.js +0 -755
  576. package/dist/commands/init.d.ts +0 -106
  577. package/dist/commands/init.js +0 -616
  578. package/dist/commands/monitor.d.ts +0 -27
  579. package/dist/commands/monitor.js +0 -225
  580. package/dist/commands/ollama.d.ts +0 -40
  581. package/dist/commands/ollama.js +0 -301
  582. package/dist/commands/pack.d.ts +0 -70
  583. package/dist/commands/pack.js +0 -413
  584. package/dist/commands/regression.d.ts +0 -8
  585. package/dist/commands/regression.js +0 -340
  586. package/dist/commands/repair.d.ts +0 -26
  587. package/dist/commands/repair.js +0 -307
  588. package/dist/commands/report.d.ts +0 -62
  589. package/dist/commands/report.js +0 -378
  590. package/dist/commands/retry.d.ts +0 -43
  591. package/dist/commands/retry.js +0 -275
  592. package/dist/commands/run.d.ts +0 -41
  593. package/dist/commands/run.js +0 -169
  594. package/dist/commands/scan.d.ts +0 -5
  595. package/dist/commands/scan.js +0 -155
  596. package/dist/commands/secrets.d.ts +0 -58
  597. package/dist/commands/secrets.js +0 -289
  598. package/dist/commands/serve.d.ts +0 -13
  599. package/dist/commands/serve.js +0 -156
  600. package/dist/commands/slo.d.ts +0 -8
  601. package/dist/commands/slo.js +0 -327
  602. package/dist/commands/verify.d.ts +0 -32
  603. package/dist/commands/verify.js +0 -278
  604. package/dist/core/adapters/gitleaks-secrets.d.ts +0 -114
  605. package/dist/core/adapters/gitleaks-secrets.js +0 -410
  606. package/dist/core/adapters/k6-perf.d.ts +0 -85
  607. package/dist/core/adapters/k6-perf.js +0 -398
  608. package/dist/core/adapters/osv-deps.d.ts +0 -123
  609. package/dist/core/adapters/osv-deps.js +0 -372
  610. package/dist/core/adapters/playwright-native-adapter.d.ts +0 -121
  611. package/dist/core/adapters/playwright-native-adapter.js +0 -339
  612. package/dist/core/adapters/playwright-native-api.d.ts +0 -183
  613. package/dist/core/adapters/playwright-native-api.js +0 -465
  614. package/dist/core/adapters/playwright-ui.d.ts +0 -197
  615. package/dist/core/adapters/playwright-ui.js +0 -840
  616. package/dist/core/adapters/semgrep-sast.d.ts +0 -99
  617. package/dist/core/adapters/semgrep-sast.js +0 -322
  618. package/dist/core/adapters/zap-dast.d.ts +0 -133
  619. package/dist/core/adapters/zap-dast.js +0 -424
  620. package/dist/core/ai/anthropic-provider.d.ts +0 -50
  621. package/dist/core/ai/anthropic-provider.js +0 -223
  622. package/dist/core/ai/deepseek-provider.d.ts +0 -81
  623. package/dist/core/ai/deepseek-provider.js +0 -266
  624. package/dist/core/ai/index.d.ts +0 -60
  625. package/dist/core/ai/index.js +0 -18
  626. package/dist/core/ai/llm-client.d.ts +0 -45
  627. package/dist/core/ai/llm-client.js +0 -7
  628. package/dist/core/ai/mock-provider.d.ts +0 -49
  629. package/dist/core/ai/mock-provider.js +0 -121
  630. package/dist/core/ai/ollama-provider.d.ts +0 -78
  631. package/dist/core/ai/ollama-provider.js +0 -204
  632. package/dist/core/ai/openai-provider.d.ts +0 -48
  633. package/dist/core/ai/openai-provider.js +0 -200
  634. package/dist/core/ai/provider-factory.d.ts +0 -160
  635. package/dist/core/ai/provider-factory.js +0 -269
  636. package/dist/core/artifacts/index.d.ts +0 -6
  637. package/dist/core/artifacts/index.js +0 -6
  638. package/dist/core/artifacts/ui-artifacts.d.ts +0 -133
  639. package/dist/core/artifacts/ui-artifacts.js +0 -304
  640. package/dist/core/assertions/engine.d.ts +0 -51
  641. package/dist/core/assertions/engine.js +0 -530
  642. package/dist/core/assertions/index.d.ts +0 -11
  643. package/dist/core/assertions/index.js +0 -11
  644. package/dist/core/assertions/types.d.ts +0 -121
  645. package/dist/core/assertions/types.js +0 -37
  646. package/dist/core/auth/api-key-provider.d.ts +0 -16
  647. package/dist/core/auth/api-key-provider.js +0 -63
  648. package/dist/core/auth/aws-iam-provider.d.ts +0 -35
  649. package/dist/core/auth/aws-iam-provider.js +0 -177
  650. package/dist/core/auth/azure-ad-provider.d.ts +0 -15
  651. package/dist/core/auth/azure-ad-provider.js +0 -99
  652. package/dist/core/auth/basic-auth-provider.d.ts +0 -26
  653. package/dist/core/auth/basic-auth-provider.js +0 -111
  654. package/dist/core/auth/gcp-adc-provider.d.ts +0 -27
  655. package/dist/core/auth/gcp-adc-provider.js +0 -126
  656. package/dist/core/auth/index.d.ts +0 -238
  657. package/dist/core/auth/index.js +0 -82
  658. package/dist/core/auth/jwt-provider.d.ts +0 -19
  659. package/dist/core/auth/jwt-provider.js +0 -160
  660. package/dist/core/auth/manager.d.ts +0 -84
  661. package/dist/core/auth/manager.js +0 -230
  662. package/dist/core/auth/oauth2-provider.d.ts +0 -17
  663. package/dist/core/auth/oauth2-provider.js +0 -114
  664. package/dist/core/auth/totp-provider.d.ts +0 -31
  665. package/dist/core/auth/totp-provider.js +0 -134
  666. package/dist/core/auth/ui-login-provider.d.ts +0 -26
  667. package/dist/core/auth/ui-login-provider.js +0 -198
  668. package/dist/core/cache/index.d.ts +0 -7
  669. package/dist/core/cache/index.js +0 -6
  670. package/dist/core/cache/lru-cache.d.ts +0 -203
  671. package/dist/core/cache/lru-cache.js +0 -397
  672. package/dist/core/core/coverage/analyzer.d.ts +0 -101
  673. package/dist/core/core/coverage/analyzer.js +0 -415
  674. package/dist/core/core/coverage/collector.d.ts +0 -74
  675. package/dist/core/core/coverage/collector.js +0 -459
  676. package/dist/core/core/coverage/config.d.ts +0 -37
  677. package/dist/core/core/coverage/config.js +0 -156
  678. package/dist/core/core/coverage/index.d.ts +0 -11
  679. package/dist/core/core/coverage/index.js +0 -15
  680. package/dist/core/core/coverage/types.d.ts +0 -267
  681. package/dist/core/core/coverage/types.js +0 -6
  682. package/dist/core/core/coverage/vault.d.ts +0 -95
  683. package/dist/core/core/coverage/vault.js +0 -405
  684. package/dist/core/coverage/analyzer.d.ts +0 -101
  685. package/dist/core/coverage/analyzer.js +0 -415
  686. package/dist/core/coverage/collector.d.ts +0 -74
  687. package/dist/core/coverage/collector.js +0 -459
  688. package/dist/core/coverage/config.d.ts +0 -37
  689. package/dist/core/coverage/config.js +0 -156
  690. package/dist/core/coverage/index.d.ts +0 -11
  691. package/dist/core/coverage/index.js +0 -15
  692. package/dist/core/coverage/types.d.ts +0 -267
  693. package/dist/core/coverage/types.js +0 -6
  694. package/dist/core/coverage/vault.d.ts +0 -95
  695. package/dist/core/coverage/vault.js +0 -405
  696. package/dist/core/crawler/index.d.ts +0 -57
  697. package/dist/core/crawler/index.js +0 -281
  698. package/dist/core/crawler/journey-generator.d.ts +0 -49
  699. package/dist/core/crawler/journey-generator.js +0 -412
  700. package/dist/core/crawler/page-analyzer.d.ts +0 -88
  701. package/dist/core/crawler/page-analyzer.js +0 -709
  702. package/dist/core/crawler/selector-generator.d.ts +0 -34
  703. package/dist/core/crawler/selector-generator.js +0 -240
  704. package/dist/core/crawler/types.d.ts +0 -353
  705. package/dist/core/crawler/types.js +0 -6
  706. package/dist/core/dashboard/assets.d.ts +0 -6
  707. package/dist/core/dashboard/assets.js +0 -690
  708. package/dist/core/dashboard/index.d.ts +0 -6
  709. package/dist/core/dashboard/index.js +0 -5
  710. package/dist/core/dashboard/server.d.ts +0 -72
  711. package/dist/core/dashboard/server.js +0 -354
  712. package/dist/core/dashboard/types.d.ts +0 -70
  713. package/dist/core/dashboard/types.js +0 -5
  714. package/dist/core/discoverer/index.d.ts +0 -115
  715. package/dist/core/discoverer/index.js +0 -250
  716. package/dist/core/flakiness/index.d.ts +0 -228
  717. package/dist/core/flakiness/index.js +0 -384
  718. package/dist/core/generation/code-formatter.d.ts +0 -111
  719. package/dist/core/generation/code-formatter.js +0 -307
  720. package/dist/core/generation/code-generator.d.ts +0 -144
  721. package/dist/core/generation/code-generator.js +0 -293
  722. package/dist/core/generation/crawler-pack-generator.d.ts +0 -44
  723. package/dist/core/generation/crawler-pack-generator.js +0 -231
  724. package/dist/core/generation/generator.d.ts +0 -40
  725. package/dist/core/generation/generator.js +0 -76
  726. package/dist/core/generation/index.d.ts +0 -32
  727. package/dist/core/generation/index.js +0 -30
  728. package/dist/core/generation/pack-generator.d.ts +0 -107
  729. package/dist/core/generation/pack-generator.js +0 -416
  730. package/dist/core/generation/prompt-builder.d.ts +0 -132
  731. package/dist/core/generation/prompt-builder.js +0 -672
  732. package/dist/core/generation/source-analyzer.d.ts +0 -213
  733. package/dist/core/generation/source-analyzer.js +0 -657
  734. package/dist/core/generation/test-optimizer.d.ts +0 -117
  735. package/dist/core/generation/test-optimizer.js +0 -328
  736. package/dist/core/generation/types.d.ts +0 -214
  737. package/dist/core/generation/types.js +0 -4
  738. package/dist/core/hooks/compose.d.ts +0 -61
  739. package/dist/core/hooks/compose.js +0 -225
  740. package/dist/core/hooks/runner.d.ts +0 -68
  741. package/dist/core/hooks/runner.js +0 -303
  742. package/dist/core/index.d.ts +0 -104
  743. package/dist/core/index.js +0 -91
  744. package/dist/core/pack/migrator.d.ts +0 -51
  745. package/dist/core/pack/migrator.js +0 -304
  746. package/dist/core/pack/validator.d.ts +0 -42
  747. package/dist/core/pack/validator.js +0 -322
  748. package/dist/core/pack-v2/index.d.ts +0 -9
  749. package/dist/core/pack-v2/index.js +0 -8
  750. package/dist/core/pack-v2/loader.d.ts +0 -63
  751. package/dist/core/pack-v2/loader.js +0 -292
  752. package/dist/core/pack-v2/migrator.d.ts +0 -61
  753. package/dist/core/pack-v2/migrator.js +0 -480
  754. package/dist/core/pack-v2/validator.d.ts +0 -61
  755. package/dist/core/pack-v2/validator.js +0 -577
  756. package/dist/core/parallel/index.d.ts +0 -6
  757. package/dist/core/parallel/index.js +0 -6
  758. package/dist/core/parallel/parallel-runner.d.ts +0 -107
  759. package/dist/core/parallel/parallel-runner.js +0 -192
  760. package/dist/core/proof/bundle.d.ts +0 -137
  761. package/dist/core/proof/bundle.js +0 -160
  762. package/dist/core/proof/canonicalize.d.ts +0 -47
  763. package/dist/core/proof/canonicalize.js +0 -105
  764. package/dist/core/proof/index.d.ts +0 -13
  765. package/dist/core/proof/index.js +0 -18
  766. package/dist/core/proof/schema.d.ts +0 -217
  767. package/dist/core/proof/schema.js +0 -263
  768. package/dist/core/proof/signer.d.ts +0 -111
  769. package/dist/core/proof/signer.js +0 -226
  770. package/dist/core/proof/verifier.d.ts +0 -97
  771. package/dist/core/proof/verifier.js +0 -308
  772. package/dist/core/regression/detector.d.ts +0 -107
  773. package/dist/core/regression/detector.js +0 -497
  774. package/dist/core/regression/index.d.ts +0 -9
  775. package/dist/core/regression/index.js +0 -11
  776. package/dist/core/regression/trend-analyzer.d.ts +0 -102
  777. package/dist/core/regression/trend-analyzer.js +0 -345
  778. package/dist/core/regression/types.d.ts +0 -222
  779. package/dist/core/regression/types.js +0 -7
  780. package/dist/core/regression/vault.d.ts +0 -87
  781. package/dist/core/regression/vault.js +0 -289
  782. package/dist/core/repair/engine/fixer.d.ts +0 -24
  783. package/dist/core/repair/engine/fixer.js +0 -226
  784. package/dist/core/repair/engine/suggestion-engine.d.ts +0 -18
  785. package/dist/core/repair/engine/suggestion-engine.js +0 -187
  786. package/dist/core/repair/index.d.ts +0 -10
  787. package/dist/core/repair/index.js +0 -13
  788. package/dist/core/repair/repairer.d.ts +0 -90
  789. package/dist/core/repair/repairer.js +0 -284
  790. package/dist/core/repair/types.d.ts +0 -91
  791. package/dist/core/repair/types.js +0 -6
  792. package/dist/core/repair/utils/error-analyzer.d.ts +0 -28
  793. package/dist/core/repair/utils/error-analyzer.js +0 -264
  794. package/dist/core/reporting/html-reporter.d.ts +0 -119
  795. package/dist/core/reporting/html-reporter.js +0 -737
  796. package/dist/core/reporting/index.d.ts +0 -6
  797. package/dist/core/reporting/index.js +0 -6
  798. package/dist/core/retry/flakiness-integration.d.ts +0 -60
  799. package/dist/core/retry/flakiness-integration.js +0 -228
  800. package/dist/core/retry/index.d.ts +0 -14
  801. package/dist/core/retry/index.js +0 -16
  802. package/dist/core/retry/retry-engine.d.ts +0 -80
  803. package/dist/core/retry/retry-engine.js +0 -296
  804. package/dist/core/retry/types.d.ts +0 -178
  805. package/dist/core/retry/types.js +0 -52
  806. package/dist/core/retry/vault.d.ts +0 -77
  807. package/dist/core/retry/vault.js +0 -304
  808. package/dist/core/runner/e2e-helpers.d.ts +0 -102
  809. package/dist/core/runner/e2e-helpers.js +0 -153
  810. package/dist/core/runner/phase3-runner.d.ts +0 -200
  811. package/dist/core/runner/phase3-runner.js +0 -1041
  812. package/dist/core/secrets/crypto.d.ts +0 -75
  813. package/dist/core/secrets/crypto.js +0 -223
  814. package/dist/core/secrets/manager.d.ts +0 -76
  815. package/dist/core/secrets/manager.js +0 -219
  816. package/dist/core/security/redaction-patterns-extended.d.ts +0 -27
  817. package/dist/core/security/redaction-patterns-extended.js +0 -247
  818. package/dist/core/security/redactor.d.ts +0 -71
  819. package/dist/core/security/redactor.js +0 -279
  820. package/dist/core/self-healing/assertion-healer.d.ts +0 -97
  821. package/dist/core/self-healing/assertion-healer.js +0 -371
  822. package/dist/core/self-healing/engine.d.ts +0 -122
  823. package/dist/core/self-healing/engine.js +0 -538
  824. package/dist/core/self-healing/index.d.ts +0 -10
  825. package/dist/core/self-healing/index.js +0 -11
  826. package/dist/core/self-healing/selector-healer.d.ts +0 -103
  827. package/dist/core/self-healing/selector-healer.js +0 -372
  828. package/dist/core/self-healing/types.d.ts +0 -152
  829. package/dist/core/self-healing/types.js +0 -6
  830. package/dist/core/serve/diagnostics-collector.d.ts +0 -32
  831. package/dist/core/serve/diagnostics-collector.js +0 -149
  832. package/dist/core/serve/health-checker.d.ts +0 -44
  833. package/dist/core/serve/health-checker.js +0 -219
  834. package/dist/core/serve/index.d.ts +0 -8
  835. package/dist/core/serve/index.js +0 -8
  836. package/dist/core/serve/metrics-collector.d.ts +0 -24
  837. package/dist/core/serve/metrics-collector.js +0 -322
  838. package/dist/core/serve/process-manager.d.ts +0 -36
  839. package/dist/core/serve/process-manager.js +0 -213
  840. package/dist/core/serve/server.d.ts +0 -36
  841. package/dist/core/serve/server.js +0 -191
  842. package/dist/core/slo/config.d.ts +0 -107
  843. package/dist/core/slo/config.js +0 -360
  844. package/dist/core/slo/index.d.ts +0 -11
  845. package/dist/core/slo/index.js +0 -15
  846. package/dist/core/slo/sli-calculator.d.ts +0 -92
  847. package/dist/core/slo/sli-calculator.js +0 -364
  848. package/dist/core/slo/slo-tracker.d.ts +0 -148
  849. package/dist/core/slo/slo-tracker.js +0 -379
  850. package/dist/core/slo/types.d.ts +0 -281
  851. package/dist/core/slo/types.js +0 -7
  852. package/dist/core/slo/vault.d.ts +0 -102
  853. package/dist/core/slo/vault.js +0 -427
  854. package/dist/core/tui/index.d.ts +0 -7
  855. package/dist/core/tui/index.js +0 -6
  856. package/dist/core/tui/monitor.d.ts +0 -92
  857. package/dist/core/tui/monitor.js +0 -271
  858. package/dist/core/tui/renderer.d.ts +0 -33
  859. package/dist/core/tui/renderer.js +0 -218
  860. package/dist/core/tui/types.d.ts +0 -63
  861. package/dist/core/tui/types.js +0 -5
  862. package/dist/core/types/pack-v1.d.ts +0 -251
  863. package/dist/core/types/pack-v1.js +0 -5
  864. package/dist/core/types/pack-v2.d.ts +0 -425
  865. package/dist/core/types/pack-v2.js +0 -8
  866. package/dist/core/types/trust-score.d.ts +0 -69
  867. package/dist/core/types/trust-score.js +0 -191
  868. package/dist/core/vault/cas.d.ts +0 -90
  869. package/dist/core/vault/cas.js +0 -261
  870. package/dist/core/vault/index.d.ts +0 -326
  871. package/dist/core/vault/index.js +0 -1042
  872. package/dist/core/visual/index.d.ts +0 -6
  873. package/dist/core/visual/index.js +0 -6
  874. package/dist/core/visual/visual-regression.d.ts +0 -113
  875. package/dist/core/visual/visual-regression.js +0 -236
  876. package/dist/core/watch/index.d.ts +0 -7
  877. package/dist/core/watch/index.js +0 -6
  878. package/dist/core/watch/watch-mode.d.ts +0 -213
  879. package/dist/core/watch/watch-mode.js +0 -389
  880. package/dist/generators/index.d.ts +0 -5
  881. package/dist/generators/index.js +0 -5
  882. package/dist/generators/json-reporter.d.ts +0 -10
  883. package/dist/generators/json-reporter.js +0 -12
  884. package/dist/generators/test-generator.d.ts +0 -18
  885. package/dist/generators/test-generator.js +0 -78
  886. package/dist/index.d.ts +0 -8
  887. package/dist/index.js +0 -246
  888. package/dist/scanners/dom-scanner.d.ts +0 -52
  889. package/dist/scanners/dom-scanner.js +0 -296
  890. package/dist/scanners/index.d.ts +0 -4
  891. package/dist/scanners/index.js +0 -4
  892. package/dist/schemas/pack.schema.json +0 -236
  893. package/dist/types/scan.d.ts +0 -68
  894. package/dist/types/scan.js +0 -4
  895. package/dist/utils/config.d.ts +0 -5
  896. package/dist/utils/config.js +0 -136
  897. /package/{bin → cli/bin}/qa360.js +0 -0
  898. /package/{examples → cli/examples}/accessibility.yml +0 -0
  899. /package/{examples → cli/examples}/api-basic.yml +0 -0
  900. /package/{examples → cli/examples}/complete.yml +0 -0
  901. /package/{examples → cli/examples}/crawler.yml +0 -0
  902. /package/{examples → cli/examples}/fullstack.yml +0 -0
  903. /package/{examples → cli/examples}/security.yml +0 -0
  904. /package/{examples → cli/examples}/ui-advanced.yml +0 -0
  905. /package/{examples → cli/examples}/ui-basic.yml +0 -0
  906. /package/{dist/core → core}/schemas/pack.schema.json +0 -0
@@ -0,0 +1,792 @@
1
+ /**
2
+ * Playwright Native API Adapter Tests
3
+ *
4
+ * Comprehensive test suite for the browserless Playwright API adapter.
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
8
+ import {
9
+ PlaywrightNativeApiAdapter,
10
+ createPlaywrightNativeApiAdapter,
11
+ PlaywrightNativeApiError,
12
+ type NativeApiTestConfig,
13
+ type ApiTestResult
14
+ } from '../playwright-native-api.js';
15
+
16
+ // Mock Playwright to avoid actual network calls in tests
17
+ vi.mock('playwright', async () => {
18
+ const actual = await vi.importActual('playwright');
19
+ return {
20
+ ...actual,
21
+ request: {
22
+ newContext: vi.fn()
23
+ }
24
+ };
25
+ });
26
+
27
+ import * as playwright from 'playwright';
28
+
29
+ describe('PlaywrightNativeApiAdapter', () => {
30
+ let adapter: PlaywrightNativeApiAdapter;
31
+ let mockRequestContext: any;
32
+
33
+ beforeEach(() => {
34
+ adapter = new PlaywrightNativeApiAdapter();
35
+ vi.clearAllMocks();
36
+
37
+ // Create mock request context
38
+ mockRequestContext = {
39
+ fetch: vi.fn(),
40
+ setHTTPCredentials: vi.fn(),
41
+ dispose: vi.fn(),
42
+ get: vi.fn(),
43
+ post: vi.fn(),
44
+ put: vi.fn(),
45
+ delete: vi.fn(),
46
+ patch: vi.fn()
47
+ };
48
+
49
+ vi.mocked(playwright.request.newContext).mockResolvedValue(mockRequestContext);
50
+ });
51
+
52
+ afterEach(() => {
53
+ vi.restoreAllMocks();
54
+ });
55
+
56
+ describe('Constructor', () => {
57
+ it('should create adapter instance', () => {
58
+ expect(adapter).toBeInstanceOf(PlaywrightNativeApiAdapter);
59
+ });
60
+
61
+ it('should have factory function', () => {
62
+ const instance = createPlaywrightNativeApiAdapter();
63
+ expect(instance).toBeInstanceOf(PlaywrightNativeApiAdapter);
64
+ });
65
+ });
66
+
67
+ describe('getCapabilities', () => {
68
+ it('should return adapter capabilities', () => {
69
+ const capabilities = PlaywrightNativeApiAdapter.getCapabilities();
70
+
71
+ expect(capabilities).toEqual({
72
+ adapter: 'playwright-native',
73
+ browserless: true,
74
+ features: expect.arrayContaining([
75
+ 'REST API testing',
76
+ 'GraphQL support',
77
+ 'Basic auth',
78
+ 'Bearer token auth',
79
+ 'Retry logic with exponential backoff'
80
+ ])
81
+ });
82
+ });
83
+
84
+ it('should indicate browserless operation', () => {
85
+ const capabilities = PlaywrightNativeApiAdapter.getCapabilities();
86
+ expect(capabilities.browserless).toBe(true);
87
+ });
88
+ });
89
+
90
+ describe('validateConfig', () => {
91
+ it('should validate correct config', () => {
92
+ const result = PlaywrightNativeApiAdapter.validateConfig({
93
+ baseUrl: 'https://api.example.com',
94
+ smoke: ['GET /health -> 200']
95
+ });
96
+
97
+ expect(result.valid).toBe(true);
98
+ expect(result.errors).toEqual([]);
99
+ });
100
+
101
+ it('should reject config without baseUrl', () => {
102
+ const result = PlaywrightNativeApiAdapter.validateConfig({
103
+ baseUrl: ''
104
+ });
105
+
106
+ expect(result.valid).toBe(false);
107
+ expect(result.errors).toContain('baseUrl is required in gate config. Add: "baseUrl: https://your-api.com"');
108
+ });
109
+
110
+ it('should reject invalid URL', () => {
111
+ const result = PlaywrightNativeApiAdapter.validateConfig({
112
+ baseUrl: 'not-a-valid-url'
113
+ });
114
+
115
+ expect(result.valid).toBe(false);
116
+ expect(result.errors).toContain('baseUrl "not-a-valid-url" is not a valid URL. Expected format: https://api.example.com');
117
+ });
118
+
119
+ it('should reject invalid test spec format', () => {
120
+ const result = PlaywrightNativeApiAdapter.validateConfig({
121
+ baseUrl: 'https://api.example.com',
122
+ smoke: ['invalid format']
123
+ });
124
+
125
+ expect(result.valid).toBe(false);
126
+ expect(result.errors).toContain('Invalid smoke test format: invalid format. Expected: "METHOD /path -> STATUS"');
127
+ });
128
+
129
+ it('should accept multiple test specs', () => {
130
+ const result = PlaywrightNativeApiAdapter.validateConfig({
131
+ baseUrl: 'https://api.example.com',
132
+ smoke: [
133
+ 'GET /health -> 200',
134
+ 'POST /users -> 201',
135
+ 'PUT /users/1 -> 200'
136
+ ]
137
+ });
138
+
139
+ expect(result.valid).toBe(true);
140
+ });
141
+ });
142
+
143
+ describe('setAuth', () => {
144
+ it('should store auth credentials', () => {
145
+ const auth = {
146
+ headers: { 'Authorization': 'Bearer token123' }
147
+ };
148
+
149
+ adapter.setAuth(auth);
150
+ // Auth is stored but not directly exposed
151
+ expect(adapter).toBeDefined();
152
+ });
153
+
154
+ it('should accept undefined auth', () => {
155
+ expect(() => adapter.setAuth(undefined)).not.toThrow();
156
+ });
157
+ });
158
+
159
+ describe('runSmokeTests', () => {
160
+ it('should run successful smoke tests', async () => {
161
+ // Mock successful response
162
+ mockRequestContext.fetch.mockResolvedValue({
163
+ status: () => 200,
164
+ headers: () => ({ 'content-type': 'application/json' }),
165
+ json: async () => ({ status: 'ok' }),
166
+ text: async () => '{"status":"ok"}'
167
+ });
168
+
169
+ const config: NativeApiTestConfig = {
170
+ target: {
171
+ baseUrl: 'https://api.example.com',
172
+ smoke: ['GET /health -> 200']
173
+ }
174
+ };
175
+
176
+ const result = await adapter.runSmokeTests(config);
177
+
178
+ expect(result.success).toBe(true);
179
+ expect(result.summary.total).toBe(1);
180
+ expect(result.summary.passed).toBe(1);
181
+ expect(result.summary.failed).toBe(0);
182
+ expect(result.results).toHaveLength(1);
183
+ expect(result.results[0].status).toBe(200);
184
+ expect(result.results[0].success).toBe(true);
185
+ });
186
+
187
+ it('should handle multiple smoke tests', async () => {
188
+ mockRequestContext.fetch
189
+ .mockResolvedValueOnce({
190
+ status: () => 200,
191
+ headers: () => ({ 'content-type': 'application/json' }),
192
+ json: async () => ({ status: 'ok' }),
193
+ text: async () => '{"status":"ok"}'
194
+ })
195
+ .mockResolvedValueOnce({
196
+ status: () => 201,
197
+ headers: () => ({ 'content-type': 'application/json' }),
198
+ json: async () => ({ id: 1 }),
199
+ text: async () => '{"id":1}'
200
+ });
201
+
202
+ const config: NativeApiTestConfig = {
203
+ target: {
204
+ baseUrl: 'https://api.example.com',
205
+ smoke: [
206
+ 'GET /health -> 200',
207
+ 'POST /users -> 201'
208
+ ]
209
+ }
210
+ };
211
+
212
+ const result = await adapter.runSmokeTests(config);
213
+
214
+ expect(result.success).toBe(true);
215
+ expect(result.summary.total).toBe(2);
216
+ expect(result.summary.passed).toBe(2);
217
+ expect(result.results[0].method).toBe('GET');
218
+ expect(result.results[1].method).toBe('POST');
219
+ });
220
+
221
+ it('should handle failed smoke test', async () => {
222
+ mockRequestContext.fetch.mockResolvedValue({
223
+ status: () => 500,
224
+ headers: () => ({ 'content-type': 'application/json' }),
225
+ json: async () => ({ error: 'Internal server error' }),
226
+ text: async () => '{"error":"Internal server error"}'
227
+ });
228
+
229
+ const config: NativeApiTestConfig = {
230
+ target: {
231
+ baseUrl: 'https://api.example.com',
232
+ smoke: ['GET /health -> 200']
233
+ }
234
+ };
235
+
236
+ const result = await adapter.runSmokeTests(config);
237
+
238
+ expect(result.success).toBe(false);
239
+ expect(result.summary.failed).toBe(1);
240
+ expect(result.results[0].success).toBe(false);
241
+ expect(result.results[0].error).toContain('Expected status 200, got 500');
242
+ });
243
+
244
+ it('should generate JUnit XML', async () => {
245
+ mockRequestContext.fetch.mockResolvedValue({
246
+ status: () => 200,
247
+ headers: () => ({ 'content-type': 'application/json' }),
248
+ json: async () => ({ status: 'ok' }),
249
+ text: async () => '{"status":"ok"}'
250
+ });
251
+
252
+ const config: NativeApiTestConfig = {
253
+ target: {
254
+ baseUrl: 'https://api.example.com',
255
+ smoke: ['GET /health -> 200']
256
+ }
257
+ };
258
+
259
+ const result = await adapter.runSmokeTests(config);
260
+
261
+ expect(result.junit).toBeDefined();
262
+ expect(result.junit).toContain('<?xml version="1.0"');
263
+ expect(result.junit).toContain('<testsuite');
264
+ expect(result.junit).toContain('API Smoke Tests (Playwright Native)');
265
+ expect(result.junit).toContain('<testcase');
266
+ });
267
+
268
+ it('should cleanup request context after tests', async () => {
269
+ mockRequestContext.fetch.mockResolvedValue({
270
+ status: () => 200,
271
+ headers: () => ({ 'content-type': 'application/json' }),
272
+ json: async () => ({}),
273
+ text: async () => '{}'
274
+ });
275
+
276
+ const config: NativeApiTestConfig = {
277
+ target: {
278
+ baseUrl: 'https://api.example.com',
279
+ smoke: ['GET /health -> 200']
280
+ }
281
+ };
282
+
283
+ await adapter.runSmokeTests(config);
284
+
285
+ expect(mockRequestContext.dispose).toHaveBeenCalled();
286
+ });
287
+
288
+ it('should include error message when tests fail', async () => {
289
+ mockRequestContext.fetch.mockResolvedValue({
290
+ status: () => 404,
291
+ headers: () => ({ 'content-type': 'application/json' }),
292
+ json: async () => ({ error: 'Not found' }),
293
+ text: async () => '{"error":"Not found"}'
294
+ });
295
+
296
+ const config: NativeApiTestConfig = {
297
+ target: {
298
+ baseUrl: 'https://api.example.com',
299
+ smoke: ['GET /missing -> 200']
300
+ }
301
+ };
302
+
303
+ const result = await adapter.runSmokeTests(config);
304
+
305
+ expect(result.error).toBeDefined();
306
+ expect(result.error).toContain('1 endpoint(s) failed');
307
+ });
308
+ });
309
+
310
+ describe('retry logic', () => {
311
+ it('should retry on retryable errors', async () => {
312
+ let attemptCount = 0;
313
+ mockRequestContext.fetch.mockImplementation(async () => {
314
+ attemptCount++;
315
+ if (attemptCount < 3) {
316
+ throw new Error('ECONNRESET');
317
+ }
318
+ return {
319
+ status: () => 200,
320
+ headers: () => ({ 'content-type': 'application/json' }),
321
+ json: async () => ({ status: 'ok' }),
322
+ text: async () => '{"status":"ok"}'
323
+ };
324
+ });
325
+
326
+ const config: NativeApiTestConfig = {
327
+ target: {
328
+ baseUrl: 'https://api.example.com',
329
+ smoke: ['GET /health -> 200']
330
+ },
331
+ retries: 3
332
+ };
333
+
334
+ const result = await adapter.runSmokeTests(config);
335
+
336
+ expect(result.success).toBe(true);
337
+ expect(result.results[0].attempts).toBe(3);
338
+ });
339
+
340
+ it('should give up after max retries', async () => {
341
+ mockRequestContext.fetch.mockRejectedValue(new Error('ECONNRESET'));
342
+
343
+ const config: NativeApiTestConfig = {
344
+ target: {
345
+ baseUrl: 'https://api.example.com',
346
+ smoke: ['GET /health -> 200']
347
+ },
348
+ retries: 2
349
+ };
350
+
351
+ const result = await adapter.runSmokeTests(config);
352
+
353
+ expect(result.success).toBe(false);
354
+ expect(result.results[0].success).toBe(false);
355
+ expect(result.results[0].attempts).toBe(3); // initial + 2 retries
356
+ });
357
+
358
+ it('should not retry on non-retryable errors', async () => {
359
+ mockRequestContext.fetch.mockRejectedValue(new Error('Invalid credentials'));
360
+
361
+ const config: NativeApiTestConfig = {
362
+ target: {
363
+ baseUrl: 'https://api.example.com',
364
+ smoke: ['GET /health -> 200']
365
+ },
366
+ retries: 3
367
+ };
368
+
369
+ const result = await adapter.runSmokeTests(config);
370
+
371
+ expect(result.results[0].attempts).toBe(1); // No retries
372
+ });
373
+ });
374
+
375
+ describe('healthCheck', () => {
376
+ it('should return true for healthy endpoint', async () => {
377
+ mockRequestContext.fetch.mockResolvedValue({
378
+ status: () => 200
379
+ });
380
+
381
+ const result = await adapter.healthCheck('https://api.example.com', '/health');
382
+
383
+ expect(result).toBe(true);
384
+ });
385
+
386
+ it('should return true for redirect', async () => {
387
+ mockRequestContext.fetch.mockResolvedValue({
388
+ status: () => 301
389
+ });
390
+
391
+ const result = await adapter.healthCheck('https://api.example.com', '/redirect');
392
+
393
+ expect(result).toBe(true);
394
+ });
395
+
396
+ it('should return false for server error', async () => {
397
+ mockRequestContext.fetch.mockResolvedValue({
398
+ status: () => 500
399
+ });
400
+
401
+ const result = await adapter.healthCheck('https://api.example.com', '/error');
402
+
403
+ expect(result).toBe(false);
404
+ });
405
+
406
+ it('should return false on network error', async () => {
407
+ mockRequestContext.fetch.mockRejectedValue(new Error('Network error'));
408
+
409
+ const result = await adapter.healthCheck('https://api.example.com', '/health');
410
+
411
+ expect(result).toBe(false);
412
+ });
413
+
414
+ it('should use custom timeout', async () => {
415
+ mockRequestContext.fetch.mockResolvedValue({
416
+ status: () => 200
417
+ });
418
+
419
+ await adapter.healthCheck('https://api.example.com', '/health', 10000);
420
+
421
+ expect(playwright.request.newContext).toHaveBeenCalledWith(
422
+ expect.objectContaining({
423
+ timeout: 10000
424
+ })
425
+ );
426
+ });
427
+
428
+ it('should use default /health path', async () => {
429
+ mockRequestContext.fetch.mockResolvedValue({
430
+ status: () => 200
431
+ });
432
+
433
+ await adapter.healthCheck('https://api.example.com');
434
+
435
+ expect(mockRequestContext.fetch).toHaveBeenCalledWith(
436
+ 'https://api.example.com/health',
437
+ expect.objectContaining({
438
+ method: 'GET'
439
+ })
440
+ );
441
+ });
442
+ });
443
+
444
+ describe('authentication', () => {
445
+ it('should set basic auth credentials', async () => {
446
+ mockRequestContext.fetch.mockResolvedValue({
447
+ status: () => 200,
448
+ headers: () => ({ 'content-type': 'application/json' }),
449
+ json: async () => ({}),
450
+ text: async () => '{}'
451
+ });
452
+
453
+ const config: NativeApiTestConfig = {
454
+ target: {
455
+ baseUrl: 'https://api.example.com',
456
+ smoke: ['GET /health -> 200']
457
+ },
458
+ basicAuth: {
459
+ username: 'testuser',
460
+ password: 'testpass'
461
+ }
462
+ };
463
+
464
+ await adapter.runSmokeTests(config);
465
+
466
+ // Basic auth is now handled via Authorization header
467
+ const newContextCall = vi.mocked(playwright.request.newContext).mock.calls;
468
+ expect(newContextCall.length).toBeGreaterThan(0);
469
+ // The last call should have basic auth in headers
470
+ const lastCall = newContextCall[newContextCall.length - 1][0];
471
+ expect(lastCall.extraHTTPHeaders?.Authorization).toContain('Basic ');
472
+ });
473
+
474
+ it('should include auth headers in request', async () => {
475
+ mockRequestContext.fetch.mockResolvedValue({
476
+ status: () => 200,
477
+ headers: () => ({ 'content-type': 'application/json' }),
478
+ json: async () => ({}),
479
+ text: async () => '{}'
480
+ });
481
+
482
+ const config: NativeApiTestConfig = {
483
+ target: {
484
+ baseUrl: 'https://api.example.com',
485
+ smoke: ['GET /health -> 200']
486
+ },
487
+ auth: {
488
+ headers: {
489
+ 'Authorization': 'Bearer token123',
490
+ 'X-Custom-Header': 'custom-value'
491
+ }
492
+ }
493
+ };
494
+
495
+ await adapter.runSmokeTests(config);
496
+
497
+ const newContextCall = vi.mocked(playwright.request.newContext).mock.calls[0][0];
498
+ expect(newContextCall.extraHTTPHeaders).toEqual(
499
+ expect.objectContaining({
500
+ 'Authorization': 'Bearer token123',
501
+ 'X-Custom-Header': 'custom-value'
502
+ })
503
+ );
504
+ });
505
+ });
506
+
507
+ describe('response handling', () => {
508
+ it('should parse JSON responses', async () => {
509
+ const mockData = { user: { id: 1, name: 'Test' } };
510
+ mockRequestContext.fetch.mockResolvedValue({
511
+ status: () => 200,
512
+ headers: () => ({ 'content-type': 'application/json' }),
513
+ json: async () => mockData,
514
+ text: async () => JSON.stringify(mockData)
515
+ });
516
+
517
+ const config: NativeApiTestConfig = {
518
+ target: {
519
+ baseUrl: 'https://api.example.com',
520
+ smoke: ['GET /user -> 200']
521
+ }
522
+ };
523
+
524
+ const result = await adapter.runSmokeTests(config);
525
+
526
+ expect(result.results[0].body).toEqual(mockData);
527
+ });
528
+
529
+ it('should handle text responses', async () => {
530
+ mockRequestContext.fetch.mockResolvedValue({
531
+ status: () => 200,
532
+ headers: () => ({ 'content-type': 'text/plain' }),
533
+ json: async () => { throw new Error('Not JSON'); },
534
+ text: async () => 'Plain text response'
535
+ });
536
+
537
+ const config: NativeApiTestConfig = {
538
+ target: {
539
+ baseUrl: 'https://api.example.com',
540
+ smoke: ['GET /text -> 200']
541
+ }
542
+ };
543
+
544
+ const result = await adapter.runSmokeTests(config);
545
+
546
+ expect(result.results[0].body).toBe('Plain text response');
547
+ });
548
+
549
+ it('should capture response headers', async () => {
550
+ const mockHeaders = {
551
+ 'content-type': 'application/json',
552
+ 'x-request-id': '12345',
553
+ 'x-rate-limit': '100'
554
+ };
555
+
556
+ mockRequestContext.fetch.mockResolvedValue({
557
+ status: () => 200,
558
+ headers: () => mockHeaders,
559
+ json: async () => ({}),
560
+ text: async () => '{}'
561
+ });
562
+
563
+ const config: NativeApiTestConfig = {
564
+ target: {
565
+ baseUrl: 'https://api.example.com',
566
+ smoke: ['GET /health -> 200']
567
+ }
568
+ };
569
+
570
+ const result = await adapter.runSmokeTests(config);
571
+
572
+ expect(result.results[0].headers).toEqual(mockHeaders);
573
+ });
574
+
575
+ it('should limit response body size', async () => {
576
+ const longText = 'x'.repeat(1000);
577
+ mockRequestContext.fetch.mockResolvedValue({
578
+ status: () => 200,
579
+ headers: () => ({ 'content-type': 'text/plain' }),
580
+ json: async () => { throw new Error('Not JSON'); },
581
+ text: async () => longText
582
+ });
583
+
584
+ const config: NativeApiTestConfig = {
585
+ target: {
586
+ baseUrl: 'https://api.example.com',
587
+ smoke: ['GET /text -> 200']
588
+ }
589
+ };
590
+
591
+ const result = await adapter.runSmokeTests(config);
592
+
593
+ // Body should be limited to 500 chars for non-JSON
594
+ expect(result.results[0].body?.length).toBeLessThanOrEqual(500);
595
+ });
596
+ });
597
+
598
+ describe('summary calculation', () => {
599
+ it('should calculate average response time', async () => {
600
+ mockRequestContext.fetch.mockResolvedValue({
601
+ status: () => 200,
602
+ headers: () => ({ 'content-type': 'application/json' }),
603
+ json: async () => ({}),
604
+ text: async () => '{}'
605
+ });
606
+
607
+ const config: NativeApiTestConfig = {
608
+ target: {
609
+ baseUrl: 'https://api.example.com',
610
+ smoke: [
611
+ 'GET /fast -> 200',
612
+ 'GET /slow -> 200',
613
+ 'GET /medium -> 200'
614
+ ]
615
+ }
616
+ };
617
+
618
+ const result = await adapter.runSmokeTests(config);
619
+
620
+ // Average is calculated (may be 0 in fast mock tests)
621
+ expect(result.summary.avgResponseTime).toBeGreaterThanOrEqual(0);
622
+ expect(result.summary.totalAttempts).toBe(3);
623
+ });
624
+ });
625
+
626
+ describe('error handling', () => {
627
+ it('should handle request timeout', async () => {
628
+ mockRequestContext.fetch.mockRejectedValue(new Error('Request timeout'));
629
+
630
+ const config: NativeApiTestConfig = {
631
+ target: {
632
+ baseUrl: 'https://api.example.com',
633
+ smoke: ['GET /health -> 200']
634
+ },
635
+ timeout: 5000
636
+ };
637
+
638
+ const result = await adapter.runSmokeTests(config);
639
+
640
+ expect(result.success).toBe(false);
641
+ expect(result.results[0].error).toContain('timeout');
642
+ });
643
+
644
+ it('should handle connection refused', async () => {
645
+ mockRequestContext.fetch.mockRejectedValue(new Error('ECONNREFUSED'));
646
+
647
+ const config: NativeApiTestConfig = {
648
+ target: {
649
+ baseUrl: 'https://api.example.com',
650
+ smoke: ['GET /health -> 200']
651
+ }
652
+ };
653
+
654
+ const result = await adapter.runSmokeTests(config);
655
+
656
+ expect(result.success).toBe(false);
657
+ expect(result.results[0].error).toContain('ECONNREFUSED');
658
+ });
659
+ });
660
+
661
+ describe('PlaywrightNativeApiError', () => {
662
+ it('should create error with details', () => {
663
+ const error = new PlaywrightNativeApiError(
664
+ 'Request failed',
665
+ 'https://api.example.com/endpoint',
666
+ 'GET'
667
+ );
668
+
669
+ expect(error.message).toBe('Request failed');
670
+ expect(error.endpoint).toBe('https://api.example.com/endpoint');
671
+ expect(error.method).toBe('GET');
672
+ expect(error.code).toBe('PLAYWRIGHT_NATIVE_API_ERROR');
673
+ });
674
+
675
+ it('should create error with message only', () => {
676
+ const error = new PlaywrightNativeApiError('Simple error');
677
+
678
+ expect(error.message).toBe('Simple error');
679
+ expect(error.endpoint).toBeUndefined();
680
+ expect(error.method).toBeUndefined();
681
+ });
682
+ });
683
+
684
+ describe('test spec parsing', () => {
685
+ it('should handle absolute URLs', async () => {
686
+ mockRequestContext.fetch.mockResolvedValue({
687
+ status: () => 200,
688
+ headers: () => ({ 'content-type': 'application/json' }),
689
+ json: async () => ({}),
690
+ text: async () => '{}'
691
+ });
692
+
693
+ const config: NativeApiTestConfig = {
694
+ target: {
695
+ baseUrl: 'https://api.example.com',
696
+ smoke: ['GET https://other-api.com/health -> 200']
697
+ }
698
+ };
699
+
700
+ const result = await adapter.runSmokeTests(config);
701
+
702
+ expect(mockRequestContext.fetch).toHaveBeenCalledWith(
703
+ 'https://other-api.com/health',
704
+ expect.any(Object)
705
+ );
706
+ });
707
+
708
+ it('should handle relative URLs', async () => {
709
+ mockRequestContext.fetch.mockResolvedValue({
710
+ status: () => 200,
711
+ headers: () => ({ 'content-type': 'application/json' }),
712
+ json: async () => ({}),
713
+ text: async () => '{}'
714
+ });
715
+
716
+ const config: NativeApiTestConfig = {
717
+ target: {
718
+ baseUrl: 'https://api.example.com',
719
+ smoke: ['GET /api/v1/users -> 200']
720
+ }
721
+ };
722
+
723
+ const result = await adapter.runSmokeTests(config);
724
+
725
+ expect(mockRequestContext.fetch).toHaveBeenCalledWith(
726
+ 'https://api.example.com/api/v1/users',
727
+ expect.any(Object)
728
+ );
729
+ });
730
+
731
+ it('should handle URLs without leading slash', async () => {
732
+ mockRequestContext.fetch.mockResolvedValue({
733
+ status: () => 200,
734
+ headers: () => ({ 'content-type': 'application/json' }),
735
+ json: async () => ({}),
736
+ text: async () => '{}'
737
+ });
738
+
739
+ const config: NativeApiTestConfig = {
740
+ target: {
741
+ baseUrl: 'https://api.example.com/api',
742
+ smoke: ['GET users -> 200']
743
+ }
744
+ };
745
+
746
+ const result = await adapter.runSmokeTests(config);
747
+
748
+ expect(mockRequestContext.fetch).toHaveBeenCalledWith(
749
+ 'https://api.example.com/api/users',
750
+ expect.any(Object)
751
+ );
752
+ });
753
+
754
+ it('should handle different HTTP methods', async () => {
755
+ // Mock with different status codes per call
756
+ let callIndex = 0;
757
+ const statusCodes = [200, 201, 200, 200, 204];
758
+ mockRequestContext.fetch.mockImplementation(async () => {
759
+ return {
760
+ status: () => statusCodes[callIndex++ % statusCodes.length],
761
+ headers: () => ({ 'content-type': 'application/json' }),
762
+ json: async () => ({}),
763
+ text: async () => '{}'
764
+ };
765
+ });
766
+
767
+ const config: NativeApiTestConfig = {
768
+ target: {
769
+ baseUrl: 'https://api.example.com',
770
+ smoke: [
771
+ 'GET /resource -> 200',
772
+ 'POST /resource -> 201',
773
+ 'PUT /resource/1 -> 200',
774
+ 'PATCH /resource/1 -> 200',
775
+ 'DELETE /resource/1 -> 204'
776
+ ]
777
+ }
778
+ };
779
+
780
+ await adapter.runSmokeTests(config);
781
+
782
+ expect(mockRequestContext.fetch).toHaveBeenCalledTimes(5);
783
+
784
+ const calls = vi.mocked(mockRequestContext.fetch).mock.calls;
785
+ expect(calls[0][1]?.method).toBe('GET');
786
+ expect(calls[1][1]?.method).toBe('POST');
787
+ expect(calls[2][1]?.method).toBe('PUT');
788
+ expect(calls[3][1]?.method).toBe('PATCH');
789
+ expect(calls[4][1]?.method).toBe('DELETE');
790
+ });
791
+ });
792
+ });