qa360 2.1.2 → 2.1.4

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 (866) hide show
  1. package/.BETA_TESTING_FEEDBACK.md +256 -0
  2. package/.claude/settings.local.json +151 -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 +62 -0
  25. package/check-branches.sh +32 -0
  26. package/cli/CHANGELOG.md +84 -0
  27. package/cli/LICENSE +24 -0
  28. package/cli/README.md +222 -0
  29. package/cli/examples/README.md +160 -0
  30. package/cli/package.json +76 -0
  31. package/cli/scripts/bundle-for-npm.sh +51 -0
  32. package/cli/scripts/validate-package.js +116 -0
  33. package/cli/src/__tests__/commands/doctor.test.ts +97 -0
  34. package/cli/src/__tests__/index.test.ts +15 -0
  35. package/cli/src/cli-minimal.ts +44 -0
  36. package/cli/src/commands/__tests__/crawl.test.ts +412 -0
  37. package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +156 -0
  38. package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +494 -0
  39. package/cli/src/commands/__tests__/e2e.test.ts +187 -0
  40. package/cli/src/commands/__tests__/flakiness.test.ts +528 -0
  41. package/cli/src/commands/__tests__/generate.test.ts +507 -0
  42. package/cli/src/commands/__tests__/history.integration.test.ts +358 -0
  43. package/cli/src/commands/__tests__/history.test.ts +433 -0
  44. package/cli/src/commands/__tests__/monitor-realworld.test.ts +199 -0
  45. package/cli/src/commands/__tests__/monitor.test.ts +81 -0
  46. package/cli/src/commands/__tests__/ollama.test.ts +529 -0
  47. package/cli/src/commands/__tests__/repair.test.ts +225 -0
  48. package/cli/src/commands/__tests__/report.integration.test.ts +167 -0
  49. package/cli/src/commands/__tests__/report.test.ts +294 -0
  50. package/cli/src/commands/__tests__/report.vitest.ts +288 -0
  51. package/cli/src/commands/__tests__/retry.test.ts +78 -0
  52. package/cli/src/commands/__tests__/run.integration.test.ts +240 -0
  53. package/cli/src/commands/__tests__/run.test.ts +346 -0
  54. package/cli/src/commands/__tests__/run.vitest.ts +301 -0
  55. package/cli/src/commands/__tests__/secrets.test.ts +114 -0
  56. package/cli/src/commands/__tests__/serve.test.ts +80 -0
  57. package/cli/src/commands/__tests__/verify.test.ts +103 -0
  58. package/cli/src/commands/ai.ts +579 -0
  59. package/cli/src/commands/ask.ts +678 -0
  60. package/cli/src/commands/coverage.ts +305 -0
  61. package/cli/src/commands/crawl.ts +155 -0
  62. package/cli/src/commands/doctor.ts +610 -0
  63. package/cli/src/commands/examples.ts +248 -0
  64. package/cli/src/commands/explain.ts +710 -0
  65. package/cli/src/commands/flakiness.ts +560 -0
  66. package/cli/src/commands/generate.ts +566 -0
  67. package/cli/src/commands/history.ts +914 -0
  68. package/cli/src/commands/init.ts +763 -0
  69. package/cli/src/commands/monitor.ts +270 -0
  70. package/cli/src/commands/ollama.ts +337 -0
  71. package/cli/src/commands/pack.ts +497 -0
  72. package/cli/src/commands/regression.ts +400 -0
  73. package/cli/src/commands/repair.ts +356 -0
  74. package/cli/src/commands/report.ts +463 -0
  75. package/cli/src/commands/retry.ts +380 -0
  76. package/cli/src/commands/run.ts +218 -0
  77. package/cli/src/commands/scan.ts +177 -0
  78. package/cli/src/commands/secrets.ts +340 -0
  79. package/cli/src/commands/serve.ts +194 -0
  80. package/cli/src/commands/slo.ts +387 -0
  81. package/cli/src/commands/verify-temp-note.md +11 -0
  82. package/cli/src/commands/verify.ts +322 -0
  83. package/cli/src/generators/index.ts +6 -0
  84. package/cli/src/generators/json-reporter.ts +15 -0
  85. package/cli/src/generators/test-generator.ts +90 -0
  86. package/cli/src/index.ts +289 -0
  87. package/cli/src/scanners/dom-scanner.ts +360 -0
  88. package/cli/src/scanners/index.ts +5 -0
  89. package/cli/src/types/scan.ts +84 -0
  90. package/cli/src/utils/config.ts +145 -0
  91. package/cli/tsconfig.bundle.json +12 -0
  92. package/cli/tsconfig.json +23 -0
  93. package/cli/vitest.config.ts +57 -0
  94. package/core/LICENSE +24 -0
  95. package/core/README.md +64 -0
  96. package/core/package.json +81 -0
  97. package/core/src/__tests__/adapters-contract/adapters-contract.test.md +156 -0
  98. package/core/src/__tests__/index.test.ts +31 -0
  99. package/core/src/__tests__/integration/phase3.test.ts +405 -0
  100. package/core/src/__tests__/pack/validator.test.ts +312 -0
  101. package/core/src/__tests__/secrets/crypto.test.ts +190 -0
  102. package/core/src/__tests__/secrets/manager.test.ts +316 -0
  103. package/core/src/__tests__/security/redactor-phase3.test.ts +233 -0
  104. package/core/src/__tests__/serve/health-checker.test.ts +155 -0
  105. package/core/src/__tests__/serve/process-manager.test.ts +213 -0
  106. package/core/src/__tests__/serve/server.test.ts +103 -0
  107. package/core/src/__tests__/vault/cas.test.ts +178 -0
  108. package/core/src/__tests__/vault/vault.test.ts +296 -0
  109. package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +452 -0
  110. package/core/src/adapters/__tests__/k6-perf.test.ts +538 -0
  111. package/core/src/adapters/__tests__/osv-deps.test.ts +471 -0
  112. package/core/src/adapters/__tests__/playwright-native-api.test.ts +792 -0
  113. package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +431 -0
  114. package/core/src/adapters/__tests__/playwright-ui.test.ts +1073 -0
  115. package/core/src/adapters/__tests__/semgrep-sast.test.ts +436 -0
  116. package/core/src/adapters/__tests__/zap-dast.test.ts +453 -0
  117. package/core/src/adapters/gitleaks-secrets.ts +521 -0
  118. package/core/src/adapters/k6-perf.ts +479 -0
  119. package/core/src/adapters/osv-deps.ts +467 -0
  120. package/core/src/adapters/playwright-native-adapter.ts +472 -0
  121. package/core/src/adapters/playwright-native-api.ts +619 -0
  122. package/core/src/adapters/playwright-ui.ts +1088 -0
  123. package/core/src/adapters/semgrep-sast.ts +410 -0
  124. package/core/src/adapters/zap-dast.ts +551 -0
  125. package/core/src/ai/__tests__/deepseek-provider.test.ts +586 -0
  126. package/core/src/ai/__tests__/ollama-provider.test.ts +641 -0
  127. package/core/src/ai/anthropic-provider.ts +248 -0
  128. package/core/src/ai/deepseek-provider.ts +301 -0
  129. package/core/src/ai/index.ts +87 -0
  130. package/core/src/ai/llm-client.ts +52 -0
  131. package/core/src/ai/mock-provider.ts +146 -0
  132. package/core/src/ai/ollama-provider.ts +255 -0
  133. package/core/src/ai/openai-provider.ts +226 -0
  134. package/core/src/ai/provider-factory.ts +408 -0
  135. package/core/src/artifacts/README.md +78 -0
  136. package/core/src/artifacts/index.ts +16 -0
  137. package/core/src/artifacts/ui-artifacts.ts +412 -0
  138. package/core/src/assertions/__tests__/engine.test.ts +360 -0
  139. package/core/src/assertions/engine.ts +577 -0
  140. package/core/src/assertions/index.ts +13 -0
  141. package/core/src/assertions/types.ts +229 -0
  142. package/core/src/auth/__tests__/api-key-provider.test.ts +282 -0
  143. package/core/src/auth/__tests__/auth-manager.test.ts +430 -0
  144. package/core/src/auth/__tests__/basic-auth-provider.test.ts +364 -0
  145. package/core/src/auth/__tests__/cloud-providers.test.ts +751 -0
  146. package/core/src/auth/__tests__/jwt-provider.test.ts +400 -0
  147. package/core/src/auth/__tests__/oauth2-provider.test.ts +383 -0
  148. package/core/src/auth/__tests__/totp-provider.test.ts +294 -0
  149. package/core/src/auth/__tests__/ui-login-provider.test.ts +323 -0
  150. package/core/src/auth/api-key-provider.ts +75 -0
  151. package/core/src/auth/aws-iam-provider.ts +212 -0
  152. package/core/src/auth/azure-ad-provider.ts +126 -0
  153. package/core/src/auth/basic-auth-provider.ts +133 -0
  154. package/core/src/auth/gcp-adc-provider.ts +146 -0
  155. package/core/src/auth/index.ts +342 -0
  156. package/core/src/auth/jwt-provider.ts +193 -0
  157. package/core/src/auth/manager.ts +281 -0
  158. package/core/src/auth/oauth2-provider.ts +141 -0
  159. package/core/src/auth/totp-provider.ts +163 -0
  160. package/core/src/auth/ui-login-provider.ts +242 -0
  161. package/core/src/cache/__tests__/lru-cache.test.ts +564 -0
  162. package/core/src/cache/index.ts +13 -0
  163. package/core/src/cache/lru-cache.ts +536 -0
  164. package/core/src/crawler/__tests__/journey-generator.test.ts +344 -0
  165. package/core/src/crawler/__tests__/selector-generator.test.ts +211 -0
  166. package/core/src/crawler/index.ts +335 -0
  167. package/core/src/crawler/journey-generator.ts +471 -0
  168. package/core/src/crawler/page-analyzer.ts +857 -0
  169. package/core/src/crawler/selector-generator.ts +280 -0
  170. package/core/src/crawler/types.ts +475 -0
  171. package/core/src/dashboard/__tests__/real-world.test.ts +430 -0
  172. package/core/src/dashboard/__tests__/server.test.ts +283 -0
  173. package/core/src/dashboard/__tests__/types.test.ts +208 -0
  174. package/core/src/dashboard/assets.ts +692 -0
  175. package/core/src/dashboard/index.ts +17 -0
  176. package/core/src/dashboard/server.ts +401 -0
  177. package/core/src/dashboard/types.ts +78 -0
  178. package/core/src/discoverer/__tests__/test-discoverer.test.ts +444 -0
  179. package/core/src/discoverer/index.ts +374 -0
  180. package/core/src/flakiness/__tests__/flakiness.test.ts +554 -0
  181. package/core/src/flakiness/index.ts +536 -0
  182. package/core/src/generation/__tests__/code-formatter.test.ts +170 -0
  183. package/core/src/generation/__tests__/code-generator-contract.test.ts +207 -0
  184. package/core/src/generation/__tests__/code-generator.test.ts +586 -0
  185. package/core/src/generation/__tests__/crawler-pack-generator.test.ts +479 -0
  186. package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +718 -0
  187. package/core/src/generation/__tests__/generation-integration.test.ts +655 -0
  188. package/core/src/generation/__tests__/pack-generator.test.ts +408 -0
  189. package/core/src/generation/__tests__/prompt-builder.test.ts +200 -0
  190. package/core/src/generation/__tests__/real-provider-integration.test.ts +414 -0
  191. package/core/src/generation/__tests__/source-analyzer.test.ts +774 -0
  192. package/core/src/generation/__tests__/test-optimizer.test.ts +255 -0
  193. package/core/src/generation/code-formatter.ts +408 -0
  194. package/core/src/generation/code-generator.ts +470 -0
  195. package/core/src/generation/crawler-pack-generator.ts +289 -0
  196. package/core/src/generation/generator.ts +113 -0
  197. package/core/src/generation/index.ts +59 -0
  198. package/core/src/generation/pack-generator.ts +527 -0
  199. package/core/src/generation/prompt-builder.ts +772 -0
  200. package/core/src/generation/source-analyzer.ts +830 -0
  201. package/core/src/generation/test-optimizer.ts +474 -0
  202. package/core/src/generation/types.ts +217 -0
  203. package/core/src/hooks/__tests__/compose.test.ts +636 -0
  204. package/core/src/hooks/__tests__/runner.test.ts +478 -0
  205. package/core/src/hooks/compose.ts +268 -0
  206. package/core/src/hooks/runner.ts +364 -0
  207. package/core/src/index.ts +237 -0
  208. package/core/src/pack/__tests__/migrator.test.ts +594 -0
  209. package/core/src/pack/__tests__/validator.test.ts +759 -0
  210. package/core/src/pack/migrator.ts +353 -0
  211. package/core/src/pack/validator.ts +359 -0
  212. package/core/src/pack-v2/__tests__/loader.test.ts +533 -0
  213. package/core/src/pack-v2/__tests__/migrator.test.ts +455 -0
  214. package/core/src/pack-v2/__tests__/validator.test.ts +549 -0
  215. package/core/src/pack-v2/index.ts +41 -0
  216. package/core/src/pack-v2/loader.ts +321 -0
  217. package/core/src/pack-v2/migrator.ts +540 -0
  218. package/core/src/pack-v2/validator.ts +673 -0
  219. package/core/src/parallel/README.md +143 -0
  220. package/core/src/parallel/index.ts +16 -0
  221. package/core/src/parallel/parallel-runner.ts +282 -0
  222. package/core/src/proof/__tests__/proof-roundtrip.test.ts +149 -0
  223. package/core/src/proof/__tests__/schema-validation-manual.mjs +211 -0
  224. package/core/src/proof/__tests__/schema-validation.test.ts +336 -0
  225. package/core/src/proof/__tests__/signer.test.ts +486 -0
  226. package/core/src/proof/__tests__/temporal-regression.test.ts +537 -0
  227. package/core/src/proof/__tests__/verifier-advanced.test.ts +588 -0
  228. package/core/src/proof/__tests__/verifier.test.ts +413 -0
  229. package/core/src/proof/bundle.ts +290 -0
  230. package/core/src/proof/canonicalize.ts +116 -0
  231. package/core/src/proof/index.ts +74 -0
  232. package/core/src/proof/schema.ts +285 -0
  233. package/core/src/proof/signer.ts +293 -0
  234. package/core/src/proof/verifier.ts +380 -0
  235. package/core/src/regression/__tests__/detector.test.ts +396 -0
  236. package/core/src/regression/__tests__/trend-analyzer.test.ts +300 -0
  237. package/core/src/regression/detector.ts +629 -0
  238. package/core/src/regression/index.ts +34 -0
  239. package/core/src/regression/trend-analyzer.ts +468 -0
  240. package/core/src/regression/types.ts +295 -0
  241. package/core/src/regression/vault.ts +419 -0
  242. package/core/src/repair/__tests__/repairer.test.ts +572 -0
  243. package/core/src/repair/__tests__/types.test.ts +302 -0
  244. package/core/src/repair/engine/__tests__/fixer.test.ts +482 -0
  245. package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +395 -0
  246. package/core/src/repair/engine/fixer.ts +271 -0
  247. package/core/src/repair/engine/suggestion-engine.ts +234 -0
  248. package/core/src/repair/index.ts +53 -0
  249. package/core/src/repair/repairer.ts +376 -0
  250. package/core/src/repair/types.ts +119 -0
  251. package/core/src/repair/utils/__tests__/error-analyzer.test.ts +454 -0
  252. package/core/src/repair/utils/error-analyzer.ts +308 -0
  253. package/core/src/reporting/README.md +144 -0
  254. package/core/src/reporting/html-reporter.ts +835 -0
  255. package/core/src/reporting/index.ts +16 -0
  256. package/core/src/retry/README.md +192 -0
  257. package/core/src/retry/__tests__/flakiness-integration.test.ts +475 -0
  258. package/core/src/retry/__tests__/retry-engine.test.ts +424 -0
  259. package/core/src/retry/flakiness-integration.ts +267 -0
  260. package/core/src/retry/index.ts +48 -0
  261. package/core/src/retry/retry-engine.ts +368 -0
  262. package/core/src/retry/types.ts +208 -0
  263. package/core/src/retry/vault.ts +413 -0
  264. package/core/src/runner/__tests__/flakiness-integration.test.ts +566 -0
  265. package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +218 -0
  266. package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +199 -0
  267. package/core/src/runner/__tests__/phase3-runner.test.ts +1118 -0
  268. package/core/src/runner/e2e-helpers.ts +216 -0
  269. package/core/src/runner/phase3-runner.ts +1236 -0
  270. package/core/src/schemas/gherkin-report.json +122 -0
  271. package/core/src/secrets/__tests__/crypto.test.ts +180 -0
  272. package/core/src/secrets/crypto.ts +289 -0
  273. package/core/src/secrets/manager.ts +272 -0
  274. package/core/src/security/__tests__/hardening.test.ts +480 -0
  275. package/core/src/security/redaction-patterns-extended.ts +278 -0
  276. package/core/src/security/redactor.ts +326 -0
  277. package/core/src/self-healing/assertion-healer.ts +485 -0
  278. package/core/src/self-healing/engine.ts +626 -0
  279. package/core/src/self-healing/index.ts +33 -0
  280. package/core/src/self-healing/selector-healer.ts +488 -0
  281. package/core/src/self-healing/types.ts +193 -0
  282. package/core/src/serve/diagnostics-collector.ts +201 -0
  283. package/core/src/serve/health-checker.ts +274 -0
  284. package/core/src/serve/index.ts +9 -0
  285. package/core/src/serve/metrics-collector.ts +386 -0
  286. package/core/src/serve/process-manager.ts +265 -0
  287. package/core/src/serve/server.ts +230 -0
  288. package/core/src/slo/config.ts +408 -0
  289. package/core/src/slo/index.ts +68 -0
  290. package/core/src/slo/sli-calculator.ts +474 -0
  291. package/core/src/slo/slo-tracker.ts +481 -0
  292. package/core/src/slo/types.ts +408 -0
  293. package/core/src/slo/vault.ts +600 -0
  294. package/core/src/tui/__tests__/monitor.test.ts +336 -0
  295. package/core/src/tui/__tests__/real-world.test.ts +376 -0
  296. package/core/src/tui/__tests__/renderer.test.ts +201 -0
  297. package/core/src/tui/__tests__/types.test.ts +295 -0
  298. package/core/src/tui/index.ts +19 -0
  299. package/core/src/tui/monitor.ts +331 -0
  300. package/core/src/tui/renderer.ts +269 -0
  301. package/core/src/tui/types.ts +68 -0
  302. package/core/src/types/pack-v1.ts +305 -0
  303. package/core/src/types/pack-v2.ts +491 -0
  304. package/core/src/types/trust-score.ts +258 -0
  305. package/core/src/vault/__tests__/flakiness-vault.test.ts +562 -0
  306. package/core/src/vault/__tests__/vault.test.ts +259 -0
  307. package/core/src/vault/cas.ts +323 -0
  308. package/core/src/vault/index.ts +1361 -0
  309. package/core/src/vault/schema.sql +168 -0
  310. package/core/src/visual/README.md +185 -0
  311. package/core/src/visual/index.ts +14 -0
  312. package/core/src/visual/visual-regression.ts +347 -0
  313. package/core/src/watch/__tests__/watch-mode.test.ts +192 -0
  314. package/core/src/watch/index.ts +14 -0
  315. package/core/src/watch/watch-mode.ts +565 -0
  316. package/core/tsconfig.json +12 -0
  317. package/core/vitest.config.ts +52 -0
  318. package/docs/ARCHITECTURE.md +901 -0
  319. package/docs/AUDIT-GLOBAL-DEC2025.md +271 -0
  320. package/docs/BETA_TESTING.md +257 -0
  321. package/docs/BETA_TESTING_PLAN.md +727 -0
  322. package/docs/CERTIFICATION-REPORT.md +142 -0
  323. package/docs/COMPLETE_AUDIT_REFACTORING.md +965 -0
  324. package/docs/DEVELOPMENT.md +331 -0
  325. package/docs/DEVELOPMENT_HISTORY.md +345 -0
  326. package/docs/LIMITATIONS.md +176 -0
  327. package/docs/MIGRATION.md +303 -0
  328. package/docs/OPTION_3_4_EXPLORATION.md +1257 -0
  329. package/docs/PHASE1_PERFORMANCE.md +144 -0
  330. package/docs/QA360_Cloud.postman_collection.json +89 -0
  331. package/docs/README.md +50 -0
  332. package/docs/STATUS.md +179 -0
  333. package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +615 -0
  334. package/docs/USER_GUIDE.md +687 -0
  335. package/docs/WORK-DONE-ADAPTER-TESTS.md +136 -0
  336. package/docs/adapters-security.md +485 -0
  337. package/docs/architecture-diagram.mmd +168 -0
  338. package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +396 -0
  339. package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +324 -0
  340. package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +644 -0
  341. package/docs/archive/ARCH-01_NEXT_STEPS.md +60 -0
  342. package/docs/archive/BRANCH_PROTECTION.md +183 -0
  343. package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +222 -0
  344. package/docs/archive/HANDOFF_TEST-01.md +669 -0
  345. package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +372 -0
  346. package/docs/archive/NODE_UPGRADE_GUIDE.md +188 -0
  347. package/docs/archive/PHASE1_COMPLETION.md +386 -0
  348. package/docs/archive/PHASE2_COMPLETION.md +404 -0
  349. package/docs/archive/PHASE3_AND_4_FINAL.md +360 -0
  350. package/docs/archive/PHASE3_COMPLETE.md +301 -0
  351. package/docs/archive/PHASE3_STATUS.md +255 -0
  352. package/docs/archive/PRE-WEEK2-AUDIT.md +364 -0
  353. package/docs/archive/README.md +33 -0
  354. package/docs/archive/SCHEMA_AJV_2020_FIX.md +245 -0
  355. package/docs/archive/TEST-01_AUDIT_REPORT.md +240 -0
  356. package/docs/archive/TEST-01_COVERAGE_PLAN.md +423 -0
  357. package/docs/budgets-advanced.md +308 -0
  358. package/docs/examples/history-export-gc.md +285 -0
  359. package/docs/examples/pack-v2-complete.yaml +158 -0
  360. package/docs/examples/pack-v2-quickstart.yaml +24 -0
  361. package/docs/examples/pack-v2-ui-login.yaml +81 -0
  362. package/docs/examples/qa360-report.json +50 -0
  363. package/docs/history.md +565 -0
  364. package/docs/hooks.md +304 -0
  365. package/docs/llm-providers.md +419 -0
  366. package/docs/mcp-server.md +651 -0
  367. package/docs/mcp-tools.md +1131 -0
  368. package/docs/pack-v1.md +383 -0
  369. package/docs/pack-v2.md +558 -0
  370. package/docs/proofs.md +670 -0
  371. package/docs/quickstart-5min.md +257 -0
  372. package/docs/readiness-ci.md +654 -0
  373. package/docs/rfc/README.md +20 -0
  374. package/docs/rfc/proof-bundle-v1.md +787 -0
  375. package/docs/secrets.md +392 -0
  376. package/docs/serve.md +494 -0
  377. package/docs/vault.md +491 -0
  378. package/e2e/qa360-e2e.test.ts +696 -0
  379. package/e2e/vitest.config.ts +18 -0
  380. package/examples/README.md +30 -140
  381. package/examples/ci/docker-compose-serve.yml +375 -0
  382. package/examples/ci/github-actions-serve.yml +345 -0
  383. package/examples/ci/gitlab-ci-serve.yml +407 -0
  384. package/examples/datasets/README.md +101 -0
  385. package/examples/datasets/b2bshop.ts +155 -0
  386. package/examples/datasets/index.ts +57 -0
  387. package/examples/datasets/reqres.ts +195 -0
  388. package/examples/future-api/README.md +16 -0
  389. package/examples/future-api/diag.js +7 -0
  390. package/examples/future-api/health.js +4 -0
  391. package/examples/future-api/packs.js +13 -0
  392. package/examples/future-api/runpack.js +10 -0
  393. package/examples/generation/README.md +148 -0
  394. package/examples/generation/pack-generator-example.js +115 -0
  395. package/examples/generation/source-analyzer-example.js +115 -0
  396. package/examples/httpbin/pack.yml +59 -0
  397. package/examples/load-testing/mcp-load.yml +115 -0
  398. package/examples/load-testing/mcp-stdio.yml +95 -0
  399. package/examples/mcp/claude-desktop-config.json +33 -0
  400. package/examples/mcp/claude-desktop.json +16 -0
  401. package/examples/mcp/conversation-sample.md +131 -0
  402. package/examples/mcp/demo-60s.md +330 -0
  403. package/examples/mcp/sample-conversation.jsonl +21 -0
  404. package/examples/mcp/vscode-settings.json +22 -0
  405. package/examples/pack-v2-complete.yml +242 -0
  406. package/examples/pack-v2-examples.md +244 -0
  407. package/examples/pack-v2-quickstart.yml +55 -0
  408. package/examples/packs-business/ecommerce-api.yml +121 -0
  409. package/examples/packs-business/saas-dashboard-ui.yml +133 -0
  410. package/examples/packs-conformance/compose-multi.yml +174 -0
  411. package/examples/packs-conformance/full.yml +152 -0
  412. package/examples/packs-conformance/heavy-artifacts.yml +152 -0
  413. package/examples/packs-conformance/minimal.yml +71 -0
  414. package/examples/packs-conformance/secrets-missing.yml +97 -0
  415. package/examples/packs-conformance/timeouts.yml +77 -0
  416. package/examples/proofs/e2e-playwright-proof.json +75 -0
  417. package/examples/proofs/httpbin-proof.json +69 -0
  418. package/examples/proofs/multi-adapter-proof.json +117 -0
  419. package/examples/proofs/test-proof.json +26 -0
  420. package/examples/restful-api-dev/README.md +102 -0
  421. package/examples/restful-api-dev/restful-api-advanced.yml +29 -0
  422. package/examples/restful-api-dev/restful-api-basic.yml +29 -0
  423. package/examples/web-lite/.github/workflows/qa360-phase3.yml +73 -0
  424. package/examples/web-lite/api-mock/server.js +258 -0
  425. package/examples/web-lite/pack.yml +71 -0
  426. package/examples/web-lite/services.yml +43 -0
  427. package/examples/web-lite/web-content/healthz +1 -0
  428. package/examples/web-lite/web-content/index.html +259 -0
  429. package/package.json +55 -45
  430. package/packages/mcp/CHANGELOG.md +109 -0
  431. package/packages/mcp/IMPLEMENTATION_SUMMARY.md +350 -0
  432. package/packages/mcp/LICENSE +21 -0
  433. package/packages/mcp/QUICK_START.md +291 -0
  434. package/packages/mcp/README.md +294 -0
  435. package/packages/mcp/TELEMETRY.md +220 -0
  436. package/packages/mcp/package.json +92 -0
  437. package/packages/mcp/scripts/generate-sbom-fallback.cjs +84 -0
  438. package/packages/mcp/scripts/safe-postinstall.cjs +32 -0
  439. package/packages/mcp/src/__tests__/contract.test.ts +902 -0
  440. package/packages/mcp/src/cli/cli.ts +137 -0
  441. package/packages/mcp/src/cli/doctor.ts +286 -0
  442. package/packages/mcp/src/cli/fix.ts +99 -0
  443. package/packages/mcp/src/cli/init.ts +233 -0
  444. package/packages/mcp/src/cli/postinstall.ts +14 -0
  445. package/packages/mcp/src/cli/reset.ts +44 -0
  446. package/packages/mcp/src/cli/telemetry.ts +166 -0
  447. package/packages/mcp/src/cli/test-dx.ts +94 -0
  448. package/packages/mcp/src/cli/uninstall.ts +80 -0
  449. package/packages/mcp/src/cli/up.ts +178 -0
  450. package/packages/mcp/src/index.ts +12 -0
  451. package/packages/mcp/src/scripts/e2e-local.ts +337 -0
  452. package/packages/mcp/src/scripts/verify-settings.ts +242 -0
  453. package/packages/mcp/src/security/audit.ts +244 -0
  454. package/packages/mcp/src/security/manager.ts +242 -0
  455. package/packages/mcp/src/server/full-server.ts +212 -0
  456. package/packages/mcp/src/server/minimal-server.ts +134 -0
  457. package/packages/mcp/src/tools/history.ts +388 -0
  458. package/packages/mcp/src/tools/pack.ts +449 -0
  459. package/packages/mcp/src/tools/registry.ts +638 -0
  460. package/packages/mcp/src/tools/report.ts +100 -0
  461. package/packages/mcp/src/tools/run.ts +268 -0
  462. package/packages/mcp/src/tools/secrets.ts +198 -0
  463. package/packages/mcp/src/tools/serve.ts +221 -0
  464. package/packages/mcp/src/tools/triage.ts +532 -0
  465. package/packages/mcp/src/tools/types.ts +26 -0
  466. package/packages/mcp/src/tools/vault.ts +164 -0
  467. package/packages/mcp/src/tools/verify.ts +166 -0
  468. package/packages/mcp/src/types/index.ts +311 -0
  469. package/packages/mcp/src/types/mcp-stubs.ts +83 -0
  470. package/packages/mcp/tsconfig.json +16 -0
  471. package/playwright.config.ts +20 -0
  472. package/pnpm-workspace.yaml +4 -0
  473. package/run-test-and-push.sh +20 -0
  474. package/scripts/build-proof-cli.sh +110 -0
  475. package/scripts/ci/check-windows-paths.js +92 -0
  476. package/scripts/ci/invariants.sh +124 -0
  477. package/scripts/ci/make-final-bundle.js +106 -0
  478. package/scripts/ci/mcp-run-multipack.js +305 -0
  479. package/scripts/ci/run-pack-suite.sh +103 -0
  480. package/scripts/ci/run-phase7-final.sh +190 -0
  481. package/scripts/ci/slo-assert.js +158 -0
  482. package/scripts/ci/test-fault-tolerance.sh +301 -0
  483. package/scripts/install-mcp.sh +66 -0
  484. package/scripts/mcp-smoke.mjs +27 -0
  485. package/scripts/smoke.sh +26 -0
  486. package/scripts/stress-test.js +288 -0
  487. package/scripts/validate-examples.mjs +404 -0
  488. package/scripts/validation/simple-pack-check.sh +51 -0
  489. package/scripts/validation/validate-universal-pack.mjs +77 -0
  490. package/scripts/verify-persistence.js +127 -0
  491. package/test-pack.yaml +43 -0
  492. package/test-results/.last-run.json +4 -0
  493. package/test-runner.mjs +87 -0
  494. package/tests/artifacts.spec.js +147 -0
  495. package/tests/contracts.spec.js +239 -0
  496. package/tests/e2e/assertions.test.mjs +370 -0
  497. package/tests/e2e/crawler.test.mjs +451 -0
  498. package/tests/e2e/playwright-plus-plus.test.mjs +604 -0
  499. package/tests/e2e/proof-bundle.test.mjs +258 -0
  500. package/tests/e2e/real-world/saucedemo.test.mjs +714 -0
  501. package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +760 -0
  502. package/tests/e2e/ui-actions.test.mjs +546 -0
  503. package/tests/gherkin.e2e.spec.ts +310 -0
  504. package/tests/no-console-errors.spec.js +136 -0
  505. package/tests/pdf.spec.ts +252 -0
  506. package/tests/run-pack.spec.ts +58 -0
  507. package/tsconfig.base.json +15 -0
  508. package/tsconfig.build.json +8 -0
  509. package/tsconfig.json +37 -0
  510. package/tsconfig.test.json +18 -0
  511. package/typedoc.json +37 -0
  512. package/ui/README.md +51 -0
  513. package/verify-proof.mjs +60 -0
  514. package/dist/cli-minimal.d.ts +0 -6
  515. package/dist/cli-minimal.js +0 -36
  516. package/dist/commands/ai.d.ts +0 -41
  517. package/dist/commands/ai.js +0 -511
  518. package/dist/commands/ask.d.ts +0 -94
  519. package/dist/commands/ask.js +0 -582
  520. package/dist/commands/coverage.d.ts +0 -8
  521. package/dist/commands/coverage.js +0 -252
  522. package/dist/commands/crawl.d.ts +0 -24
  523. package/dist/commands/crawl.js +0 -121
  524. package/dist/commands/doctor.d.ts +0 -54
  525. package/dist/commands/doctor.js +0 -513
  526. package/dist/commands/examples.d.ts +0 -33
  527. package/dist/commands/examples.js +0 -193
  528. package/dist/commands/explain.d.ts +0 -27
  529. package/dist/commands/explain.js +0 -630
  530. package/dist/commands/flakiness.d.ts +0 -73
  531. package/dist/commands/flakiness.js +0 -435
  532. package/dist/commands/generate.d.ts +0 -66
  533. package/dist/commands/generate.js +0 -438
  534. package/dist/commands/history.d.ts +0 -76
  535. package/dist/commands/history.js +0 -757
  536. package/dist/commands/init.d.ts +0 -106
  537. package/dist/commands/init.js +0 -599
  538. package/dist/commands/monitor.d.ts +0 -27
  539. package/dist/commands/monitor.js +0 -225
  540. package/dist/commands/ollama.d.ts +0 -40
  541. package/dist/commands/ollama.js +0 -301
  542. package/dist/commands/pack.d.ts +0 -70
  543. package/dist/commands/pack.js +0 -413
  544. package/dist/commands/regression.d.ts +0 -8
  545. package/dist/commands/regression.js +0 -340
  546. package/dist/commands/repair.d.ts +0 -26
  547. package/dist/commands/repair.js +0 -307
  548. package/dist/commands/report.d.ts +0 -62
  549. package/dist/commands/report.js +0 -378
  550. package/dist/commands/retry.d.ts +0 -43
  551. package/dist/commands/retry.js +0 -275
  552. package/dist/commands/run.d.ts +0 -41
  553. package/dist/commands/run.js +0 -169
  554. package/dist/commands/scan.d.ts +0 -5
  555. package/dist/commands/scan.js +0 -155
  556. package/dist/commands/secrets.d.ts +0 -58
  557. package/dist/commands/secrets.js +0 -289
  558. package/dist/commands/serve.d.ts +0 -13
  559. package/dist/commands/serve.js +0 -156
  560. package/dist/commands/slo.d.ts +0 -8
  561. package/dist/commands/slo.js +0 -327
  562. package/dist/commands/verify.d.ts +0 -32
  563. package/dist/commands/verify.js +0 -278
  564. package/dist/core/adapters/gitleaks-secrets.d.ts +0 -114
  565. package/dist/core/adapters/gitleaks-secrets.js +0 -410
  566. package/dist/core/adapters/k6-perf.d.ts +0 -85
  567. package/dist/core/adapters/k6-perf.js +0 -398
  568. package/dist/core/adapters/osv-deps.d.ts +0 -123
  569. package/dist/core/adapters/osv-deps.js +0 -372
  570. package/dist/core/adapters/playwright-native-adapter.d.ts +0 -121
  571. package/dist/core/adapters/playwright-native-adapter.js +0 -339
  572. package/dist/core/adapters/playwright-native-api.d.ts +0 -183
  573. package/dist/core/adapters/playwright-native-api.js +0 -461
  574. package/dist/core/adapters/playwright-ui.d.ts +0 -197
  575. package/dist/core/adapters/playwright-ui.js +0 -840
  576. package/dist/core/adapters/semgrep-sast.d.ts +0 -99
  577. package/dist/core/adapters/semgrep-sast.js +0 -322
  578. package/dist/core/adapters/zap-dast.d.ts +0 -133
  579. package/dist/core/adapters/zap-dast.js +0 -424
  580. package/dist/core/ai/anthropic-provider.d.ts +0 -50
  581. package/dist/core/ai/anthropic-provider.js +0 -211
  582. package/dist/core/ai/deepseek-provider.d.ts +0 -81
  583. package/dist/core/ai/deepseek-provider.js +0 -254
  584. package/dist/core/ai/index.d.ts +0 -60
  585. package/dist/core/ai/index.js +0 -18
  586. package/dist/core/ai/llm-client.d.ts +0 -45
  587. package/dist/core/ai/llm-client.js +0 -7
  588. package/dist/core/ai/mock-provider.d.ts +0 -49
  589. package/dist/core/ai/mock-provider.js +0 -121
  590. package/dist/core/ai/ollama-provider.d.ts +0 -78
  591. package/dist/core/ai/ollama-provider.js +0 -192
  592. package/dist/core/ai/openai-provider.d.ts +0 -48
  593. package/dist/core/ai/openai-provider.js +0 -188
  594. package/dist/core/ai/provider-factory.d.ts +0 -160
  595. package/dist/core/ai/provider-factory.js +0 -269
  596. package/dist/core/artifacts/index.d.ts +0 -6
  597. package/dist/core/artifacts/index.js +0 -6
  598. package/dist/core/artifacts/ui-artifacts.d.ts +0 -133
  599. package/dist/core/artifacts/ui-artifacts.js +0 -304
  600. package/dist/core/assertions/engine.d.ts +0 -51
  601. package/dist/core/assertions/engine.js +0 -530
  602. package/dist/core/assertions/index.d.ts +0 -11
  603. package/dist/core/assertions/index.js +0 -11
  604. package/dist/core/assertions/types.d.ts +0 -121
  605. package/dist/core/assertions/types.js +0 -37
  606. package/dist/core/auth/api-key-provider.d.ts +0 -16
  607. package/dist/core/auth/api-key-provider.js +0 -63
  608. package/dist/core/auth/aws-iam-provider.d.ts +0 -35
  609. package/dist/core/auth/aws-iam-provider.js +0 -177
  610. package/dist/core/auth/azure-ad-provider.d.ts +0 -15
  611. package/dist/core/auth/azure-ad-provider.js +0 -99
  612. package/dist/core/auth/basic-auth-provider.d.ts +0 -26
  613. package/dist/core/auth/basic-auth-provider.js +0 -111
  614. package/dist/core/auth/gcp-adc-provider.d.ts +0 -27
  615. package/dist/core/auth/gcp-adc-provider.js +0 -126
  616. package/dist/core/auth/index.d.ts +0 -238
  617. package/dist/core/auth/index.js +0 -82
  618. package/dist/core/auth/jwt-provider.d.ts +0 -19
  619. package/dist/core/auth/jwt-provider.js +0 -160
  620. package/dist/core/auth/manager.d.ts +0 -84
  621. package/dist/core/auth/manager.js +0 -230
  622. package/dist/core/auth/oauth2-provider.d.ts +0 -17
  623. package/dist/core/auth/oauth2-provider.js +0 -114
  624. package/dist/core/auth/totp-provider.d.ts +0 -31
  625. package/dist/core/auth/totp-provider.js +0 -134
  626. package/dist/core/auth/ui-login-provider.d.ts +0 -26
  627. package/dist/core/auth/ui-login-provider.js +0 -198
  628. package/dist/core/cache/index.d.ts +0 -7
  629. package/dist/core/cache/index.js +0 -6
  630. package/dist/core/cache/lru-cache.d.ts +0 -203
  631. package/dist/core/cache/lru-cache.js +0 -397
  632. package/dist/core/core/coverage/analyzer.d.ts +0 -101
  633. package/dist/core/core/coverage/analyzer.js +0 -415
  634. package/dist/core/core/coverage/collector.d.ts +0 -74
  635. package/dist/core/core/coverage/collector.js +0 -459
  636. package/dist/core/core/coverage/config.d.ts +0 -37
  637. package/dist/core/core/coverage/config.js +0 -156
  638. package/dist/core/core/coverage/index.d.ts +0 -11
  639. package/dist/core/core/coverage/index.js +0 -15
  640. package/dist/core/core/coverage/types.d.ts +0 -267
  641. package/dist/core/core/coverage/types.js +0 -6
  642. package/dist/core/core/coverage/vault.d.ts +0 -95
  643. package/dist/core/core/coverage/vault.js +0 -405
  644. package/dist/core/coverage/analyzer.d.ts +0 -101
  645. package/dist/core/coverage/analyzer.js +0 -415
  646. package/dist/core/coverage/collector.d.ts +0 -74
  647. package/dist/core/coverage/collector.js +0 -459
  648. package/dist/core/coverage/config.d.ts +0 -37
  649. package/dist/core/coverage/config.js +0 -156
  650. package/dist/core/coverage/index.d.ts +0 -11
  651. package/dist/core/coverage/index.js +0 -15
  652. package/dist/core/coverage/types.d.ts +0 -267
  653. package/dist/core/coverage/types.js +0 -6
  654. package/dist/core/coverage/vault.d.ts +0 -95
  655. package/dist/core/coverage/vault.js +0 -405
  656. package/dist/core/crawler/index.d.ts +0 -57
  657. package/dist/core/crawler/index.js +0 -281
  658. package/dist/core/crawler/journey-generator.d.ts +0 -49
  659. package/dist/core/crawler/journey-generator.js +0 -412
  660. package/dist/core/crawler/page-analyzer.d.ts +0 -88
  661. package/dist/core/crawler/page-analyzer.js +0 -709
  662. package/dist/core/crawler/selector-generator.d.ts +0 -34
  663. package/dist/core/crawler/selector-generator.js +0 -240
  664. package/dist/core/crawler/types.d.ts +0 -353
  665. package/dist/core/crawler/types.js +0 -6
  666. package/dist/core/dashboard/assets.d.ts +0 -6
  667. package/dist/core/dashboard/assets.js +0 -690
  668. package/dist/core/dashboard/index.d.ts +0 -6
  669. package/dist/core/dashboard/index.js +0 -5
  670. package/dist/core/dashboard/server.d.ts +0 -72
  671. package/dist/core/dashboard/server.js +0 -354
  672. package/dist/core/dashboard/types.d.ts +0 -70
  673. package/dist/core/dashboard/types.js +0 -5
  674. package/dist/core/discoverer/index.d.ts +0 -115
  675. package/dist/core/discoverer/index.js +0 -250
  676. package/dist/core/flakiness/index.d.ts +0 -228
  677. package/dist/core/flakiness/index.js +0 -384
  678. package/dist/core/generation/code-formatter.d.ts +0 -111
  679. package/dist/core/generation/code-formatter.js +0 -307
  680. package/dist/core/generation/code-generator.d.ts +0 -144
  681. package/dist/core/generation/code-generator.js +0 -293
  682. package/dist/core/generation/crawler-pack-generator.d.ts +0 -44
  683. package/dist/core/generation/crawler-pack-generator.js +0 -231
  684. package/dist/core/generation/generator.d.ts +0 -40
  685. package/dist/core/generation/generator.js +0 -76
  686. package/dist/core/generation/index.d.ts +0 -32
  687. package/dist/core/generation/index.js +0 -30
  688. package/dist/core/generation/pack-generator.d.ts +0 -107
  689. package/dist/core/generation/pack-generator.js +0 -416
  690. package/dist/core/generation/prompt-builder.d.ts +0 -132
  691. package/dist/core/generation/prompt-builder.js +0 -672
  692. package/dist/core/generation/source-analyzer.d.ts +0 -213
  693. package/dist/core/generation/source-analyzer.js +0 -657
  694. package/dist/core/generation/test-optimizer.d.ts +0 -117
  695. package/dist/core/generation/test-optimizer.js +0 -328
  696. package/dist/core/generation/types.d.ts +0 -214
  697. package/dist/core/generation/types.js +0 -4
  698. package/dist/core/hooks/compose.d.ts +0 -61
  699. package/dist/core/hooks/compose.js +0 -225
  700. package/dist/core/hooks/runner.d.ts +0 -68
  701. package/dist/core/hooks/runner.js +0 -303
  702. package/dist/core/index.d.ts +0 -104
  703. package/dist/core/index.js +0 -91
  704. package/dist/core/pack/migrator.d.ts +0 -51
  705. package/dist/core/pack/migrator.js +0 -304
  706. package/dist/core/pack/validator.d.ts +0 -42
  707. package/dist/core/pack/validator.js +0 -322
  708. package/dist/core/pack-v2/index.d.ts +0 -9
  709. package/dist/core/pack-v2/index.js +0 -8
  710. package/dist/core/pack-v2/loader.d.ts +0 -62
  711. package/dist/core/pack-v2/loader.js +0 -259
  712. package/dist/core/pack-v2/migrator.d.ts +0 -61
  713. package/dist/core/pack-v2/migrator.js +0 -480
  714. package/dist/core/pack-v2/validator.d.ts +0 -61
  715. package/dist/core/pack-v2/validator.js +0 -577
  716. package/dist/core/parallel/index.d.ts +0 -6
  717. package/dist/core/parallel/index.js +0 -6
  718. package/dist/core/parallel/parallel-runner.d.ts +0 -107
  719. package/dist/core/parallel/parallel-runner.js +0 -192
  720. package/dist/core/proof/bundle.d.ts +0 -137
  721. package/dist/core/proof/bundle.js +0 -160
  722. package/dist/core/proof/canonicalize.d.ts +0 -47
  723. package/dist/core/proof/canonicalize.js +0 -105
  724. package/dist/core/proof/index.d.ts +0 -13
  725. package/dist/core/proof/index.js +0 -18
  726. package/dist/core/proof/schema.d.ts +0 -217
  727. package/dist/core/proof/schema.js +0 -263
  728. package/dist/core/proof/signer.d.ts +0 -111
  729. package/dist/core/proof/signer.js +0 -226
  730. package/dist/core/proof/verifier.d.ts +0 -97
  731. package/dist/core/proof/verifier.js +0 -308
  732. package/dist/core/regression/detector.d.ts +0 -107
  733. package/dist/core/regression/detector.js +0 -497
  734. package/dist/core/regression/index.d.ts +0 -9
  735. package/dist/core/regression/index.js +0 -11
  736. package/dist/core/regression/trend-analyzer.d.ts +0 -102
  737. package/dist/core/regression/trend-analyzer.js +0 -345
  738. package/dist/core/regression/types.d.ts +0 -222
  739. package/dist/core/regression/types.js +0 -7
  740. package/dist/core/regression/vault.d.ts +0 -87
  741. package/dist/core/regression/vault.js +0 -289
  742. package/dist/core/repair/engine/fixer.d.ts +0 -24
  743. package/dist/core/repair/engine/fixer.js +0 -226
  744. package/dist/core/repair/engine/suggestion-engine.d.ts +0 -18
  745. package/dist/core/repair/engine/suggestion-engine.js +0 -187
  746. package/dist/core/repair/index.d.ts +0 -10
  747. package/dist/core/repair/index.js +0 -13
  748. package/dist/core/repair/repairer.d.ts +0 -90
  749. package/dist/core/repair/repairer.js +0 -284
  750. package/dist/core/repair/types.d.ts +0 -91
  751. package/dist/core/repair/types.js +0 -6
  752. package/dist/core/repair/utils/error-analyzer.d.ts +0 -28
  753. package/dist/core/repair/utils/error-analyzer.js +0 -264
  754. package/dist/core/reporting/html-reporter.d.ts +0 -119
  755. package/dist/core/reporting/html-reporter.js +0 -737
  756. package/dist/core/reporting/index.d.ts +0 -6
  757. package/dist/core/reporting/index.js +0 -6
  758. package/dist/core/retry/flakiness-integration.d.ts +0 -60
  759. package/dist/core/retry/flakiness-integration.js +0 -228
  760. package/dist/core/retry/index.d.ts +0 -14
  761. package/dist/core/retry/index.js +0 -16
  762. package/dist/core/retry/retry-engine.d.ts +0 -80
  763. package/dist/core/retry/retry-engine.js +0 -296
  764. package/dist/core/retry/types.d.ts +0 -178
  765. package/dist/core/retry/types.js +0 -52
  766. package/dist/core/retry/vault.d.ts +0 -77
  767. package/dist/core/retry/vault.js +0 -304
  768. package/dist/core/runner/e2e-helpers.d.ts +0 -102
  769. package/dist/core/runner/e2e-helpers.js +0 -153
  770. package/dist/core/runner/phase3-runner.d.ts +0 -200
  771. package/dist/core/runner/phase3-runner.js +0 -1039
  772. package/dist/core/secrets/crypto.d.ts +0 -75
  773. package/dist/core/secrets/crypto.js +0 -223
  774. package/dist/core/secrets/manager.d.ts +0 -76
  775. package/dist/core/secrets/manager.js +0 -219
  776. package/dist/core/security/redaction-patterns-extended.d.ts +0 -27
  777. package/dist/core/security/redaction-patterns-extended.js +0 -247
  778. package/dist/core/security/redactor.d.ts +0 -71
  779. package/dist/core/security/redactor.js +0 -279
  780. package/dist/core/self-healing/assertion-healer.d.ts +0 -97
  781. package/dist/core/self-healing/assertion-healer.js +0 -371
  782. package/dist/core/self-healing/engine.d.ts +0 -122
  783. package/dist/core/self-healing/engine.js +0 -538
  784. package/dist/core/self-healing/index.d.ts +0 -10
  785. package/dist/core/self-healing/index.js +0 -11
  786. package/dist/core/self-healing/selector-healer.d.ts +0 -103
  787. package/dist/core/self-healing/selector-healer.js +0 -372
  788. package/dist/core/self-healing/types.d.ts +0 -152
  789. package/dist/core/self-healing/types.js +0 -6
  790. package/dist/core/serve/diagnostics-collector.d.ts +0 -32
  791. package/dist/core/serve/diagnostics-collector.js +0 -149
  792. package/dist/core/serve/health-checker.d.ts +0 -44
  793. package/dist/core/serve/health-checker.js +0 -219
  794. package/dist/core/serve/index.d.ts +0 -8
  795. package/dist/core/serve/index.js +0 -8
  796. package/dist/core/serve/metrics-collector.d.ts +0 -24
  797. package/dist/core/serve/metrics-collector.js +0 -322
  798. package/dist/core/serve/process-manager.d.ts +0 -36
  799. package/dist/core/serve/process-manager.js +0 -213
  800. package/dist/core/serve/server.d.ts +0 -36
  801. package/dist/core/serve/server.js +0 -191
  802. package/dist/core/slo/config.d.ts +0 -107
  803. package/dist/core/slo/config.js +0 -360
  804. package/dist/core/slo/index.d.ts +0 -11
  805. package/dist/core/slo/index.js +0 -15
  806. package/dist/core/slo/sli-calculator.d.ts +0 -92
  807. package/dist/core/slo/sli-calculator.js +0 -364
  808. package/dist/core/slo/slo-tracker.d.ts +0 -148
  809. package/dist/core/slo/slo-tracker.js +0 -379
  810. package/dist/core/slo/types.d.ts +0 -281
  811. package/dist/core/slo/types.js +0 -7
  812. package/dist/core/slo/vault.d.ts +0 -102
  813. package/dist/core/slo/vault.js +0 -427
  814. package/dist/core/tui/index.d.ts +0 -7
  815. package/dist/core/tui/index.js +0 -6
  816. package/dist/core/tui/monitor.d.ts +0 -92
  817. package/dist/core/tui/monitor.js +0 -271
  818. package/dist/core/tui/renderer.d.ts +0 -33
  819. package/dist/core/tui/renderer.js +0 -218
  820. package/dist/core/tui/types.d.ts +0 -63
  821. package/dist/core/tui/types.js +0 -5
  822. package/dist/core/types/pack-v1.d.ts +0 -251
  823. package/dist/core/types/pack-v1.js +0 -5
  824. package/dist/core/types/pack-v2.d.ts +0 -425
  825. package/dist/core/types/pack-v2.js +0 -8
  826. package/dist/core/types/trust-score.d.ts +0 -69
  827. package/dist/core/types/trust-score.js +0 -191
  828. package/dist/core/vault/cas.d.ts +0 -90
  829. package/dist/core/vault/cas.js +0 -261
  830. package/dist/core/vault/index.d.ts +0 -326
  831. package/dist/core/vault/index.js +0 -1042
  832. package/dist/core/visual/index.d.ts +0 -6
  833. package/dist/core/visual/index.js +0 -6
  834. package/dist/core/visual/visual-regression.d.ts +0 -113
  835. package/dist/core/visual/visual-regression.js +0 -236
  836. package/dist/core/watch/index.d.ts +0 -7
  837. package/dist/core/watch/index.js +0 -6
  838. package/dist/core/watch/watch-mode.d.ts +0 -213
  839. package/dist/core/watch/watch-mode.js +0 -389
  840. package/dist/generators/index.d.ts +0 -5
  841. package/dist/generators/index.js +0 -5
  842. package/dist/generators/json-reporter.d.ts +0 -10
  843. package/dist/generators/json-reporter.js +0 -12
  844. package/dist/generators/test-generator.d.ts +0 -18
  845. package/dist/generators/test-generator.js +0 -78
  846. package/dist/index.d.ts +0 -8
  847. package/dist/index.js +0 -246
  848. package/dist/scanners/dom-scanner.d.ts +0 -52
  849. package/dist/scanners/dom-scanner.js +0 -296
  850. package/dist/scanners/index.d.ts +0 -4
  851. package/dist/scanners/index.js +0 -4
  852. package/dist/schemas/pack.schema.json +0 -236
  853. package/dist/types/scan.d.ts +0 -68
  854. package/dist/types/scan.js +0 -4
  855. package/dist/utils/config.d.ts +0 -5
  856. package/dist/utils/config.js +0 -136
  857. /package/{bin → cli/bin}/qa360.js +0 -0
  858. /package/{examples → cli/examples}/accessibility.yml +0 -0
  859. /package/{examples → cli/examples}/api-basic.yml +0 -0
  860. /package/{examples → cli/examples}/complete.yml +0 -0
  861. /package/{examples → cli/examples}/crawler.yml +0 -0
  862. /package/{examples → cli/examples}/fullstack.yml +0 -0
  863. /package/{examples → cli/examples}/security.yml +0 -0
  864. /package/{examples → cli/examples}/ui-advanced.yml +0 -0
  865. /package/{examples → cli/examples}/ui-basic.yml +0 -0
  866. /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
+ });