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
@@ -1,630 +0,0 @@
1
- /**
2
- * QA360 Explain Command
3
- *
4
- * Advanced error and failure explanations with:
5
- * - Static error code database
6
- * - AI-powered explanations
7
- * - Vault-based historical context
8
- * - Flakiness insights
9
- *
10
- * Usage:
11
- * qa360 explain QX001 # Static error code
12
- * qa360 explain --ai "my test failed" # AI explanation
13
- * qa360 explain --run run-xxx # Explain run results
14
- * qa360 explain --gate api_smoke # Explain gate failure
15
- */
16
- import chalk from 'chalk';
17
- import ora from 'ora';
18
- import { join } from 'path';
19
- import { existsSync } from 'fs';
20
- import { createBest, createLLMProvider } from '../core/index.js';
21
- import { EvidenceVault } from '../core/index.js';
22
- /**
23
- * Static error code database
24
- */
25
- const ERROR_CODES = {
26
- 'QX001': {
27
- title: 'Node.js Version Incompatible',
28
- cause: 'QA360 Core requires Node.js 18.0.0 or higher. You are running an older version.',
29
- solution: 'Update Node.js: https://nodejs.org/ or use nvm/fnm: `nvm install 20`',
30
- category: 'prerequisite'
31
- },
32
- 'QX002': {
33
- title: 'QA360 Directory Structure Missing',
34
- cause: 'Required .qa360 directories not found in the current project.',
35
- solution: 'Run "qa360 doctor --fix" to create missing directories automatically',
36
- category: 'setup'
37
- },
38
- 'QX003': {
39
- title: 'Playwright Not Available',
40
- cause: 'Playwright is not installed or not in PATH. Required for API and UI tests.',
41
- solution: 'Install: "npx playwright install" or use --docker flag for containerized execution',
42
- category: 'prerequisite'
43
- },
44
- 'QX004': {
45
- title: 'Puppeteer Not Available',
46
- cause: 'Puppeteer is not installed (required for PDF report generation).',
47
- solution: 'Install: "npm install puppeteer" or use --format json to skip PDF generation',
48
- category: 'prerequisite'
49
- },
50
- 'QX005': {
51
- title: 'Network Connectivity Issues',
52
- cause: 'Cannot reach external services (API, website). Check proxy/firewall settings.',
53
- solution: 'Check network, configure proxy (export HTTP_PROXY), or test with local endpoints',
54
- category: 'network'
55
- },
56
- 'QX006': {
57
- title: 'Secrets Configuration Missing',
58
- cause: 'No secrets.enc file configured. Required for encrypted credential storage.',
59
- solution: 'Run "qa360 doctor --fix" to create default secrets file',
60
- category: 'setup'
61
- },
62
- 'QX007': {
63
- title: 'Cryptographic Keys Missing',
64
- cause: 'Ed25519 key pair not found for signing proofs. Required for proof generation.',
65
- solution: 'Run "qa360 doctor --fix" to generate new key pair automatically',
66
- category: 'setup'
67
- },
68
- 'QP100': {
69
- title: 'Pack Validation Failed',
70
- cause: 'The pack.yml file does not conform to the required schema or has invalid values.',
71
- solution: 'Check pack.yml syntax with "qa360 pack validate". Ensure required fields (version, name, gates) are present.',
72
- category: 'pack'
73
- },
74
- 'QP200': {
75
- title: 'Pack Version Not Supported',
76
- cause: 'The pack version specified is not supported by this version of QA360.',
77
- solution: 'Update QA360: "npm install -g qa360@latest" or use pack v1 format',
78
- category: 'pack'
79
- },
80
- 'QG200': {
81
- title: 'Gate Execution Failed',
82
- cause: 'A quality gate failed during execution. Check gate-specific error messages.',
83
- solution: 'Review gate logs in .qa360/runs/ directory. Run with verbose mode for details.',
84
- category: 'execution'
85
- },
86
- 'QG300': {
87
- title: 'Adapter Not Found',
88
- cause: 'The required adapter for a gate is not available or not installed.',
89
- solution: 'Ensure dependencies are installed. Run "qa360 doctor" to check prerequisites.',
90
- category: 'execution'
91
- },
92
- 'QV100': {
93
- title: 'Proof Verification Failed',
94
- cause: 'The proof signature is invalid or the proof has been tampered with.',
95
- solution: 'Ensure the proof file has not been modified. Check the public key matches the signer.',
96
- category: 'verification'
97
- },
98
- 'QV200': {
99
- title: 'Vault Corruption Detected',
100
- cause: 'The evidence vault database (.qa360/vault.db) is corrupted or invalid.',
101
- solution: 'Run "qa360 doctor --fix" to repair the vault. Restore from backup if available.',
102
- category: 'vault'
103
- },
104
- 'QT000': {
105
- title: 'Test Timeout',
106
- cause: 'A test exceeded the maximum allowed execution time.',
107
- solution: 'Increase timeout in pack.yml (execution.timeout) or optimize the test',
108
- category: 'execution'
109
- },
110
- 'QT001': {
111
- title: 'Flaky Test Detected',
112
- cause: 'A test is showing inconsistent results across runs (flakiness score < 75).',
113
- solution: 'Review "qa360 flakiness history" for patterns. Consider quarantining: "qa360 flakiness quarantine <testId>"',
114
- category: 'flakiness'
115
- },
116
- 'QD500': {
117
- title: 'Dashboard Start Failed',
118
- cause: 'The dashboard server cannot start (port in use or permission denied).',
119
- solution: 'Use --port to specify a different port, or check if another instance is running.',
120
- category: 'dashboard'
121
- }
122
- };
123
- /**
124
- * Gate-specific explanations
125
- */
126
- const GATE_EXPLANATIONS = {
127
- 'api_smoke': {
128
- title: 'API Smoke Tests',
129
- commonFailures: [
130
- 'Endpoint not reachable (404, connection refused)',
131
- 'Unexpected response status (expected 200, got 500)',
132
- 'Response format mismatch',
133
- 'Authentication failure (401, 403)'
134
- ],
135
- tips: [
136
- 'Verify API is running: curl -I <apiUrl>',
137
- 'Check authentication tokens are valid',
138
- 'Review CORS settings for cross-origin requests',
139
- 'Ensure test environment matches expected configuration'
140
- ]
141
- },
142
- 'ui': {
143
- title: 'UI/E2E Tests',
144
- commonFailures: [
145
- 'Page load timeout',
146
- 'Element not found (selector changed)',
147
- 'JavaScript errors in browser console',
148
- 'Viewport/responsive issues'
149
- ],
150
- tips: [
151
- 'Use data-testid attributes for stable selectors',
152
- 'Add explicit waits for dynamic content',
153
- 'Check browser console for JavaScript errors',
154
- 'Test in headless mode matches real browser behavior'
155
- ]
156
- },
157
- 'a11y': {
158
- title: 'Accessibility Tests',
159
- commonFailures: [
160
- 'Missing alt text on images',
161
- 'Low color contrast ratio',
162
- 'Missing ARIA labels on interactive elements',
163
- 'Keyboard navigation issues'
164
- ],
165
- tips: [
166
- 'Use axe DevTools browser extension for debugging',
167
- 'Test with keyboard only (no mouse)',
168
- 'Run screen reader simulation to verify experience',
169
- 'Check contrast ratios with WCAG tools'
170
- ]
171
- },
172
- 'perf': {
173
- title: 'Performance Tests',
174
- commonFailures: [
175
- 'Response time exceeds budget',
176
- 'Error rate too high under load',
177
- 'Resource exhaustion (memory, CPU)',
178
- 'Timeouts during peak load'
179
- ],
180
- tips: [
181
- 'Start with low load and gradually increase',
182
- 'Monitor server resources during tests',
183
- 'Profile slow endpoints with performance tools',
184
- 'Consider caching and optimization strategies'
185
- ]
186
- },
187
- 'sast': {
188
- title: 'Static Application Security Testing',
189
- commonFailures: [
190
- 'Hardcoded secrets or passwords',
191
- 'SQL injection vulnerabilities',
192
- 'Unsafe function usage',
193
- 'Dependency vulnerabilities'
194
- ],
195
- tips: [
196
- 'Use environment variables for secrets',
197
- 'Parameterize all database queries',
198
- 'Keep dependencies updated',
199
- 'Review and understand each security finding'
200
- ]
201
- },
202
- 'dast': {
203
- title: 'Dynamic Application Security Testing',
204
- commonFailures: [
205
- 'Injection vulnerabilities (SQL, XSS)',
206
- 'Authentication/authorization bypass',
207
- 'Sensitive data exposure',
208
- 'Misconfigurations'
209
- ],
210
- tips: [
211
- 'Run against test environment only',
212
- 'DAST may trigger security alerts - inform your team',
213
- 'Review false positives carefully',
214
- 'Fix critical findings before production'
215
- ]
216
- },
217
- 'secrets': {
218
- title: 'Secrets Scanning',
219
- commonFailures: [
220
- 'API keys in source code',
221
- 'Passwords in config files',
222
- 'Certificates committed to repo',
223
- 'Tokens in logs'
224
- ],
225
- tips: [
226
- 'Use git-secrets or similar pre-commit hooks',
227
- 'Rotate any leaked credentials immediately',
228
- 'Use .env files with gitignore',
229
- 'Enable branch protection rules'
230
- ]
231
- },
232
- 'deps': {
233
- title: 'Dependency Vulnerability Scanning',
234
- commonFailures: [
235
- 'Known CVEs in dependencies',
236
- 'Outdated packages with security fixes',
237
- 'Transitive dependency issues',
238
- 'License violations'
239
- ],
240
- tips: [
241
- 'Run "npm audit fix" for automatic fixes',
242
- 'Review dependabot PRs promptly',
243
- 'Pin dependency versions where appropriate',
244
- 'Understand your dependency tree'
245
- ]
246
- }
247
- };
248
- /**
249
- * Explain an error code
250
- */
251
- async function explainErrorCode(code, json = false) {
252
- const error = ERROR_CODES[code];
253
- if (!error) {
254
- console.log(chalk.red(`\n[X] Unknown error code: ${code}`));
255
- console.log(chalk.blue('\nAvailable error codes:'));
256
- const grouped = groupErrorCodes();
257
- for (const [category, codes] of Object.entries(grouped)) {
258
- console.log(chalk.yellow(`\n ${category.toUpperCase()}:`));
259
- console.log(chalk.gray(` ${codes.join(', ')}`));
260
- }
261
- return;
262
- }
263
- if (json) {
264
- console.log(JSON.stringify({ code, ...error }, null, 2));
265
- return;
266
- }
267
- console.log(chalk.red(`\n[X] ${error.title}`));
268
- console.log(chalk.gray(` Code: ${code}`));
269
- console.log(chalk.gray(` Category: ${error.category}\n`));
270
- console.log(chalk.yellow('Cause:'));
271
- console.log(chalk.white(` ${error.cause}\n`));
272
- console.log(chalk.green('Solution:'));
273
- console.log(chalk.white(` ${error.solution}\n`));
274
- // Show related commands
275
- const relatedCommands = {
276
- prerequisite: ['qa360 doctor', 'qa360 doctor --fix'],
277
- setup: ['qa360 doctor --fix', 'qa360 secrets add'],
278
- execution: ['qa360 run --verbose', 'qa360 history show <run-id>'],
279
- pack: ['qa360 pack validate', 'qa360 init'],
280
- vault: ['qa360 doctor --fix', 'qa360 history list'],
281
- verification: ['qa360 verify --verbose'],
282
- flakiness: ['qa360 flakiness history', 'qa360 flakiness quarantine'],
283
- network: ['curl -I <url>', 'ping <host>'],
284
- dashboard: ['qa360 dashboard --port 8081']
285
- };
286
- const commands = relatedCommands[error.category];
287
- if (commands) {
288
- console.log(chalk.cyan('Related commands:'));
289
- commands.forEach(cmd => console.log(chalk.gray(` ${cmd}`)));
290
- console.log('');
291
- }
292
- }
293
- /**
294
- * Group error codes by category
295
- */
296
- function groupErrorCodes() {
297
- const grouped = {};
298
- for (const [code, error] of Object.entries(ERROR_CODES)) {
299
- if (!grouped[error.category]) {
300
- grouped[error.category] = [];
301
- }
302
- grouped[error.category].push(code);
303
- }
304
- return grouped;
305
- }
306
- /**
307
- * Explain gate failure with context
308
- */
309
- async function explainGate(gateName, runId, json = false) {
310
- const info = GATE_EXPLANATIONS[gateName];
311
- if (!info) {
312
- console.log(chalk.yellow(`\n[!] No specific information available for gate: ${gateName}`));
313
- console.log(chalk.gray('Available gates: ' + Object.keys(GATE_EXPLANATIONS).join(', ')));
314
- return;
315
- }
316
- if (json) {
317
- console.log(JSON.stringify({ gate: gateName, ...info }, null, 2));
318
- return;
319
- }
320
- console.log(chalk.bold(`\n${info.title} (${gateName})\n`));
321
- console.log(chalk.yellow('Common failures:'));
322
- info.commonFailures.forEach(f => console.log(chalk.gray(` - ${f}`)));
323
- console.log(chalk.cyan('\nTips:'));
324
- info.tips.forEach(t => console.log(chalk.gray(` - ${t}`)));
325
- // Load from vault if runId provided
326
- if (runId) {
327
- await explainGateFromVault(gateName, runId);
328
- }
329
- }
330
- /**
331
- * Load and display gate-specific data from vault
332
- */
333
- async function explainGateFromVault(gateName, runId) {
334
- const vaultDir = join(process.cwd(), '.qa360');
335
- if (!existsSync(vaultDir)) {
336
- console.log(chalk.yellow('\n[!] Vault not found in current directory'));
337
- return;
338
- }
339
- try {
340
- const vault = new EvidenceVault({ baseDir: vaultDir });
341
- // Get gate results from the run
342
- const runInfo = await vault.getRun(runId);
343
- if (!runInfo) {
344
- console.log(chalk.yellow(`\n[!] Run ${runId} not found in vault`));
345
- await vault.close();
346
- return;
347
- }
348
- const gateResults = await vault.getGates(runId);
349
- const gateResult = gateResults.find((g) => g.name === gateName);
350
- if (gateResult) {
351
- console.log(chalk.bold('\nRun Results:'));
352
- console.log(chalk.gray(` Status: ${gateResult.status}`));
353
- console.log(chalk.gray(` Duration: ${gateResult.duration_ms}ms`));
354
- if (gateResult.metrics_json) {
355
- const metrics = JSON.parse(gateResult.metrics_json);
356
- if (metrics.total || metrics.passed || metrics.failed) {
357
- console.log(chalk.gray(` Tests: ${metrics.passed || 0}/${metrics.total || 0} passed`));
358
- }
359
- }
360
- // Get findings for this gate
361
- const findings = await vault.getFindings(runId);
362
- const gateFindings = findings.filter((f) => f.gate === gateName);
363
- if (gateFindings.length > 0) {
364
- console.log(chalk.yellow('\nFindings:'));
365
- gateFindings.slice(0, 10).forEach((f) => {
366
- console.log(chalk.gray(` - [${f.severity}] ${f.rule}: ${f.message}`));
367
- });
368
- if (gateFindings.length > 10) {
369
- console.log(chalk.gray(` ... and ${gateFindings.length - 10} more`));
370
- }
371
- }
372
- }
373
- await vault.close();
374
- }
375
- catch (error) {
376
- console.log(chalk.yellow(`\n[!] Could not load vault data: ${error.message}`));
377
- }
378
- }
379
- /**
380
- * AI-powered explanation
381
- */
382
- async function explainWithAI(query, provider, runId, json = false) {
383
- const spinner = ora('Connecting to AI provider...').start();
384
- try {
385
- // Get the AI provider
386
- const aiProvider = provider
387
- ? await createLLMProvider({ preferred: provider })
388
- : await createBest();
389
- if (!aiProvider) {
390
- spinner.fail('No AI provider available');
391
- console.log(chalk.yellow('\nSet up an AI provider:'));
392
- console.log(chalk.gray(' qa360 ai list'));
393
- console.log(chalk.gray(' export DEEPSEEK_API_KEY=your_key\n'));
394
- return;
395
- }
396
- spinner.text = `Using ${aiProvider.getProviderType()}...`;
397
- // Build context from vault if available
398
- let context = '';
399
- if (runId) {
400
- const vaultDir = join(process.cwd(), '.qa360');
401
- if (existsSync(vaultDir)) {
402
- try {
403
- const vault = new EvidenceVault({ baseDir: vaultDir });
404
- const runInfo = await vault.getRun(runId);
405
- if (runInfo) {
406
- const duration = runInfo.ended_at && runInfo.started_at
407
- ? runInfo.ended_at - runInfo.started_at
408
- : undefined;
409
- context = `\n\nContext from run ${runId}:
410
- - Status: ${runInfo.status}
411
- - Trust Score: ${runInfo.trust_score ?? 'N/A'}
412
- - Pack: ${runInfo.pack_path || 'unknown'}
413
- - Duration: ${duration ? `${duration}ms` : 'N/A'}
414
- - Started: ${new Date(runInfo.started_at).toISOString()}`;
415
- }
416
- await vault.close();
417
- }
418
- catch {
419
- // Vault access failed, continue without context
420
- }
421
- }
422
- }
423
- // Build the explanation prompt
424
- const systemPrompt = `You are QA360 Explain, an expert QA assistant.
425
- Explain test failures, errors, and quality issues in clear, actionable terms.
426
-
427
- Structure your response:
428
- 1. **Summary**: What happened in one sentence
429
- 2. **Root Cause**: Why it happened (technical explanation)
430
- 3. **Impact**: What this means for the project
431
- 4. **Solutions**: Specific steps to fix it (numbered list)
432
- 5. **Prevention**: How to avoid this in the future
433
-
434
- Be concise but thorough. Use simple language but accurate technical terms.`;
435
- const userPrompt = `Explain this QA issue:${context}\n\n${query}`;
436
- const response = await aiProvider.generate({
437
- prompt: userPrompt,
438
- systemPrompt,
439
- maxTokens: 2048,
440
- temperature: 0.3
441
- });
442
- spinner.succeed(`Explanation using ${chalk.cyan(aiProvider.getProviderType())}\n`);
443
- if (json) {
444
- console.log(JSON.stringify({
445
- provider: aiProvider.getProviderType(),
446
- query,
447
- explanation: response.content,
448
- usage: response.usage
449
- }, null, 2));
450
- }
451
- else {
452
- console.log(chalk.bold('Explanation:\n'));
453
- console.log(chalk.gray('-'.repeat(70)));
454
- console.log(response.content);
455
- console.log(chalk.gray('-'.repeat(70)));
456
- console.log(chalk.gray(`\nTokens: ${response.usage.totalTokens}`));
457
- console.log(chalk.gray(` Prompt: ${response.usage.promptTokens}`));
458
- console.log(chalk.gray(` Completion: ${response.usage.completionTokens}\n`));
459
- }
460
- }
461
- catch (error) {
462
- spinner.fail('AI explanation failed');
463
- console.log(chalk.red(`Error: ${error.message}`));
464
- // Fallback to static explanation
465
- console.log(chalk.yellow('\nYou can also try static explanations:'));
466
- console.log(chalk.gray(' qa360 explain QX001 # List error codes'));
467
- console.log(chalk.gray(' qa360 explain --gate api_smoke\n'));
468
- }
469
- }
470
- /**
471
- * Explain a run result
472
- */
473
- async function explainRun(runId, options) {
474
- const vaultDir = join(process.cwd(), '.qa360');
475
- if (!existsSync(vaultDir)) {
476
- console.log(chalk.red('\n[X] Vault not found in current directory'));
477
- console.log(chalk.yellow('Run "qa360 run" first to generate test results.\n'));
478
- return;
479
- }
480
- const spinner = ora('Loading run data...').start();
481
- try {
482
- const vault = new EvidenceVault({ baseDir: vaultDir });
483
- const runInfo = await vault.getRun(runId);
484
- if (!runInfo) {
485
- spinner.fail(`Run ${runId} not found`);
486
- console.log(chalk.yellow('\nAvailable runs:'));
487
- const runs = await vault.listRuns({ limit: 20 });
488
- runs.forEach((r) => console.log(chalk.gray(` ${r.id} - ${r.status}`)));
489
- await vault.close();
490
- return;
491
- }
492
- spinner.succeed('Run loaded\n');
493
- if (options.json) {
494
- console.log(JSON.stringify(runInfo, null, 2));
495
- await vault.close();
496
- return;
497
- }
498
- // Calculate duration
499
- const duration = runInfo.ended_at && runInfo.started_at
500
- ? runInfo.ended_at - runInfo.started_at
501
- : undefined;
502
- // Display run summary
503
- console.log(chalk.bold(`Run: ${runId}`));
504
- console.log(chalk.gray(` Status: ${runInfo.status}`));
505
- console.log(chalk.gray(` Trust Score: ${runInfo.trust_score ?? 'N/A'}/100`));
506
- console.log(chalk.gray(` Started: ${new Date(runInfo.started_at).toISOString()}`));
507
- if (duration) {
508
- console.log(chalk.gray(` Duration: ${duration}ms\n`));
509
- }
510
- else {
511
- console.log('');
512
- }
513
- // Get gate results
514
- const gates = await vault.getGates(runId);
515
- if (gates.length > 0) {
516
- console.log(chalk.bold('Gates:'));
517
- gates.forEach((g) => {
518
- const icon = g.status === 'passed' ? '[OK]' : g.status === 'failed' ? '[FAIL]' : '[SKIP]';
519
- const color = g.status === 'passed' ? chalk.green : g.status === 'failed' ? chalk.red : chalk.gray;
520
- console.log(` ${icon} ${color(g.name)} (${g.duration_ms || 'N/A'}ms)`);
521
- });
522
- }
523
- // Get findings
524
- const findings = await vault.getFindings(runId);
525
- if (findings.length > 0) {
526
- console.log(chalk.bold('\nFindings:'));
527
- const bySeverity = {};
528
- findings.forEach((f) => {
529
- if (!bySeverity[f.severity])
530
- bySeverity[f.severity] = [];
531
- bySeverity[f.severity].push(f);
532
- });
533
- ['critical', 'high', 'medium', 'low', 'info'].forEach(sev => {
534
- if (bySeverity[sev]?.length) {
535
- console.log(chalk.red(` ${sev.toUpperCase()}: ${bySeverity[sev].length}`));
536
- bySeverity[sev].slice(0, 5).forEach((f) => {
537
- const msg = f.message.length > 60 ? f.message.substring(0, 60) + '...' : f.message;
538
- console.log(chalk.gray(` - ${f.rule}: ${msg}`));
539
- });
540
- }
541
- });
542
- }
543
- // Get flakiness data (may fail if vault doesn't have flakiness tables)
544
- try {
545
- const flakiness = await vault.getRunFlakiness(runId);
546
- if (flakiness.length > 0) {
547
- console.log(chalk.bold('\nFlakiness:'));
548
- const unstable = flakiness.filter((f) => f.score < 75);
549
- if (unstable.length > 0) {
550
- console.log(chalk.yellow(` ${unstable.length} unstable tests detected`));
551
- unstable.forEach((f) => {
552
- console.log(chalk.gray(` - ${f.test_name}: score ${f.score}`));
553
- });
554
- }
555
- else {
556
- console.log(chalk.green(' All tests are stable!'));
557
- }
558
- }
559
- }
560
- catch {
561
- // Flakiness tables not available in this vault version
562
- }
563
- await vault.close();
564
- // Offer AI explanation if requested
565
- if (options.ai) {
566
- console.log(chalk.cyan('\nGetting AI explanation...\n'));
567
- await explainWithAI(`Explain this test run: ${runId} with status ${runInfo.status} and ${gates.length} gates`, options.provider, runId, options.json);
568
- }
569
- }
570
- catch (error) {
571
- spinner.fail('Failed to load run data');
572
- console.log(chalk.red(`Error: ${error.message}`));
573
- }
574
- }
575
- /**
576
- * Main explain command
577
- */
578
- export async function explainCommand(input, options = {}) {
579
- // No input - show help
580
- if (!input && !options.run && !options.gate) {
581
- console.log(chalk.bold.cyan('\nQA360 Explain - Error and Failure Explanations\n'));
582
- console.log(chalk.yellow('Usage:\n'));
583
- console.log(chalk.gray(' qa360 explain QX001 # Explain error code'));
584
- console.log(chalk.gray(' qa360 explain --ai "query" # AI-powered explanation'));
585
- console.log(chalk.gray(' qa360 explain --run run-xxx # Explain test run'));
586
- console.log(chalk.gray(' qa360 explain --gate api_smoke # Explain gate failures\n'));
587
- console.log(chalk.yellow('Available Error Codes:\n'));
588
- const grouped = groupErrorCodes();
589
- for (const [category, codes] of Object.entries(grouped)) {
590
- console.log(chalk.cyan(` ${category.toUpperCase()}:`));
591
- codes.slice(0, 5).forEach(code => {
592
- const error = ERROR_CODES[code];
593
- console.log(chalk.gray(` ${code} - ${error?.title}`));
594
- });
595
- if (codes.length > 5) {
596
- console.log(chalk.gray(` ... and ${codes.length - 5} more`));
597
- }
598
- }
599
- console.log(chalk.yellow('\nAvailable Gates:\n'));
600
- console.log(chalk.gray(' ' + Object.keys(GATE_EXPLANATIONS).join(', ') + '\n'));
601
- return;
602
- }
603
- // Run mode
604
- if (options.run) {
605
- await explainRun(options.run, options);
606
- return;
607
- }
608
- // Gate mode
609
- if (options.gate) {
610
- await explainGate(options.gate, options.run, options.json);
611
- return;
612
- }
613
- // AI mode
614
- if (options.ai) {
615
- await explainWithAI(input || '', options.provider, options.run, options.json);
616
- return;
617
- }
618
- // Error code mode (default)
619
- if (input) {
620
- // Check if it looks like an error code
621
- if (/^Q[A-Z]\d{3}$/.test(input)) {
622
- await explainErrorCode(input, options.json);
623
- }
624
- else {
625
- // Treat as AI query
626
- await explainWithAI(input, options.provider, options.run, options.json);
627
- }
628
- }
629
- }
630
- export default explainCommand;