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,763 @@
1
+ /**
2
+ * QA360 Init Command - Interactive pack generator (v2)
3
+ *
4
+ * Usage:
5
+ * qa360 init
6
+ * qa360 init --template api-basic
7
+ * qa360 init --output custom-pack.yml
8
+ * qa360 init --beginner # Guided mode for first-time users
9
+ */
10
+
11
+ import { existsSync, writeFileSync, mkdirSync } from 'fs';
12
+ import { join, resolve } from 'path';
13
+ import { createRequire } from 'module';
14
+ import chalk from 'chalk';
15
+ import { dump } from 'js-yaml';
16
+
17
+ // Use createRequire for CommonJS module inquirer
18
+ const require = createRequire(import.meta.url);
19
+ const inquirer = require('inquirer');
20
+
21
+ // ============================================================
22
+ // Type Definitions (Pack v2)
23
+ // ============================================================
24
+
25
+ export interface PackConfigV2 {
26
+ version: 2;
27
+ name: string;
28
+ description?: string;
29
+ profile?: string;
30
+ auth?: AuthConfigV2;
31
+ gates: Record<string, GateConfigV2>;
32
+ hooks?: HooksConfig;
33
+ execution?: ExecutionConfigV2;
34
+ variables?: Record<string, string>;
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+
38
+ export interface AuthConfigV2 {
39
+ api?: string;
40
+ ui?: string;
41
+ profiles?: Record<string, AuthProfile>;
42
+ }
43
+
44
+ export interface AuthProfile {
45
+ type: string;
46
+ config: Record<string, unknown>;
47
+ cache?: { enabled?: boolean; ttl?: number };
48
+ }
49
+
50
+ export interface GateConfigV2 {
51
+ adapter?: string;
52
+ test_files?: string[];
53
+ config?: Record<string, unknown>;
54
+ auth?: string;
55
+ budgets?: Record<string, unknown>;
56
+ options?: { timeout?: number; retries?: number; continue_on_failure?: boolean };
57
+ enabled?: boolean;
58
+ depends_on?: string[];
59
+ parallel?: boolean;
60
+ }
61
+
62
+ export interface HooksConfig {
63
+ beforeAll?: Hook[];
64
+ afterAll?: Hook[];
65
+ beforeEach?: Hook[];
66
+ afterEach?: Hook[];
67
+ }
68
+
69
+ export interface Hook {
70
+ type: 'run' | 'wait_on' | 'script' | 'docker';
71
+ command?: string;
72
+ cwd?: string;
73
+ timeout?: number;
74
+ env?: Record<string, string>;
75
+ wait_for?: { resource: string; timeout?: number };
76
+ compose?: { file?: string; services?: string[]; command?: string };
77
+ }
78
+
79
+ export interface ExecutionConfigV2 {
80
+ parallel?: boolean;
81
+ max_concurrency?: number;
82
+ default_timeout?: number;
83
+ default_retries?: number;
84
+ on_failure: 'stop' | 'continue' | 'proceed';
85
+ limits?: { cpu?: string; memory?: string };
86
+ compose_file?: string;
87
+ hook_timeout_ms?: number;
88
+ }
89
+
90
+ // ============================================================
91
+ // CLI options for init command
92
+ // ============================================================
93
+
94
+ export interface InitOptions {
95
+ template?: string;
96
+ output?: string;
97
+ force?: boolean;
98
+ yes?: boolean;
99
+ beginner?: boolean;
100
+ }
101
+
102
+ // ============================================================
103
+ // Available templates (v2)
104
+ // ============================================================
105
+
106
+ export const TEMPLATES: Record<string, {
107
+ name: string;
108
+ description: string;
109
+ gates: string[];
110
+ icon: string;
111
+ }> = {
112
+ 'api-basic': {
113
+ name: 'API Basic',
114
+ description: 'Simple API smoke tests (REST/GraphQL)',
115
+ gates: ['api-smoke'],
116
+ icon: 'šŸ”Œ',
117
+ },
118
+ 'ui-basic': {
119
+ name: 'UI Basic',
120
+ description: 'Basic UI/E2E browser tests',
121
+ gates: ['ui-smoke', 'a11y'],
122
+ icon: '🌐',
123
+ },
124
+ 'fullstack': {
125
+ name: 'Full Stack',
126
+ description: 'API + UI + Performance tests',
127
+ gates: ['api-smoke', 'api-crud', 'ui-smoke', 'perf'],
128
+ icon: 'šŸŽÆ',
129
+ },
130
+ 'security': {
131
+ name: 'Security',
132
+ description: 'SAST, DAST, secrets scanning',
133
+ gates: ['api-smoke', 'sast', 'dast', 'secrets'],
134
+ icon: 'šŸ›”ļø',
135
+ },
136
+ 'complete': {
137
+ name: 'Complete',
138
+ description: 'All quality gates (API, UI, Performance, Security, Accessibility)',
139
+ gates: ['api-smoke', 'api-crud', 'ui-smoke', 'a11y', 'perf', 'sast', 'dast', 'secrets'],
140
+ icon: '✨',
141
+ },
142
+ };
143
+
144
+ // ============================================================
145
+ // Gate descriptions with beginner-friendly explanations
146
+ // ============================================================
147
+
148
+ export const GATE_DESCRIPTIONS: Record<string, {
149
+ short: string;
150
+ beginner: string;
151
+ example: string;
152
+ icon: string;
153
+ adapter: string;
154
+ }> = {
155
+ 'api-smoke': {
156
+ short: 'API smoke tests (REST/GraphQL health checks)',
157
+ beginner: 'Tests if your API is alive and responds correctly. Like checking if the server is up.',
158
+ example: 'Checks if GET /api/health or GET /status/200 returns 200 OK',
159
+ icon: 'šŸ”Œ',
160
+ adapter: 'playwright-api',
161
+ },
162
+ 'api-crud': {
163
+ short: 'API CRUD tests (Create, Read, Update, Delete)',
164
+ beginner: 'Tests the full lifecycle of your data operations.',
165
+ example: 'Tests POST /users, GET /users, PUT /users/1, DELETE /users/1',
166
+ icon: 'šŸ”§',
167
+ adapter: 'playwright-api',
168
+ },
169
+ 'ui-smoke': {
170
+ short: 'UI/E2E tests (browser automation)',
171
+ beginner: 'Tests your website in a real browser. Checks if pages load and buttons work.',
172
+ example: 'Opens your site and verifies the login form appears',
173
+ icon: '🌐',
174
+ adapter: 'playwright-ui',
175
+ },
176
+ 'a11y': {
177
+ short: 'Accessibility tests (WCAG compliance)',
178
+ beginner: 'Tests if your site is usable by people with disabilities (screen readers, color blindness).',
179
+ example: 'Checks if images have alt text for blind users',
180
+ icon: '♿',
181
+ adapter: 'playwright-ui',
182
+ },
183
+ 'perf': {
184
+ short: 'Performance tests (load/stress testing)',
185
+ beginner: 'Tests if your site stays fast when many people visit at once.',
186
+ example: 'Simulates 100 users visiting simultaneously',
187
+ icon: '⚔',
188
+ adapter: 'k6-perf',
189
+ },
190
+ 'sast': {
191
+ short: 'Static security analysis (code scanning)',
192
+ beginner: 'Analyzes your source code for security vulnerabilities without running it.',
193
+ example: 'Finds hardcoded passwords or unsafe functions',
194
+ icon: 'šŸ”',
195
+ adapter: 'semgrep-sast',
196
+ },
197
+ 'dast': {
198
+ short: 'Dynamic security testing (runtime scanning)',
199
+ beginner: 'Attacks your running application to find security weaknesses.',
200
+ example: 'Tries common attacks like SQL injection',
201
+ icon: 'āš”ļø',
202
+ adapter: 'zap-dast',
203
+ },
204
+ 'secrets': {
205
+ short: 'Secrets detection (credential scanning)',
206
+ beginner: 'Scans for accidentally committed passwords, API keys, or tokens.',
207
+ example: 'Finds AWS keys in your code',
208
+ icon: 'šŸ”‘',
209
+ adapter: 'gitleaks-secrets',
210
+ },
211
+ };
212
+
213
+ // ============================================================
214
+ // Helper: Create gate config
215
+ // ============================================================
216
+
217
+ function createGate(adapter: string, baseUrl: string, extraConfig: Record<string, unknown> = {}): GateConfigV2 {
218
+ return {
219
+ adapter,
220
+ enabled: true,
221
+ config: {
222
+ baseUrl,
223
+ ...extraConfig,
224
+ },
225
+ options: {
226
+ timeout: 30000,
227
+ retries: 2,
228
+ },
229
+ };
230
+ }
231
+
232
+ // ============================================================
233
+ // Helper: Generate v2 pack from selected gates
234
+ // ============================================================
235
+
236
+ function generateV2Pack(name: string, gates: string[], apiTarget?: string, webTarget?: string): PackConfigV2 {
237
+ const pack: PackConfigV2 = {
238
+ version: 2,
239
+ name,
240
+ description: `QA360 test pack for ${name}`,
241
+ gates: {},
242
+ execution: {
243
+ default_timeout: 30000,
244
+ default_retries: 2,
245
+ on_failure: 'continue',
246
+ parallel: true,
247
+ },
248
+ };
249
+
250
+ const apiBaseUrl = apiTarget ? `\${BASE_URL:-${apiTarget}}` : '${BASE_URL:-https://api.example.com}';
251
+ const webBaseUrl = webTarget ? `\${BASE_URL:-${webTarget}}` : '${BASE_URL:-https://example.com}';
252
+
253
+ // Build gates
254
+ for (const gate of gates) {
255
+ const gateInfo = GATE_DESCRIPTIONS[gate];
256
+
257
+ if (!gateInfo) continue;
258
+
259
+ switch (gate) {
260
+ case 'api-smoke':
261
+ pack.gates['api-health'] = createGate('playwright-api', apiBaseUrl, {
262
+ smoke: [
263
+ 'GET /status/200 -> 200',
264
+ 'GET /get -> 200',
265
+ 'GET /uuid -> 200',
266
+ ],
267
+ });
268
+ break;
269
+
270
+ case 'api-crud':
271
+ pack.gates['api-crud'] = createGate('playwright-api', apiBaseUrl, {
272
+ smoke: [
273
+ 'GET /api/v1/users -> 200',
274
+ 'POST /api/v1/users -> 201',
275
+ 'PUT /api/v1/users/1 -> 200',
276
+ 'DELETE /api/v1/users/1 -> 204',
277
+ ],
278
+ });
279
+ pack.gates['api-crud'].budgets = {
280
+ p95_ms: 1000,
281
+ error_rate: 0.01,
282
+ };
283
+ break;
284
+
285
+ case 'ui-smoke':
286
+ pack.gates['ui-smoke'] = createGate('playwright-ui', webBaseUrl, {
287
+ pages: [
288
+ {
289
+ url: '/',
290
+ expectedElements: ['body', 'main'],
291
+ },
292
+ ],
293
+ });
294
+ break;
295
+
296
+ case 'a11y':
297
+ pack.gates['a11y'] = {
298
+ adapter: 'playwright-ui',
299
+ enabled: true,
300
+ config: {
301
+ baseUrl: webBaseUrl,
302
+ pages: [
303
+ {
304
+ url: '/',
305
+ a11yRules: ['wcag2a', 'wcag2aa'],
306
+ },
307
+ ],
308
+ },
309
+ budgets: {
310
+ violations: 10,
311
+ a11y_score: 90,
312
+ },
313
+ };
314
+ break;
315
+
316
+ case 'perf':
317
+ pack.gates['perf'] = {
318
+ adapter: 'k6-perf',
319
+ enabled: true,
320
+ config: {
321
+ script: `import http from 'k6/http';
322
+ import { check } from 'k6';
323
+
324
+ export const options = {
325
+ stages: [
326
+ { duration: '10s', target: 10 },
327
+ { duration: '20s', target: 50 },
328
+ { duration: '10s', target: 0 },
329
+ ],
330
+ };
331
+
332
+ export default function () {
333
+ const res = http.get('${apiBaseUrl}/health');
334
+ check(res, {
335
+ 'status is 200': (r) => r.status === 200,
336
+ 'response time < 500ms': (r) => r.timings.duration < 500,
337
+ });
338
+ }`,
339
+ },
340
+ budgets: {
341
+ p95_ms: 2000,
342
+ p99_ms: 5000,
343
+ error_rate: 0.05,
344
+ },
345
+ options: {
346
+ timeout: 60000,
347
+ retries: 1,
348
+ },
349
+ };
350
+ break;
351
+
352
+ case 'sast':
353
+ pack.gates['sast'] = {
354
+ adapter: 'semgrep-sast',
355
+ enabled: true,
356
+ config: {
357
+ rules: ['security', 'owasp-top-10'],
358
+ paths: ['src/', 'lib/'],
359
+ },
360
+ budgets: {
361
+ high_findings: 0,
362
+ medium_findings: 10,
363
+ },
364
+ };
365
+ break;
366
+
367
+ case 'dast':
368
+ pack.gates['dast'] = {
369
+ adapter: 'zap-dast',
370
+ enabled: true,
371
+ config: {
372
+ target: 'api',
373
+ profile: 'baseline',
374
+ url: apiBaseUrl,
375
+ scanType: 'baseline',
376
+ },
377
+ budgets: {
378
+ high_findings: 5,
379
+ medium_findings: 20,
380
+ },
381
+ options: {
382
+ timeout: 120000,
383
+ },
384
+ };
385
+ break;
386
+
387
+ case 'secrets':
388
+ pack.gates['secrets'] = {
389
+ adapter: 'gitleaks-secrets',
390
+ enabled: true,
391
+ config: {
392
+ paths: ['.', 'src/', 'config/'],
393
+ },
394
+ budgets: {
395
+ critical_findings: 0,
396
+ },
397
+ };
398
+ break;
399
+ }
400
+ }
401
+
402
+ // Add hooks if needed
403
+ if (gates.includes('perf') || gates.includes('dast')) {
404
+ pack.hooks = {
405
+ beforeAll: [
406
+ {
407
+ type: 'wait_on',
408
+ wait_for: {
409
+ resource: `${apiBaseUrl}/health`,
410
+ timeout: 30000,
411
+ },
412
+ },
413
+ ],
414
+ };
415
+ }
416
+
417
+ return pack;
418
+ }
419
+
420
+ // ============================================================
421
+ // Beginner mode - Step by step guided experience
422
+ // ============================================================
423
+
424
+ async function beginnerMode(): Promise<PackConfigV2> {
425
+ console.log(chalk.bold.cyan('\n╔════════════════════════════════════════════════════════════╗'));
426
+ console.log(chalk.bold.cyan('ā•‘ šŸ‘‹ Welcome to QA360 - Your Quality Assistant! ā•‘'));
427
+ console.log(chalk.bold.cyan('ā•‘ ā•‘'));
428
+ console.log(chalk.bold.cyan('ā•‘ Let\'s create your first test pack together, step by step. ā•‘'));
429
+ console.log(chalk.bold.cyan('ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n'));
430
+
431
+ console.log(chalk.gray('šŸ“¦ What is a "test pack"?'));
432
+ console.log(chalk.white(' A test pack defines WHAT to test (your API, website) and HOW (smoke tests, security scans).\n'));
433
+
434
+ // Step 1: Project name
435
+ console.log(chalk.bold('Step 1ļøāƒ£ - Project Name'));
436
+ console.log(chalk.gray(' Give your test pack a memorable name.\n'));
437
+
438
+ const { name } = await inquirer.prompt([
439
+ {
440
+ type: 'input',
441
+ name: 'name',
442
+ message: 'What should we call your test pack?',
443
+ default: 'my-first-tests',
444
+ validate: (input: string) => input.length > 0 || 'Name is required',
445
+ },
446
+ ]);
447
+
448
+ console.log(chalk.green(` āœ“ Great! Your test pack is called "${name}"\n`));
449
+
450
+ // Step 2: What to test?
451
+ console.log(chalk.bold('Step 2ļøāƒ£ - What do you want to test?'));
452
+ console.log(chalk.gray(' Select the type of application you want to test.\n'));
453
+
454
+ const { appType } = await inquirer.prompt([
455
+ {
456
+ type: 'list',
457
+ name: 'appType',
458
+ message: 'What type of application are you testing?',
459
+ choices: [
460
+ { name: 'šŸ”Œ API / Backend - REST or GraphQL API', value: 'api-basic' },
461
+ { name: '🌐 Website / Frontend - Web application', value: 'ui-basic' },
462
+ { name: 'šŸŽÆ Full Stack - Both API and Website', value: 'fullstack' },
463
+ { name: 'šŸ›”ļø Security Scan - Check for vulnerabilities', value: 'security' },
464
+ { name: '✨ Everything - All tests enabled', value: 'complete' },
465
+ ],
466
+ },
467
+ ]);
468
+
469
+ console.log(chalk.green(` āœ“ You chose: ${TEMPLATES[appType].name}\n`));
470
+
471
+ // Step 3: Gates explanation and selection
472
+ const suggestedGates = TEMPLATES[appType].gates;
473
+
474
+ console.log(chalk.bold('Step 3ļøāƒ£ - Quality Gates'));
475
+ console.log(chalk.gray(' Gates are different types of tests. We\'ll suggest some based on your choice.\n'));
476
+
477
+ console.log(chalk.cyan(' Suggested gates for you:\n'));
478
+ for (const gate of suggestedGates) {
479
+ const info = GATE_DESCRIPTIONS[gate];
480
+ if (info) {
481
+ console.log(chalk.cyan(` ${info.icon} ${gate}`));
482
+ console.log(chalk.gray(` ${info.beginner}`));
483
+ console.log(chalk.gray(` Example: ${info.example}\n`));
484
+ }
485
+ }
486
+
487
+ const { useSuggested } = await inquirer.prompt([
488
+ {
489
+ type: 'confirm',
490
+ name: 'useSuggested',
491
+ message: 'Use the suggested gates?',
492
+ default: true,
493
+ },
494
+ ]);
495
+
496
+ let gates = suggestedGates;
497
+ let apiTarget: string | undefined;
498
+ let webTarget: string | undefined;
499
+
500
+ if (!useSuggested) {
501
+ const { customGates } = await inquirer.prompt([
502
+ {
503
+ type: 'checkbox',
504
+ name: 'customGates',
505
+ message: 'Select the gates you want:',
506
+ choices: Object.entries(GATE_DESCRIPTIONS).map(([key, info]) => ({
507
+ name: `${info.icon} ${key} - ${info.short}`,
508
+ value: key,
509
+ })),
510
+ validate: (input: string[]) => input.length > 0 || 'Select at least one gate',
511
+ },
512
+ ]);
513
+ gates = customGates;
514
+ }
515
+
516
+ console.log(chalk.green(` āœ“ Selected gates: ${gates.join(', ')}\n`));
517
+
518
+ // Step 4: URLs
519
+ console.log(chalk.bold('Step 4ļøāƒ£ - Application URLs'));
520
+ console.log(chalk.gray(' Where is your application running?\n'));
521
+
522
+ const hasApiGates = gates.some((g: string) => ['api-smoke', 'api-crud', 'perf', 'dast'].includes(g));
523
+ const hasUiGates = gates.some((g: string) => ['ui-smoke', 'a11y'].includes(g));
524
+
525
+ if (hasApiGates) {
526
+ console.log(chalk.cyan(' šŸ“” API Configuration'));
527
+ const apiAnswers = await inquirer.prompt([
528
+ {
529
+ type: 'input',
530
+ name: 'apiUrl',
531
+ message: 'What is your API base URL?',
532
+ default: 'https://api.example.com',
533
+ validate: (input: string) => input.startsWith('http') || 'Must start with http:// or https://',
534
+ },
535
+ ]);
536
+ apiTarget = apiAnswers.apiUrl;
537
+ console.log(chalk.green(` āœ“ API: ${apiTarget}\n`));
538
+ }
539
+
540
+ if (hasUiGates) {
541
+ console.log(chalk.cyan(' 🌐 Website Configuration'));
542
+ const uiAnswers = await inquirer.prompt([
543
+ {
544
+ type: 'input',
545
+ name: 'webUrl',
546
+ message: 'What is your website URL?',
547
+ default: 'https://example.com',
548
+ validate: (input: string) => input.startsWith('http') || 'Must start with http:// or https://',
549
+ },
550
+ ]);
551
+ webTarget = uiAnswers.webUrl;
552
+ console.log(chalk.green(` āœ“ Website: ${webTarget}\n`));
553
+ }
554
+
555
+ // Build pack
556
+ const pack = generateV2Pack(name, gates, apiTarget, webTarget);
557
+
558
+ // Final summary
559
+ console.log(chalk.bold.cyan('\n✨ Almost done! Here\'s your test pack summary:\n'));
560
+ console.log(chalk.white(` Name: ${chalk.bold(name)}`));
561
+ console.log(chalk.white(` Gates: ${gates.map(g => `${GATE_DESCRIPTIONS[g]?.icon} ${g}`).join(', ')}`));
562
+ console.log(chalk.white(` API: ${apiTarget || 'N/A'}`));
563
+ console.log(chalk.white(` Website: ${webTarget || 'N/A'}`));
564
+
565
+ return pack;
566
+ }
567
+
568
+ // ============================================================
569
+ // Interactive prompts
570
+ // ============================================================
571
+
572
+ async function promptForConfig(): Promise<PackConfigV2> {
573
+ const answers = await inquirer.prompt([
574
+ {
575
+ type: 'input',
576
+ name: 'name',
577
+ message: 'Pack name:',
578
+ default: 'my-qa360-tests',
579
+ validate: (input: string) => input.length > 0 || 'Name is required',
580
+ },
581
+ {
582
+ type: 'list',
583
+ name: 'template',
584
+ message: 'Choose a template:',
585
+ choices: Object.entries(TEMPLATES).map(([key, value]) => ({
586
+ name: `${value.icon} ${value.name} - ${value.description}`,
587
+ value: key,
588
+ })),
589
+ },
590
+ {
591
+ type: 'confirm',
592
+ name: 'customizeGates',
593
+ message: 'Customize quality gates?',
594
+ default: false,
595
+ },
596
+ ]);
597
+
598
+ let gates = TEMPLATES[answers.template].gates;
599
+
600
+ if (answers.customizeGates) {
601
+ const gateAnswers = await inquirer.prompt([
602
+ {
603
+ type: 'checkbox',
604
+ name: 'gates',
605
+ message: 'Select quality gates to enable:',
606
+ choices: Object.entries(GATE_DESCRIPTIONS).map(([key, desc]) => ({
607
+ name: `${desc.icon} ${key} - ${desc.short}`,
608
+ value: key,
609
+ checked: gates.includes(key),
610
+ })),
611
+ validate: (input: string[]) => input.length > 0 || 'Select at least one gate',
612
+ },
613
+ ]);
614
+ gates = gateAnswers.gates;
615
+ }
616
+
617
+ // Prompt for target URLs based on selected gates
618
+ const targets: { api?: string; web?: string } = {};
619
+
620
+ const hasApiGates = gates.some((g: string) => ['api-smoke', 'api-crud', 'perf', 'dast'].includes(g));
621
+ const hasUiGates = gates.some((g: string) => ['ui-smoke', 'a11y'].includes(g));
622
+
623
+ if (hasApiGates) {
624
+ const apiAnswers = await inquirer.prompt([
625
+ {
626
+ type: 'input',
627
+ name: 'apiUrl',
628
+ message: 'API base URL:',
629
+ default: 'https://api.example.com',
630
+ validate: (input: string) => input.startsWith('http') || 'Must be a valid URL',
631
+ },
632
+ ]);
633
+ targets.api = apiAnswers.apiUrl;
634
+ }
635
+
636
+ if (hasUiGates) {
637
+ const uiAnswers = await inquirer.prompt([
638
+ {
639
+ type: 'input',
640
+ name: 'webUrl',
641
+ message: 'Web application URL:',
642
+ default: 'https://example.com',
643
+ validate: (input: string) => input.startsWith('http') || 'Must be a valid URL',
644
+ },
645
+ ]);
646
+ targets.web = uiAnswers.webUrl;
647
+ }
648
+
649
+ return generateV2Pack(answers.name, gates, targets.api, targets.web);
650
+ }
651
+
652
+ // ============================================================
653
+ // Generate pack from template
654
+ // ============================================================
655
+
656
+ function generateFromTemplate(templateKey: string, name?: string): PackConfigV2 {
657
+ const template = TEMPLATES[templateKey];
658
+
659
+ if (!template) {
660
+ throw new Error(`Unknown template: ${templateKey}`);
661
+ }
662
+
663
+ // Determine targets based on template
664
+ let apiTarget: string | undefined;
665
+ let webTarget: string | undefined;
666
+
667
+ const hasApiGates = template.gates.some((g: string) => ['api-smoke', 'api-crud', 'perf', 'dast'].includes(g));
668
+ const hasUiGates = template.gates.some((g: string) => ['ui-smoke', 'a11y'].includes(g));
669
+
670
+ if (hasApiGates) {
671
+ apiTarget = 'https://api.example.com';
672
+ }
673
+ if (hasUiGates) {
674
+ webTarget = 'https://example.com';
675
+ }
676
+
677
+ return generateV2Pack(name || `${templateKey}-tests`, template.gates, apiTarget, webTarget);
678
+ }
679
+
680
+ // ============================================================
681
+ // Main init command
682
+ // ============================================================
683
+
684
+ export async function initCommand(options: InitOptions = {}): Promise<void> {
685
+ try {
686
+ console.log(chalk.bold.cyan('\nšŸš€ QA360 Pack Generator (v2)\n'));
687
+
688
+ // Determine output file
689
+ const outputFile = options.output
690
+ ? resolve(options.output)
691
+ : join(process.cwd(), 'qa360.yml');
692
+
693
+ // Check if file exists
694
+ if (existsSync(outputFile) && !options.force) {
695
+ const overwrite = await inquirer.prompt([
696
+ {
697
+ type: 'confirm',
698
+ name: 'overwrite',
699
+ message: `File ${outputFile} already exists. Overwrite?`,
700
+ default: false,
701
+ },
702
+ ]);
703
+
704
+ if (!overwrite.overwrite) {
705
+ console.log(chalk.yellow('\nāš ļø Aborted. Use --force to overwrite.'));
706
+ return;
707
+ }
708
+ }
709
+
710
+ // Generate pack config
711
+ let pack: PackConfigV2;
712
+
713
+ if (options.beginner) {
714
+ // Beginner guided mode
715
+ pack = await beginnerMode();
716
+ } else if (options.template) {
717
+ // Use template directly
718
+ pack = generateFromTemplate(options.template);
719
+ console.log(chalk.green(`āœ… Using template: ${TEMPLATES[options.template]?.name || options.template}`));
720
+ } else if (options.yes) {
721
+ // Use default template (api-basic)
722
+ pack = generateFromTemplate('api-basic');
723
+ console.log(chalk.green('āœ… Using default template: API Basic'));
724
+ } else {
725
+ // Interactive mode
726
+ pack = await promptForConfig();
727
+ }
728
+
729
+ // Convert to YAML
730
+ const yaml = dump(pack, {
731
+ indent: 2,
732
+ lineWidth: 120,
733
+ noRefs: true,
734
+ quotingType: '"',
735
+ forceQuotes: false,
736
+ });
737
+
738
+ // Ensure directory exists
739
+ const dir = resolve(outputFile, '..');
740
+ if (!existsSync(dir)) {
741
+ mkdirSync(dir, { recursive: true });
742
+ }
743
+
744
+ // Write file
745
+ writeFileSync(outputFile, yaml, 'utf-8');
746
+
747
+ console.log(chalk.green.bold('\nāœ… Pack created successfully!'));
748
+ console.log(chalk.gray(`\nšŸ“„ File: ${outputFile}`));
749
+ console.log(chalk.gray(`šŸ“‹ Gates: ${Object.keys(pack.gates).join(', ')}`));
750
+
751
+ console.log(chalk.cyan('\nšŸ“š Next steps:'));
752
+ console.log(chalk.gray(' 1. Edit the pack file to customize your tests'));
753
+ console.log(chalk.gray(' 2. Run: qa360 run'));
754
+ console.log(chalk.gray(' 3. View results: qa360 verify .qa360/runs/\n'));
755
+
756
+ } catch (error) {
757
+ console.error(chalk.red('\nāŒ Init failed:'));
758
+ console.error(chalk.red(` ${error instanceof Error ? error.message : 'Unknown error'}`));
759
+ process.exit(1);
760
+ }
761
+ }
762
+
763
+ export default initCommand;