qa360 2.1.7 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (906) hide show
  1. package/.BETA_TESTING_FEEDBACK.md +256 -0
  2. package/.claude/settings.local.json +154 -0
  3. package/.editorconfig +21 -0
  4. package/.github/CODEOWNERS +23 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
  6. package/.github/ISSUE_TEMPLATE/feedback_dx.yml +121 -0
  7. package/.github/dependabot.yml +35 -0
  8. package/.github/workflows/mcp-dx.yml +106 -0
  9. package/.github/workflows/release.yml +26 -0
  10. package/.github/workflows/test.yml +93 -0
  11. package/.nvmrc +1 -0
  12. package/.qa360-artifacts/.gitkeep +0 -0
  13. package/.qa360-artifacts/baselines/.gitkeep +0 -0
  14. package/.qa360-artifacts/cache/.gitkeep +0 -0
  15. package/.qa360-artifacts/reports/.gitkeep +0 -0
  16. package/.qa360-artifacts/screenshots/.gitkeep +0 -0
  17. package/.qa360-baselines/www_xyqo_ai.baseline.json +33 -0
  18. package/CHANGELOG.md +234 -0
  19. package/CODEOWNERS +43 -0
  20. package/CONTRIBUTING.md +273 -0
  21. package/NOVICE_USER_GUIDE.md +272 -0
  22. package/QUICK_START.md +191 -0
  23. package/README.md +191 -163
  24. package/adapters/README.md +46 -0
  25. package/check-branches.sh +32 -0
  26. package/cli/.qa360/keys/ed25519.key +1 -0
  27. package/cli/.qa360/keys/ed25519.pub +1 -0
  28. package/cli/CHANGELOG.md +84 -0
  29. package/cli/LICENSE +24 -0
  30. package/cli/README.md +222 -0
  31. package/cli/examples/README.md +160 -0
  32. package/cli/package.json +76 -0
  33. package/cli/scripts/bundle-for-npm.sh +51 -0
  34. package/cli/scripts/validate-package.js +116 -0
  35. package/cli/src/__tests__/commands/doctor.test.ts +108 -0
  36. package/cli/src/__tests__/index.test.ts +15 -0
  37. package/cli/src/cli-minimal.ts +44 -0
  38. package/cli/src/commands/__tests__/crawl.test.ts +412 -0
  39. package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +156 -0
  40. package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +494 -0
  41. package/cli/src/commands/__tests__/e2e.test.ts +187 -0
  42. package/cli/src/commands/__tests__/flakiness.test.ts +528 -0
  43. package/cli/src/commands/__tests__/generate.test.ts +507 -0
  44. package/cli/src/commands/__tests__/history.integration.test.ts +358 -0
  45. package/cli/src/commands/__tests__/history.test.ts +433 -0
  46. package/cli/src/commands/__tests__/monitor-realworld.test.ts +199 -0
  47. package/cli/src/commands/__tests__/monitor.test.ts +81 -0
  48. package/cli/src/commands/__tests__/ollama.test.ts +529 -0
  49. package/cli/src/commands/__tests__/repair.test.ts +225 -0
  50. package/cli/src/commands/__tests__/report.integration.test.ts +167 -0
  51. package/cli/src/commands/__tests__/report.test.ts +294 -0
  52. package/cli/src/commands/__tests__/report.vitest.ts +288 -0
  53. package/cli/src/commands/__tests__/retry.test.ts +78 -0
  54. package/cli/src/commands/__tests__/run.integration.test.ts +240 -0
  55. package/cli/src/commands/__tests__/run.test.ts +346 -0
  56. package/cli/src/commands/__tests__/run.vitest.ts +301 -0
  57. package/cli/src/commands/__tests__/secrets.test.ts +114 -0
  58. package/cli/src/commands/__tests__/serve.test.ts +80 -0
  59. package/cli/src/commands/__tests__/verify.test.ts +103 -0
  60. package/cli/src/commands/ai.ts +702 -0
  61. package/cli/src/commands/ask.ts +678 -0
  62. package/cli/src/commands/coverage.ts +305 -0
  63. package/cli/src/commands/crawl.ts +155 -0
  64. package/cli/src/commands/doctor.ts +610 -0
  65. package/cli/src/commands/examples.ts +248 -0
  66. package/cli/src/commands/explain.ts +710 -0
  67. package/cli/src/commands/flakiness.ts +560 -0
  68. package/cli/src/commands/generate.ts +566 -0
  69. package/cli/src/commands/history.ts +914 -0
  70. package/cli/src/commands/init.ts +777 -0
  71. package/cli/src/commands/monitor.ts +270 -0
  72. package/cli/src/commands/ollama.ts +337 -0
  73. package/cli/src/commands/pack.ts +497 -0
  74. package/cli/src/commands/regression.ts +400 -0
  75. package/cli/src/commands/repair.ts +356 -0
  76. package/cli/src/commands/report.ts +463 -0
  77. package/cli/src/commands/retry.ts +380 -0
  78. package/cli/src/commands/run.ts +218 -0
  79. package/cli/src/commands/scan.ts +177 -0
  80. package/cli/src/commands/secrets.ts +340 -0
  81. package/cli/src/commands/serve.ts +194 -0
  82. package/cli/src/commands/slo.ts +387 -0
  83. package/cli/src/commands/verify-temp-note.md +11 -0
  84. package/cli/src/commands/verify.ts +322 -0
  85. package/cli/src/generators/index.ts +6 -0
  86. package/cli/src/generators/json-reporter.ts +15 -0
  87. package/cli/src/generators/test-generator.ts +90 -0
  88. package/cli/src/index.ts +289 -0
  89. package/cli/src/scanners/dom-scanner.ts +360 -0
  90. package/cli/src/scanners/index.ts +5 -0
  91. package/cli/src/types/scan.ts +84 -0
  92. package/cli/src/utils/config.ts +145 -0
  93. package/cli/tsconfig.bundle.json +12 -0
  94. package/cli/tsconfig.json +23 -0
  95. package/cli/vitest.config.ts +59 -0
  96. package/core/LICENSE +24 -0
  97. package/core/README.md +64 -0
  98. package/core/package.json +81 -0
  99. package/core/src/__tests__/adapters-contract/adapters-contract.test.md +156 -0
  100. package/core/src/__tests__/index.test.ts +31 -0
  101. package/core/src/__tests__/integration/phase3.test.ts +405 -0
  102. package/core/src/__tests__/pack/validator.test.ts +312 -0
  103. package/core/src/__tests__/secrets/crypto.test.ts +190 -0
  104. package/core/src/__tests__/secrets/manager.test.ts +316 -0
  105. package/core/src/__tests__/security/redactor-phase3.test.ts +233 -0
  106. package/core/src/__tests__/serve/health-checker.test.ts +155 -0
  107. package/core/src/__tests__/serve/process-manager.test.ts +213 -0
  108. package/core/src/__tests__/serve/server.test.ts +103 -0
  109. package/core/src/__tests__/vault/cas.test.ts +178 -0
  110. package/core/src/__tests__/vault/vault.test.ts +296 -0
  111. package/core/src/adapters/__tests__/fixtures/jest-coverage.json +8 -0
  112. package/core/src/adapters/__tests__/fixtures/jest-results.json +41 -0
  113. package/core/src/adapters/__tests__/fixtures/pytest-junit.xml +16 -0
  114. package/core/src/adapters/__tests__/fixtures/vitest-coverage.json +8 -0
  115. package/core/src/adapters/__tests__/fixtures/vitest-results.json +50 -0
  116. package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +452 -0
  117. package/core/src/adapters/__tests__/jest-adapter.test.ts +276 -0
  118. package/core/src/adapters/__tests__/k6-perf.test.ts +538 -0
  119. package/core/src/adapters/__tests__/osv-deps.test.ts +471 -0
  120. package/core/src/adapters/__tests__/playwright-native-api.test.ts +792 -0
  121. package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +431 -0
  122. package/core/src/adapters/__tests__/playwright-ui.test.ts +1073 -0
  123. package/core/src/adapters/__tests__/pytest-adapter.test.ts +207 -0
  124. package/core/src/adapters/__tests__/semgrep-sast.test.ts +436 -0
  125. package/core/src/adapters/__tests__/vitest-adapter.test.ts +208 -0
  126. package/core/src/adapters/__tests__/zap-dast.test.ts +453 -0
  127. package/core/src/adapters/gitleaks-secrets.ts +521 -0
  128. package/core/src/adapters/jest-adapter.ts +306 -0
  129. package/core/src/adapters/k6-perf.ts +479 -0
  130. package/core/src/adapters/osv-deps.ts +467 -0
  131. package/core/src/adapters/playwright-native-adapter.ts +472 -0
  132. package/core/src/adapters/playwright-native-api.ts +619 -0
  133. package/core/src/adapters/playwright-ui.ts +1088 -0
  134. package/core/src/adapters/pytest-adapter.ts +472 -0
  135. package/core/src/adapters/semgrep-sast.ts +410 -0
  136. package/core/src/adapters/unit-test-types.ts +106 -0
  137. package/core/src/adapters/vitest-adapter.ts +295 -0
  138. package/core/src/adapters/zap-dast.ts +551 -0
  139. package/core/src/ai/__tests__/deepseek-provider.test.ts +586 -0
  140. package/core/src/ai/__tests__/ollama-provider.test.ts +641 -0
  141. package/core/src/ai/anthropic-provider.ts +262 -0
  142. package/core/src/ai/deepseek-provider.ts +315 -0
  143. package/core/src/ai/index.ts +87 -0
  144. package/core/src/ai/llm-client.ts +52 -0
  145. package/core/src/ai/mock-provider.ts +146 -0
  146. package/core/src/ai/ollama-provider.ts +269 -0
  147. package/core/src/ai/openai-provider.ts +240 -0
  148. package/core/src/ai/provider-factory.ts +408 -0
  149. package/core/src/artifacts/README.md +78 -0
  150. package/core/src/artifacts/index.ts +16 -0
  151. package/core/src/artifacts/ui-artifacts.ts +412 -0
  152. package/core/src/assertions/__tests__/engine.test.ts +360 -0
  153. package/core/src/assertions/engine.ts +577 -0
  154. package/core/src/assertions/index.ts +13 -0
  155. package/core/src/assertions/types.ts +229 -0
  156. package/core/src/auth/__tests__/api-key-provider.test.ts +282 -0
  157. package/core/src/auth/__tests__/auth-manager.test.ts +430 -0
  158. package/core/src/auth/__tests__/basic-auth-provider.test.ts +364 -0
  159. package/core/src/auth/__tests__/cloud-providers.test.ts +751 -0
  160. package/core/src/auth/__tests__/jwt-provider.test.ts +400 -0
  161. package/core/src/auth/__tests__/oauth2-provider.test.ts +383 -0
  162. package/core/src/auth/__tests__/totp-provider.test.ts +294 -0
  163. package/core/src/auth/__tests__/ui-login-provider.test.ts +323 -0
  164. package/core/src/auth/api-key-provider.ts +75 -0
  165. package/core/src/auth/aws-iam-provider.ts +212 -0
  166. package/core/src/auth/azure-ad-provider.ts +126 -0
  167. package/core/src/auth/basic-auth-provider.ts +133 -0
  168. package/core/src/auth/gcp-adc-provider.ts +146 -0
  169. package/core/src/auth/index.ts +342 -0
  170. package/core/src/auth/jwt-provider.ts +193 -0
  171. package/core/src/auth/manager.ts +281 -0
  172. package/core/src/auth/oauth2-provider.ts +141 -0
  173. package/core/src/auth/totp-provider.ts +163 -0
  174. package/core/src/auth/ui-login-provider.ts +242 -0
  175. package/core/src/cache/__tests__/lru-cache.test.ts +564 -0
  176. package/core/src/cache/index.ts +13 -0
  177. package/core/src/cache/lru-cache.ts +536 -0
  178. package/core/src/crawler/__tests__/journey-generator.test.ts +344 -0
  179. package/core/src/crawler/__tests__/selector-generator.test.ts +211 -0
  180. package/core/src/crawler/index.ts +335 -0
  181. package/core/src/crawler/journey-generator.ts +471 -0
  182. package/core/src/crawler/page-analyzer.ts +857 -0
  183. package/core/src/crawler/selector-generator.ts +280 -0
  184. package/core/src/crawler/types.ts +475 -0
  185. package/core/src/dashboard/__tests__/real-world.test.ts +430 -0
  186. package/core/src/dashboard/__tests__/server.test.ts +283 -0
  187. package/core/src/dashboard/__tests__/types.test.ts +208 -0
  188. package/core/src/dashboard/assets.ts +692 -0
  189. package/core/src/dashboard/index.ts +17 -0
  190. package/core/src/dashboard/server.ts +401 -0
  191. package/core/src/dashboard/types.ts +78 -0
  192. package/core/src/discoverer/__tests__/test-discoverer.test.ts +444 -0
  193. package/core/src/discoverer/index.ts +374 -0
  194. package/core/src/fixtures/__tests__/loader.test.ts +246 -0
  195. package/core/src/fixtures/__tests__/resolver.test.ts +334 -0
  196. package/core/src/fixtures/index.ts +9 -0
  197. package/core/src/fixtures/loader.ts +189 -0
  198. package/core/src/fixtures/resolver.ts +221 -0
  199. package/core/src/fixtures/types.ts +86 -0
  200. package/core/src/flakiness/__tests__/flakiness.test.ts +554 -0
  201. package/core/src/flakiness/index.ts +536 -0
  202. package/core/src/generation/__tests__/code-formatter.test.ts +170 -0
  203. package/core/src/generation/__tests__/code-generator-contract.test.ts +207 -0
  204. package/core/src/generation/__tests__/code-generator.test.ts +586 -0
  205. package/core/src/generation/__tests__/crawler-pack-generator.test.ts +479 -0
  206. package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +718 -0
  207. package/core/src/generation/__tests__/generation-integration.test.ts +655 -0
  208. package/core/src/generation/__tests__/pack-generator.test.ts +408 -0
  209. package/core/src/generation/__tests__/prompt-builder.test.ts +200 -0
  210. package/core/src/generation/__tests__/real-provider-integration.test.ts +414 -0
  211. package/core/src/generation/__tests__/source-analyzer.test.ts +774 -0
  212. package/core/src/generation/__tests__/test-optimizer.test.ts +255 -0
  213. package/core/src/generation/code-formatter.ts +408 -0
  214. package/core/src/generation/code-generator.ts +470 -0
  215. package/core/src/generation/crawler-pack-generator.ts +289 -0
  216. package/core/src/generation/generator.ts +113 -0
  217. package/core/src/generation/index.ts +59 -0
  218. package/core/src/generation/pack-generator.ts +527 -0
  219. package/core/src/generation/prompt-builder.ts +772 -0
  220. package/core/src/generation/source-analyzer.ts +830 -0
  221. package/core/src/generation/test-optimizer.ts +474 -0
  222. package/core/src/generation/types.ts +217 -0
  223. package/core/src/hooks/__tests__/compose.test.ts +636 -0
  224. package/core/src/hooks/__tests__/runner.test.ts +478 -0
  225. package/core/src/hooks/compose.ts +268 -0
  226. package/core/src/hooks/runner.ts +364 -0
  227. package/core/src/index.ts +255 -0
  228. package/core/src/pack/__tests__/migrator.test.ts +594 -0
  229. package/core/src/pack/__tests__/validator.test.ts +759 -0
  230. package/core/src/pack/migrator.ts +353 -0
  231. package/core/src/pack/validator.ts +359 -0
  232. package/core/src/pack-v2/__tests__/loader.test.ts +533 -0
  233. package/core/src/pack-v2/__tests__/migrator.test.ts +455 -0
  234. package/core/src/pack-v2/__tests__/validator.test.ts +609 -0
  235. package/core/src/pack-v2/index.ts +41 -0
  236. package/core/src/pack-v2/loader.ts +358 -0
  237. package/core/src/pack-v2/migrator.ts +540 -0
  238. package/core/src/pack-v2/validator.ts +726 -0
  239. package/core/src/parallel/README.md +143 -0
  240. package/core/src/parallel/index.ts +16 -0
  241. package/core/src/parallel/parallel-runner.ts +282 -0
  242. package/core/src/pom/__tests__/loader.test.ts +378 -0
  243. package/core/src/pom/base-page.ts +425 -0
  244. package/core/src/pom/index.ts +45 -0
  245. package/core/src/pom/loader.ts +480 -0
  246. package/core/src/pom/types.ts +146 -0
  247. package/core/src/proof/__tests__/proof-roundtrip.test.ts +149 -0
  248. package/core/src/proof/__tests__/schema-validation-manual.mjs +211 -0
  249. package/core/src/proof/__tests__/schema-validation.test.ts +336 -0
  250. package/core/src/proof/__tests__/signer.test.ts +486 -0
  251. package/core/src/proof/__tests__/temporal-regression.test.ts +537 -0
  252. package/core/src/proof/__tests__/verifier-advanced.test.ts +588 -0
  253. package/core/src/proof/__tests__/verifier.test.ts +413 -0
  254. package/core/src/proof/bundle.ts +290 -0
  255. package/core/src/proof/canonicalize.ts +116 -0
  256. package/core/src/proof/index.ts +74 -0
  257. package/core/src/proof/schema.ts +285 -0
  258. package/core/src/proof/signer.ts +293 -0
  259. package/core/src/proof/verifier.ts +380 -0
  260. package/core/src/regression/__tests__/detector.test.ts +396 -0
  261. package/core/src/regression/__tests__/trend-analyzer.test.ts +300 -0
  262. package/core/src/regression/detector.ts +629 -0
  263. package/core/src/regression/index.ts +34 -0
  264. package/core/src/regression/trend-analyzer.ts +468 -0
  265. package/core/src/regression/types.ts +295 -0
  266. package/core/src/regression/vault.ts +419 -0
  267. package/core/src/repair/__tests__/repairer.test.ts +572 -0
  268. package/core/src/repair/__tests__/types.test.ts +302 -0
  269. package/core/src/repair/engine/__tests__/fixer.test.ts +482 -0
  270. package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +395 -0
  271. package/core/src/repair/engine/fixer.ts +271 -0
  272. package/core/src/repair/engine/suggestion-engine.ts +234 -0
  273. package/core/src/repair/index.ts +53 -0
  274. package/core/src/repair/repairer.ts +376 -0
  275. package/core/src/repair/types.ts +119 -0
  276. package/core/src/repair/utils/__tests__/error-analyzer.test.ts +454 -0
  277. package/core/src/repair/utils/error-analyzer.ts +308 -0
  278. package/core/src/reporting/README.md +144 -0
  279. package/core/src/reporting/html-reporter.ts +835 -0
  280. package/core/src/reporting/index.ts +16 -0
  281. package/core/src/retry/README.md +192 -0
  282. package/core/src/retry/__tests__/flakiness-integration.test.ts +475 -0
  283. package/core/src/retry/__tests__/retry-engine.test.ts +424 -0
  284. package/core/src/retry/flakiness-integration.ts +267 -0
  285. package/core/src/retry/index.ts +48 -0
  286. package/core/src/retry/retry-engine.ts +368 -0
  287. package/core/src/retry/types.ts +208 -0
  288. package/core/src/retry/vault.ts +413 -0
  289. package/core/src/runner/__tests__/flakiness-integration.test.ts +566 -0
  290. package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +218 -0
  291. package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +199 -0
  292. package/core/src/runner/__tests__/phase3-runner.test.ts +1118 -0
  293. package/core/src/runner/e2e-helpers.ts +216 -0
  294. package/core/src/runner/phase3-runner.ts +1236 -0
  295. package/core/src/schemas/gherkin-report.json +122 -0
  296. package/core/src/secrets/__tests__/crypto.test.ts +180 -0
  297. package/core/src/secrets/crypto.ts +289 -0
  298. package/core/src/secrets/manager.ts +272 -0
  299. package/core/src/security/__tests__/hardening.test.ts +480 -0
  300. package/core/src/security/redaction-patterns-extended.ts +278 -0
  301. package/core/src/security/redactor.ts +326 -0
  302. package/core/src/self-healing/assertion-healer.ts +485 -0
  303. package/core/src/self-healing/engine.ts +626 -0
  304. package/core/src/self-healing/index.ts +33 -0
  305. package/core/src/self-healing/selector-healer.ts +488 -0
  306. package/core/src/self-healing/types.ts +193 -0
  307. package/core/src/serve/diagnostics-collector.ts +201 -0
  308. package/core/src/serve/health-checker.ts +274 -0
  309. package/core/src/serve/index.ts +9 -0
  310. package/core/src/serve/metrics-collector.ts +386 -0
  311. package/core/src/serve/process-manager.ts +265 -0
  312. package/core/src/serve/server.ts +230 -0
  313. package/core/src/slo/config.ts +408 -0
  314. package/core/src/slo/index.ts +68 -0
  315. package/core/src/slo/sli-calculator.ts +474 -0
  316. package/core/src/slo/slo-tracker.ts +481 -0
  317. package/core/src/slo/types.ts +408 -0
  318. package/core/src/slo/vault.ts +600 -0
  319. package/core/src/tui/__tests__/monitor.test.ts +336 -0
  320. package/core/src/tui/__tests__/real-world.test.ts +376 -0
  321. package/core/src/tui/__tests__/renderer.test.ts +201 -0
  322. package/core/src/tui/__tests__/types.test.ts +295 -0
  323. package/core/src/tui/index.ts +19 -0
  324. package/core/src/tui/monitor.ts +331 -0
  325. package/core/src/tui/renderer.ts +269 -0
  326. package/core/src/tui/types.ts +68 -0
  327. package/core/src/types/pack-v1.ts +305 -0
  328. package/core/src/types/pack-v2.ts +501 -0
  329. package/core/src/types/trust-score.ts +258 -0
  330. package/core/src/vault/__tests__/flakiness-vault.test.ts +562 -0
  331. package/core/src/vault/__tests__/vault.test.ts +259 -0
  332. package/core/src/vault/cas.ts +323 -0
  333. package/core/src/vault/index.ts +1361 -0
  334. package/core/src/vault/schema.sql +168 -0
  335. package/core/src/visual/README.md +185 -0
  336. package/core/src/visual/index.ts +14 -0
  337. package/core/src/visual/visual-regression.ts +347 -0
  338. package/core/src/watch/__tests__/watch-mode.test.ts +192 -0
  339. package/core/src/watch/index.ts +14 -0
  340. package/core/src/watch/watch-mode.ts +565 -0
  341. package/core/tsconfig.json +12 -0
  342. package/core/vitest.config.ts +52 -0
  343. package/docs/ARCHITECTURE.md +901 -0
  344. package/docs/AUDIT-GLOBAL-DEC2025.md +271 -0
  345. package/docs/BETA_TESTING.md +257 -0
  346. package/docs/BETA_TESTING_PLAN.md +727 -0
  347. package/docs/CERTIFICATION-REPORT.md +142 -0
  348. package/docs/COMPLETE_AUDIT_REFACTORING.md +965 -0
  349. package/docs/DEVELOPMENT.md +545 -0
  350. package/docs/DEVELOPMENT_HISTORY.md +345 -0
  351. package/docs/LIMITATIONS.md +176 -0
  352. package/docs/MIGRATION.md +303 -0
  353. package/docs/OPTION_3_4_EXPLORATION.md +1257 -0
  354. package/docs/PHASE1_PERFORMANCE.md +144 -0
  355. package/docs/QA360_Cloud.postman_collection.json +89 -0
  356. package/docs/QA360_TESTING_PHILOSOPHY.md +769 -0
  357. package/docs/QA_TEST_PLAN.md +727 -0
  358. package/docs/README.md +50 -0
  359. package/docs/STATUS.md +198 -0
  360. package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +615 -0
  361. package/docs/USER_GUIDE.md +687 -0
  362. package/docs/WORK-DONE-ADAPTER-TESTS.md +136 -0
  363. package/docs/adapters-security.md +485 -0
  364. package/docs/architecture-diagram.mmd +168 -0
  365. package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +396 -0
  366. package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +324 -0
  367. package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +644 -0
  368. package/docs/archive/ARCH-01_NEXT_STEPS.md +60 -0
  369. package/docs/archive/BRANCH_PROTECTION.md +183 -0
  370. package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +222 -0
  371. package/docs/archive/HANDOFF_TEST-01.md +669 -0
  372. package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +372 -0
  373. package/docs/archive/NODE_UPGRADE_GUIDE.md +188 -0
  374. package/docs/archive/PHASE1_COMPLETION.md +386 -0
  375. package/docs/archive/PHASE2_COMPLETION.md +404 -0
  376. package/docs/archive/PHASE3_AND_4_FINAL.md +360 -0
  377. package/docs/archive/PHASE3_COMPLETE.md +301 -0
  378. package/docs/archive/PHASE3_STATUS.md +255 -0
  379. package/docs/archive/PRE-WEEK2-AUDIT.md +364 -0
  380. package/docs/archive/README.md +16 -0
  381. package/docs/archive/SCHEMA_AJV_2020_FIX.md +245 -0
  382. package/docs/archive/TEST-01_AUDIT_REPORT.md +240 -0
  383. package/docs/archive/TEST-01_COVERAGE_PLAN.md +423 -0
  384. package/docs/archive/obsolete-proposals/dom-element-discovery-mode.md +250 -0
  385. package/docs/archive/obsolete-proposals/qa360-comprehensive-test-plan.md +1249 -0
  386. package/docs/archive/obsolete-proposals/qa360-quick-start-guide.md +298 -0
  387. package/docs/archive/obsolete-proposals/technical-plan-dom-discovery.md +870 -0
  388. package/docs/budgets-advanced.md +308 -0
  389. package/docs/examples/history-export-gc.md +285 -0
  390. package/docs/examples/pack-v2-complete.yaml +158 -0
  391. package/docs/examples/pack-v2-quickstart.yaml +24 -0
  392. package/docs/examples/pack-v2-ui-login.yaml +81 -0
  393. package/docs/examples/qa360-report.json +50 -0
  394. package/docs/history.md +565 -0
  395. package/docs/hooks.md +304 -0
  396. package/docs/llm-providers.md +512 -0
  397. package/docs/mcp-server.md +651 -0
  398. package/docs/mcp-tools.md +1131 -0
  399. package/docs/pack-v1.md +383 -0
  400. package/docs/pack-v2.md +558 -0
  401. package/docs/page-objects.md +366 -0
  402. package/docs/proofs.md +670 -0
  403. package/docs/quickstart-5min.md +257 -0
  404. package/docs/readiness-ci.md +654 -0
  405. package/docs/rfc/README.md +20 -0
  406. package/docs/rfc/proof-bundle-v1.md +787 -0
  407. package/docs/secrets.md +392 -0
  408. package/docs/serve.md +494 -0
  409. package/docs/unit-test-adapters.md +168 -0
  410. package/docs/vault.md +491 -0
  411. package/e2e/qa360-e2e.test.ts +696 -0
  412. package/e2e/vitest.config.ts +18 -0
  413. package/examples/README.md +30 -140
  414. package/examples/ci/docker-compose-serve.yml +375 -0
  415. package/examples/ci/github-actions-serve.yml +345 -0
  416. package/examples/ci/gitlab-ci-serve.yml +407 -0
  417. package/examples/datasets/README.md +101 -0
  418. package/examples/datasets/b2bshop.ts +155 -0
  419. package/examples/datasets/index.ts +57 -0
  420. package/examples/datasets/reqres.ts +195 -0
  421. package/examples/fixtures-demo/fixtures/users.yml +39 -0
  422. package/examples/fixtures-demo/pack.yml +71 -0
  423. package/examples/future-api/README.md +16 -0
  424. package/examples/future-api/diag.js +7 -0
  425. package/examples/future-api/health.js +4 -0
  426. package/examples/future-api/packs.js +13 -0
  427. package/examples/future-api/runpack.js +10 -0
  428. package/examples/generation/README.md +148 -0
  429. package/examples/generation/pack-generator-example.js +115 -0
  430. package/examples/generation/source-analyzer-example.js +115 -0
  431. package/examples/httpbin/pack.yml +59 -0
  432. package/examples/load-testing/mcp-load.yml +115 -0
  433. package/examples/load-testing/mcp-stdio.yml +95 -0
  434. package/examples/mcp/claude-desktop-config.json +33 -0
  435. package/examples/mcp/claude-desktop.json +16 -0
  436. package/examples/mcp/conversation-sample.md +131 -0
  437. package/examples/mcp/demo-60s.md +330 -0
  438. package/examples/mcp/sample-conversation.jsonl +21 -0
  439. package/examples/mcp/vscode-settings.json +22 -0
  440. package/examples/pack-v2-complete.yml +242 -0
  441. package/examples/pack-v2-examples.md +244 -0
  442. package/examples/pack-v2-quickstart.yml +55 -0
  443. package/examples/packs-business/ecommerce-api.yml +121 -0
  444. package/examples/packs-business/saas-dashboard-ui.yml +133 -0
  445. package/examples/packs-conformance/compose-multi.yml +174 -0
  446. package/examples/packs-conformance/full.yml +152 -0
  447. package/examples/packs-conformance/heavy-artifacts.yml +152 -0
  448. package/examples/packs-conformance/minimal.yml +71 -0
  449. package/examples/packs-conformance/secrets-missing.yml +97 -0
  450. package/examples/packs-conformance/timeouts.yml +77 -0
  451. package/examples/pom-demo/README.md +104 -0
  452. package/examples/pom-demo/pack.yml +60 -0
  453. package/examples/pom-demo/pages/DashboardPage.page.ts +73 -0
  454. package/examples/pom-demo/pages/LoginPage.page.ts +76 -0
  455. package/examples/proofs/e2e-playwright-proof.json +75 -0
  456. package/examples/proofs/httpbin-proof.json +69 -0
  457. package/examples/proofs/multi-adapter-proof.json +117 -0
  458. package/examples/proofs/test-proof.json +26 -0
  459. package/examples/restful-api-dev/README.md +102 -0
  460. package/examples/restful-api-dev/restful-api-advanced.yml +29 -0
  461. package/examples/restful-api-dev/restful-api-basic.yml +29 -0
  462. package/examples/web-lite/.github/workflows/qa360-phase3.yml +73 -0
  463. package/examples/web-lite/api-mock/server.js +258 -0
  464. package/examples/web-lite/pack.yml +71 -0
  465. package/examples/web-lite/services.yml +43 -0
  466. package/examples/web-lite/web-content/healthz +1 -0
  467. package/examples/web-lite/web-content/index.html +259 -0
  468. package/package.json +55 -45
  469. package/packages/mcp/CHANGELOG.md +109 -0
  470. package/packages/mcp/IMPLEMENTATION_SUMMARY.md +350 -0
  471. package/packages/mcp/LICENSE +21 -0
  472. package/packages/mcp/QUICK_START.md +291 -0
  473. package/packages/mcp/README.md +294 -0
  474. package/packages/mcp/TELEMETRY.md +220 -0
  475. package/packages/mcp/package.json +91 -0
  476. package/packages/mcp/scripts/generate-sbom-fallback.cjs +84 -0
  477. package/packages/mcp/scripts/safe-postinstall.cjs +32 -0
  478. package/packages/mcp/src/__tests__/contract.test.ts +902 -0
  479. package/packages/mcp/src/cli/cli.ts +137 -0
  480. package/packages/mcp/src/cli/doctor.ts +286 -0
  481. package/packages/mcp/src/cli/fix.ts +99 -0
  482. package/packages/mcp/src/cli/init.ts +233 -0
  483. package/packages/mcp/src/cli/postinstall.ts +14 -0
  484. package/packages/mcp/src/cli/reset.ts +44 -0
  485. package/packages/mcp/src/cli/telemetry.ts +166 -0
  486. package/packages/mcp/src/cli/test-dx.ts +94 -0
  487. package/packages/mcp/src/cli/uninstall.ts +80 -0
  488. package/packages/mcp/src/cli/up.ts +178 -0
  489. package/packages/mcp/src/index.ts +12 -0
  490. package/packages/mcp/src/scripts/e2e-local.ts +337 -0
  491. package/packages/mcp/src/scripts/verify-settings.ts +242 -0
  492. package/packages/mcp/src/security/audit.ts +244 -0
  493. package/packages/mcp/src/security/manager.ts +242 -0
  494. package/packages/mcp/src/server/full-server.ts +212 -0
  495. package/packages/mcp/src/server/minimal-server.ts +134 -0
  496. package/packages/mcp/src/tools/history.ts +388 -0
  497. package/packages/mcp/src/tools/pack.ts +449 -0
  498. package/packages/mcp/src/tools/registry.ts +638 -0
  499. package/packages/mcp/src/tools/report.ts +100 -0
  500. package/packages/mcp/src/tools/run.ts +268 -0
  501. package/packages/mcp/src/tools/secrets.ts +198 -0
  502. package/packages/mcp/src/tools/serve.ts +221 -0
  503. package/packages/mcp/src/tools/triage.ts +532 -0
  504. package/packages/mcp/src/tools/types.ts +26 -0
  505. package/packages/mcp/src/tools/vault.ts +164 -0
  506. package/packages/mcp/src/tools/verify.ts +166 -0
  507. package/packages/mcp/src/types/index.ts +311 -0
  508. package/packages/mcp/src/types/mcp-stubs.ts +83 -0
  509. package/packages/mcp/tsconfig.json +16 -0
  510. package/playwright.config.ts +20 -0
  511. package/pnpm-workspace.yaml +4 -0
  512. package/run-test-and-push.sh +20 -0
  513. package/scripts/build-proof-cli.sh +110 -0
  514. package/scripts/ci/check-windows-paths.js +92 -0
  515. package/scripts/ci/invariants.sh +124 -0
  516. package/scripts/ci/make-final-bundle.js +106 -0
  517. package/scripts/ci/mcp-run-multipack.js +305 -0
  518. package/scripts/ci/run-pack-suite.sh +103 -0
  519. package/scripts/ci/run-phase7-final.sh +190 -0
  520. package/scripts/ci/slo-assert.js +158 -0
  521. package/scripts/ci/test-fault-tolerance.sh +301 -0
  522. package/scripts/install-mcp.sh +66 -0
  523. package/scripts/mcp-smoke.mjs +27 -0
  524. package/scripts/smoke.sh +26 -0
  525. package/scripts/stress-test.js +288 -0
  526. package/scripts/sync-version.mjs +50 -0
  527. package/scripts/validate-examples.mjs +404 -0
  528. package/scripts/validation/simple-pack-check.sh +51 -0
  529. package/scripts/validation/validate-universal-pack.mjs +77 -0
  530. package/scripts/verify-persistence.js +127 -0
  531. package/test-pack.yaml +43 -0
  532. package/test-results/.last-run.json +4 -0
  533. package/test-runner.mjs +87 -0
  534. package/tests/artifacts.spec.js +147 -0
  535. package/tests/contracts.spec.js +239 -0
  536. package/tests/e2e/assertions.test.mjs +370 -0
  537. package/tests/e2e/crawler.test.mjs +451 -0
  538. package/tests/e2e/playwright-plus-plus.test.mjs +604 -0
  539. package/tests/e2e/proof-bundle.test.mjs +258 -0
  540. package/tests/e2e/real-world/saucedemo.test.mjs +714 -0
  541. package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +760 -0
  542. package/tests/e2e/ui-actions.test.mjs +546 -0
  543. package/tests/gherkin.e2e.spec.ts +310 -0
  544. package/tests/no-console-errors.spec.js +136 -0
  545. package/tests/pdf.spec.ts +252 -0
  546. package/tests/run-pack.spec.ts +58 -0
  547. package/tsconfig.base.json +15 -0
  548. package/tsconfig.build.json +8 -0
  549. package/tsconfig.json +37 -0
  550. package/tsconfig.test.json +18 -0
  551. package/typedoc.json +37 -0
  552. package/ui/README.md +50 -0
  553. package/verify-proof.mjs +60 -0
  554. package/dist/cli-minimal.d.ts +0 -6
  555. package/dist/cli-minimal.js +0 -36
  556. package/dist/commands/ai.d.ts +0 -43
  557. package/dist/commands/ai.js +0 -616
  558. package/dist/commands/ask.d.ts +0 -94
  559. package/dist/commands/ask.js +0 -582
  560. package/dist/commands/coverage.d.ts +0 -8
  561. package/dist/commands/coverage.js +0 -252
  562. package/dist/commands/crawl.d.ts +0 -24
  563. package/dist/commands/crawl.js +0 -121
  564. package/dist/commands/doctor.d.ts +0 -54
  565. package/dist/commands/doctor.js +0 -513
  566. package/dist/commands/examples.d.ts +0 -33
  567. package/dist/commands/examples.js +0 -193
  568. package/dist/commands/explain.d.ts +0 -27
  569. package/dist/commands/explain.js +0 -630
  570. package/dist/commands/flakiness.d.ts +0 -73
  571. package/dist/commands/flakiness.js +0 -435
  572. package/dist/commands/generate.d.ts +0 -66
  573. package/dist/commands/generate.js +0 -438
  574. package/dist/commands/history.d.ts +0 -76
  575. package/dist/commands/history.js +0 -755
  576. package/dist/commands/init.d.ts +0 -106
  577. package/dist/commands/init.js +0 -616
  578. package/dist/commands/monitor.d.ts +0 -27
  579. package/dist/commands/monitor.js +0 -225
  580. package/dist/commands/ollama.d.ts +0 -40
  581. package/dist/commands/ollama.js +0 -301
  582. package/dist/commands/pack.d.ts +0 -70
  583. package/dist/commands/pack.js +0 -413
  584. package/dist/commands/regression.d.ts +0 -8
  585. package/dist/commands/regression.js +0 -340
  586. package/dist/commands/repair.d.ts +0 -26
  587. package/dist/commands/repair.js +0 -307
  588. package/dist/commands/report.d.ts +0 -62
  589. package/dist/commands/report.js +0 -378
  590. package/dist/commands/retry.d.ts +0 -43
  591. package/dist/commands/retry.js +0 -275
  592. package/dist/commands/run.d.ts +0 -41
  593. package/dist/commands/run.js +0 -169
  594. package/dist/commands/scan.d.ts +0 -5
  595. package/dist/commands/scan.js +0 -155
  596. package/dist/commands/secrets.d.ts +0 -58
  597. package/dist/commands/secrets.js +0 -289
  598. package/dist/commands/serve.d.ts +0 -13
  599. package/dist/commands/serve.js +0 -156
  600. package/dist/commands/slo.d.ts +0 -8
  601. package/dist/commands/slo.js +0 -327
  602. package/dist/commands/verify.d.ts +0 -32
  603. package/dist/commands/verify.js +0 -278
  604. package/dist/core/adapters/gitleaks-secrets.d.ts +0 -114
  605. package/dist/core/adapters/gitleaks-secrets.js +0 -410
  606. package/dist/core/adapters/k6-perf.d.ts +0 -85
  607. package/dist/core/adapters/k6-perf.js +0 -398
  608. package/dist/core/adapters/osv-deps.d.ts +0 -123
  609. package/dist/core/adapters/osv-deps.js +0 -372
  610. package/dist/core/adapters/playwright-native-adapter.d.ts +0 -121
  611. package/dist/core/adapters/playwright-native-adapter.js +0 -339
  612. package/dist/core/adapters/playwright-native-api.d.ts +0 -183
  613. package/dist/core/adapters/playwright-native-api.js +0 -465
  614. package/dist/core/adapters/playwright-ui.d.ts +0 -197
  615. package/dist/core/adapters/playwright-ui.js +0 -840
  616. package/dist/core/adapters/semgrep-sast.d.ts +0 -99
  617. package/dist/core/adapters/semgrep-sast.js +0 -322
  618. package/dist/core/adapters/zap-dast.d.ts +0 -133
  619. package/dist/core/adapters/zap-dast.js +0 -424
  620. package/dist/core/ai/anthropic-provider.d.ts +0 -50
  621. package/dist/core/ai/anthropic-provider.js +0 -223
  622. package/dist/core/ai/deepseek-provider.d.ts +0 -81
  623. package/dist/core/ai/deepseek-provider.js +0 -266
  624. package/dist/core/ai/index.d.ts +0 -60
  625. package/dist/core/ai/index.js +0 -18
  626. package/dist/core/ai/llm-client.d.ts +0 -45
  627. package/dist/core/ai/llm-client.js +0 -7
  628. package/dist/core/ai/mock-provider.d.ts +0 -49
  629. package/dist/core/ai/mock-provider.js +0 -121
  630. package/dist/core/ai/ollama-provider.d.ts +0 -78
  631. package/dist/core/ai/ollama-provider.js +0 -204
  632. package/dist/core/ai/openai-provider.d.ts +0 -48
  633. package/dist/core/ai/openai-provider.js +0 -200
  634. package/dist/core/ai/provider-factory.d.ts +0 -160
  635. package/dist/core/ai/provider-factory.js +0 -269
  636. package/dist/core/artifacts/index.d.ts +0 -6
  637. package/dist/core/artifacts/index.js +0 -6
  638. package/dist/core/artifacts/ui-artifacts.d.ts +0 -133
  639. package/dist/core/artifacts/ui-artifacts.js +0 -304
  640. package/dist/core/assertions/engine.d.ts +0 -51
  641. package/dist/core/assertions/engine.js +0 -530
  642. package/dist/core/assertions/index.d.ts +0 -11
  643. package/dist/core/assertions/index.js +0 -11
  644. package/dist/core/assertions/types.d.ts +0 -121
  645. package/dist/core/assertions/types.js +0 -37
  646. package/dist/core/auth/api-key-provider.d.ts +0 -16
  647. package/dist/core/auth/api-key-provider.js +0 -63
  648. package/dist/core/auth/aws-iam-provider.d.ts +0 -35
  649. package/dist/core/auth/aws-iam-provider.js +0 -177
  650. package/dist/core/auth/azure-ad-provider.d.ts +0 -15
  651. package/dist/core/auth/azure-ad-provider.js +0 -99
  652. package/dist/core/auth/basic-auth-provider.d.ts +0 -26
  653. package/dist/core/auth/basic-auth-provider.js +0 -111
  654. package/dist/core/auth/gcp-adc-provider.d.ts +0 -27
  655. package/dist/core/auth/gcp-adc-provider.js +0 -126
  656. package/dist/core/auth/index.d.ts +0 -238
  657. package/dist/core/auth/index.js +0 -82
  658. package/dist/core/auth/jwt-provider.d.ts +0 -19
  659. package/dist/core/auth/jwt-provider.js +0 -160
  660. package/dist/core/auth/manager.d.ts +0 -84
  661. package/dist/core/auth/manager.js +0 -230
  662. package/dist/core/auth/oauth2-provider.d.ts +0 -17
  663. package/dist/core/auth/oauth2-provider.js +0 -114
  664. package/dist/core/auth/totp-provider.d.ts +0 -31
  665. package/dist/core/auth/totp-provider.js +0 -134
  666. package/dist/core/auth/ui-login-provider.d.ts +0 -26
  667. package/dist/core/auth/ui-login-provider.js +0 -198
  668. package/dist/core/cache/index.d.ts +0 -7
  669. package/dist/core/cache/index.js +0 -6
  670. package/dist/core/cache/lru-cache.d.ts +0 -203
  671. package/dist/core/cache/lru-cache.js +0 -397
  672. package/dist/core/core/coverage/analyzer.d.ts +0 -101
  673. package/dist/core/core/coverage/analyzer.js +0 -415
  674. package/dist/core/core/coverage/collector.d.ts +0 -74
  675. package/dist/core/core/coverage/collector.js +0 -459
  676. package/dist/core/core/coverage/config.d.ts +0 -37
  677. package/dist/core/core/coverage/config.js +0 -156
  678. package/dist/core/core/coverage/index.d.ts +0 -11
  679. package/dist/core/core/coverage/index.js +0 -15
  680. package/dist/core/core/coverage/types.d.ts +0 -267
  681. package/dist/core/core/coverage/types.js +0 -6
  682. package/dist/core/core/coverage/vault.d.ts +0 -95
  683. package/dist/core/core/coverage/vault.js +0 -405
  684. package/dist/core/coverage/analyzer.d.ts +0 -101
  685. package/dist/core/coverage/analyzer.js +0 -415
  686. package/dist/core/coverage/collector.d.ts +0 -74
  687. package/dist/core/coverage/collector.js +0 -459
  688. package/dist/core/coverage/config.d.ts +0 -37
  689. package/dist/core/coverage/config.js +0 -156
  690. package/dist/core/coverage/index.d.ts +0 -11
  691. package/dist/core/coverage/index.js +0 -15
  692. package/dist/core/coverage/types.d.ts +0 -267
  693. package/dist/core/coverage/types.js +0 -6
  694. package/dist/core/coverage/vault.d.ts +0 -95
  695. package/dist/core/coverage/vault.js +0 -405
  696. package/dist/core/crawler/index.d.ts +0 -57
  697. package/dist/core/crawler/index.js +0 -281
  698. package/dist/core/crawler/journey-generator.d.ts +0 -49
  699. package/dist/core/crawler/journey-generator.js +0 -412
  700. package/dist/core/crawler/page-analyzer.d.ts +0 -88
  701. package/dist/core/crawler/page-analyzer.js +0 -709
  702. package/dist/core/crawler/selector-generator.d.ts +0 -34
  703. package/dist/core/crawler/selector-generator.js +0 -240
  704. package/dist/core/crawler/types.d.ts +0 -353
  705. package/dist/core/crawler/types.js +0 -6
  706. package/dist/core/dashboard/assets.d.ts +0 -6
  707. package/dist/core/dashboard/assets.js +0 -690
  708. package/dist/core/dashboard/index.d.ts +0 -6
  709. package/dist/core/dashboard/index.js +0 -5
  710. package/dist/core/dashboard/server.d.ts +0 -72
  711. package/dist/core/dashboard/server.js +0 -354
  712. package/dist/core/dashboard/types.d.ts +0 -70
  713. package/dist/core/dashboard/types.js +0 -5
  714. package/dist/core/discoverer/index.d.ts +0 -115
  715. package/dist/core/discoverer/index.js +0 -250
  716. package/dist/core/flakiness/index.d.ts +0 -228
  717. package/dist/core/flakiness/index.js +0 -384
  718. package/dist/core/generation/code-formatter.d.ts +0 -111
  719. package/dist/core/generation/code-formatter.js +0 -307
  720. package/dist/core/generation/code-generator.d.ts +0 -144
  721. package/dist/core/generation/code-generator.js +0 -293
  722. package/dist/core/generation/crawler-pack-generator.d.ts +0 -44
  723. package/dist/core/generation/crawler-pack-generator.js +0 -231
  724. package/dist/core/generation/generator.d.ts +0 -40
  725. package/dist/core/generation/generator.js +0 -76
  726. package/dist/core/generation/index.d.ts +0 -32
  727. package/dist/core/generation/index.js +0 -30
  728. package/dist/core/generation/pack-generator.d.ts +0 -107
  729. package/dist/core/generation/pack-generator.js +0 -416
  730. package/dist/core/generation/prompt-builder.d.ts +0 -132
  731. package/dist/core/generation/prompt-builder.js +0 -672
  732. package/dist/core/generation/source-analyzer.d.ts +0 -213
  733. package/dist/core/generation/source-analyzer.js +0 -657
  734. package/dist/core/generation/test-optimizer.d.ts +0 -117
  735. package/dist/core/generation/test-optimizer.js +0 -328
  736. package/dist/core/generation/types.d.ts +0 -214
  737. package/dist/core/generation/types.js +0 -4
  738. package/dist/core/hooks/compose.d.ts +0 -61
  739. package/dist/core/hooks/compose.js +0 -225
  740. package/dist/core/hooks/runner.d.ts +0 -68
  741. package/dist/core/hooks/runner.js +0 -303
  742. package/dist/core/index.d.ts +0 -104
  743. package/dist/core/index.js +0 -91
  744. package/dist/core/pack/migrator.d.ts +0 -51
  745. package/dist/core/pack/migrator.js +0 -304
  746. package/dist/core/pack/validator.d.ts +0 -42
  747. package/dist/core/pack/validator.js +0 -322
  748. package/dist/core/pack-v2/index.d.ts +0 -9
  749. package/dist/core/pack-v2/index.js +0 -8
  750. package/dist/core/pack-v2/loader.d.ts +0 -63
  751. package/dist/core/pack-v2/loader.js +0 -292
  752. package/dist/core/pack-v2/migrator.d.ts +0 -61
  753. package/dist/core/pack-v2/migrator.js +0 -480
  754. package/dist/core/pack-v2/validator.d.ts +0 -61
  755. package/dist/core/pack-v2/validator.js +0 -577
  756. package/dist/core/parallel/index.d.ts +0 -6
  757. package/dist/core/parallel/index.js +0 -6
  758. package/dist/core/parallel/parallel-runner.d.ts +0 -107
  759. package/dist/core/parallel/parallel-runner.js +0 -192
  760. package/dist/core/proof/bundle.d.ts +0 -137
  761. package/dist/core/proof/bundle.js +0 -160
  762. package/dist/core/proof/canonicalize.d.ts +0 -47
  763. package/dist/core/proof/canonicalize.js +0 -105
  764. package/dist/core/proof/index.d.ts +0 -13
  765. package/dist/core/proof/index.js +0 -18
  766. package/dist/core/proof/schema.d.ts +0 -217
  767. package/dist/core/proof/schema.js +0 -263
  768. package/dist/core/proof/signer.d.ts +0 -111
  769. package/dist/core/proof/signer.js +0 -226
  770. package/dist/core/proof/verifier.d.ts +0 -97
  771. package/dist/core/proof/verifier.js +0 -308
  772. package/dist/core/regression/detector.d.ts +0 -107
  773. package/dist/core/regression/detector.js +0 -497
  774. package/dist/core/regression/index.d.ts +0 -9
  775. package/dist/core/regression/index.js +0 -11
  776. package/dist/core/regression/trend-analyzer.d.ts +0 -102
  777. package/dist/core/regression/trend-analyzer.js +0 -345
  778. package/dist/core/regression/types.d.ts +0 -222
  779. package/dist/core/regression/types.js +0 -7
  780. package/dist/core/regression/vault.d.ts +0 -87
  781. package/dist/core/regression/vault.js +0 -289
  782. package/dist/core/repair/engine/fixer.d.ts +0 -24
  783. package/dist/core/repair/engine/fixer.js +0 -226
  784. package/dist/core/repair/engine/suggestion-engine.d.ts +0 -18
  785. package/dist/core/repair/engine/suggestion-engine.js +0 -187
  786. package/dist/core/repair/index.d.ts +0 -10
  787. package/dist/core/repair/index.js +0 -13
  788. package/dist/core/repair/repairer.d.ts +0 -90
  789. package/dist/core/repair/repairer.js +0 -284
  790. package/dist/core/repair/types.d.ts +0 -91
  791. package/dist/core/repair/types.js +0 -6
  792. package/dist/core/repair/utils/error-analyzer.d.ts +0 -28
  793. package/dist/core/repair/utils/error-analyzer.js +0 -264
  794. package/dist/core/reporting/html-reporter.d.ts +0 -119
  795. package/dist/core/reporting/html-reporter.js +0 -737
  796. package/dist/core/reporting/index.d.ts +0 -6
  797. package/dist/core/reporting/index.js +0 -6
  798. package/dist/core/retry/flakiness-integration.d.ts +0 -60
  799. package/dist/core/retry/flakiness-integration.js +0 -228
  800. package/dist/core/retry/index.d.ts +0 -14
  801. package/dist/core/retry/index.js +0 -16
  802. package/dist/core/retry/retry-engine.d.ts +0 -80
  803. package/dist/core/retry/retry-engine.js +0 -296
  804. package/dist/core/retry/types.d.ts +0 -178
  805. package/dist/core/retry/types.js +0 -52
  806. package/dist/core/retry/vault.d.ts +0 -77
  807. package/dist/core/retry/vault.js +0 -304
  808. package/dist/core/runner/e2e-helpers.d.ts +0 -102
  809. package/dist/core/runner/e2e-helpers.js +0 -153
  810. package/dist/core/runner/phase3-runner.d.ts +0 -200
  811. package/dist/core/runner/phase3-runner.js +0 -1041
  812. package/dist/core/secrets/crypto.d.ts +0 -75
  813. package/dist/core/secrets/crypto.js +0 -223
  814. package/dist/core/secrets/manager.d.ts +0 -76
  815. package/dist/core/secrets/manager.js +0 -219
  816. package/dist/core/security/redaction-patterns-extended.d.ts +0 -27
  817. package/dist/core/security/redaction-patterns-extended.js +0 -247
  818. package/dist/core/security/redactor.d.ts +0 -71
  819. package/dist/core/security/redactor.js +0 -279
  820. package/dist/core/self-healing/assertion-healer.d.ts +0 -97
  821. package/dist/core/self-healing/assertion-healer.js +0 -371
  822. package/dist/core/self-healing/engine.d.ts +0 -122
  823. package/dist/core/self-healing/engine.js +0 -538
  824. package/dist/core/self-healing/index.d.ts +0 -10
  825. package/dist/core/self-healing/index.js +0 -11
  826. package/dist/core/self-healing/selector-healer.d.ts +0 -103
  827. package/dist/core/self-healing/selector-healer.js +0 -372
  828. package/dist/core/self-healing/types.d.ts +0 -152
  829. package/dist/core/self-healing/types.js +0 -6
  830. package/dist/core/serve/diagnostics-collector.d.ts +0 -32
  831. package/dist/core/serve/diagnostics-collector.js +0 -149
  832. package/dist/core/serve/health-checker.d.ts +0 -44
  833. package/dist/core/serve/health-checker.js +0 -219
  834. package/dist/core/serve/index.d.ts +0 -8
  835. package/dist/core/serve/index.js +0 -8
  836. package/dist/core/serve/metrics-collector.d.ts +0 -24
  837. package/dist/core/serve/metrics-collector.js +0 -322
  838. package/dist/core/serve/process-manager.d.ts +0 -36
  839. package/dist/core/serve/process-manager.js +0 -213
  840. package/dist/core/serve/server.d.ts +0 -36
  841. package/dist/core/serve/server.js +0 -191
  842. package/dist/core/slo/config.d.ts +0 -107
  843. package/dist/core/slo/config.js +0 -360
  844. package/dist/core/slo/index.d.ts +0 -11
  845. package/dist/core/slo/index.js +0 -15
  846. package/dist/core/slo/sli-calculator.d.ts +0 -92
  847. package/dist/core/slo/sli-calculator.js +0 -364
  848. package/dist/core/slo/slo-tracker.d.ts +0 -148
  849. package/dist/core/slo/slo-tracker.js +0 -379
  850. package/dist/core/slo/types.d.ts +0 -281
  851. package/dist/core/slo/types.js +0 -7
  852. package/dist/core/slo/vault.d.ts +0 -102
  853. package/dist/core/slo/vault.js +0 -427
  854. package/dist/core/tui/index.d.ts +0 -7
  855. package/dist/core/tui/index.js +0 -6
  856. package/dist/core/tui/monitor.d.ts +0 -92
  857. package/dist/core/tui/monitor.js +0 -271
  858. package/dist/core/tui/renderer.d.ts +0 -33
  859. package/dist/core/tui/renderer.js +0 -218
  860. package/dist/core/tui/types.d.ts +0 -63
  861. package/dist/core/tui/types.js +0 -5
  862. package/dist/core/types/pack-v1.d.ts +0 -251
  863. package/dist/core/types/pack-v1.js +0 -5
  864. package/dist/core/types/pack-v2.d.ts +0 -425
  865. package/dist/core/types/pack-v2.js +0 -8
  866. package/dist/core/types/trust-score.d.ts +0 -69
  867. package/dist/core/types/trust-score.js +0 -191
  868. package/dist/core/vault/cas.d.ts +0 -90
  869. package/dist/core/vault/cas.js +0 -261
  870. package/dist/core/vault/index.d.ts +0 -326
  871. package/dist/core/vault/index.js +0 -1042
  872. package/dist/core/visual/index.d.ts +0 -6
  873. package/dist/core/visual/index.js +0 -6
  874. package/dist/core/visual/visual-regression.d.ts +0 -113
  875. package/dist/core/visual/visual-regression.js +0 -236
  876. package/dist/core/watch/index.d.ts +0 -7
  877. package/dist/core/watch/index.js +0 -6
  878. package/dist/core/watch/watch-mode.d.ts +0 -213
  879. package/dist/core/watch/watch-mode.js +0 -389
  880. package/dist/generators/index.d.ts +0 -5
  881. package/dist/generators/index.js +0 -5
  882. package/dist/generators/json-reporter.d.ts +0 -10
  883. package/dist/generators/json-reporter.js +0 -12
  884. package/dist/generators/test-generator.d.ts +0 -18
  885. package/dist/generators/test-generator.js +0 -78
  886. package/dist/index.d.ts +0 -8
  887. package/dist/index.js +0 -246
  888. package/dist/scanners/dom-scanner.d.ts +0 -52
  889. package/dist/scanners/dom-scanner.js +0 -296
  890. package/dist/scanners/index.d.ts +0 -4
  891. package/dist/scanners/index.js +0 -4
  892. package/dist/schemas/pack.schema.json +0 -236
  893. package/dist/types/scan.d.ts +0 -68
  894. package/dist/types/scan.js +0 -4
  895. package/dist/utils/config.d.ts +0 -5
  896. package/dist/utils/config.js +0 -136
  897. /package/{bin → cli/bin}/qa360.js +0 -0
  898. /package/{examples → cli/examples}/accessibility.yml +0 -0
  899. /package/{examples → cli/examples}/api-basic.yml +0 -0
  900. /package/{examples → cli/examples}/complete.yml +0 -0
  901. /package/{examples → cli/examples}/crawler.yml +0 -0
  902. /package/{examples → cli/examples}/fullstack.yml +0 -0
  903. /package/{examples → cli/examples}/security.yml +0 -0
  904. /package/{examples → cli/examples}/ui-advanced.yml +0 -0
  905. /package/{examples → cli/examples}/ui-basic.yml +0 -0
  906. /package/{dist/core → core}/schemas/pack.schema.json +0 -0
@@ -0,0 +1,902 @@
1
+ /**
2
+ * MCP Server - Contract Tests
3
+ *
4
+ * Tests the INPUT/OUTPUT contracts for all MCP tools.
5
+ * These tests verify that tools accept the expected arguments
6
+ * and return results matching the declared types.
7
+ *
8
+ * This is critical for MCP consumers (Claude Desktop, etc.)
9
+ * to rely on stable interfaces.
10
+ *
11
+ * Strategy: Mock the underlying QA360 execution and only test
12
+ * the contract layer (input validation, output shape, error handling).
13
+ */
14
+
15
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
16
+
17
+ // Import types
18
+ import type {
19
+ RunArgs,
20
+ RunResult,
21
+ ReportSignArgs,
22
+ ReportSignResult,
23
+ VerifyArgs,
24
+ VerifyResult,
25
+ HistoryListArgs,
26
+ HistoryListResult,
27
+ HistoryGetArgs,
28
+ HistoryGetResult,
29
+ HistoryDiffArgs,
30
+ HistoryDiffResult,
31
+ HistoryTrendArgs,
32
+ HistoryTrendResult,
33
+ HistoryExportArgs,
34
+ HistoryExportResult,
35
+ HistoryGCArgs,
36
+ HistoryGCResult,
37
+ HistoryPinArgs,
38
+ PackAskArgs,
39
+ PackAskResult,
40
+ PackValidateArgs,
41
+ PackValidateResult,
42
+ SecretsAddArgs,
43
+ SecretsListArgs,
44
+ SecretsListResult,
45
+ SecretsRemoveArgs,
46
+ ServeDiagArgs,
47
+ ServeDiagResult,
48
+ VaultGetRunArgs,
49
+ VaultGetArtifactsArgs,
50
+ TriageExplainArgs,
51
+ TriageExplainResult,
52
+ } from '../types/index.js';
53
+
54
+ describe('MCP Tool Contracts - Type Validation', () => {
55
+ /**
56
+ * CONTRACT TEST 1: Run Tool
57
+ * qa360.run - Execute a QA360 test pack
58
+ */
59
+ describe('qa360.run contract', () => {
60
+ it('should accept valid RunArgs', () => {
61
+ const validArgs: RunArgs = {
62
+ packPath: '/path/to/pack.yaml',
63
+ runKey: 'my-test-run',
64
+ strict: true,
65
+ weights: { api: 0.3, ui: 0.4, perf: 0.3 },
66
+ };
67
+
68
+ expect(validArgs.packPath).toBeDefined();
69
+ expect(validArgs.packPath).toMatch(/\.ya?ml$/);
70
+ });
71
+
72
+ it('should accept minimal RunArgs', () => {
73
+ const minimalArgs: RunArgs = {
74
+ packPath: '/path/to/pack.yaml',
75
+ };
76
+
77
+ expect(minimalArgs.packPath).toBeDefined();
78
+ });
79
+
80
+ it('should produce RunResult shape', () => {
81
+ const validResult: RunResult = {
82
+ runId: '550e8400-e29b-41d4-a716-446655440000',
83
+ status: 'passed',
84
+ trust: {
85
+ score: 87,
86
+ weights: { api: 0.3, ui: 0.4, perf: 0.3 },
87
+ },
88
+ gates: [
89
+ {
90
+ name: 'api_smoke',
91
+ status: 'passed',
92
+ duration_ms: 1500,
93
+ key_metrics: { p95_ms: 142 },
94
+ },
95
+ ],
96
+ };
97
+
98
+ expect(validResult.runId).toMatch(/^[0-9a-f-]{36}$/);
99
+ expect(['passed', 'failed', 'cancelled', 'error']).toContain(validResult.status);
100
+ expect(validResult.trust.score).toBeGreaterThanOrEqual(0);
101
+ expect(validResult.trust.score).toBeLessThanOrEqual(100);
102
+ expect(Array.isArray(validResult.gates)).toBe(true);
103
+ });
104
+
105
+ it('should allow all valid status values', () => {
106
+ const statuses: Array<'passed' | 'failed' | 'cancelled' | 'error'> = [
107
+ 'passed',
108
+ 'failed',
109
+ 'cancelled',
110
+ 'error',
111
+ ];
112
+
113
+ statuses.forEach((status) => {
114
+ const result: RunResult = {
115
+ runId: 'test-id',
116
+ status,
117
+ trust: { score: 50 },
118
+ gates: [],
119
+ };
120
+ expect(result.status).toBe(status);
121
+ });
122
+ });
123
+ });
124
+
125
+ /**
126
+ * CONTRACT TEST 2: Report Tool
127
+ * qa360.report.sign - Sign a test report
128
+ */
129
+ describe('qa360.report.sign contract', () => {
130
+ it('should accept ReportSignArgs', () => {
131
+ const args: ReportSignArgs = {
132
+ runId: '550e8400-e29b-41d4-a716-446655440000',
133
+ };
134
+
135
+ expect(args.runId).toMatch(/^[0-9a-f-]{36}$/);
136
+ });
137
+
138
+ it('should produce ReportSignResult', () => {
139
+ const result: ReportSignResult = {
140
+ signature: 'ed25519-base64-signature',
141
+ algorithm: 'ed25519',
142
+ runId: '550e8400-e29b-41d4-a716-446655440000',
143
+ };
144
+
145
+ expect(result.signature).toBeDefined();
146
+ expect(result.algorithm).toBe('ed25519');
147
+ expect(result.runId).toBeDefined();
148
+ });
149
+ });
150
+
151
+ /**
152
+ * CONTRACT TEST 3: Verify Tool
153
+ * qa360.verify - Verify a proof bundle
154
+ */
155
+ describe('qa360.verify contract', () => {
156
+ it('should accept VerifyArgs with runId', () => {
157
+ const args: VerifyArgs = {
158
+ runId: '550e8400-e29b-41d4-a716-446655440000',
159
+ };
160
+
161
+ expect(args.runId).toBeDefined();
162
+ });
163
+
164
+ it('should accept VerifyArgs with proofPath', () => {
165
+ const args: VerifyArgs = {
166
+ proofPath: '/path/to/proof.json',
167
+ };
168
+
169
+ expect(args.proofPath).toBeDefined();
170
+ });
171
+
172
+ it('should produce VerifyResult', () => {
173
+ const validResult: VerifyResult = {
174
+ verified: true,
175
+ algorithm: 'ed25519',
176
+ message: 'Proof verified successfully',
177
+ runId: '550e8400-e29b-41d4-a716-446655440000',
178
+ };
179
+
180
+ const invalidResult: VerifyResult = {
181
+ verified: false,
182
+ algorithm: 'ed25519',
183
+ message: 'Signature verification failed',
184
+ };
185
+
186
+ expect(validResult.verified).toBe(true);
187
+ expect(invalidResult.verified).toBe(false);
188
+ expect(validResult.algorithm).toBe('ed25519');
189
+ });
190
+ });
191
+
192
+ /**
193
+ * CONTRACT TEST 4: History List
194
+ * qa360.history.list - List test runs
195
+ */
196
+ describe('qa360.history.list contract', () => {
197
+ it('should accept HistoryListArgs with filters', () => {
198
+ const args: HistoryListArgs = {
199
+ limit: 10,
200
+ status: 'passed',
201
+ gate: 'api_smoke',
202
+ since: '2025-01-01T00:00:00Z',
203
+ };
204
+
205
+ expect(args.limit).toBe(10);
206
+ expect(['passed', 'failed', 'error', 'cancelled', 'any']).toContain(args.status);
207
+ });
208
+
209
+ it('should accept empty HistoryListArgs', () => {
210
+ const args: HistoryListArgs = {};
211
+
212
+ expect(Object.keys(args)).toHaveLength(0);
213
+ });
214
+
215
+ it('should produce HistoryListResult', () => {
216
+ const result: HistoryListResult = {
217
+ runs: [
218
+ {
219
+ id: 'run-1',
220
+ started_at: 1704067200000,
221
+ status: 'passed',
222
+ trust_score: 87,
223
+ gates_summary: { api: 'passed', ui: 'passed' },
224
+ },
225
+ {
226
+ id: 'run-2',
227
+ started_at: 1704067260000,
228
+ status: 'failed',
229
+ trust_score: 45,
230
+ },
231
+ ],
232
+ };
233
+
234
+ expect(Array.isArray(result.runs)).toBe(true);
235
+ expect(result.runs[0].id).toBeDefined();
236
+ expect(typeof result.runs[0].started_at).toBe('number');
237
+ });
238
+ });
239
+
240
+ /**
241
+ * CONTRACT TEST 5: History Get
242
+ * qa360.history.get - Get detailed run info
243
+ */
244
+ describe('qa360.history.get contract', () => {
245
+ it('should accept HistoryGetArgs', () => {
246
+ const args: HistoryGetArgs = {
247
+ runId: '550e8400-e29b-41d4-a716-446655440000',
248
+ };
249
+
250
+ expect(args.runId).toBeDefined();
251
+ });
252
+
253
+ it('should produce HistoryGetResult', () => {
254
+ const result: HistoryGetResult = {
255
+ run: {
256
+ id: 'run-1',
257
+ started_at: 1704067200000,
258
+ ended_at: 1704067800000,
259
+ status: 'passed',
260
+ trust_score: 87,
261
+ pack_path: '/path/to/pack.yaml',
262
+ pack_hash: 'sha256-abc123',
263
+ run_key: 'test-key',
264
+ },
265
+ gates: [
266
+ {
267
+ name: 'api_smoke',
268
+ status: 'passed',
269
+ duration_ms: 1500,
270
+ metrics: { p95_ms: 142 },
271
+ },
272
+ ],
273
+ findings: [
274
+ {
275
+ gate: 'sast',
276
+ severity: 'high',
277
+ rule: 'sql-injection',
278
+ location: 'src/db.ts:45',
279
+ message: 'Potential SQL injection',
280
+ },
281
+ ],
282
+ artifacts: [
283
+ {
284
+ label: 'screenshot.png',
285
+ sha256: 'sha256-def456',
286
+ mime_type: 'image/png',
287
+ size_bytes: 12345,
288
+ },
289
+ ],
290
+ };
291
+
292
+ expect(result.run.id).toBeDefined();
293
+ expect(Array.isArray(result.gates)).toBe(true);
294
+ expect(Array.isArray(result.findings)).toBe(true);
295
+ expect(Array.isArray(result.artifacts)).toBe(true);
296
+ });
297
+ });
298
+
299
+ /**
300
+ * CONTRACT TEST 6: History Diff
301
+ * qa360.history.diff - Compare two runs
302
+ */
303
+ describe('qa360.history.diff contract', () => {
304
+ it('should accept HistoryDiffArgs', () => {
305
+ const args: HistoryDiffArgs = {
306
+ runA: 'run-1',
307
+ runB: 'run-2',
308
+ };
309
+
310
+ expect(args.runA).toBeDefined();
311
+ expect(args.runB).toBeDefined();
312
+ });
313
+
314
+ it('should produce HistoryDiffResult', () => {
315
+ const result: HistoryDiffResult = {
316
+ delta: {
317
+ trust: -5,
318
+ gates: {
319
+ api: { duration_change: -100 },
320
+ ui: { status_change: 'passed -> failed' },
321
+ },
322
+ findings: {
323
+ added: [{ rule: 'new-issue' }],
324
+ removed: [{ rule: 'fixed-issue' }],
325
+ regressed: [{ rule: 'reappeared-issue' }],
326
+ },
327
+ },
328
+ };
329
+
330
+ expect(typeof result.delta.trust).toBe('number');
331
+ expect(result.delta.gates).toBeDefined();
332
+ expect(result.delta.findings).toBeDefined();
333
+ });
334
+ });
335
+
336
+ /**
337
+ * CONTRACT TEST 7: History Trend
338
+ * qa360.history.trend - Analyze trends
339
+ */
340
+ describe('qa360.history.trend contract', () => {
341
+ it('should accept HistoryTrendArgs', () => {
342
+ const args: HistoryTrendArgs = {
343
+ gate: 'perf',
344
+ window: 10,
345
+ };
346
+
347
+ expect(args.gate).toBeDefined();
348
+ expect(args.window).toBe(10);
349
+ });
350
+
351
+ it('should produce HistoryTrendResult', () => {
352
+ const result: HistoryTrendResult = {
353
+ series: [
354
+ { timestamp: 1704067200000, value: 87 },
355
+ { timestamp: 1704067260000, value: 89 },
356
+ { timestamp: 1704067320000, value: 85 },
357
+ ],
358
+ summary: {
359
+ average: 87,
360
+ trend: 'stable',
361
+ window_size: 10,
362
+ },
363
+ };
364
+
365
+ expect(Array.isArray(result.series)).toBe(true);
366
+ expect(['up', 'down', 'stable']).toContain(result.summary.trend);
367
+ });
368
+ });
369
+
370
+ /**
371
+ * CONTRACT TEST 8: History Export
372
+ * qa360.history.export - Export run data
373
+ */
374
+ describe('qa360.history.export contract', () => {
375
+ it('should accept HistoryExportArgs', () => {
376
+ const args: HistoryExportArgs = {
377
+ runId: 'run-1',
378
+ bundlePath: '/tmp/export-bundle.tar.gz',
379
+ };
380
+
381
+ expect(args.runId).toBeDefined();
382
+ expect(args.bundlePath).toBeDefined();
383
+ });
384
+
385
+ it('should produce HistoryExportResult', () => {
386
+ const result: HistoryExportResult = {
387
+ bundlePath: '/tmp/export-bundle.tar.gz',
388
+ size_bytes: 12345,
389
+ contents: ['proof.json', 'screenshot.png', 'logs.txt'],
390
+ };
391
+
392
+ expect(result.bundlePath).toBeDefined();
393
+ expect(result.size_bytes).toBeGreaterThan(0);
394
+ expect(Array.isArray(result.contents)).toBe(true);
395
+ });
396
+ });
397
+
398
+ /**
399
+ * CONTRACT TEST 9: History GC
400
+ * qa360.history.gc - Garbage collect old runs
401
+ */
402
+ describe('qa360.history.gc contract', () => {
403
+ it('should accept HistoryGCArgs', () => {
404
+ const args: HistoryGCArgs = {
405
+ keepLast: 10,
406
+ maxBytes: '1GB',
407
+ dryRun: true,
408
+ };
409
+
410
+ expect(args.keepLast).toBe(10);
411
+ expect(args.dryRun).toBe(true);
412
+ });
413
+
414
+ it('should produce HistoryGCResult', () => {
415
+ const result: HistoryGCResult = {
416
+ removed: {
417
+ runs: 5,
418
+ artifacts: 15,
419
+ bytesFreed: 52428800,
420
+ },
421
+ dryRun: false,
422
+ };
423
+
424
+ expect(result.removed.runs).toBeGreaterThanOrEqual(0);
425
+ expect(result.removed.bytesFreed).toBeGreaterThanOrEqual(0);
426
+ expect(typeof result.dryRun).toBe('boolean');
427
+ });
428
+ });
429
+
430
+ /**
431
+ * CONTRACT TEST 10: History Pin
432
+ * qa360.history.pin - Pin a run from deletion
433
+ */
434
+ describe('qa360.history.pin contract', () => {
435
+ it('should accept HistoryPinArgs', () => {
436
+ const args: HistoryPinArgs = {
437
+ runId: 'run-1',
438
+ };
439
+
440
+ expect(args.runId).toBeDefined();
441
+ });
442
+ });
443
+
444
+ /**
445
+ * CONTRACT TEST 11: Pack Ask
446
+ * qa360.pack.ask - Generate pack from query
447
+ */
448
+ describe('qa360.pack.ask contract', () => {
449
+ it('should accept PackAskArgs', () => {
450
+ const args: PackAskArgs = {
451
+ query: 'Test my REST API endpoints',
452
+ context: {
453
+ targets: {
454
+ api: { baseUrl: 'https://api.example.com' },
455
+ },
456
+ },
457
+ };
458
+
459
+ expect(args.query).toBeDefined();
460
+ expect(args.context?.targets).toBeDefined();
461
+ });
462
+
463
+ it('should produce PackAskResult', () => {
464
+ const result: PackAskResult = {
465
+ pack: 'version: 1\nname: generated-pack\ngates:\n - api_smoke',
466
+ hints: {
467
+ tools_needed: ['curl', 'node'],
468
+ estimated_duration: '2-5 minutes',
469
+ complexity: 'simple',
470
+ },
471
+ };
472
+
473
+ expect(result.pack).toBeDefined();
474
+ expect(['simple', 'medium', 'complex']).toContain(result.hints.complexity);
475
+ });
476
+ });
477
+
478
+ /**
479
+ * CONTRACT TEST 12: Pack Validate
480
+ * qa360.pack.validate - Validate pack YAML
481
+ */
482
+ describe('qa360.pack.validate contract', () => {
483
+ it('should accept PackValidateArgs with pack content', () => {
484
+ const args: PackValidateArgs = {
485
+ pack: 'version: 1\nname: test',
486
+ };
487
+
488
+ expect(args.pack).toBeDefined();
489
+ });
490
+
491
+ it('should accept PackValidateArgs with path', () => {
492
+ const args: PackValidateArgs = {
493
+ path: '/path/to/pack.yaml',
494
+ };
495
+
496
+ expect(args.path).toBeDefined();
497
+ });
498
+
499
+ it('should produce PackValidateResult', () => {
500
+ const validResult: PackValidateResult = {
501
+ valid: true,
502
+ errors: [],
503
+ warnings: [],
504
+ };
505
+
506
+ const invalidResult: PackValidateResult = {
507
+ valid: false,
508
+ errors: [
509
+ {
510
+ code: 'MISSING_FIELD',
511
+ message: 'Field "name" is required',
512
+ line: 2,
513
+ column: 1,
514
+ },
515
+ ],
516
+ warnings: [
517
+ {
518
+ code: 'DEPRECATED',
519
+ message: 'Field "old_field" is deprecated',
520
+ },
521
+ ],
522
+ auto_fixes: ['Add "name: <pack-name>"'],
523
+ };
524
+
525
+ expect(validResult.valid).toBe(true);
526
+ expect(invalidResult.valid).toBe(false);
527
+ expect(Array.isArray(invalidResult.errors)).toBe(true);
528
+ });
529
+ });
530
+
531
+ /**
532
+ * CONTRACT TEST 13: Secrets Add
533
+ * qa360.secrets.add - Add a secret
534
+ */
535
+ describe('qa360.secrets.add contract', () => {
536
+ it('should accept SecretsAddArgs', () => {
537
+ const args: SecretsAddArgs = {
538
+ name: 'API_KEY',
539
+ value: 'secret-value',
540
+ description: 'API key for external service',
541
+ };
542
+
543
+ expect(args.name).toBeDefined();
544
+ expect(args.value).toBeDefined();
545
+ });
546
+
547
+ it('should accept minimal SecretsAddArgs', () => {
548
+ const args: SecretsAddArgs = {
549
+ name: 'TOKEN',
550
+ value: 'token-value',
551
+ };
552
+
553
+ expect(args.name).toBeDefined();
554
+ expect(args.value).toBeDefined();
555
+ });
556
+ });
557
+
558
+ /**
559
+ * CONTRACT TEST 14: Secrets List
560
+ * qa360.secrets.list - List all secrets
561
+ */
562
+ describe('qa360.secrets.list contract', () => {
563
+ it('should accept empty SecretsListArgs', () => {
564
+ const args: SecretsListArgs = {};
565
+
566
+ expect(Object.keys(args)).toHaveLength(0);
567
+ });
568
+
569
+ it('should produce SecretsListResult', () => {
570
+ const result: SecretsListResult = {
571
+ secrets: [
572
+ {
573
+ name: 'API_KEY',
574
+ description: 'External API key',
575
+ created_at: 1704067200000,
576
+ last_used: 1704067800000,
577
+ },
578
+ {
579
+ name: 'TOKEN',
580
+ created_at: 1704067200000,
581
+ },
582
+ ],
583
+ };
584
+
585
+ expect(Array.isArray(result.secrets)).toBe(true);
586
+ expect(typeof result.secrets[0].created_at).toBe('number');
587
+ });
588
+ });
589
+
590
+ /**
591
+ * CONTRACT TEST 15: Secrets Remove
592
+ * qa360.secrets.remove - Remove a secret
593
+ */
594
+ describe('qa360.secrets.remove contract', () => {
595
+ it('should accept SecretsRemoveArgs', () => {
596
+ const args: SecretsRemoveArgs = {
597
+ name: 'API_KEY',
598
+ };
599
+
600
+ expect(args.name).toBeDefined();
601
+ });
602
+ });
603
+
604
+ /**
605
+ * CONTRACT TEST 16: Serve Diag
606
+ * qa360.serve.diag - Server health check
607
+ */
608
+ describe('qa360.serve.diag contract', () => {
609
+ it('should accept empty ServeDiagArgs', () => {
610
+ const args: ServeDiagArgs = {};
611
+
612
+ expect(Object.keys(args)).toHaveLength(0);
613
+ });
614
+
615
+ it('should produce ServeDiagResult', () => {
616
+ const result: ServeDiagResult = {
617
+ health: 'healthy',
618
+ version: '1.0.0',
619
+ uptime_ms: 1234567,
620
+ metrics: {
621
+ active_runs: 2,
622
+ total_runs: 100,
623
+ success_rate: 0.95,
624
+ },
625
+ vault_stats: {
626
+ total_runs: 100,
627
+ total_artifacts: 250,
628
+ vault_size_bytes: 5242880,
629
+ },
630
+ };
631
+
632
+ expect(['healthy', 'degraded', 'unhealthy']).toContain(result.health);
633
+ expect(result.uptime_ms).toBeGreaterThan(0);
634
+ expect(result.metrics).toBeDefined();
635
+ });
636
+ });
637
+
638
+ /**
639
+ * CONTRACT TEST 17: Triage Explain
640
+ * qa360.triage.explain - Explain a finding code
641
+ */
642
+ describe('qa360.triage.explain contract', () => {
643
+ it('should accept TriageExplainArgs', () => {
644
+ const args: TriageExplainArgs = {
645
+ code: 'SG001',
646
+ context: {
647
+ language: 'typescript',
648
+ framework: 'react',
649
+ },
650
+ };
651
+
652
+ expect(args.code).toBeDefined();
653
+ expect(args.context).toBeDefined();
654
+ });
655
+
656
+ it('should accept valid finding codes', () => {
657
+ const validCodes = ['SG001', 'ZAP001', 'GL001', 'OSV001', 'PA001', 'PU001', 'K6100'];
658
+
659
+ validCodes.forEach((code) => {
660
+ const args: TriageExplainArgs = { code };
661
+ expect(args.code).toMatch(/^(SG|ZAP|GL|OSV|PA|PU|K6)\d+$/);
662
+ });
663
+ });
664
+
665
+ it('should produce TriageExplainResult', () => {
666
+ const result: TriageExplainResult = {
667
+ explanation: {
668
+ cause: 'SQL injection vulnerability detected',
669
+ severity: 'high',
670
+ category: 'security',
671
+ },
672
+ actions: [
673
+ {
674
+ type: 'fix',
675
+ description: 'Use parameterized queries',
676
+ command: 'npm install sql-template',
677
+ },
678
+ {
679
+ type: 'investigate',
680
+ description: 'Review all database queries',
681
+ },
682
+ ],
683
+ references: [
684
+ {
685
+ title: 'OWASP SQL Injection',
686
+ url: 'https://owasp.org/www-community/attacks/SQL_Injection',
687
+ },
688
+ ],
689
+ };
690
+
691
+ expect(['low', 'medium', 'high', 'critical']).toContain(result.explanation.severity);
692
+ expect(Array.isArray(result.actions)).toBe(true);
693
+ expect(Array.isArray(result.references)).toBe(true);
694
+ });
695
+ });
696
+
697
+ /**
698
+ * CONTRACT TEST 18: Vault Get Run
699
+ * qa360.vault.getRun - Get run from vault
700
+ */
701
+ describe('qa360.vault.getRun contract', () => {
702
+ it('should accept VaultGetRunArgs', () => {
703
+ const args: VaultGetRunArgs = {
704
+ runId: 'run-1',
705
+ };
706
+
707
+ expect(args.runId).toBeDefined();
708
+ });
709
+ });
710
+
711
+ /**
712
+ * CONTRACT TEST 19: Vault Get Artifacts
713
+ * qa360.vault.getArtifacts - Get run artifacts
714
+ */
715
+ describe('qa360.vault.getArtifacts contract', () => {
716
+ it('should accept VaultGetArtifactsArgs', () => {
717
+ const args: VaultGetArtifactsArgs = {
718
+ runId: 'run-1',
719
+ };
720
+
721
+ expect(args.runId).toBeDefined();
722
+ });
723
+ });
724
+ });
725
+
726
+ describe('MCP Tool Contracts - Error Handling', () => {
727
+ /**
728
+ * CONTRACT TEST 20: Error Response Format
729
+ *
730
+ * All MCP tools should return errors in a consistent format
731
+ */
732
+ it('should use consistent error format', () => {
733
+ interface QA360Error {
734
+ code: string;
735
+ message: string;
736
+ hint?: string;
737
+ }
738
+
739
+ const error: QA360Error = {
740
+ code: 'PACK_NOT_FOUND',
741
+ message: 'Pack file not found: /path/to/pack.yaml',
742
+ hint: 'Check that the file path is correct and the file exists.',
743
+ };
744
+
745
+ expect(error.code).toBeDefined();
746
+ expect(error.code).toMatch(/^[A-Z_]+$/);
747
+ expect(error.message).toBeDefined();
748
+ expect(error.hint).toBeDefined();
749
+ });
750
+
751
+ it('should include error codes for common failures', () => {
752
+ const expectedErrorCodes = [
753
+ 'PACK_NOT_FOUND',
754
+ 'PACK_INVALID',
755
+ 'RUN_NOT_FOUND',
756
+ 'VAULT_ERROR',
757
+ 'SIGNATURE_FAILED',
758
+ 'PERMISSION_DENIED',
759
+ 'SECRET_NOT_FOUND',
760
+ ];
761
+
762
+ expectedErrorCodes.forEach((code) => {
763
+ expect(code).toMatch(/^[A-Z_]+$/);
764
+ });
765
+ });
766
+ });
767
+
768
+ describe('MCP Tool Contracts - Security', () => {
769
+ /**
770
+ * CONTRACT TEST 21: Path Traversal Protection
771
+ *
772
+ * All file path arguments should be validated
773
+ */
774
+ it('should reject path traversal attempts', () => {
775
+ const maliciousPaths = [
776
+ '../../../etc/passwd',
777
+ '~/.ssh/id_rsa',
778
+ '../../.env',
779
+ '/etc/passwd',
780
+ 'subfolder/../../../sensitive',
781
+ ];
782
+
783
+ maliciousPaths.forEach((path) => {
784
+ // In real implementation, this would be validated by SecurityManager
785
+ // Paths with traversal or sensitive system paths should be blocked
786
+ const isSuspicious = path.includes('..') || path.includes('~') || path.startsWith('/etc/') || path.includes('.env');
787
+ expect(isSuspicious).toBe(true);
788
+ });
789
+
790
+ // Absolute paths that are NOT system paths are OK (in some contexts)
791
+ const acceptablePaths = [
792
+ '/absolute/path/outside/allowed',
793
+ '/home/user/project',
794
+ 'C:/Users/user/project', // Windows absolute path (not system dir)
795
+ ];
796
+
797
+ acceptablePaths.forEach((path) => {
798
+ const isSuspicious = path.includes('..') || path.includes('~') || path.startsWith('/etc/') || path.includes('.env');
799
+ expect(isSuspicious).toBe(false);
800
+ });
801
+ });
802
+
803
+ /**
804
+ * CONTRACT TEST 22: Secret Value Protection
805
+ *
806
+ * Secret values should never be exposed in logs or responses
807
+ */
808
+ it('should not expose secret values in list response', () => {
809
+ const result: SecretsListResult = {
810
+ secrets: [
811
+ {
812
+ name: 'API_KEY',
813
+ description: 'API key',
814
+ created_at: 1704067200000,
815
+ // Note: 'value' field should NOT be present
816
+ },
817
+ ],
818
+ };
819
+
820
+ // Secret value should not be exposed
821
+ expect('value' in result.secrets[0]).toBe(false);
822
+ });
823
+ });
824
+
825
+ describe('MCP Tool Registry', () => {
826
+ /**
827
+ * CONTRACT TEST 23: Tool Registration
828
+ *
829
+ * All tools must be properly registered with schema
830
+ */
831
+ it('should have expected tool count', () => {
832
+ // List of all MCP tools
833
+ const expectedTools = [
834
+ 'qa360.run',
835
+ 'qa360.report.sign',
836
+ 'qa360.verify',
837
+ 'qa360.history.list',
838
+ 'qa360.history.get',
839
+ 'qa360.history.diff',
840
+ 'qa360.history.trend',
841
+ 'qa360.history.export',
842
+ 'qa360.history.gc',
843
+ 'qa360.history.pin',
844
+ 'qa360.pack.ask',
845
+ 'qa360.pack.validate',
846
+ 'qa360.pack.lint',
847
+ 'qa360.secrets.add',
848
+ 'qa360.secrets.list',
849
+ 'qa360.secrets.remove',
850
+ 'qa360.serve.diag',
851
+ 'qa360.serve.start',
852
+ 'qa360.serve.stop',
853
+ 'qa360.vault.getRun',
854
+ 'qa360.vault.getArtifacts',
855
+ 'qa360.vault.stats',
856
+ 'qa360.triage.explain',
857
+ ];
858
+
859
+ expect(expectedTools.length).toBeGreaterThanOrEqual(20);
860
+ });
861
+
862
+ /**
863
+ * CONTRACT TEST 24: Tool Schema Format
864
+ *
865
+ * Each tool should have a proper schema for MCP discovery
866
+ */
867
+ it('should have valid tool schema format', () => {
868
+ interface ToolSchema {
869
+ name: string;
870
+ description: string;
871
+ inputSchema: {
872
+ type: 'object';
873
+ properties: Record<string, any>;
874
+ required?: string[];
875
+ };
876
+ }
877
+
878
+ const exampleSchema: ToolSchema = {
879
+ name: 'qa360.run',
880
+ description: 'Execute a QA360 test pack',
881
+ inputSchema: {
882
+ type: 'object',
883
+ properties: {
884
+ packPath: {
885
+ type: 'string',
886
+ description: 'Path to the pack YAML file',
887
+ },
888
+ runKey: {
889
+ type: 'string',
890
+ description: 'Optional run key for idempotence',
891
+ },
892
+ },
893
+ required: ['packPath'],
894
+ },
895
+ };
896
+
897
+ expect(exampleSchema.name).toBeDefined();
898
+ expect(exampleSchema.description).toBeDefined();
899
+ expect(exampleSchema.inputSchema.type).toBe('object');
900
+ expect(Array.isArray(exampleSchema.inputSchema.required)).toBe(true);
901
+ });
902
+ });