qa360 2.1.2 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (866) hide show
  1. package/.BETA_TESTING_FEEDBACK.md +256 -0
  2. package/.claude/settings.local.json +151 -0
  3. package/.editorconfig +21 -0
  4. package/.github/CODEOWNERS +23 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
  6. package/.github/ISSUE_TEMPLATE/feedback_dx.yml +121 -0
  7. package/.github/dependabot.yml +35 -0
  8. package/.github/workflows/mcp-dx.yml +106 -0
  9. package/.github/workflows/release.yml +26 -0
  10. package/.github/workflows/test.yml +93 -0
  11. package/.nvmrc +1 -0
  12. package/.qa360-artifacts/.gitkeep +0 -0
  13. package/.qa360-artifacts/baselines/.gitkeep +0 -0
  14. package/.qa360-artifacts/cache/.gitkeep +0 -0
  15. package/.qa360-artifacts/reports/.gitkeep +0 -0
  16. package/.qa360-artifacts/screenshots/.gitkeep +0 -0
  17. package/.qa360-baselines/www_xyqo_ai.baseline.json +33 -0
  18. package/CHANGELOG.md +234 -0
  19. package/CODEOWNERS +43 -0
  20. package/CONTRIBUTING.md +273 -0
  21. package/NOVICE_USER_GUIDE.md +272 -0
  22. package/QUICK_START.md +191 -0
  23. package/README.md +191 -163
  24. package/adapters/README.md +62 -0
  25. package/check-branches.sh +32 -0
  26. package/cli/CHANGELOG.md +84 -0
  27. package/cli/LICENSE +24 -0
  28. package/cli/README.md +222 -0
  29. package/cli/examples/README.md +160 -0
  30. package/cli/package.json +76 -0
  31. package/cli/scripts/bundle-for-npm.sh +51 -0
  32. package/cli/scripts/validate-package.js +116 -0
  33. package/cli/src/__tests__/commands/doctor.test.ts +97 -0
  34. package/cli/src/__tests__/index.test.ts +15 -0
  35. package/cli/src/cli-minimal.ts +44 -0
  36. package/cli/src/commands/__tests__/crawl.test.ts +412 -0
  37. package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +156 -0
  38. package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +494 -0
  39. package/cli/src/commands/__tests__/e2e.test.ts +187 -0
  40. package/cli/src/commands/__tests__/flakiness.test.ts +528 -0
  41. package/cli/src/commands/__tests__/generate.test.ts +507 -0
  42. package/cli/src/commands/__tests__/history.integration.test.ts +358 -0
  43. package/cli/src/commands/__tests__/history.test.ts +433 -0
  44. package/cli/src/commands/__tests__/monitor-realworld.test.ts +199 -0
  45. package/cli/src/commands/__tests__/monitor.test.ts +81 -0
  46. package/cli/src/commands/__tests__/ollama.test.ts +529 -0
  47. package/cli/src/commands/__tests__/repair.test.ts +225 -0
  48. package/cli/src/commands/__tests__/report.integration.test.ts +167 -0
  49. package/cli/src/commands/__tests__/report.test.ts +294 -0
  50. package/cli/src/commands/__tests__/report.vitest.ts +288 -0
  51. package/cli/src/commands/__tests__/retry.test.ts +78 -0
  52. package/cli/src/commands/__tests__/run.integration.test.ts +240 -0
  53. package/cli/src/commands/__tests__/run.test.ts +346 -0
  54. package/cli/src/commands/__tests__/run.vitest.ts +301 -0
  55. package/cli/src/commands/__tests__/secrets.test.ts +114 -0
  56. package/cli/src/commands/__tests__/serve.test.ts +80 -0
  57. package/cli/src/commands/__tests__/verify.test.ts +103 -0
  58. package/cli/src/commands/ai.ts +579 -0
  59. package/cli/src/commands/ask.ts +678 -0
  60. package/cli/src/commands/coverage.ts +305 -0
  61. package/cli/src/commands/crawl.ts +155 -0
  62. package/cli/src/commands/doctor.ts +610 -0
  63. package/cli/src/commands/examples.ts +248 -0
  64. package/cli/src/commands/explain.ts +710 -0
  65. package/cli/src/commands/flakiness.ts +560 -0
  66. package/cli/src/commands/generate.ts +566 -0
  67. package/cli/src/commands/history.ts +914 -0
  68. package/cli/src/commands/init.ts +763 -0
  69. package/cli/src/commands/monitor.ts +270 -0
  70. package/cli/src/commands/ollama.ts +337 -0
  71. package/cli/src/commands/pack.ts +497 -0
  72. package/cli/src/commands/regression.ts +400 -0
  73. package/cli/src/commands/repair.ts +356 -0
  74. package/cli/src/commands/report.ts +463 -0
  75. package/cli/src/commands/retry.ts +380 -0
  76. package/cli/src/commands/run.ts +218 -0
  77. package/cli/src/commands/scan.ts +177 -0
  78. package/cli/src/commands/secrets.ts +340 -0
  79. package/cli/src/commands/serve.ts +194 -0
  80. package/cli/src/commands/slo.ts +387 -0
  81. package/cli/src/commands/verify-temp-note.md +11 -0
  82. package/cli/src/commands/verify.ts +322 -0
  83. package/cli/src/generators/index.ts +6 -0
  84. package/cli/src/generators/json-reporter.ts +15 -0
  85. package/cli/src/generators/test-generator.ts +90 -0
  86. package/cli/src/index.ts +289 -0
  87. package/cli/src/scanners/dom-scanner.ts +360 -0
  88. package/cli/src/scanners/index.ts +5 -0
  89. package/cli/src/types/scan.ts +84 -0
  90. package/cli/src/utils/config.ts +145 -0
  91. package/cli/tsconfig.bundle.json +12 -0
  92. package/cli/tsconfig.json +23 -0
  93. package/cli/vitest.config.ts +57 -0
  94. package/core/LICENSE +24 -0
  95. package/core/README.md +64 -0
  96. package/core/package.json +81 -0
  97. package/core/src/__tests__/adapters-contract/adapters-contract.test.md +156 -0
  98. package/core/src/__tests__/index.test.ts +31 -0
  99. package/core/src/__tests__/integration/phase3.test.ts +405 -0
  100. package/core/src/__tests__/pack/validator.test.ts +312 -0
  101. package/core/src/__tests__/secrets/crypto.test.ts +190 -0
  102. package/core/src/__tests__/secrets/manager.test.ts +316 -0
  103. package/core/src/__tests__/security/redactor-phase3.test.ts +233 -0
  104. package/core/src/__tests__/serve/health-checker.test.ts +155 -0
  105. package/core/src/__tests__/serve/process-manager.test.ts +213 -0
  106. package/core/src/__tests__/serve/server.test.ts +103 -0
  107. package/core/src/__tests__/vault/cas.test.ts +178 -0
  108. package/core/src/__tests__/vault/vault.test.ts +296 -0
  109. package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +452 -0
  110. package/core/src/adapters/__tests__/k6-perf.test.ts +538 -0
  111. package/core/src/adapters/__tests__/osv-deps.test.ts +471 -0
  112. package/core/src/adapters/__tests__/playwright-native-api.test.ts +792 -0
  113. package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +431 -0
  114. package/core/src/adapters/__tests__/playwright-ui.test.ts +1073 -0
  115. package/core/src/adapters/__tests__/semgrep-sast.test.ts +436 -0
  116. package/core/src/adapters/__tests__/zap-dast.test.ts +453 -0
  117. package/core/src/adapters/gitleaks-secrets.ts +521 -0
  118. package/core/src/adapters/k6-perf.ts +479 -0
  119. package/core/src/adapters/osv-deps.ts +467 -0
  120. package/core/src/adapters/playwright-native-adapter.ts +472 -0
  121. package/core/src/adapters/playwright-native-api.ts +619 -0
  122. package/core/src/adapters/playwright-ui.ts +1088 -0
  123. package/core/src/adapters/semgrep-sast.ts +410 -0
  124. package/core/src/adapters/zap-dast.ts +551 -0
  125. package/core/src/ai/__tests__/deepseek-provider.test.ts +586 -0
  126. package/core/src/ai/__tests__/ollama-provider.test.ts +641 -0
  127. package/core/src/ai/anthropic-provider.ts +248 -0
  128. package/core/src/ai/deepseek-provider.ts +301 -0
  129. package/core/src/ai/index.ts +87 -0
  130. package/core/src/ai/llm-client.ts +52 -0
  131. package/core/src/ai/mock-provider.ts +146 -0
  132. package/core/src/ai/ollama-provider.ts +255 -0
  133. package/core/src/ai/openai-provider.ts +226 -0
  134. package/core/src/ai/provider-factory.ts +408 -0
  135. package/core/src/artifacts/README.md +78 -0
  136. package/core/src/artifacts/index.ts +16 -0
  137. package/core/src/artifacts/ui-artifacts.ts +412 -0
  138. package/core/src/assertions/__tests__/engine.test.ts +360 -0
  139. package/core/src/assertions/engine.ts +577 -0
  140. package/core/src/assertions/index.ts +13 -0
  141. package/core/src/assertions/types.ts +229 -0
  142. package/core/src/auth/__tests__/api-key-provider.test.ts +282 -0
  143. package/core/src/auth/__tests__/auth-manager.test.ts +430 -0
  144. package/core/src/auth/__tests__/basic-auth-provider.test.ts +364 -0
  145. package/core/src/auth/__tests__/cloud-providers.test.ts +751 -0
  146. package/core/src/auth/__tests__/jwt-provider.test.ts +400 -0
  147. package/core/src/auth/__tests__/oauth2-provider.test.ts +383 -0
  148. package/core/src/auth/__tests__/totp-provider.test.ts +294 -0
  149. package/core/src/auth/__tests__/ui-login-provider.test.ts +323 -0
  150. package/core/src/auth/api-key-provider.ts +75 -0
  151. package/core/src/auth/aws-iam-provider.ts +212 -0
  152. package/core/src/auth/azure-ad-provider.ts +126 -0
  153. package/core/src/auth/basic-auth-provider.ts +133 -0
  154. package/core/src/auth/gcp-adc-provider.ts +146 -0
  155. package/core/src/auth/index.ts +342 -0
  156. package/core/src/auth/jwt-provider.ts +193 -0
  157. package/core/src/auth/manager.ts +281 -0
  158. package/core/src/auth/oauth2-provider.ts +141 -0
  159. package/core/src/auth/totp-provider.ts +163 -0
  160. package/core/src/auth/ui-login-provider.ts +242 -0
  161. package/core/src/cache/__tests__/lru-cache.test.ts +564 -0
  162. package/core/src/cache/index.ts +13 -0
  163. package/core/src/cache/lru-cache.ts +536 -0
  164. package/core/src/crawler/__tests__/journey-generator.test.ts +344 -0
  165. package/core/src/crawler/__tests__/selector-generator.test.ts +211 -0
  166. package/core/src/crawler/index.ts +335 -0
  167. package/core/src/crawler/journey-generator.ts +471 -0
  168. package/core/src/crawler/page-analyzer.ts +857 -0
  169. package/core/src/crawler/selector-generator.ts +280 -0
  170. package/core/src/crawler/types.ts +475 -0
  171. package/core/src/dashboard/__tests__/real-world.test.ts +430 -0
  172. package/core/src/dashboard/__tests__/server.test.ts +283 -0
  173. package/core/src/dashboard/__tests__/types.test.ts +208 -0
  174. package/core/src/dashboard/assets.ts +692 -0
  175. package/core/src/dashboard/index.ts +17 -0
  176. package/core/src/dashboard/server.ts +401 -0
  177. package/core/src/dashboard/types.ts +78 -0
  178. package/core/src/discoverer/__tests__/test-discoverer.test.ts +444 -0
  179. package/core/src/discoverer/index.ts +374 -0
  180. package/core/src/flakiness/__tests__/flakiness.test.ts +554 -0
  181. package/core/src/flakiness/index.ts +536 -0
  182. package/core/src/generation/__tests__/code-formatter.test.ts +170 -0
  183. package/core/src/generation/__tests__/code-generator-contract.test.ts +207 -0
  184. package/core/src/generation/__tests__/code-generator.test.ts +586 -0
  185. package/core/src/generation/__tests__/crawler-pack-generator.test.ts +479 -0
  186. package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +718 -0
  187. package/core/src/generation/__tests__/generation-integration.test.ts +655 -0
  188. package/core/src/generation/__tests__/pack-generator.test.ts +408 -0
  189. package/core/src/generation/__tests__/prompt-builder.test.ts +200 -0
  190. package/core/src/generation/__tests__/real-provider-integration.test.ts +414 -0
  191. package/core/src/generation/__tests__/source-analyzer.test.ts +774 -0
  192. package/core/src/generation/__tests__/test-optimizer.test.ts +255 -0
  193. package/core/src/generation/code-formatter.ts +408 -0
  194. package/core/src/generation/code-generator.ts +470 -0
  195. package/core/src/generation/crawler-pack-generator.ts +289 -0
  196. package/core/src/generation/generator.ts +113 -0
  197. package/core/src/generation/index.ts +59 -0
  198. package/core/src/generation/pack-generator.ts +527 -0
  199. package/core/src/generation/prompt-builder.ts +772 -0
  200. package/core/src/generation/source-analyzer.ts +830 -0
  201. package/core/src/generation/test-optimizer.ts +474 -0
  202. package/core/src/generation/types.ts +217 -0
  203. package/core/src/hooks/__tests__/compose.test.ts +636 -0
  204. package/core/src/hooks/__tests__/runner.test.ts +478 -0
  205. package/core/src/hooks/compose.ts +268 -0
  206. package/core/src/hooks/runner.ts +364 -0
  207. package/core/src/index.ts +237 -0
  208. package/core/src/pack/__tests__/migrator.test.ts +594 -0
  209. package/core/src/pack/__tests__/validator.test.ts +759 -0
  210. package/core/src/pack/migrator.ts +353 -0
  211. package/core/src/pack/validator.ts +359 -0
  212. package/core/src/pack-v2/__tests__/loader.test.ts +533 -0
  213. package/core/src/pack-v2/__tests__/migrator.test.ts +455 -0
  214. package/core/src/pack-v2/__tests__/validator.test.ts +549 -0
  215. package/core/src/pack-v2/index.ts +41 -0
  216. package/core/src/pack-v2/loader.ts +321 -0
  217. package/core/src/pack-v2/migrator.ts +540 -0
  218. package/core/src/pack-v2/validator.ts +673 -0
  219. package/core/src/parallel/README.md +143 -0
  220. package/core/src/parallel/index.ts +16 -0
  221. package/core/src/parallel/parallel-runner.ts +282 -0
  222. package/core/src/proof/__tests__/proof-roundtrip.test.ts +149 -0
  223. package/core/src/proof/__tests__/schema-validation-manual.mjs +211 -0
  224. package/core/src/proof/__tests__/schema-validation.test.ts +336 -0
  225. package/core/src/proof/__tests__/signer.test.ts +486 -0
  226. package/core/src/proof/__tests__/temporal-regression.test.ts +537 -0
  227. package/core/src/proof/__tests__/verifier-advanced.test.ts +588 -0
  228. package/core/src/proof/__tests__/verifier.test.ts +413 -0
  229. package/core/src/proof/bundle.ts +290 -0
  230. package/core/src/proof/canonicalize.ts +116 -0
  231. package/core/src/proof/index.ts +74 -0
  232. package/core/src/proof/schema.ts +285 -0
  233. package/core/src/proof/signer.ts +293 -0
  234. package/core/src/proof/verifier.ts +380 -0
  235. package/core/src/regression/__tests__/detector.test.ts +396 -0
  236. package/core/src/regression/__tests__/trend-analyzer.test.ts +300 -0
  237. package/core/src/regression/detector.ts +629 -0
  238. package/core/src/regression/index.ts +34 -0
  239. package/core/src/regression/trend-analyzer.ts +468 -0
  240. package/core/src/regression/types.ts +295 -0
  241. package/core/src/regression/vault.ts +419 -0
  242. package/core/src/repair/__tests__/repairer.test.ts +572 -0
  243. package/core/src/repair/__tests__/types.test.ts +302 -0
  244. package/core/src/repair/engine/__tests__/fixer.test.ts +482 -0
  245. package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +395 -0
  246. package/core/src/repair/engine/fixer.ts +271 -0
  247. package/core/src/repair/engine/suggestion-engine.ts +234 -0
  248. package/core/src/repair/index.ts +53 -0
  249. package/core/src/repair/repairer.ts +376 -0
  250. package/core/src/repair/types.ts +119 -0
  251. package/core/src/repair/utils/__tests__/error-analyzer.test.ts +454 -0
  252. package/core/src/repair/utils/error-analyzer.ts +308 -0
  253. package/core/src/reporting/README.md +144 -0
  254. package/core/src/reporting/html-reporter.ts +835 -0
  255. package/core/src/reporting/index.ts +16 -0
  256. package/core/src/retry/README.md +192 -0
  257. package/core/src/retry/__tests__/flakiness-integration.test.ts +475 -0
  258. package/core/src/retry/__tests__/retry-engine.test.ts +424 -0
  259. package/core/src/retry/flakiness-integration.ts +267 -0
  260. package/core/src/retry/index.ts +48 -0
  261. package/core/src/retry/retry-engine.ts +368 -0
  262. package/core/src/retry/types.ts +208 -0
  263. package/core/src/retry/vault.ts +413 -0
  264. package/core/src/runner/__tests__/flakiness-integration.test.ts +566 -0
  265. package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +218 -0
  266. package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +199 -0
  267. package/core/src/runner/__tests__/phase3-runner.test.ts +1118 -0
  268. package/core/src/runner/e2e-helpers.ts +216 -0
  269. package/core/src/runner/phase3-runner.ts +1236 -0
  270. package/core/src/schemas/gherkin-report.json +122 -0
  271. package/core/src/secrets/__tests__/crypto.test.ts +180 -0
  272. package/core/src/secrets/crypto.ts +289 -0
  273. package/core/src/secrets/manager.ts +272 -0
  274. package/core/src/security/__tests__/hardening.test.ts +480 -0
  275. package/core/src/security/redaction-patterns-extended.ts +278 -0
  276. package/core/src/security/redactor.ts +326 -0
  277. package/core/src/self-healing/assertion-healer.ts +485 -0
  278. package/core/src/self-healing/engine.ts +626 -0
  279. package/core/src/self-healing/index.ts +33 -0
  280. package/core/src/self-healing/selector-healer.ts +488 -0
  281. package/core/src/self-healing/types.ts +193 -0
  282. package/core/src/serve/diagnostics-collector.ts +201 -0
  283. package/core/src/serve/health-checker.ts +274 -0
  284. package/core/src/serve/index.ts +9 -0
  285. package/core/src/serve/metrics-collector.ts +386 -0
  286. package/core/src/serve/process-manager.ts +265 -0
  287. package/core/src/serve/server.ts +230 -0
  288. package/core/src/slo/config.ts +408 -0
  289. package/core/src/slo/index.ts +68 -0
  290. package/core/src/slo/sli-calculator.ts +474 -0
  291. package/core/src/slo/slo-tracker.ts +481 -0
  292. package/core/src/slo/types.ts +408 -0
  293. package/core/src/slo/vault.ts +600 -0
  294. package/core/src/tui/__tests__/monitor.test.ts +336 -0
  295. package/core/src/tui/__tests__/real-world.test.ts +376 -0
  296. package/core/src/tui/__tests__/renderer.test.ts +201 -0
  297. package/core/src/tui/__tests__/types.test.ts +295 -0
  298. package/core/src/tui/index.ts +19 -0
  299. package/core/src/tui/monitor.ts +331 -0
  300. package/core/src/tui/renderer.ts +269 -0
  301. package/core/src/tui/types.ts +68 -0
  302. package/core/src/types/pack-v1.ts +305 -0
  303. package/core/src/types/pack-v2.ts +491 -0
  304. package/core/src/types/trust-score.ts +258 -0
  305. package/core/src/vault/__tests__/flakiness-vault.test.ts +562 -0
  306. package/core/src/vault/__tests__/vault.test.ts +259 -0
  307. package/core/src/vault/cas.ts +323 -0
  308. package/core/src/vault/index.ts +1361 -0
  309. package/core/src/vault/schema.sql +168 -0
  310. package/core/src/visual/README.md +185 -0
  311. package/core/src/visual/index.ts +14 -0
  312. package/core/src/visual/visual-regression.ts +347 -0
  313. package/core/src/watch/__tests__/watch-mode.test.ts +192 -0
  314. package/core/src/watch/index.ts +14 -0
  315. package/core/src/watch/watch-mode.ts +565 -0
  316. package/core/tsconfig.json +12 -0
  317. package/core/vitest.config.ts +52 -0
  318. package/docs/ARCHITECTURE.md +901 -0
  319. package/docs/AUDIT-GLOBAL-DEC2025.md +271 -0
  320. package/docs/BETA_TESTING.md +257 -0
  321. package/docs/BETA_TESTING_PLAN.md +727 -0
  322. package/docs/CERTIFICATION-REPORT.md +142 -0
  323. package/docs/COMPLETE_AUDIT_REFACTORING.md +965 -0
  324. package/docs/DEVELOPMENT.md +331 -0
  325. package/docs/DEVELOPMENT_HISTORY.md +345 -0
  326. package/docs/LIMITATIONS.md +176 -0
  327. package/docs/MIGRATION.md +303 -0
  328. package/docs/OPTION_3_4_EXPLORATION.md +1257 -0
  329. package/docs/PHASE1_PERFORMANCE.md +144 -0
  330. package/docs/QA360_Cloud.postman_collection.json +89 -0
  331. package/docs/README.md +50 -0
  332. package/docs/STATUS.md +179 -0
  333. package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +615 -0
  334. package/docs/USER_GUIDE.md +687 -0
  335. package/docs/WORK-DONE-ADAPTER-TESTS.md +136 -0
  336. package/docs/adapters-security.md +485 -0
  337. package/docs/architecture-diagram.mmd +168 -0
  338. package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +396 -0
  339. package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +324 -0
  340. package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +644 -0
  341. package/docs/archive/ARCH-01_NEXT_STEPS.md +60 -0
  342. package/docs/archive/BRANCH_PROTECTION.md +183 -0
  343. package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +222 -0
  344. package/docs/archive/HANDOFF_TEST-01.md +669 -0
  345. package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +372 -0
  346. package/docs/archive/NODE_UPGRADE_GUIDE.md +188 -0
  347. package/docs/archive/PHASE1_COMPLETION.md +386 -0
  348. package/docs/archive/PHASE2_COMPLETION.md +404 -0
  349. package/docs/archive/PHASE3_AND_4_FINAL.md +360 -0
  350. package/docs/archive/PHASE3_COMPLETE.md +301 -0
  351. package/docs/archive/PHASE3_STATUS.md +255 -0
  352. package/docs/archive/PRE-WEEK2-AUDIT.md +364 -0
  353. package/docs/archive/README.md +33 -0
  354. package/docs/archive/SCHEMA_AJV_2020_FIX.md +245 -0
  355. package/docs/archive/TEST-01_AUDIT_REPORT.md +240 -0
  356. package/docs/archive/TEST-01_COVERAGE_PLAN.md +423 -0
  357. package/docs/budgets-advanced.md +308 -0
  358. package/docs/examples/history-export-gc.md +285 -0
  359. package/docs/examples/pack-v2-complete.yaml +158 -0
  360. package/docs/examples/pack-v2-quickstart.yaml +24 -0
  361. package/docs/examples/pack-v2-ui-login.yaml +81 -0
  362. package/docs/examples/qa360-report.json +50 -0
  363. package/docs/history.md +565 -0
  364. package/docs/hooks.md +304 -0
  365. package/docs/llm-providers.md +419 -0
  366. package/docs/mcp-server.md +651 -0
  367. package/docs/mcp-tools.md +1131 -0
  368. package/docs/pack-v1.md +383 -0
  369. package/docs/pack-v2.md +558 -0
  370. package/docs/proofs.md +670 -0
  371. package/docs/quickstart-5min.md +257 -0
  372. package/docs/readiness-ci.md +654 -0
  373. package/docs/rfc/README.md +20 -0
  374. package/docs/rfc/proof-bundle-v1.md +787 -0
  375. package/docs/secrets.md +392 -0
  376. package/docs/serve.md +494 -0
  377. package/docs/vault.md +491 -0
  378. package/e2e/qa360-e2e.test.ts +696 -0
  379. package/e2e/vitest.config.ts +18 -0
  380. package/examples/README.md +30 -140
  381. package/examples/ci/docker-compose-serve.yml +375 -0
  382. package/examples/ci/github-actions-serve.yml +345 -0
  383. package/examples/ci/gitlab-ci-serve.yml +407 -0
  384. package/examples/datasets/README.md +101 -0
  385. package/examples/datasets/b2bshop.ts +155 -0
  386. package/examples/datasets/index.ts +57 -0
  387. package/examples/datasets/reqres.ts +195 -0
  388. package/examples/future-api/README.md +16 -0
  389. package/examples/future-api/diag.js +7 -0
  390. package/examples/future-api/health.js +4 -0
  391. package/examples/future-api/packs.js +13 -0
  392. package/examples/future-api/runpack.js +10 -0
  393. package/examples/generation/README.md +148 -0
  394. package/examples/generation/pack-generator-example.js +115 -0
  395. package/examples/generation/source-analyzer-example.js +115 -0
  396. package/examples/httpbin/pack.yml +59 -0
  397. package/examples/load-testing/mcp-load.yml +115 -0
  398. package/examples/load-testing/mcp-stdio.yml +95 -0
  399. package/examples/mcp/claude-desktop-config.json +33 -0
  400. package/examples/mcp/claude-desktop.json +16 -0
  401. package/examples/mcp/conversation-sample.md +131 -0
  402. package/examples/mcp/demo-60s.md +330 -0
  403. package/examples/mcp/sample-conversation.jsonl +21 -0
  404. package/examples/mcp/vscode-settings.json +22 -0
  405. package/examples/pack-v2-complete.yml +242 -0
  406. package/examples/pack-v2-examples.md +244 -0
  407. package/examples/pack-v2-quickstart.yml +55 -0
  408. package/examples/packs-business/ecommerce-api.yml +121 -0
  409. package/examples/packs-business/saas-dashboard-ui.yml +133 -0
  410. package/examples/packs-conformance/compose-multi.yml +174 -0
  411. package/examples/packs-conformance/full.yml +152 -0
  412. package/examples/packs-conformance/heavy-artifacts.yml +152 -0
  413. package/examples/packs-conformance/minimal.yml +71 -0
  414. package/examples/packs-conformance/secrets-missing.yml +97 -0
  415. package/examples/packs-conformance/timeouts.yml +77 -0
  416. package/examples/proofs/e2e-playwright-proof.json +75 -0
  417. package/examples/proofs/httpbin-proof.json +69 -0
  418. package/examples/proofs/multi-adapter-proof.json +117 -0
  419. package/examples/proofs/test-proof.json +26 -0
  420. package/examples/restful-api-dev/README.md +102 -0
  421. package/examples/restful-api-dev/restful-api-advanced.yml +29 -0
  422. package/examples/restful-api-dev/restful-api-basic.yml +29 -0
  423. package/examples/web-lite/.github/workflows/qa360-phase3.yml +73 -0
  424. package/examples/web-lite/api-mock/server.js +258 -0
  425. package/examples/web-lite/pack.yml +71 -0
  426. package/examples/web-lite/services.yml +43 -0
  427. package/examples/web-lite/web-content/healthz +1 -0
  428. package/examples/web-lite/web-content/index.html +259 -0
  429. package/package.json +55 -45
  430. package/packages/mcp/CHANGELOG.md +109 -0
  431. package/packages/mcp/IMPLEMENTATION_SUMMARY.md +350 -0
  432. package/packages/mcp/LICENSE +21 -0
  433. package/packages/mcp/QUICK_START.md +291 -0
  434. package/packages/mcp/README.md +294 -0
  435. package/packages/mcp/TELEMETRY.md +220 -0
  436. package/packages/mcp/package.json +92 -0
  437. package/packages/mcp/scripts/generate-sbom-fallback.cjs +84 -0
  438. package/packages/mcp/scripts/safe-postinstall.cjs +32 -0
  439. package/packages/mcp/src/__tests__/contract.test.ts +902 -0
  440. package/packages/mcp/src/cli/cli.ts +137 -0
  441. package/packages/mcp/src/cli/doctor.ts +286 -0
  442. package/packages/mcp/src/cli/fix.ts +99 -0
  443. package/packages/mcp/src/cli/init.ts +233 -0
  444. package/packages/mcp/src/cli/postinstall.ts +14 -0
  445. package/packages/mcp/src/cli/reset.ts +44 -0
  446. package/packages/mcp/src/cli/telemetry.ts +166 -0
  447. package/packages/mcp/src/cli/test-dx.ts +94 -0
  448. package/packages/mcp/src/cli/uninstall.ts +80 -0
  449. package/packages/mcp/src/cli/up.ts +178 -0
  450. package/packages/mcp/src/index.ts +12 -0
  451. package/packages/mcp/src/scripts/e2e-local.ts +337 -0
  452. package/packages/mcp/src/scripts/verify-settings.ts +242 -0
  453. package/packages/mcp/src/security/audit.ts +244 -0
  454. package/packages/mcp/src/security/manager.ts +242 -0
  455. package/packages/mcp/src/server/full-server.ts +212 -0
  456. package/packages/mcp/src/server/minimal-server.ts +134 -0
  457. package/packages/mcp/src/tools/history.ts +388 -0
  458. package/packages/mcp/src/tools/pack.ts +449 -0
  459. package/packages/mcp/src/tools/registry.ts +638 -0
  460. package/packages/mcp/src/tools/report.ts +100 -0
  461. package/packages/mcp/src/tools/run.ts +268 -0
  462. package/packages/mcp/src/tools/secrets.ts +198 -0
  463. package/packages/mcp/src/tools/serve.ts +221 -0
  464. package/packages/mcp/src/tools/triage.ts +532 -0
  465. package/packages/mcp/src/tools/types.ts +26 -0
  466. package/packages/mcp/src/tools/vault.ts +164 -0
  467. package/packages/mcp/src/tools/verify.ts +166 -0
  468. package/packages/mcp/src/types/index.ts +311 -0
  469. package/packages/mcp/src/types/mcp-stubs.ts +83 -0
  470. package/packages/mcp/tsconfig.json +16 -0
  471. package/playwright.config.ts +20 -0
  472. package/pnpm-workspace.yaml +4 -0
  473. package/run-test-and-push.sh +20 -0
  474. package/scripts/build-proof-cli.sh +110 -0
  475. package/scripts/ci/check-windows-paths.js +92 -0
  476. package/scripts/ci/invariants.sh +124 -0
  477. package/scripts/ci/make-final-bundle.js +106 -0
  478. package/scripts/ci/mcp-run-multipack.js +305 -0
  479. package/scripts/ci/run-pack-suite.sh +103 -0
  480. package/scripts/ci/run-phase7-final.sh +190 -0
  481. package/scripts/ci/slo-assert.js +158 -0
  482. package/scripts/ci/test-fault-tolerance.sh +301 -0
  483. package/scripts/install-mcp.sh +66 -0
  484. package/scripts/mcp-smoke.mjs +27 -0
  485. package/scripts/smoke.sh +26 -0
  486. package/scripts/stress-test.js +288 -0
  487. package/scripts/validate-examples.mjs +404 -0
  488. package/scripts/validation/simple-pack-check.sh +51 -0
  489. package/scripts/validation/validate-universal-pack.mjs +77 -0
  490. package/scripts/verify-persistence.js +127 -0
  491. package/test-pack.yaml +43 -0
  492. package/test-results/.last-run.json +4 -0
  493. package/test-runner.mjs +87 -0
  494. package/tests/artifacts.spec.js +147 -0
  495. package/tests/contracts.spec.js +239 -0
  496. package/tests/e2e/assertions.test.mjs +370 -0
  497. package/tests/e2e/crawler.test.mjs +451 -0
  498. package/tests/e2e/playwright-plus-plus.test.mjs +604 -0
  499. package/tests/e2e/proof-bundle.test.mjs +258 -0
  500. package/tests/e2e/real-world/saucedemo.test.mjs +714 -0
  501. package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +760 -0
  502. package/tests/e2e/ui-actions.test.mjs +546 -0
  503. package/tests/gherkin.e2e.spec.ts +310 -0
  504. package/tests/no-console-errors.spec.js +136 -0
  505. package/tests/pdf.spec.ts +252 -0
  506. package/tests/run-pack.spec.ts +58 -0
  507. package/tsconfig.base.json +15 -0
  508. package/tsconfig.build.json +8 -0
  509. package/tsconfig.json +37 -0
  510. package/tsconfig.test.json +18 -0
  511. package/typedoc.json +37 -0
  512. package/ui/README.md +51 -0
  513. package/verify-proof.mjs +60 -0
  514. package/dist/cli-minimal.d.ts +0 -6
  515. package/dist/cli-minimal.js +0 -36
  516. package/dist/commands/ai.d.ts +0 -41
  517. package/dist/commands/ai.js +0 -511
  518. package/dist/commands/ask.d.ts +0 -94
  519. package/dist/commands/ask.js +0 -582
  520. package/dist/commands/coverage.d.ts +0 -8
  521. package/dist/commands/coverage.js +0 -252
  522. package/dist/commands/crawl.d.ts +0 -24
  523. package/dist/commands/crawl.js +0 -121
  524. package/dist/commands/doctor.d.ts +0 -54
  525. package/dist/commands/doctor.js +0 -513
  526. package/dist/commands/examples.d.ts +0 -33
  527. package/dist/commands/examples.js +0 -193
  528. package/dist/commands/explain.d.ts +0 -27
  529. package/dist/commands/explain.js +0 -630
  530. package/dist/commands/flakiness.d.ts +0 -73
  531. package/dist/commands/flakiness.js +0 -435
  532. package/dist/commands/generate.d.ts +0 -66
  533. package/dist/commands/generate.js +0 -438
  534. package/dist/commands/history.d.ts +0 -76
  535. package/dist/commands/history.js +0 -757
  536. package/dist/commands/init.d.ts +0 -106
  537. package/dist/commands/init.js +0 -599
  538. package/dist/commands/monitor.d.ts +0 -27
  539. package/dist/commands/monitor.js +0 -225
  540. package/dist/commands/ollama.d.ts +0 -40
  541. package/dist/commands/ollama.js +0 -301
  542. package/dist/commands/pack.d.ts +0 -70
  543. package/dist/commands/pack.js +0 -413
  544. package/dist/commands/regression.d.ts +0 -8
  545. package/dist/commands/regression.js +0 -340
  546. package/dist/commands/repair.d.ts +0 -26
  547. package/dist/commands/repair.js +0 -307
  548. package/dist/commands/report.d.ts +0 -62
  549. package/dist/commands/report.js +0 -378
  550. package/dist/commands/retry.d.ts +0 -43
  551. package/dist/commands/retry.js +0 -275
  552. package/dist/commands/run.d.ts +0 -41
  553. package/dist/commands/run.js +0 -169
  554. package/dist/commands/scan.d.ts +0 -5
  555. package/dist/commands/scan.js +0 -155
  556. package/dist/commands/secrets.d.ts +0 -58
  557. package/dist/commands/secrets.js +0 -289
  558. package/dist/commands/serve.d.ts +0 -13
  559. package/dist/commands/serve.js +0 -156
  560. package/dist/commands/slo.d.ts +0 -8
  561. package/dist/commands/slo.js +0 -327
  562. package/dist/commands/verify.d.ts +0 -32
  563. package/dist/commands/verify.js +0 -278
  564. package/dist/core/adapters/gitleaks-secrets.d.ts +0 -114
  565. package/dist/core/adapters/gitleaks-secrets.js +0 -410
  566. package/dist/core/adapters/k6-perf.d.ts +0 -85
  567. package/dist/core/adapters/k6-perf.js +0 -398
  568. package/dist/core/adapters/osv-deps.d.ts +0 -123
  569. package/dist/core/adapters/osv-deps.js +0 -372
  570. package/dist/core/adapters/playwright-native-adapter.d.ts +0 -121
  571. package/dist/core/adapters/playwright-native-adapter.js +0 -339
  572. package/dist/core/adapters/playwright-native-api.d.ts +0 -183
  573. package/dist/core/adapters/playwright-native-api.js +0 -461
  574. package/dist/core/adapters/playwright-ui.d.ts +0 -197
  575. package/dist/core/adapters/playwright-ui.js +0 -840
  576. package/dist/core/adapters/semgrep-sast.d.ts +0 -99
  577. package/dist/core/adapters/semgrep-sast.js +0 -322
  578. package/dist/core/adapters/zap-dast.d.ts +0 -133
  579. package/dist/core/adapters/zap-dast.js +0 -424
  580. package/dist/core/ai/anthropic-provider.d.ts +0 -50
  581. package/dist/core/ai/anthropic-provider.js +0 -211
  582. package/dist/core/ai/deepseek-provider.d.ts +0 -81
  583. package/dist/core/ai/deepseek-provider.js +0 -254
  584. package/dist/core/ai/index.d.ts +0 -60
  585. package/dist/core/ai/index.js +0 -18
  586. package/dist/core/ai/llm-client.d.ts +0 -45
  587. package/dist/core/ai/llm-client.js +0 -7
  588. package/dist/core/ai/mock-provider.d.ts +0 -49
  589. package/dist/core/ai/mock-provider.js +0 -121
  590. package/dist/core/ai/ollama-provider.d.ts +0 -78
  591. package/dist/core/ai/ollama-provider.js +0 -192
  592. package/dist/core/ai/openai-provider.d.ts +0 -48
  593. package/dist/core/ai/openai-provider.js +0 -188
  594. package/dist/core/ai/provider-factory.d.ts +0 -160
  595. package/dist/core/ai/provider-factory.js +0 -269
  596. package/dist/core/artifacts/index.d.ts +0 -6
  597. package/dist/core/artifacts/index.js +0 -6
  598. package/dist/core/artifacts/ui-artifacts.d.ts +0 -133
  599. package/dist/core/artifacts/ui-artifacts.js +0 -304
  600. package/dist/core/assertions/engine.d.ts +0 -51
  601. package/dist/core/assertions/engine.js +0 -530
  602. package/dist/core/assertions/index.d.ts +0 -11
  603. package/dist/core/assertions/index.js +0 -11
  604. package/dist/core/assertions/types.d.ts +0 -121
  605. package/dist/core/assertions/types.js +0 -37
  606. package/dist/core/auth/api-key-provider.d.ts +0 -16
  607. package/dist/core/auth/api-key-provider.js +0 -63
  608. package/dist/core/auth/aws-iam-provider.d.ts +0 -35
  609. package/dist/core/auth/aws-iam-provider.js +0 -177
  610. package/dist/core/auth/azure-ad-provider.d.ts +0 -15
  611. package/dist/core/auth/azure-ad-provider.js +0 -99
  612. package/dist/core/auth/basic-auth-provider.d.ts +0 -26
  613. package/dist/core/auth/basic-auth-provider.js +0 -111
  614. package/dist/core/auth/gcp-adc-provider.d.ts +0 -27
  615. package/dist/core/auth/gcp-adc-provider.js +0 -126
  616. package/dist/core/auth/index.d.ts +0 -238
  617. package/dist/core/auth/index.js +0 -82
  618. package/dist/core/auth/jwt-provider.d.ts +0 -19
  619. package/dist/core/auth/jwt-provider.js +0 -160
  620. package/dist/core/auth/manager.d.ts +0 -84
  621. package/dist/core/auth/manager.js +0 -230
  622. package/dist/core/auth/oauth2-provider.d.ts +0 -17
  623. package/dist/core/auth/oauth2-provider.js +0 -114
  624. package/dist/core/auth/totp-provider.d.ts +0 -31
  625. package/dist/core/auth/totp-provider.js +0 -134
  626. package/dist/core/auth/ui-login-provider.d.ts +0 -26
  627. package/dist/core/auth/ui-login-provider.js +0 -198
  628. package/dist/core/cache/index.d.ts +0 -7
  629. package/dist/core/cache/index.js +0 -6
  630. package/dist/core/cache/lru-cache.d.ts +0 -203
  631. package/dist/core/cache/lru-cache.js +0 -397
  632. package/dist/core/core/coverage/analyzer.d.ts +0 -101
  633. package/dist/core/core/coverage/analyzer.js +0 -415
  634. package/dist/core/core/coverage/collector.d.ts +0 -74
  635. package/dist/core/core/coverage/collector.js +0 -459
  636. package/dist/core/core/coverage/config.d.ts +0 -37
  637. package/dist/core/core/coverage/config.js +0 -156
  638. package/dist/core/core/coverage/index.d.ts +0 -11
  639. package/dist/core/core/coverage/index.js +0 -15
  640. package/dist/core/core/coverage/types.d.ts +0 -267
  641. package/dist/core/core/coverage/types.js +0 -6
  642. package/dist/core/core/coverage/vault.d.ts +0 -95
  643. package/dist/core/core/coverage/vault.js +0 -405
  644. package/dist/core/coverage/analyzer.d.ts +0 -101
  645. package/dist/core/coverage/analyzer.js +0 -415
  646. package/dist/core/coverage/collector.d.ts +0 -74
  647. package/dist/core/coverage/collector.js +0 -459
  648. package/dist/core/coverage/config.d.ts +0 -37
  649. package/dist/core/coverage/config.js +0 -156
  650. package/dist/core/coverage/index.d.ts +0 -11
  651. package/dist/core/coverage/index.js +0 -15
  652. package/dist/core/coverage/types.d.ts +0 -267
  653. package/dist/core/coverage/types.js +0 -6
  654. package/dist/core/coverage/vault.d.ts +0 -95
  655. package/dist/core/coverage/vault.js +0 -405
  656. package/dist/core/crawler/index.d.ts +0 -57
  657. package/dist/core/crawler/index.js +0 -281
  658. package/dist/core/crawler/journey-generator.d.ts +0 -49
  659. package/dist/core/crawler/journey-generator.js +0 -412
  660. package/dist/core/crawler/page-analyzer.d.ts +0 -88
  661. package/dist/core/crawler/page-analyzer.js +0 -709
  662. package/dist/core/crawler/selector-generator.d.ts +0 -34
  663. package/dist/core/crawler/selector-generator.js +0 -240
  664. package/dist/core/crawler/types.d.ts +0 -353
  665. package/dist/core/crawler/types.js +0 -6
  666. package/dist/core/dashboard/assets.d.ts +0 -6
  667. package/dist/core/dashboard/assets.js +0 -690
  668. package/dist/core/dashboard/index.d.ts +0 -6
  669. package/dist/core/dashboard/index.js +0 -5
  670. package/dist/core/dashboard/server.d.ts +0 -72
  671. package/dist/core/dashboard/server.js +0 -354
  672. package/dist/core/dashboard/types.d.ts +0 -70
  673. package/dist/core/dashboard/types.js +0 -5
  674. package/dist/core/discoverer/index.d.ts +0 -115
  675. package/dist/core/discoverer/index.js +0 -250
  676. package/dist/core/flakiness/index.d.ts +0 -228
  677. package/dist/core/flakiness/index.js +0 -384
  678. package/dist/core/generation/code-formatter.d.ts +0 -111
  679. package/dist/core/generation/code-formatter.js +0 -307
  680. package/dist/core/generation/code-generator.d.ts +0 -144
  681. package/dist/core/generation/code-generator.js +0 -293
  682. package/dist/core/generation/crawler-pack-generator.d.ts +0 -44
  683. package/dist/core/generation/crawler-pack-generator.js +0 -231
  684. package/dist/core/generation/generator.d.ts +0 -40
  685. package/dist/core/generation/generator.js +0 -76
  686. package/dist/core/generation/index.d.ts +0 -32
  687. package/dist/core/generation/index.js +0 -30
  688. package/dist/core/generation/pack-generator.d.ts +0 -107
  689. package/dist/core/generation/pack-generator.js +0 -416
  690. package/dist/core/generation/prompt-builder.d.ts +0 -132
  691. package/dist/core/generation/prompt-builder.js +0 -672
  692. package/dist/core/generation/source-analyzer.d.ts +0 -213
  693. package/dist/core/generation/source-analyzer.js +0 -657
  694. package/dist/core/generation/test-optimizer.d.ts +0 -117
  695. package/dist/core/generation/test-optimizer.js +0 -328
  696. package/dist/core/generation/types.d.ts +0 -214
  697. package/dist/core/generation/types.js +0 -4
  698. package/dist/core/hooks/compose.d.ts +0 -61
  699. package/dist/core/hooks/compose.js +0 -225
  700. package/dist/core/hooks/runner.d.ts +0 -68
  701. package/dist/core/hooks/runner.js +0 -303
  702. package/dist/core/index.d.ts +0 -104
  703. package/dist/core/index.js +0 -91
  704. package/dist/core/pack/migrator.d.ts +0 -51
  705. package/dist/core/pack/migrator.js +0 -304
  706. package/dist/core/pack/validator.d.ts +0 -42
  707. package/dist/core/pack/validator.js +0 -322
  708. package/dist/core/pack-v2/index.d.ts +0 -9
  709. package/dist/core/pack-v2/index.js +0 -8
  710. package/dist/core/pack-v2/loader.d.ts +0 -62
  711. package/dist/core/pack-v2/loader.js +0 -259
  712. package/dist/core/pack-v2/migrator.d.ts +0 -61
  713. package/dist/core/pack-v2/migrator.js +0 -480
  714. package/dist/core/pack-v2/validator.d.ts +0 -61
  715. package/dist/core/pack-v2/validator.js +0 -577
  716. package/dist/core/parallel/index.d.ts +0 -6
  717. package/dist/core/parallel/index.js +0 -6
  718. package/dist/core/parallel/parallel-runner.d.ts +0 -107
  719. package/dist/core/parallel/parallel-runner.js +0 -192
  720. package/dist/core/proof/bundle.d.ts +0 -137
  721. package/dist/core/proof/bundle.js +0 -160
  722. package/dist/core/proof/canonicalize.d.ts +0 -47
  723. package/dist/core/proof/canonicalize.js +0 -105
  724. package/dist/core/proof/index.d.ts +0 -13
  725. package/dist/core/proof/index.js +0 -18
  726. package/dist/core/proof/schema.d.ts +0 -217
  727. package/dist/core/proof/schema.js +0 -263
  728. package/dist/core/proof/signer.d.ts +0 -111
  729. package/dist/core/proof/signer.js +0 -226
  730. package/dist/core/proof/verifier.d.ts +0 -97
  731. package/dist/core/proof/verifier.js +0 -308
  732. package/dist/core/regression/detector.d.ts +0 -107
  733. package/dist/core/regression/detector.js +0 -497
  734. package/dist/core/regression/index.d.ts +0 -9
  735. package/dist/core/regression/index.js +0 -11
  736. package/dist/core/regression/trend-analyzer.d.ts +0 -102
  737. package/dist/core/regression/trend-analyzer.js +0 -345
  738. package/dist/core/regression/types.d.ts +0 -222
  739. package/dist/core/regression/types.js +0 -7
  740. package/dist/core/regression/vault.d.ts +0 -87
  741. package/dist/core/regression/vault.js +0 -289
  742. package/dist/core/repair/engine/fixer.d.ts +0 -24
  743. package/dist/core/repair/engine/fixer.js +0 -226
  744. package/dist/core/repair/engine/suggestion-engine.d.ts +0 -18
  745. package/dist/core/repair/engine/suggestion-engine.js +0 -187
  746. package/dist/core/repair/index.d.ts +0 -10
  747. package/dist/core/repair/index.js +0 -13
  748. package/dist/core/repair/repairer.d.ts +0 -90
  749. package/dist/core/repair/repairer.js +0 -284
  750. package/dist/core/repair/types.d.ts +0 -91
  751. package/dist/core/repair/types.js +0 -6
  752. package/dist/core/repair/utils/error-analyzer.d.ts +0 -28
  753. package/dist/core/repair/utils/error-analyzer.js +0 -264
  754. package/dist/core/reporting/html-reporter.d.ts +0 -119
  755. package/dist/core/reporting/html-reporter.js +0 -737
  756. package/dist/core/reporting/index.d.ts +0 -6
  757. package/dist/core/reporting/index.js +0 -6
  758. package/dist/core/retry/flakiness-integration.d.ts +0 -60
  759. package/dist/core/retry/flakiness-integration.js +0 -228
  760. package/dist/core/retry/index.d.ts +0 -14
  761. package/dist/core/retry/index.js +0 -16
  762. package/dist/core/retry/retry-engine.d.ts +0 -80
  763. package/dist/core/retry/retry-engine.js +0 -296
  764. package/dist/core/retry/types.d.ts +0 -178
  765. package/dist/core/retry/types.js +0 -52
  766. package/dist/core/retry/vault.d.ts +0 -77
  767. package/dist/core/retry/vault.js +0 -304
  768. package/dist/core/runner/e2e-helpers.d.ts +0 -102
  769. package/dist/core/runner/e2e-helpers.js +0 -153
  770. package/dist/core/runner/phase3-runner.d.ts +0 -200
  771. package/dist/core/runner/phase3-runner.js +0 -1039
  772. package/dist/core/secrets/crypto.d.ts +0 -75
  773. package/dist/core/secrets/crypto.js +0 -223
  774. package/dist/core/secrets/manager.d.ts +0 -76
  775. package/dist/core/secrets/manager.js +0 -219
  776. package/dist/core/security/redaction-patterns-extended.d.ts +0 -27
  777. package/dist/core/security/redaction-patterns-extended.js +0 -247
  778. package/dist/core/security/redactor.d.ts +0 -71
  779. package/dist/core/security/redactor.js +0 -279
  780. package/dist/core/self-healing/assertion-healer.d.ts +0 -97
  781. package/dist/core/self-healing/assertion-healer.js +0 -371
  782. package/dist/core/self-healing/engine.d.ts +0 -122
  783. package/dist/core/self-healing/engine.js +0 -538
  784. package/dist/core/self-healing/index.d.ts +0 -10
  785. package/dist/core/self-healing/index.js +0 -11
  786. package/dist/core/self-healing/selector-healer.d.ts +0 -103
  787. package/dist/core/self-healing/selector-healer.js +0 -372
  788. package/dist/core/self-healing/types.d.ts +0 -152
  789. package/dist/core/self-healing/types.js +0 -6
  790. package/dist/core/serve/diagnostics-collector.d.ts +0 -32
  791. package/dist/core/serve/diagnostics-collector.js +0 -149
  792. package/dist/core/serve/health-checker.d.ts +0 -44
  793. package/dist/core/serve/health-checker.js +0 -219
  794. package/dist/core/serve/index.d.ts +0 -8
  795. package/dist/core/serve/index.js +0 -8
  796. package/dist/core/serve/metrics-collector.d.ts +0 -24
  797. package/dist/core/serve/metrics-collector.js +0 -322
  798. package/dist/core/serve/process-manager.d.ts +0 -36
  799. package/dist/core/serve/process-manager.js +0 -213
  800. package/dist/core/serve/server.d.ts +0 -36
  801. package/dist/core/serve/server.js +0 -191
  802. package/dist/core/slo/config.d.ts +0 -107
  803. package/dist/core/slo/config.js +0 -360
  804. package/dist/core/slo/index.d.ts +0 -11
  805. package/dist/core/slo/index.js +0 -15
  806. package/dist/core/slo/sli-calculator.d.ts +0 -92
  807. package/dist/core/slo/sli-calculator.js +0 -364
  808. package/dist/core/slo/slo-tracker.d.ts +0 -148
  809. package/dist/core/slo/slo-tracker.js +0 -379
  810. package/dist/core/slo/types.d.ts +0 -281
  811. package/dist/core/slo/types.js +0 -7
  812. package/dist/core/slo/vault.d.ts +0 -102
  813. package/dist/core/slo/vault.js +0 -427
  814. package/dist/core/tui/index.d.ts +0 -7
  815. package/dist/core/tui/index.js +0 -6
  816. package/dist/core/tui/monitor.d.ts +0 -92
  817. package/dist/core/tui/monitor.js +0 -271
  818. package/dist/core/tui/renderer.d.ts +0 -33
  819. package/dist/core/tui/renderer.js +0 -218
  820. package/dist/core/tui/types.d.ts +0 -63
  821. package/dist/core/tui/types.js +0 -5
  822. package/dist/core/types/pack-v1.d.ts +0 -251
  823. package/dist/core/types/pack-v1.js +0 -5
  824. package/dist/core/types/pack-v2.d.ts +0 -425
  825. package/dist/core/types/pack-v2.js +0 -8
  826. package/dist/core/types/trust-score.d.ts +0 -69
  827. package/dist/core/types/trust-score.js +0 -191
  828. package/dist/core/vault/cas.d.ts +0 -90
  829. package/dist/core/vault/cas.js +0 -261
  830. package/dist/core/vault/index.d.ts +0 -326
  831. package/dist/core/vault/index.js +0 -1042
  832. package/dist/core/visual/index.d.ts +0 -6
  833. package/dist/core/visual/index.js +0 -6
  834. package/dist/core/visual/visual-regression.d.ts +0 -113
  835. package/dist/core/visual/visual-regression.js +0 -236
  836. package/dist/core/watch/index.d.ts +0 -7
  837. package/dist/core/watch/index.js +0 -6
  838. package/dist/core/watch/watch-mode.d.ts +0 -213
  839. package/dist/core/watch/watch-mode.js +0 -389
  840. package/dist/generators/index.d.ts +0 -5
  841. package/dist/generators/index.js +0 -5
  842. package/dist/generators/json-reporter.d.ts +0 -10
  843. package/dist/generators/json-reporter.js +0 -12
  844. package/dist/generators/test-generator.d.ts +0 -18
  845. package/dist/generators/test-generator.js +0 -78
  846. package/dist/index.d.ts +0 -8
  847. package/dist/index.js +0 -246
  848. package/dist/scanners/dom-scanner.d.ts +0 -52
  849. package/dist/scanners/dom-scanner.js +0 -296
  850. package/dist/scanners/index.d.ts +0 -4
  851. package/dist/scanners/index.js +0 -4
  852. package/dist/schemas/pack.schema.json +0 -236
  853. package/dist/types/scan.d.ts +0 -68
  854. package/dist/types/scan.js +0 -4
  855. package/dist/utils/config.d.ts +0 -5
  856. package/dist/utils/config.js +0 -136
  857. /package/{bin → cli/bin}/qa360.js +0 -0
  858. /package/{examples → cli/examples}/accessibility.yml +0 -0
  859. /package/{examples → cli/examples}/api-basic.yml +0 -0
  860. /package/{examples → cli/examples}/complete.yml +0 -0
  861. /package/{examples → cli/examples}/crawler.yml +0 -0
  862. /package/{examples → cli/examples}/fullstack.yml +0 -0
  863. /package/{examples → cli/examples}/security.yml +0 -0
  864. /package/{examples → cli/examples}/ui-advanced.yml +0 -0
  865. /package/{examples → cli/examples}/ui-basic.yml +0 -0
  866. /package/{dist/core → core}/schemas/pack.schema.json +0 -0
@@ -1,327 +0,0 @@
1
- /**
2
- * QA360 SLO/SLI Command
3
- *
4
- * CLI command for SLO/SLI management and reporting.
5
- */
6
- import { Command } from 'commander';
7
- import { SLOTracker, createDefaultSLOConfig, createStrictSLOConfig, createRelaxedSLOConfig, TimeWindows } from '../core/index.js';
8
- export const sloCommand = new Command('slo');
9
- sloCommand.description('Service Level Objectives and Indicators management');
10
- // List all SLOs
11
- sloCommand
12
- .command('list')
13
- .description('List all SLOs')
14
- .option('--json', 'Output as JSON')
15
- .action(async (options) => {
16
- const config = createDefaultSLOConfig();
17
- const tracker = new SLOTracker();
18
- tracker.registerSLOs(config.slos);
19
- const slos = tracker.getAllSLOs();
20
- if (options.json) {
21
- console.log(JSON.stringify(slos, null, 2));
22
- return;
23
- }
24
- console.log('\n📊 Service Level Objectives\n');
25
- if (slos.length === 0) {
26
- console.log('No SLOs configured.\n');
27
- return;
28
- }
29
- for (const slo of slos) {
30
- const status = slo.status === 'healthy' ? '✓' : slo.status === 'warning' ? '⚠' : '✗';
31
- const currentValue = slo.currentValue?.toFixed(2) || 'N/A';
32
- console.log(` ${status} ${slo.name}`);
33
- console.log(` Target: ${slo.target}% | Current: ${currentValue}%`);
34
- console.log(` Window: ${formatDuration(slo.windowMs)}`);
35
- console.log(` Error Budget: ${slo.errorBudget.remainingBudget.toFixed(2)}% remaining`);
36
- console.log('');
37
- }
38
- });
39
- // List all SLIs
40
- sloCommand
41
- .command('sli')
42
- .description('List all Service Level Indicators')
43
- .option('--json', 'Output as JSON')
44
- .action(async (options) => {
45
- const config = createDefaultSLOConfig();
46
- const tracker = new SLOTracker();
47
- tracker.registerSLIs(config.slis);
48
- const slis = tracker.getAllSLIs();
49
- if (options.json) {
50
- console.log(JSON.stringify(slis, null, 2));
51
- return;
52
- }
53
- console.log('\n📈 Service Level Indicators\n');
54
- if (slis.length === 0) {
55
- console.log('No SLIs configured.\n');
56
- return;
57
- }
58
- for (const sli of slis) {
59
- console.log(` • ${sli.name}`);
60
- console.log(` Type: ${sli.type}`);
61
- console.log(` Source: ${sli.source}`);
62
- console.log(` Aggregation: ${sli.aggregation}`);
63
- console.log(` Unit: ${sli.unit}`);
64
- console.log(` Threshold: ${sli.threshold.operator} ${sli.threshold.value}${sli.unit === 'percentage' ? '%' : sli.unit}`);
65
- console.log('');
66
- }
67
- });
68
- // Show SLO status
69
- sloCommand
70
- .command('status')
71
- .description('Show current SLO status')
72
- .option('--id <id>', 'SLO ID (optional, shows all if not specified)')
73
- .option('--json', 'Output as JSON')
74
- .action(async (options) => {
75
- const config = createDefaultSLOConfig();
76
- const tracker = new SLOTracker();
77
- tracker.registerSLOs(config.slos);
78
- tracker.registerSLIs(config.slis);
79
- // Simulate some measurements for demo
80
- const demoSli = config.slis[0];
81
- if (demoSli) {
82
- tracker.recordMeasurement({
83
- sliId: demoSli.id,
84
- timestamp: Date.now(),
85
- value: 92,
86
- total: 100,
87
- good: 92,
88
- bad: 8,
89
- unit: demoSli.unit,
90
- windowStart: Date.now() - TimeWindows.DAY,
91
- windowEnd: Date.now()
92
- });
93
- }
94
- const results = options.id
95
- ? [tracker.calculateSLOResult(options.id)]
96
- : tracker.calculateAllResults();
97
- if (options.json) {
98
- console.log(JSON.stringify(results.filter((r) => r != null), null, 2));
99
- return;
100
- }
101
- console.log('\n📊 SLO Status Report\n');
102
- console.log(`Generated: ${new Date().toISOString()}\n`);
103
- for (const result of results.filter((r) => r != null)) {
104
- if (!result)
105
- continue;
106
- const status = result.status === 'healthy' ? '✅ Healthy' : result.status === 'warning' ? '⚠️ Warning' : '❌ Breached';
107
- const budgetBar = createBudgetBar(result.errorBudget.remaining);
108
- console.log(` ${result.name}`);
109
- console.log(` Status: ${status}`);
110
- console.log(` Target: ${result.target}% | Current: ${result.current.toFixed(2)}%`);
111
- console.log(` Error Budget: ${budgetBar} ${result.errorBudget.remaining.toFixed(2)}%`);
112
- console.log(` Burn Rate: ${result.errorBudget.burnRate.toFixed(2)}x`);
113
- console.log('');
114
- }
115
- });
116
- // Show error budget
117
- sloCommand
118
- .command('budget')
119
- .description('Show error budget status')
120
- .option('--id <id>', 'SLO ID')
121
- .option('--json', 'Output as JSON')
122
- .action(async (options) => {
123
- const config = createDefaultSLOConfig();
124
- const tracker = new SLOTracker();
125
- tracker.registerSLOs(config.slos);
126
- const slos = options.id
127
- ? ((slo => slo ? [slo] : [])(tracker.getSLO(options.id)))
128
- : tracker.getAllSLOs();
129
- if (options.json) {
130
- console.log(JSON.stringify(slos.map((s) => ({
131
- id: s.id,
132
- name: s.name,
133
- errorBudget: s.errorBudget
134
- })), null, 2));
135
- return;
136
- }
137
- console.log('\n💰 Error Budget Status\n');
138
- for (const slo of slos) {
139
- if (!slo)
140
- continue;
141
- const budget = slo.errorBudget;
142
- const budgetBar = createBudgetBar(budget.remainingBudget);
143
- const status = budget.remainingBudget > 0 ? '✅' : '❌';
144
- console.log(` ${status} ${slo.name}`);
145
- console.log(` Initial Budget: ${budget.initialBudget}%`);
146
- console.log(` Remaining: ${budgetBar} ${budget.remainingBudget.toFixed(2)}%`);
147
- console.log(` Burned: ${(budget.initialBudget - budget.remainingBudget).toFixed(2)}%`);
148
- console.log('');
149
- }
150
- });
151
- // Create a new SLO
152
- sloCommand
153
- .command('create')
154
- .description('Create a new SLO')
155
- .option('--name <name>', 'SLO name')
156
- .option('--target <percentage>', 'Target percentage (0-100)', parseFloat)
157
- .option('--window <duration>', 'Window duration (e.g., 7d, 30d)', '30d')
158
- .option('--sli <ids...>', 'SLI IDs (comma-separated)')
159
- .option('--tags <tags...>', 'Tags (comma-separated)')
160
- .action(async (options) => {
161
- if (!options.name) {
162
- console.error('Error: --name is required');
163
- process.exit(1);
164
- }
165
- if (options.target === undefined || options.target < 0 || options.target > 100) {
166
- console.error('Error: --target must be between 0 and 100');
167
- process.exit(1);
168
- }
169
- const windowMs = parseDuration(options.window);
170
- const sliIds = options.sli ? options.sli.split(',') : [];
171
- const tags = options.tags ? options.tags.split(',') : [];
172
- const newSLO = {
173
- id: `slo_${Date.now()}`,
174
- name: options.name,
175
- sliIds,
176
- target: options.target,
177
- windowMs,
178
- errorBudget: {
179
- initialBudget: 100 - options.target,
180
- remainingBudget: 100 - options.target,
181
- alertThresholds: { warning: 2, critical: 5 },
182
- onExhaustion: 'alert_only'
183
- },
184
- status: 'unknown',
185
- tags,
186
- createdAt: Date.now(),
187
- updatedAt: Date.now()
188
- };
189
- console.log('\n✅ SLO Created\n');
190
- console.log(` ID: ${newSLO.id}`);
191
- console.log(` Name: ${newSLO.name}`);
192
- console.log(` Target: ${newSLO.target}%`);
193
- console.log(` Window: ${formatDuration(windowMs)}`);
194
- console.log(` SLIs: ${sliIds.join(', ') || 'None'}`);
195
- console.log(` Tags: ${tags.join(', ') || 'None'}`);
196
- console.log('');
197
- });
198
- // Validate configuration
199
- sloCommand
200
- .command('validate')
201
- .description('Validate SLO configuration')
202
- .option('--mode <mode>', 'Configuration mode: default, strict, relaxed', 'default')
203
- .action(async (options) => {
204
- let config;
205
- switch (options.mode) {
206
- case 'strict':
207
- config = createStrictSLOConfig();
208
- break;
209
- case 'relaxed':
210
- config = createRelaxedSLOConfig();
211
- break;
212
- default:
213
- config = createDefaultSLOConfig();
214
- }
215
- console.log(`\n✅ SLO Configuration Validated (${options.mode} mode)\n`);
216
- console.log(` SLOs defined: ${config.slos.length}`);
217
- console.log(` SLIs defined: ${config.slis.length}`);
218
- console.log(` Default window: ${formatDuration(config.defaultWindowMs)}`);
219
- console.log(` On exhaustion: ${config.defaultOnExhaustion}`);
220
- console.log('');
221
- for (const slo of config.slos) {
222
- console.log(` • ${slo.name} (${slo.target}% target)`);
223
- }
224
- console.log('');
225
- });
226
- // Generate SLO report
227
- sloCommand
228
- .command('report')
229
- .description('Generate SLO report')
230
- .option('--period <duration>', 'Report period (e.g., 7d, 30d)', '30d')
231
- .option('--json', 'Output as JSON')
232
- .action(async (options) => {
233
- const config = createDefaultSLOConfig();
234
- const tracker = new SLOTracker();
235
- tracker.registerSLOs(config.slos);
236
- tracker.registerSLIs(config.slis);
237
- // Add demo measurements
238
- for (const sli of config.slis) {
239
- tracker.recordMeasurement({
240
- sliId: sli.id,
241
- timestamp: Date.now(),
242
- value: 92 + Math.random() * 8,
243
- total: 100,
244
- good: 92 + Math.floor(Math.random() * 8),
245
- bad: Math.floor(Math.random() * 8),
246
- unit: sli.unit,
247
- windowStart: Date.now() - parseDuration(options.period),
248
- windowEnd: Date.now()
249
- });
250
- }
251
- const report = tracker.generateReport({
252
- start: Date.now() - parseDuration(options.period),
253
- end: Date.now()
254
- });
255
- if (options.json) {
256
- console.log(JSON.stringify(report, null, 2));
257
- return;
258
- }
259
- console.log('\n📊 SLO Report\n');
260
- console.log(`Period: Last ${options.period}`);
261
- console.log(`Generated: ${new Date(report.timestamp).toISOString()}`);
262
- console.log(`Overall Status: ${formatStatus(report.status)}\n`);
263
- console.log('Summary:');
264
- console.log(` Total SLOs: ${report.summary.total}`);
265
- console.log(` ✅ Healthy: ${report.summary.healthy}`);
266
- console.log(` ⚠️ Warning: ${report.summary.warning}`);
267
- console.log(` ❌ Breached: ${report.summary.breached}\n`);
268
- if (report.slos.length > 0) {
269
- console.log('SLO Details:\n');
270
- for (const slo of report.slos) {
271
- const status = slo.status === 'healthy' ? '✅' : slo.status === 'warning' ? '⚠️' : '❌';
272
- console.log(` ${status} ${slo.name}`);
273
- console.log(` Target: ${slo.target}% | Current: ${slo.current.toFixed(2)}%`);
274
- console.log(` Error Budget: ${slo.errorBudget.remaining.toFixed(2)}% remaining`);
275
- console.log('');
276
- }
277
- }
278
- });
279
- // Helper functions
280
- function formatDuration(ms) {
281
- const days = Math.floor(ms / (24 * 60 * 60 * 1000));
282
- const hours = Math.floor((ms % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));
283
- if (days > 0) {
284
- return `${days} day${days > 1 ? 's' : ''}`;
285
- }
286
- if (hours > 0) {
287
- return `${hours} hour${hours > 1 ? 's' : ''}`;
288
- }
289
- return `${ms}ms`;
290
- }
291
- function parseDuration(str) {
292
- const match = str.match(/^(\d+)([dh])$/);
293
- if (!match) {
294
- return TimeWindows.MONTH; // Default
295
- }
296
- const value = parseInt(match[1], 10);
297
- const unit = match[2];
298
- switch (unit) {
299
- case 'd':
300
- return value * 24 * 60 * 60 * 1000;
301
- case 'h':
302
- return value * 60 * 60 * 1000;
303
- default:
304
- return TimeWindows.MONTH;
305
- }
306
- }
307
- function createBudgetBar(remaining) {
308
- const width = 20;
309
- const filled = Math.round((remaining / 100) * width);
310
- const bar = '█'.repeat(Math.max(0, filled)) + '░'.repeat(Math.max(0, width - filled));
311
- const color = remaining > 50 ? '\x1b[32m' : remaining > 20 ? '\x1b[33m' : '\x1b[31m';
312
- const reset = '\x1b[0m';
313
- return `${color}[${bar}]${reset}`;
314
- }
315
- function formatStatus(status) {
316
- switch (status) {
317
- case 'healthy':
318
- return '✅ Healthy';
319
- case 'warning':
320
- return '⚠️ Warning';
321
- case 'breached':
322
- return '❌ Breached';
323
- default:
324
- return '❓ Unknown';
325
- }
326
- }
327
- export default sloCommand;
@@ -1,32 +0,0 @@
1
- /**
2
- * QA360 Verify Command - Proof Bundle Verification
3
- *
4
- * Verifies cryptographically signed proof bundles (RFC Proof Bundle v1)
5
- *
6
- * Usage:
7
- * qa360 verify <proof.json>
8
- * qa360 verify <directory>
9
- * qa360 verify --json
10
- *
11
- * @see docs/rfc/proof-bundle-v1.md
12
- */
13
- /**
14
- * CLI options for verify command
15
- */
16
- export interface VerifyOptions {
17
- json?: boolean;
18
- verbose?: boolean;
19
- strict?: boolean;
20
- }
21
- /**
22
- * Verify a single proof bundle file
23
- */
24
- export declare function verifySingle(filePath: string, options?: VerifyOptions): Promise<number>;
25
- /**
26
- * Verify all proof bundles in a directory
27
- */
28
- export declare function verifyDirectory(dirPath: string, options?: VerifyOptions): Promise<number>;
29
- /**
30
- * Main verify command
31
- */
32
- export declare function verifyCommand(pathArg?: string, options?: VerifyOptions): Promise<void>;
@@ -1,278 +0,0 @@
1
- /**
2
- * QA360 Verify Command - Proof Bundle Verification
3
- *
4
- * Verifies cryptographically signed proof bundles (RFC Proof Bundle v1)
5
- *
6
- * Usage:
7
- * qa360 verify <proof.json>
8
- * qa360 verify <directory>
9
- * qa360 verify --json
10
- *
11
- * @see docs/rfc/proof-bundle-v1.md
12
- */
13
- import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
14
- import { join, resolve, basename } from 'path';
15
- import chalk from 'chalk';
16
- // Import from core
17
- import { verifyProofFile, verifyPhase3Proof, VerificationCode, } from '../core/index.js';
18
- /**
19
- * Verify a proof file with automatic format detection
20
- */
21
- async function verifyProofAuto(filePath) {
22
- try {
23
- const content = readFileSync(filePath, 'utf-8');
24
- const json = JSON.parse(content);
25
- // Detect format
26
- if (json.spec === 'qa360.proof.v1') {
27
- // RFC format
28
- return await verifyProofFile(filePath);
29
- }
30
- else if (json.version && json.signature && json.runId) {
31
- // Phase3 format
32
- return await verifyPhase3Proof(filePath);
33
- }
34
- else {
35
- return {
36
- valid: false,
37
- code: VerificationCode.PROOF_MALFORMED,
38
- message: 'Unknown proof format',
39
- };
40
- }
41
- }
42
- catch (error) {
43
- return {
44
- valid: false,
45
- code: VerificationCode.PROOF_MALFORMED,
46
- message: `Failed to read proof: ${error instanceof Error ? error.message : 'Unknown error'}`,
47
- };
48
- }
49
- }
50
- /**
51
- * Format verification result for human-readable output
52
- */
53
- function formatResult(result, filePath) {
54
- if (result.valid) {
55
- console.log(chalk.green.bold('\n✅ Proof verified: OK\n'));
56
- console.log(chalk.blue(`🔏 Signer: ${result.details?.signerId || 'unknown'}`));
57
- console.log(chalk.blue(`🔐 Hash: ${result.details?.hash || 'unknown'}`));
58
- if (result.details?.artifactsTotal !== undefined) {
59
- const verified = result.details.artifactsVerified || 0;
60
- const total = result.details.artifactsTotal;
61
- const status = verified === total ? chalk.green('all verified') : chalk.yellow(`${verified}/${total} verified`);
62
- console.log(chalk.blue(`📦 Artifacts: ${total} (${status})`));
63
- }
64
- if (result.details?.startedAt && result.details?.finishedAt) {
65
- console.log(chalk.blue(`⏱️ Run: ${result.details.startedAt} → ${result.details.finishedAt}`));
66
- }
67
- if (result.details?.trustScore !== undefined) {
68
- const score = result.details.trustScore;
69
- const scoreColor = score >= 80 ? chalk.green : score >= 60 ? chalk.yellow : chalk.red;
70
- console.log(chalk.blue(`🎯 Trust Score: ${scoreColor(`${score}/100`)}`));
71
- }
72
- console.log();
73
- }
74
- else {
75
- console.log(chalk.red.bold('\n❌ Proof verification FAILED\n'));
76
- console.log(chalk.red(`📝 ${result.message}`));
77
- if (result.code === VerificationCode.PROOF_INVALID_SIG) {
78
- console.log(chalk.yellow('\n💡 Possible causes:'));
79
- console.log(chalk.yellow(' • Proof bundle was tampered with'));
80
- console.log(chalk.yellow(' • Wrong public key used for verification'));
81
- console.log(chalk.yellow(' • Proof bundle corrupted'));
82
- }
83
- else if (result.code === VerificationCode.PROOF_INVALID_SCHEMA) {
84
- console.log(chalk.yellow('\n💡 The proof bundle does not match the expected schema'));
85
- }
86
- else if (result.code === VerificationCode.PROOF_ARTIFACT_MISMATCH) {
87
- console.log(chalk.yellow('\n💡 One or more artifacts have been modified or are missing'));
88
- }
89
- else if (result.code === VerificationCode.PROOF_MISSING_KEY) {
90
- console.log(chalk.yellow('\n💡 Public key not found'));
91
- console.log(chalk.yellow(' Run: qa360 doctor --init-keys'));
92
- }
93
- console.log();
94
- }
95
- }
96
- /**
97
- * Format verification result as JSON
98
- */
99
- function formatJSON(result) {
100
- const output = {
101
- valid: result.valid,
102
- code: result.code,
103
- message: result.message,
104
- details: result.details,
105
- };
106
- console.log(JSON.stringify(output, null, 2));
107
- }
108
- /**
109
- * Find all proof bundle files in a directory
110
- */
111
- function findProofFiles(dirPath) {
112
- const files = [];
113
- try {
114
- const entries = readdirSync(dirPath);
115
- for (const entry of entries) {
116
- const fullPath = join(dirPath, entry);
117
- const stat = statSync(fullPath);
118
- if (stat.isFile() && entry.endsWith('-proof.json')) {
119
- files.push(fullPath);
120
- }
121
- else if (stat.isFile() && entry.endsWith('.json')) {
122
- // Check if it looks like a proof bundle (either format)
123
- try {
124
- const content = readFileSync(fullPath, 'utf-8');
125
- const json = JSON.parse(content);
126
- // Support both RFC format (spec) and Phase3 format (version + signature)
127
- if (json.spec === 'qa360.proof.v1' ||
128
- (json.version && json.signature && json.runId)) {
129
- files.push(fullPath);
130
- }
131
- }
132
- catch {
133
- // Not a valid proof bundle, skip
134
- }
135
- }
136
- }
137
- }
138
- catch (error) {
139
- // Directory read error, return empty
140
- }
141
- return files;
142
- }
143
- /**
144
- * Verify a single proof bundle file
145
- */
146
- export async function verifySingle(filePath, options = {}) {
147
- const absolutePath = resolve(filePath);
148
- if (!existsSync(absolutePath)) {
149
- console.error(chalk.red(`❌ File not found: ${filePath}`));
150
- return 1;
151
- }
152
- try {
153
- const result = await verifyProofAuto(absolutePath);
154
- if (options.json) {
155
- formatJSON(result);
156
- }
157
- else {
158
- formatResult(result, filePath);
159
- }
160
- return result.valid ? 0 : result.code;
161
- }
162
- catch (error) {
163
- if (options.json) {
164
- console.log(JSON.stringify({
165
- valid: false,
166
- code: VerificationCode.PROOF_MALFORMED,
167
- message: error instanceof Error ? error.message : 'Unknown error',
168
- }, null, 2));
169
- }
170
- else {
171
- console.error(chalk.red(`❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
172
- }
173
- return VerificationCode.PROOF_MALFORMED;
174
- }
175
- }
176
- /**
177
- * Verify all proof bundles in a directory
178
- */
179
- export async function verifyDirectory(dirPath, options = {}) {
180
- const absolutePath = resolve(dirPath);
181
- if (!existsSync(absolutePath)) {
182
- console.error(chalk.red(`❌ Directory not found: ${dirPath}`));
183
- return 1;
184
- }
185
- const proofFiles = findProofFiles(absolutePath);
186
- if (proofFiles.length === 0) {
187
- console.error(chalk.yellow(`⚠️ No proof bundles found in: ${dirPath}`));
188
- return 1;
189
- }
190
- if (!options.json) {
191
- console.log(chalk.blue(`\n🔍 Found ${proofFiles.length} proof bundle(s)\n`));
192
- }
193
- let allValid = true;
194
- const results = [];
195
- for (const proofFile of proofFiles) {
196
- const fileName = basename(proofFile);
197
- if (!options.json) {
198
- console.log(chalk.gray(`\n━━━ ${fileName} ━━━`));
199
- }
200
- try {
201
- const result = await verifyProofAuto(proofFile);
202
- if (!options.json) {
203
- formatResult(result, proofFile);
204
- }
205
- else {
206
- results.push({
207
- file: fileName,
208
- ...result,
209
- });
210
- }
211
- if (!result.valid) {
212
- allValid = false;
213
- }
214
- }
215
- catch (error) {
216
- allValid = false;
217
- if (!options.json) {
218
- console.error(chalk.red(`❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
219
- }
220
- else {
221
- results.push({
222
- file: fileName,
223
- valid: false,
224
- code: VerificationCode.PROOF_MALFORMED,
225
- message: error instanceof Error ? error.message : 'Unknown error',
226
- });
227
- }
228
- }
229
- }
230
- if (options.json) {
231
- console.log(JSON.stringify({
232
- total: proofFiles.length,
233
- valid: allValid,
234
- results,
235
- }, null, 2));
236
- }
237
- else {
238
- console.log(chalk.gray('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
239
- if (allValid) {
240
- console.log(chalk.green.bold(`✅ All ${proofFiles.length} proof bundle(s) verified successfully\n`));
241
- }
242
- else {
243
- console.log(chalk.red.bold(`❌ Some proof bundles failed verification\n`));
244
- }
245
- }
246
- return allValid ? 0 : 1;
247
- }
248
- /**
249
- * Main verify command
250
- */
251
- export async function verifyCommand(pathArg, options = {}) {
252
- // Default to .qa360/proofs if no path provided
253
- const targetPath = pathArg || join(process.cwd(), '.qa360', 'proofs');
254
- try {
255
- const stat = statSync(targetPath);
256
- let exitCode;
257
- if (stat.isDirectory()) {
258
- exitCode = await verifyDirectory(targetPath, options);
259
- }
260
- else {
261
- exitCode = await verifySingle(targetPath, options);
262
- }
263
- process.exit(exitCode);
264
- }
265
- catch (error) {
266
- if (!existsSync(targetPath)) {
267
- console.error(chalk.red(`❌ Path not found: ${targetPath}`));
268
- console.error(chalk.yellow('\n💡 Usage:'));
269
- console.error(chalk.yellow(' qa360 verify <proof.json>'));
270
- console.error(chalk.yellow(' qa360 verify <directory>'));
271
- console.error(chalk.yellow(' qa360 verify (defaults to .qa360/proofs/)'));
272
- }
273
- else {
274
- console.error(chalk.red(`❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
275
- }
276
- process.exit(1);
277
- }
278
- }