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,1118 @@
1
+ /**
2
+ * Phase3Runner Integration Tests
3
+ *
4
+ * Tests the complete test execution workflow including:
5
+ * - Key initialization
6
+ * - Evidence vault setup
7
+ * - Hook execution (beforeAll/afterAll)
8
+ * - Gate execution (api_smoke, ui, perf, sast, etc.)
9
+ * - Proof generation
10
+ * - Vault storage
11
+ */
12
+
13
+ import { tmpdir } from 'os';
14
+ import { join } from 'path';
15
+ import { mkdirSync, rmSync, existsSync, writeFileSync } from 'fs';
16
+ import { Phase3Runner, type Phase3RunResult } from '../phase3-runner.js';
17
+ import type { PackConfigV1 } from '../../types/pack-v1.js';
18
+ import type { PackConfigV2 } from '../../types/pack-v2.js';
19
+ import { vi } from 'vitest';
20
+
21
+ describe('Phase3Runner - Initialization', () => {
22
+ let testDir: string;
23
+
24
+ beforeEach(() => {
25
+ testDir = join(tmpdir(), `qa360-phase3-test-${Date.now()}`);
26
+ mkdirSync(testDir, { recursive: true });
27
+ });
28
+
29
+ afterEach(() => {
30
+ if (existsSync(testDir)) {
31
+ rmSync(testDir, { recursive: true, force: true });
32
+ }
33
+ });
34
+
35
+ it('should initialize with valid pack configuration', () => {
36
+ const pack: PackConfigV1 = {
37
+ version: 1,
38
+ name: 'test-pack',
39
+ gates: ['api_smoke'],
40
+ targets: {
41
+ api: {
42
+ baseUrl: 'https://httpbin.org',
43
+ smoke: ['GET /get -> 200']
44
+ }
45
+ }
46
+ };
47
+
48
+ const runner = new Phase3Runner({
49
+ workingDir: testDir,
50
+ pack,
51
+ });
52
+
53
+ expect(runner).toBeDefined();
54
+ });
55
+
56
+ it('should use custom output directory when provided', () => {
57
+ const customOutputDir = join(testDir, 'custom-output');
58
+ const pack: PackConfigV1 = {
59
+ version: 1,
60
+ name: 'test-pack',
61
+ gates: [],
62
+ };
63
+
64
+ const runner = new Phase3Runner({
65
+ workingDir: testDir,
66
+ pack,
67
+ outputDir: customOutputDir,
68
+ });
69
+
70
+ expect(runner).toBeDefined();
71
+ });
72
+
73
+ it('should initialize with empty gates array', () => {
74
+ const pack: PackConfigV1 = {
75
+ version: 1,
76
+ name: 'empty-pack',
77
+ gates: [],
78
+ };
79
+
80
+ const runner = new Phase3Runner({
81
+ workingDir: testDir,
82
+ pack,
83
+ });
84
+
85
+ expect(runner).toBeDefined();
86
+ });
87
+ });
88
+
89
+ describe('Phase3Runner - Summary Calculation', () => {
90
+ let testDir: string;
91
+
92
+ beforeEach(() => {
93
+ testDir = join(tmpdir(), `qa360-phase3-test-${Date.now()}`);
94
+ mkdirSync(testDir, { recursive: true });
95
+ });
96
+
97
+ afterEach(() => {
98
+ if (existsSync(testDir)) {
99
+ rmSync(testDir, { recursive: true, force: true });
100
+ }
101
+ });
102
+
103
+ it('should calculate 100% trust score for all passing gates', async () => {
104
+ const pack: PackConfigV1 = {
105
+ version: 1,
106
+ name: 'test-pack',
107
+ gates: [],
108
+ };
109
+
110
+ const runner = new Phase3Runner({
111
+ workingDir: testDir,
112
+ pack,
113
+ });
114
+
115
+ // Access private method via type casting
116
+ const calculateSummary = (runner as any).calculateSummary.bind(runner);
117
+
118
+ const gateResults = [
119
+ { gate: 'api_smoke', success: true, duration: 100, adapter: 'playwright-api', results: {} },
120
+ { gate: 'ui', success: true, duration: 200, adapter: 'playwright-ui', results: {} },
121
+ ];
122
+
123
+ const summary = calculateSummary(gateResults);
124
+
125
+ expect(summary.total).toBe(2);
126
+ expect(summary.passed).toBe(2);
127
+ expect(summary.failed).toBe(0);
128
+ expect(summary.trustScore).toBe(100);
129
+ });
130
+
131
+ it('should calculate weighted trust score based on gate importance', async () => {
132
+ const pack: PackConfigV1 = {
133
+ version: 1,
134
+ name: 'test-pack',
135
+ gates: [],
136
+ };
137
+
138
+ const runner = new Phase3Runner({
139
+ workingDir: testDir,
140
+ pack,
141
+ });
142
+
143
+ const calculateSummary = (runner as any).calculateSummary.bind(runner);
144
+
145
+ const gateResults = [
146
+ { gate: 'api_smoke', success: true, duration: 100, adapter: 'playwright-api', results: {} }, // weight: 20
147
+ { gate: 'ui', success: false, duration: 200, adapter: 'playwright-ui', results: {}, error: 'Failed' }, // weight: 15
148
+ ];
149
+
150
+ const summary = calculateSummary(gateResults);
151
+
152
+ expect(summary.total).toBe(2);
153
+ expect(summary.passed).toBe(1);
154
+ expect(summary.failed).toBe(1);
155
+ // Trust score = (20 passed) / (20 + 15 total) * 100 = 57%
156
+ expect(summary.trustScore).toBe(57);
157
+ });
158
+
159
+ it('should calculate 0% trust score for all failing gates', async () => {
160
+ const pack: PackConfigV1 = {
161
+ version: 1,
162
+ name: 'test-pack',
163
+ gates: [],
164
+ };
165
+
166
+ const runner = new Phase3Runner({
167
+ workingDir: testDir,
168
+ pack,
169
+ });
170
+
171
+ const calculateSummary = (runner as any).calculateSummary.bind(runner);
172
+
173
+ const gateResults = [
174
+ { gate: 'api_smoke', success: false, duration: 100, adapter: 'playwright-api', results: {}, error: 'Failed 1' },
175
+ { gate: 'ui', success: false, duration: 200, adapter: 'playwright-ui', results: {}, error: 'Failed 2' },
176
+ ];
177
+
178
+ const summary = calculateSummary(gateResults);
179
+
180
+ expect(summary.total).toBe(2);
181
+ expect(summary.passed).toBe(0);
182
+ expect(summary.failed).toBe(2);
183
+ expect(summary.trustScore).toBe(0);
184
+ });
185
+
186
+ it('should handle empty gate results', async () => {
187
+ const pack: PackConfigV1 = {
188
+ version: 1,
189
+ name: 'test-pack',
190
+ gates: [],
191
+ };
192
+
193
+ const runner = new Phase3Runner({
194
+ workingDir: testDir,
195
+ pack,
196
+ });
197
+
198
+ const calculateSummary = (runner as any).calculateSummary.bind(runner);
199
+
200
+ const summary = calculateSummary([]);
201
+
202
+ expect(summary.total).toBe(0);
203
+ expect(summary.passed).toBe(0);
204
+ expect(summary.failed).toBe(0);
205
+ expect(summary.trustScore).toBe(0);
206
+ });
207
+ });
208
+
209
+ describe('Phase3Runner - Output Directory', () => {
210
+ let testDir: string;
211
+
212
+ beforeEach(() => {
213
+ testDir = join(tmpdir(), `qa360-phase3-test-${Date.now()}`);
214
+ mkdirSync(testDir, { recursive: true });
215
+ });
216
+
217
+ afterEach(() => {
218
+ if (existsSync(testDir)) {
219
+ rmSync(testDir, { recursive: true, force: true });
220
+ }
221
+ });
222
+
223
+ it('should create output directory if it does not exist', async () => {
224
+ const pack: PackConfigV1 = {
225
+ version: 1,
226
+ name: 'test-pack',
227
+ gates: [],
228
+ };
229
+
230
+ const runner = new Phase3Runner({
231
+ workingDir: testDir,
232
+ pack,
233
+ });
234
+
235
+ // Access private method
236
+ const ensureOutputDir = (runner as any).ensureOutputDir.bind(runner);
237
+ ensureOutputDir();
238
+
239
+ const expectedOutputDir = join(testDir, '.qa360', 'runs');
240
+ expect(existsSync(expectedOutputDir)).toBe(true);
241
+ });
242
+
243
+ it('should not fail if output directory already exists', async () => {
244
+ const outputDir = join(testDir, '.qa360', 'runs');
245
+ mkdirSync(outputDir, { recursive: true });
246
+
247
+ const pack: PackConfigV1 = {
248
+ version: 1,
249
+ name: 'test-pack',
250
+ gates: [],
251
+ };
252
+
253
+ const runner = new Phase3Runner({
254
+ workingDir: testDir,
255
+ pack,
256
+ });
257
+
258
+ const ensureOutputDir = (runner as any).ensureOutputDir.bind(runner);
259
+
260
+ // Should not throw
261
+ expect(() => ensureOutputDir()).not.toThrow();
262
+ });
263
+ });
264
+
265
+ describe('Phase3Runner - Error Handling', () => {
266
+ let testDir: string;
267
+
268
+ beforeEach(() => {
269
+ testDir = join(tmpdir(), `qa360-phase3-test-${Date.now()}`);
270
+ mkdirSync(testDir, { recursive: true });
271
+ });
272
+
273
+ afterEach(() => {
274
+ if (existsSync(testDir)) {
275
+ rmSync(testDir, { recursive: true, force: true });
276
+ }
277
+ });
278
+
279
+ it('should handle invalid working directory gracefully', () => {
280
+ const pack: PackConfigV1 = {
281
+ version: 1,
282
+ name: 'test-pack',
283
+ gates: [],
284
+ };
285
+
286
+ // Should not throw during construction
287
+ expect(() => {
288
+ new Phase3Runner({
289
+ workingDir: '/nonexistent/directory',
290
+ pack,
291
+ });
292
+ }).not.toThrow();
293
+ });
294
+
295
+ it('should handle pack with no gates', async () => {
296
+ const pack: PackConfigV1 = {
297
+ version: 1,
298
+ name: 'empty-pack',
299
+ gates: [],
300
+ };
301
+
302
+ const runner = new Phase3Runner({
303
+ workingDir: testDir,
304
+ pack,
305
+ });
306
+
307
+ expect(runner).toBeDefined();
308
+ });
309
+ });
310
+
311
+ describe('Phase3Runner - End-to-End Execution', () => {
312
+ let testDir: string;
313
+
314
+ beforeEach(() => {
315
+ testDir = join(tmpdir(), `qa360-phase3-e2e-${Date.now()}`);
316
+ mkdirSync(testDir, { recursive: true });
317
+ });
318
+
319
+ afterEach(() => {
320
+ if (existsSync(testDir)) {
321
+ rmSync(testDir, { recursive: true, force: true });
322
+ }
323
+ });
324
+
325
+ it('should execute pack with no gates successfully', async () => {
326
+ const pack: PackConfigV1 = {
327
+ version: 1,
328
+ name: 'empty-pack',
329
+ gates: [],
330
+ };
331
+
332
+ const runner = new Phase3Runner({
333
+ workingDir: testDir,
334
+ pack,
335
+ });
336
+
337
+ const result = await runner.run();
338
+
339
+ expect(result.success).toBe(true);
340
+ expect(result.summary.total).toBe(0);
341
+ expect(result.summary.passed).toBe(0);
342
+ expect(result.summary.failed).toBe(0);
343
+ expect(result.summary.trustScore).toBe(0);
344
+ expect(result.gates).toEqual([]);
345
+ expect(result.proofPath).toBeDefined();
346
+ }, 30000); // 30s timeout for initialization
347
+
348
+ it('should handle pack file creation and output directory', async () => {
349
+ const pack: PackConfigV1 = {
350
+ version: 1,
351
+ name: 'output-test',
352
+ gates: [],
353
+ };
354
+
355
+ // Create pack file
356
+ const packPath = join(testDir, 'qa360.yml');
357
+ writeFileSync(packPath, JSON.stringify(pack));
358
+
359
+ const runner = new Phase3Runner({
360
+ workingDir: testDir,
361
+ pack,
362
+ });
363
+
364
+ const result = await runner.run();
365
+
366
+ expect(result.success).toBe(true);
367
+ expect(existsSync(join(testDir, '.qa360', 'runs'))).toBe(true);
368
+ expect(result.proofPath).toBeDefined();
369
+ }, 30000);
370
+ });
371
+
372
+ describe('Phase3Runner - Real Gate Execution', () => {
373
+ let testDir: string;
374
+
375
+ beforeEach(() => {
376
+ testDir = join(tmpdir(), `qa360-phase3-gates-${Date.now()}`);
377
+ mkdirSync(testDir, { recursive: true });
378
+ });
379
+
380
+ afterEach(() => {
381
+ if (existsSync(testDir)) {
382
+ rmSync(testDir, { recursive: true, force: true });
383
+ }
384
+ });
385
+
386
+ // TODO: Flaky test on Node 20 CI - passes on Node 18/22 and locally
387
+ // Skip until network issue is investigated
388
+ it.skip('should execute api_smoke gate with real HTTP calls', async () => {
389
+ const pack: PackConfigV1 = {
390
+ version: 1,
391
+ name: 'api-smoke-test',
392
+ gates: ['api_smoke'],
393
+ targets: {
394
+ api: {
395
+ baseUrl: 'https://httpbin.org',
396
+ smoke: [
397
+ 'GET /get -> 200',
398
+ 'GET /status/200 -> 200',
399
+ ]
400
+ }
401
+ }
402
+ };
403
+
404
+ const runner = new Phase3Runner({
405
+ workingDir: testDir,
406
+ pack,
407
+ });
408
+
409
+ const result = await runner.run();
410
+
411
+ // Verify execution
412
+ expect(result.gates).toHaveLength(1);
413
+ expect(result.gates[0].gate).toBe('api_smoke');
414
+ expect(result.gates[0].adapter).toBe('playwright-native-api');
415
+ expect(result.gates[0].success).toBe(true);
416
+ expect(result.gates[0].duration).toBeGreaterThan(0);
417
+
418
+ // Verify summary
419
+ expect(result.summary.total).toBe(1);
420
+ expect(result.summary.passed).toBe(1);
421
+ expect(result.summary.failed).toBe(0);
422
+ expect(result.summary.trustScore).toBeGreaterThan(0);
423
+
424
+ // Verify proof generation
425
+ expect(result.success).toBe(true);
426
+ expect(result.proofPath).toBeDefined();
427
+ expect(existsSync(result.proofPath!)).toBe(true);
428
+ }, 60000); // 60s timeout for network calls
429
+
430
+ it('should handle api_smoke gate failure gracefully', async () => {
431
+ const pack: PackConfigV1 = {
432
+ version: 1,
433
+ name: 'api-smoke-fail-test',
434
+ gates: ['api_smoke'],
435
+ targets: {
436
+ api: {
437
+ baseUrl: 'https://httpbin.org',
438
+ smoke: [
439
+ 'GET /status/404 -> 200', // Expected 200 but will get 404
440
+ ]
441
+ }
442
+ }
443
+ };
444
+
445
+ const runner = new Phase3Runner({
446
+ workingDir: testDir,
447
+ pack,
448
+ });
449
+
450
+ const result = await runner.run();
451
+
452
+ // Gate should fail but execution should complete
453
+ expect(result.gates).toHaveLength(1);
454
+ expect(result.gates[0].gate).toBe('api_smoke');
455
+ expect(result.gates[0].success).toBe(false);
456
+ expect(result.gates[0].error).toBeDefined();
457
+
458
+ // Overall result should be failure
459
+ expect(result.success).toBe(false);
460
+ expect(result.summary.failed).toBe(1);
461
+
462
+ // Proof should still be generated
463
+ expect(result.proofPath).toBeDefined();
464
+ }, 60000);
465
+
466
+ it('should execute multiple gates in sequence', async () => {
467
+ const pack: PackConfigV1 = {
468
+ version: 1,
469
+ name: 'multi-gate-test',
470
+ gates: ['api_smoke'],
471
+ targets: {
472
+ api: {
473
+ baseUrl: 'https://httpbin.org',
474
+ smoke: ['GET /get -> 200']
475
+ }
476
+ }
477
+ };
478
+
479
+ const runner = new Phase3Runner({
480
+ workingDir: testDir,
481
+ pack,
482
+ });
483
+
484
+ const result = await runner.run();
485
+
486
+ expect(result.gates.length).toBeGreaterThan(0);
487
+ expect(result.duration).toBeGreaterThan(0);
488
+ expect(result.proofPath).toBeDefined();
489
+ }, 60000);
490
+
491
+ it('should handle unknown gate type', async () => {
492
+ const pack: PackConfigV1 = {
493
+ version: 1,
494
+ name: 'unknown-gate-test',
495
+ gates: ['unknown_gate' as any],
496
+ };
497
+
498
+ const runner = new Phase3Runner({
499
+ workingDir: testDir,
500
+ pack,
501
+ });
502
+
503
+ const result = await runner.run();
504
+
505
+ // Should complete but with error
506
+ expect(result.gates).toHaveLength(1);
507
+ expect(result.gates[0].success).toBe(false);
508
+ expect(result.gates[0].error).toContain('Unknown gate');
509
+ }, 30000);
510
+
511
+ it('should respect on_failure=stop setting', async () => {
512
+ const pack: PackConfigV1 = {
513
+ version: 1,
514
+ name: 'stop-on-failure-test',
515
+ gates: ['api_smoke', 'ui'], // Second gate won't run if first fails
516
+ targets: {
517
+ api: {
518
+ baseUrl: 'https://httpbin.org',
519
+ smoke: ['GET /status/500 -> 200'] // Will fail
520
+ }
521
+ },
522
+ execution: {
523
+ on_failure: 'stop'
524
+ }
525
+ };
526
+
527
+ const runner = new Phase3Runner({
528
+ workingDir: testDir,
529
+ pack,
530
+ });
531
+
532
+ const result = await runner.run();
533
+
534
+ // Only first gate should have executed
535
+ expect(result.gates.length).toBeLessThanOrEqual(1);
536
+ expect(result.success).toBe(false);
537
+ }, 60000);
538
+
539
+ it('should continue with on_failure=continue setting', async () => {
540
+ const pack: PackConfigV1 = {
541
+ version: 1,
542
+ name: 'continue-on-failure-test',
543
+ gates: ['api_smoke'],
544
+ targets: {
545
+ api: {
546
+ baseUrl: 'https://httpbin.org',
547
+ smoke: ['GET /status/500 -> 200'] // Will fail
548
+ }
549
+ },
550
+ execution: {
551
+ on_failure: 'continue'
552
+ }
553
+ };
554
+
555
+ const runner = new Phase3Runner({
556
+ workingDir: testDir,
557
+ pack,
558
+ });
559
+
560
+ const result = await runner.run();
561
+
562
+ // All gates should execute despite failures
563
+ expect(result.gates).toHaveLength(1);
564
+ expect(result.success).toBe(false);
565
+ expect(result.proofPath).toBeDefined(); // Proof still generated
566
+ }, 60000);
567
+ });
568
+
569
+ describe('Phase3Runner - Mocked Gate Execution', () => {
570
+ let testDir: string;
571
+
572
+ beforeEach(() => {
573
+ testDir = join(tmpdir(), `qa360-phase3-mocked-${Date.now()}`);
574
+ mkdirSync(testDir, { recursive: true });
575
+ });
576
+
577
+ afterEach(() => {
578
+ if (existsSync(testDir)) {
579
+ rmSync(testDir, { recursive: true, force: true });
580
+ }
581
+ vi.clearAllMocks();
582
+ });
583
+
584
+ it('should execute ui gate successfully', async () => {
585
+ // Mock PlaywrightUiAdapter
586
+ const mockUiAdapter = {
587
+ runSmokeTests: vi.fn().mockResolvedValue({
588
+ success: true,
589
+ summary: { total: 2, passed: 2, failed: 0 },
590
+ junit: '<testsuites><testsuite tests="2" failures="0"></testsuite></testsuites>'
591
+ })
592
+ };
593
+
594
+ // Inject mock by accessing private method
595
+ const pack: PackConfigV1 = {
596
+ version: 1,
597
+ name: 'ui-test',
598
+ gates: ['ui'],
599
+ targets: {
600
+ web: {
601
+ baseUrl: 'https://example.com',
602
+ pages: ['https://example.com']
603
+ }
604
+ }
605
+ };
606
+
607
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
608
+
609
+ // Mock the runUiGate method
610
+ const originalRunUiGate = (runner as any).runUiGate;
611
+ (runner as any).runUiGate = vi.fn().mockResolvedValue(mockUiAdapter.runSmokeTests());
612
+
613
+ const result = await runner.run();
614
+
615
+ expect(result.gates).toHaveLength(1);
616
+ expect(result.gates[0].gate).toBe('ui');
617
+ expect(result.gates[0].success).toBe(true);
618
+ expect(result.success).toBe(true);
619
+
620
+ // Restore original method
621
+ (runner as any).runUiGate = originalRunUiGate;
622
+ }, 30000);
623
+
624
+ it('should execute perf gate successfully', async () => {
625
+ const pack: PackConfigV1 = {
626
+ version: 1,
627
+ name: 'perf-test',
628
+ gates: ['perf'],
629
+ targets: {
630
+ api: {
631
+ baseUrl: 'https://httpbin.org'
632
+ }
633
+ }
634
+ };
635
+
636
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
637
+
638
+ // Mock the runPerfGate method
639
+ (runner as any).runPerfGate = vi.fn().mockResolvedValue({
640
+ success: true,
641
+ summary: { total: 1, passed: 1, failed: 0 },
642
+ metrics: { p95: 150, p99: 200 }
643
+ });
644
+
645
+ const result = await runner.run();
646
+
647
+ expect(result.gates).toHaveLength(1);
648
+ expect(result.gates[0].gate).toBe('perf');
649
+ expect(result.gates[0].success).toBe(true);
650
+ }, 30000);
651
+
652
+ it('should execute sast gate successfully', async () => {
653
+ const pack: PackConfigV1 = {
654
+ version: 1,
655
+ name: 'sast-test',
656
+ gates: ['sast'],
657
+ };
658
+
659
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
660
+
661
+ // Mock the runSastGate method
662
+ (runner as any).runSastGate = vi.fn().mockResolvedValue({
663
+ success: true,
664
+ summary: { total: 100, passed: 98, failed: 2 },
665
+ findings: []
666
+ });
667
+
668
+ const result = await runner.run();
669
+
670
+ expect(result.gates).toHaveLength(1);
671
+ expect(result.gates[0].gate).toBe('sast');
672
+ expect(result.gates[0].success).toBe(true);
673
+ }, 30000);
674
+
675
+ it('should execute dast gate successfully', async () => {
676
+ const pack: PackConfigV1 = {
677
+ version: 1,
678
+ name: 'dast-test',
679
+ gates: ['dast'],
680
+ targets: {
681
+ web: {
682
+ baseUrl: 'https://example.com'
683
+ }
684
+ }
685
+ };
686
+
687
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
688
+
689
+ // Mock the runDastGate method
690
+ (runner as any).runDastGate = vi.fn().mockResolvedValue({
691
+ success: true,
692
+ summary: { total: 50, passed: 50, failed: 0 },
693
+ findings: []
694
+ });
695
+
696
+ const result = await runner.run();
697
+
698
+ expect(result.gates).toHaveLength(1);
699
+ expect(result.gates[0].gate).toBe('dast');
700
+ expect(result.gates[0].success).toBe(true);
701
+ }, 30000);
702
+
703
+ it('should execute a11y gate successfully', async () => {
704
+ const pack: PackConfigV1 = {
705
+ version: 1,
706
+ name: 'a11y-test',
707
+ gates: ['a11y'],
708
+ targets: {
709
+ web: {
710
+ baseUrl: 'https://example.com',
711
+ pages: ['https://example.com']
712
+ }
713
+ }
714
+ };
715
+
716
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
717
+
718
+ // Mock the runA11yGate method (which calls runUiGate)
719
+ (runner as any).runA11yGate = vi.fn().mockResolvedValue({
720
+ success: true,
721
+ summary: { total: 1, passed: 1, failed: 0 },
722
+ a11y: { violations: 0 }
723
+ });
724
+
725
+ const result = await runner.run();
726
+
727
+ expect(result.gates).toHaveLength(1);
728
+ expect(result.gates[0].gate).toBe('a11y');
729
+ expect(result.gates[0].success).toBe(true);
730
+ }, 30000);
731
+
732
+ it('should execute all gates in order', async () => {
733
+ const pack: PackConfigV1 = {
734
+ version: 1,
735
+ name: 'all-gates-test',
736
+ gates: ['api_smoke', 'ui', 'perf', 'sast', 'dast', 'a11y'],
737
+ targets: {
738
+ api: {
739
+ baseUrl: 'https://httpbin.org',
740
+ smoke: ['GET /get -> 200']
741
+ },
742
+ web: {
743
+ baseUrl: 'https://example.com',
744
+ pages: ['https://example.com']
745
+ }
746
+ }
747
+ };
748
+
749
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
750
+
751
+ // Mock all gate methods except api_smoke (real)
752
+ (runner as any).runUiGate = vi.fn().mockResolvedValue({
753
+ success: true,
754
+ summary: { total: 1, passed: 1, failed: 0 }
755
+ });
756
+ (runner as any).runPerfGate = vi.fn().mockResolvedValue({
757
+ success: true,
758
+ summary: { total: 1, passed: 1, failed: 0 }
759
+ });
760
+ (runner as any).runSastGate = vi.fn().mockResolvedValue({
761
+ success: true,
762
+ summary: { total: 1, passed: 1, failed: 0 }
763
+ });
764
+ (runner as any).runDastGate = vi.fn().mockResolvedValue({
765
+ success: true,
766
+ summary: { total: 1, passed: 1, failed: 0 }
767
+ });
768
+ (runner as any).runA11yGate = vi.fn().mockResolvedValue({
769
+ success: true,
770
+ summary: { total: 1, passed: 1, failed: 0 }
771
+ });
772
+
773
+ const result = await runner.run();
774
+
775
+ expect(result.gates).toHaveLength(6);
776
+ expect(result.gates.map(g => g.gate)).toEqual([
777
+ 'api_smoke', 'ui', 'perf', 'sast', 'dast', 'a11y'
778
+ ]);
779
+ expect(result.summary.total).toBe(6);
780
+ expect(result.summary.passed).toBeGreaterThan(0);
781
+ }, 90000); // 90s for real api_smoke + mocked gates
782
+ });
783
+
784
+ describe('Phase3Runner - Pack v2 Support', () => {
785
+ let testDir: string;
786
+
787
+ beforeEach(() => {
788
+ testDir = join(tmpdir(), `qa360-phase3-v2-${Date.now()}`);
789
+ mkdirSync(testDir, { recursive: true });
790
+ });
791
+
792
+ afterEach(() => {
793
+ if (existsSync(testDir)) {
794
+ rmSync(testDir, { recursive: true, force: true });
795
+ }
796
+ });
797
+
798
+ it('should initialize with PackConfigV2', () => {
799
+ const pack: PackConfigV2 = {
800
+ version: 2,
801
+ name: 'test-pack-v2',
802
+ gates: {
803
+ api_smoke: {
804
+ adapter: 'playwright-api',
805
+ enabled: true
806
+ }
807
+ }
808
+ };
809
+
810
+ const runner = new Phase3Runner({
811
+ workingDir: testDir,
812
+ pack,
813
+ });
814
+
815
+ expect(runner).toBeDefined();
816
+ });
817
+
818
+ it('should detect pack v2 correctly', () => {
819
+ const packV2: PackConfigV2 = {
820
+ version: 2,
821
+ name: 'test-pack-v2',
822
+ gates: {
823
+ api_smoke: { adapter: 'playwright-api' }
824
+ }
825
+ };
826
+
827
+ const runner = new Phase3Runner({ workingDir: testDir, pack: packV2 });
828
+ const isPackV2 = (runner as any).isPackV2(packV2);
829
+
830
+ expect(isPackV2).toBe(true);
831
+ });
832
+
833
+ it('should detect pack v1 correctly', () => {
834
+ const packV1: PackConfigV1 = {
835
+ version: 1,
836
+ name: 'test-pack-v1',
837
+ gates: ['api_smoke']
838
+ };
839
+
840
+ const runner = new Phase3Runner({ workingDir: testDir, pack: packV1 });
841
+ const isPackV2 = (runner as any).isPackV2(packV1);
842
+
843
+ expect(isPackV2).toBe(false);
844
+ });
845
+
846
+ it('should get gates array from v2 pack', () => {
847
+ const pack: PackConfigV2 = {
848
+ version: 2,
849
+ name: 'test-pack-v2',
850
+ gates: {
851
+ api_smoke: { adapter: 'playwright-api', enabled: true },
852
+ ui: { adapter: 'playwright-ui', enabled: true },
853
+ sast: { adapter: 'semgrep', enabled: false } // disabled
854
+ }
855
+ };
856
+
857
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
858
+ const gates = (runner as any).getGatesArray();
859
+
860
+ expect(gates).toEqual(['api_smoke', 'ui']); // sast is disabled
861
+ });
862
+
863
+ it('should convert v2 hooks to v1 format', () => {
864
+ const pack: PackConfigV2 = {
865
+ version: 2,
866
+ name: 'test-pack-v2',
867
+ hooks: {
868
+ beforeAll: [
869
+ { type: 'run', command: 'echo "setup"', timeout: 5000 }
870
+ ]
871
+ },
872
+ gates: {}
873
+ };
874
+
875
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
876
+ const converted = (runner as any).convertV2HooksToV1(pack.hooks);
877
+
878
+ expect(converted.beforeAll).toHaveLength(1);
879
+ expect(converted.beforeAll[0].run).toBe('echo "setup"');
880
+ expect(converted.beforeAll[0].timeout).toBe(5000);
881
+ });
882
+
883
+ it('should convert v2 execution to v1 format', () => {
884
+ const pack: PackConfigV2 = {
885
+ version: 2,
886
+ name: 'test-pack-v2',
887
+ execution: {
888
+ default_timeout: 15000,
889
+ default_retries: 3,
890
+ on_failure: 'stop'
891
+ },
892
+ gates: {}
893
+ };
894
+
895
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
896
+ const converted = (runner as any).convertV2ExecutionToV1(pack.execution);
897
+
898
+ expect(converted.timeout).toBe(15000);
899
+ expect(converted.max_retries).toBe(3);
900
+ expect(converted.on_failure).toBe('stop');
901
+ });
902
+
903
+ it('should execute v2 pack with no gates successfully', async () => {
904
+ const pack: PackConfigV2 = {
905
+ version: 2,
906
+ name: 'empty-pack-v2',
907
+ gates: {}
908
+ };
909
+
910
+ const runner = new Phase3Runner({
911
+ workingDir: testDir,
912
+ pack,
913
+ });
914
+
915
+ const result = await runner.run();
916
+
917
+ expect(result.success).toBe(true);
918
+ expect(result.summary.total).toBe(0);
919
+ expect(result.proofPath).toBeDefined();
920
+ }, 30000);
921
+ });
922
+
923
+ describe('Phase3Runner - Auth Integration', () => {
924
+ let testDir: string;
925
+
926
+ beforeEach(() => {
927
+ testDir = join(tmpdir(), `qa360-phase3-auth-${Date.now()}`);
928
+ mkdirSync(testDir, { recursive: true });
929
+ });
930
+
931
+ afterEach(() => {
932
+ if (existsSync(testDir)) {
933
+ rmSync(testDir, { recursive: true, force: true });
934
+ }
935
+ });
936
+
937
+ it('should register auth profiles from pack v2', () => {
938
+ const pack: PackConfigV2 = {
939
+ version: 2,
940
+ name: 'test-auth-pack',
941
+ auth: {
942
+ api: 'default-api',
943
+ profiles: {
944
+ 'default-api': {
945
+ type: 'bearer',
946
+ config: { token: 'test-token-123' }
947
+ },
948
+ 'basic-auth': {
949
+ type: 'basic',
950
+ config: { username: 'user', password: 'pass' }
951
+ }
952
+ }
953
+ },
954
+ gates: {}
955
+ };
956
+
957
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
958
+ const authManager = (runner as any).authManager;
959
+
960
+ expect(authManager.listProfiles()).toContain('default-api');
961
+ expect(authManager.listProfiles()).toContain('basic-auth');
962
+ });
963
+
964
+ it('should get auth profile for api_smoke gate', () => {
965
+ const pack: PackConfigV2 = {
966
+ version: 2,
967
+ name: 'test-auth-pack',
968
+ auth: {
969
+ api: 'default-api',
970
+ profiles: {
971
+ 'default-api': {
972
+ type: 'api_key',
973
+ config: { key: 'secret-key' }
974
+ }
975
+ }
976
+ },
977
+ gates: {
978
+ api_smoke: { adapter: 'playwright-api' }
979
+ }
980
+ };
981
+
982
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
983
+ const profileName = (runner as any).getAuthProfileForGate('api_smoke');
984
+
985
+ expect(profileName).toBe('default-api');
986
+ });
987
+
988
+ it('should get auth profile for ui gate', () => {
989
+ const pack: PackConfigV2 = {
990
+ version: 2,
991
+ name: 'test-auth-pack',
992
+ auth: {
993
+ ui: 'ui-session',
994
+ profiles: {
995
+ 'ui-session': {
996
+ type: 'none',
997
+ config: {}
998
+ }
999
+ }
1000
+ },
1001
+ gates: {
1002
+ ui: { adapter: 'playwright-ui' }
1003
+ }
1004
+ };
1005
+
1006
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1007
+ const profileName = (runner as any).getAuthProfileForGate('ui');
1008
+
1009
+ expect(profileName).toBe('ui-session');
1010
+ });
1011
+
1012
+ it('should use gate-specific auth override', () => {
1013
+ const pack: PackConfigV2 = {
1014
+ version: 2,
1015
+ name: 'test-auth-pack',
1016
+ auth: {
1017
+ api: 'default-api',
1018
+ profiles: {
1019
+ 'default-api': {
1020
+ type: 'api_key',
1021
+ config: { key: 'default-key' }
1022
+ },
1023
+ 'override-auth': {
1024
+ type: 'bearer',
1025
+ config: { token: 'override-token' }
1026
+ }
1027
+ }
1028
+ },
1029
+ gates: {
1030
+ api_smoke: {
1031
+ adapter: 'playwright-api',
1032
+ auth: 'override-auth' // Override default
1033
+ }
1034
+ }
1035
+ };
1036
+
1037
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1038
+ const profileName = (runner as any).getAuthProfileForGate('api_smoke');
1039
+
1040
+ expect(profileName).toBe('override-auth');
1041
+ });
1042
+
1043
+ it('should return undefined for gate without auth in v1 pack', () => {
1044
+ const pack: PackConfigV1 = {
1045
+ version: 1,
1046
+ name: 'test-pack-v1',
1047
+ gates: ['api_smoke']
1048
+ };
1049
+
1050
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1051
+ const profileName = (runner as any).getAuthProfileForGate('api_smoke');
1052
+
1053
+ expect(profileName).toBeUndefined();
1054
+ });
1055
+
1056
+ it('should return undefined for gate without auth in v2 pack', () => {
1057
+ const pack: PackConfigV2 = {
1058
+ version: 2,
1059
+ name: 'test-pack-v2',
1060
+ gates: {
1061
+ api_smoke: { adapter: 'playwright-api' }
1062
+ }
1063
+ };
1064
+
1065
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1066
+ const profileName = (runner as any).getAuthProfileForGate('api_smoke');
1067
+
1068
+ expect(profileName).toBeUndefined();
1069
+ });
1070
+
1071
+ it('should cache credentials after authentication', async () => {
1072
+ const pack: PackConfigV2 = {
1073
+ version: 2,
1074
+ name: 'test-auth-cache',
1075
+ auth: {
1076
+ api: 'test-profile',
1077
+ profiles: {
1078
+ 'test-profile': {
1079
+ type: 'bearer',
1080
+ config: { token: 'cached-token' }
1081
+ }
1082
+ }
1083
+ },
1084
+ gates: {}
1085
+ };
1086
+
1087
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1088
+
1089
+ // First call - authenticate
1090
+ const credentials1 = await (runner as any).getCredentialsForGate('api_smoke');
1091
+ expect(credentials1).toBeDefined();
1092
+ expect(credentials1.headers?.Authorization).toContain('cached-token');
1093
+
1094
+ // Second call - should use cache
1095
+ const credentials2 = await (runner as any).getCredentialsForGate('api_smoke');
1096
+ expect(credentials2).toBeDefined();
1097
+ expect(credentials2.headers?.Authorization).toContain('cached-token');
1098
+ });
1099
+
1100
+ it('should handle v2 pack with disabled gate', () => {
1101
+ const pack: PackConfigV2 = {
1102
+ version: 2,
1103
+ name: 'test-disabled-gate',
1104
+ gates: {
1105
+ api_smoke: { adapter: 'playwright-api', enabled: true },
1106
+ ui: { adapter: 'playwright-ui', enabled: false },
1107
+ sast: { adapter: 'semgrep' } // enabled by default
1108
+ }
1109
+ };
1110
+
1111
+ const runner = new Phase3Runner({ workingDir: testDir, pack });
1112
+ const gates = (runner as any).getGatesArray();
1113
+
1114
+ expect(gates).toContain('api_smoke');
1115
+ expect(gates).toContain('sast');
1116
+ expect(gates).not.toContain('ui');
1117
+ });
1118
+ });