qa360 2.1.2 → 2.1.4

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