qa360 2.2.1 → 2.2.7
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.
Potentially problematic release.
This version of qa360 might be problematic. Click here for more details.
- package/CHANGELOG.md +28 -0
- package/README.md +79 -0
- package/cli/dist/cli-minimal.d.ts +6 -0
- package/cli/dist/cli-minimal.js +36 -0
- package/cli/dist/commands/ai.d.ts +43 -0
- package/cli/dist/commands/ai.js +616 -0
- package/cli/dist/commands/ask.d.ts +94 -0
- package/cli/dist/commands/ask.js +582 -0
- package/cli/dist/commands/coverage.d.ts +8 -0
- package/cli/dist/commands/coverage.js +252 -0
- package/cli/dist/commands/crawl.d.ts +24 -0
- package/cli/dist/commands/crawl.js +121 -0
- package/cli/dist/commands/doctor.d.ts +54 -0
- package/cli/dist/commands/doctor.js +513 -0
- package/cli/dist/commands/examples.d.ts +33 -0
- package/cli/dist/commands/examples.js +193 -0
- package/cli/dist/commands/explain.d.ts +27 -0
- package/cli/dist/commands/explain.js +630 -0
- package/cli/dist/commands/flakiness.d.ts +73 -0
- package/cli/dist/commands/flakiness.js +435 -0
- package/cli/dist/commands/generate.d.ts +66 -0
- package/cli/dist/commands/generate.js +438 -0
- package/cli/dist/commands/history.d.ts +76 -0
- package/cli/dist/commands/history.js +755 -0
- package/cli/dist/commands/init.d.ts +106 -0
- package/cli/dist/commands/init.js +616 -0
- package/cli/dist/commands/monitor.d.ts +27 -0
- package/cli/dist/commands/monitor.js +225 -0
- package/cli/dist/commands/ollama.d.ts +40 -0
- package/cli/dist/commands/ollama.js +346 -0
- package/cli/dist/commands/pack.d.ts +70 -0
- package/cli/dist/commands/pack.js +413 -0
- package/cli/dist/commands/regression.d.ts +8 -0
- package/cli/dist/commands/regression.js +340 -0
- package/cli/dist/commands/repair.d.ts +26 -0
- package/cli/dist/commands/repair.js +307 -0
- package/cli/dist/commands/report.d.ts +62 -0
- package/cli/dist/commands/report.js +378 -0
- package/cli/dist/commands/retry.d.ts +43 -0
- package/cli/dist/commands/retry.js +275 -0
- package/cli/dist/commands/run.d.ts +41 -0
- package/cli/dist/commands/run.js +171 -0
- package/cli/dist/commands/scan.d.ts +5 -0
- package/cli/dist/commands/scan.js +155 -0
- package/cli/dist/commands/secrets.d.ts +58 -0
- package/cli/dist/commands/secrets.js +289 -0
- package/cli/dist/commands/serve.d.ts +13 -0
- package/cli/dist/commands/serve.js +156 -0
- package/cli/dist/commands/slo.d.ts +8 -0
- package/cli/dist/commands/slo.js +327 -0
- package/cli/dist/commands/verify.d.ts +32 -0
- package/cli/dist/commands/verify.js +278 -0
- package/cli/dist/core/adapters/gitleaks-secrets.d.ts +114 -0
- package/cli/dist/core/adapters/gitleaks-secrets.js +410 -0
- package/cli/dist/core/adapters/jest-adapter.d.ts +44 -0
- package/cli/dist/core/adapters/jest-adapter.js +261 -0
- package/cli/dist/core/adapters/k6-perf.d.ts +85 -0
- package/cli/dist/core/adapters/k6-perf.js +398 -0
- package/cli/dist/core/adapters/osv-deps.d.ts +123 -0
- package/cli/dist/core/adapters/osv-deps.js +372 -0
- package/cli/dist/core/adapters/playwright-native-adapter.d.ts +121 -0
- package/cli/dist/core/adapters/playwright-native-adapter.js +339 -0
- package/cli/dist/core/adapters/playwright-native-api.d.ts +183 -0
- package/cli/dist/core/adapters/playwright-native-api.js +465 -0
- package/cli/dist/core/adapters/playwright-ui.d.ts +197 -0
- package/cli/dist/core/adapters/playwright-ui.js +864 -0
- package/cli/dist/core/adapters/pytest-adapter.d.ts +49 -0
- package/cli/dist/core/adapters/pytest-adapter.js +324 -0
- package/cli/dist/core/adapters/semgrep-sast.d.ts +99 -0
- package/cli/dist/core/adapters/semgrep-sast.js +322 -0
- package/cli/dist/core/adapters/unit-test-types.d.ts +119 -0
- package/cli/dist/core/adapters/unit-test-types.js +6 -0
- package/cli/dist/core/adapters/vitest-adapter.d.ts +46 -0
- package/cli/dist/core/adapters/vitest-adapter.js +272 -0
- package/cli/dist/core/adapters/zap-dast.d.ts +133 -0
- package/cli/dist/core/adapters/zap-dast.js +424 -0
- package/cli/dist/core/ai/anthropic-provider.d.ts +50 -0
- package/cli/dist/core/ai/anthropic-provider.js +223 -0
- package/cli/dist/core/ai/deepseek-provider.d.ts +81 -0
- package/cli/dist/core/ai/deepseek-provider.js +266 -0
- package/cli/dist/core/ai/index.d.ts +60 -0
- package/cli/dist/core/ai/index.js +18 -0
- package/cli/dist/core/ai/llm-client.d.ts +45 -0
- package/cli/dist/core/ai/llm-client.js +7 -0
- package/cli/dist/core/ai/mock-provider.d.ts +49 -0
- package/cli/dist/core/ai/mock-provider.js +121 -0
- package/cli/dist/core/ai/ollama-provider.d.ts +78 -0
- package/cli/dist/core/ai/ollama-provider.js +216 -0
- package/cli/dist/core/ai/openai-provider.d.ts +48 -0
- package/cli/dist/core/ai/openai-provider.js +200 -0
- package/cli/dist/core/ai/provider-factory.d.ts +160 -0
- package/cli/dist/core/ai/provider-factory.js +269 -0
- package/cli/dist/core/artifacts/index.d.ts +6 -0
- package/cli/dist/core/artifacts/index.js +6 -0
- package/cli/dist/core/artifacts/ui-artifacts.d.ts +133 -0
- package/cli/dist/core/artifacts/ui-artifacts.js +304 -0
- package/cli/dist/core/assertions/engine.d.ts +51 -0
- package/cli/dist/core/assertions/engine.js +530 -0
- package/cli/dist/core/assertions/index.d.ts +11 -0
- package/cli/dist/core/assertions/index.js +11 -0
- package/cli/dist/core/assertions/types.d.ts +121 -0
- package/cli/dist/core/assertions/types.js +37 -0
- package/cli/dist/core/auth/api-key-provider.d.ts +16 -0
- package/cli/dist/core/auth/api-key-provider.js +63 -0
- package/cli/dist/core/auth/aws-iam-provider.d.ts +35 -0
- package/cli/dist/core/auth/aws-iam-provider.js +177 -0
- package/cli/dist/core/auth/azure-ad-provider.d.ts +15 -0
- package/cli/dist/core/auth/azure-ad-provider.js +99 -0
- package/cli/dist/core/auth/basic-auth-provider.d.ts +26 -0
- package/cli/dist/core/auth/basic-auth-provider.js +111 -0
- package/cli/dist/core/auth/gcp-adc-provider.d.ts +27 -0
- package/cli/dist/core/auth/gcp-adc-provider.js +126 -0
- package/cli/dist/core/auth/index.d.ts +238 -0
- package/cli/dist/core/auth/index.js +82 -0
- package/cli/dist/core/auth/jwt-provider.d.ts +19 -0
- package/cli/dist/core/auth/jwt-provider.js +160 -0
- package/cli/dist/core/auth/manager.d.ts +84 -0
- package/cli/dist/core/auth/manager.js +230 -0
- package/cli/dist/core/auth/oauth2-provider.d.ts +17 -0
- package/cli/dist/core/auth/oauth2-provider.js +114 -0
- package/cli/dist/core/auth/totp-provider.d.ts +31 -0
- package/cli/dist/core/auth/totp-provider.js +134 -0
- package/cli/dist/core/auth/ui-login-provider.d.ts +26 -0
- package/cli/dist/core/auth/ui-login-provider.js +198 -0
- package/cli/dist/core/cache/index.d.ts +7 -0
- package/cli/dist/core/cache/index.js +6 -0
- package/cli/dist/core/cache/lru-cache.d.ts +203 -0
- package/cli/dist/core/cache/lru-cache.js +397 -0
- package/cli/dist/core/core/coverage/analyzer.d.ts +101 -0
- package/cli/dist/core/core/coverage/analyzer.js +415 -0
- package/cli/dist/core/core/coverage/collector.d.ts +74 -0
- package/cli/dist/core/core/coverage/collector.js +459 -0
- package/cli/dist/core/core/coverage/config.d.ts +37 -0
- package/cli/dist/core/core/coverage/config.js +156 -0
- package/cli/dist/core/core/coverage/index.d.ts +11 -0
- package/cli/dist/core/core/coverage/index.js +15 -0
- package/cli/dist/core/core/coverage/types.d.ts +267 -0
- package/cli/dist/core/core/coverage/types.js +6 -0
- package/cli/dist/core/core/coverage/vault.d.ts +95 -0
- package/cli/dist/core/core/coverage/vault.js +405 -0
- package/cli/dist/core/coverage/analyzer.d.ts +101 -0
- package/cli/dist/core/coverage/analyzer.js +415 -0
- package/cli/dist/core/coverage/collector.d.ts +74 -0
- package/cli/dist/core/coverage/collector.js +459 -0
- package/cli/dist/core/coverage/config.d.ts +37 -0
- package/cli/dist/core/coverage/config.js +156 -0
- package/cli/dist/core/coverage/index.d.ts +11 -0
- package/cli/dist/core/coverage/index.js +15 -0
- package/cli/dist/core/coverage/types.d.ts +267 -0
- package/cli/dist/core/coverage/types.js +6 -0
- package/cli/dist/core/coverage/vault.d.ts +95 -0
- package/cli/dist/core/coverage/vault.js +405 -0
- package/cli/dist/core/crawler/index.d.ts +57 -0
- package/cli/dist/core/crawler/index.js +281 -0
- package/cli/dist/core/crawler/journey-generator.d.ts +49 -0
- package/cli/dist/core/crawler/journey-generator.js +412 -0
- package/cli/dist/core/crawler/page-analyzer.d.ts +88 -0
- package/cli/dist/core/crawler/page-analyzer.js +709 -0
- package/cli/dist/core/crawler/selector-generator.d.ts +34 -0
- package/cli/dist/core/crawler/selector-generator.js +240 -0
- package/cli/dist/core/crawler/types.d.ts +353 -0
- package/cli/dist/core/crawler/types.js +6 -0
- package/cli/dist/core/dashboard/assets.d.ts +6 -0
- package/cli/dist/core/dashboard/assets.js +690 -0
- package/cli/dist/core/dashboard/index.d.ts +6 -0
- package/cli/dist/core/dashboard/index.js +5 -0
- package/cli/dist/core/dashboard/server.d.ts +72 -0
- package/cli/dist/core/dashboard/server.js +354 -0
- package/cli/dist/core/dashboard/types.d.ts +70 -0
- package/cli/dist/core/dashboard/types.js +5 -0
- package/cli/dist/core/discoverer/index.d.ts +115 -0
- package/cli/dist/core/discoverer/index.js +250 -0
- package/cli/dist/core/fixtures/index.d.ts +8 -0
- package/cli/dist/core/fixtures/index.js +8 -0
- package/cli/dist/core/fixtures/loader.d.ts +65 -0
- package/cli/dist/core/fixtures/loader.js +161 -0
- package/cli/dist/core/fixtures/resolver.d.ts +79 -0
- package/cli/dist/core/fixtures/resolver.js +181 -0
- package/cli/dist/core/fixtures/types.d.ts +75 -0
- package/cli/dist/core/fixtures/types.js +30 -0
- package/cli/dist/core/flakiness/index.d.ts +228 -0
- package/cli/dist/core/flakiness/index.js +384 -0
- package/cli/dist/core/generation/code-formatter.d.ts +111 -0
- package/cli/dist/core/generation/code-formatter.js +307 -0
- package/cli/dist/core/generation/code-generator.d.ts +144 -0
- package/cli/dist/core/generation/code-generator.js +293 -0
- package/cli/dist/core/generation/crawler-pack-generator.d.ts +44 -0
- package/cli/dist/core/generation/crawler-pack-generator.js +231 -0
- package/cli/dist/core/generation/generator.d.ts +40 -0
- package/cli/dist/core/generation/generator.js +76 -0
- package/cli/dist/core/generation/index.d.ts +32 -0
- package/cli/dist/core/generation/index.js +30 -0
- package/cli/dist/core/generation/pack-generator.d.ts +107 -0
- package/cli/dist/core/generation/pack-generator.js +416 -0
- package/cli/dist/core/generation/prompt-builder.d.ts +132 -0
- package/cli/dist/core/generation/prompt-builder.js +672 -0
- package/cli/dist/core/generation/source-analyzer.d.ts +213 -0
- package/cli/dist/core/generation/source-analyzer.js +657 -0
- package/cli/dist/core/generation/test-optimizer.d.ts +117 -0
- package/cli/dist/core/generation/test-optimizer.js +328 -0
- package/cli/dist/core/generation/types.d.ts +214 -0
- package/cli/dist/core/generation/types.js +4 -0
- package/cli/dist/core/hooks/compose.d.ts +61 -0
- package/cli/dist/core/hooks/compose.js +225 -0
- package/cli/dist/core/hooks/runner.d.ts +68 -0
- package/cli/dist/core/hooks/runner.js +303 -0
- package/cli/dist/core/index.d.ts +110 -0
- package/cli/dist/core/index.js +99 -0
- package/cli/dist/core/pack/migrator.d.ts +51 -0
- package/cli/dist/core/pack/migrator.js +304 -0
- package/cli/dist/core/pack/validator.d.ts +42 -0
- package/cli/dist/core/pack/validator.js +322 -0
- package/cli/dist/core/pack-v2/index.d.ts +9 -0
- package/cli/dist/core/pack-v2/index.js +8 -0
- package/cli/dist/core/pack-v2/loader.d.ts +63 -0
- package/cli/dist/core/pack-v2/loader.js +292 -0
- package/cli/dist/core/pack-v2/migrator.d.ts +61 -0
- package/cli/dist/core/pack-v2/migrator.js +480 -0
- package/cli/dist/core/pack-v2/validator.d.ts +65 -0
- package/cli/dist/core/pack-v2/validator.js +628 -0
- package/cli/dist/core/parallel/index.d.ts +6 -0
- package/cli/dist/core/parallel/index.js +6 -0
- package/cli/dist/core/parallel/parallel-runner.d.ts +107 -0
- package/cli/dist/core/parallel/parallel-runner.js +192 -0
- package/cli/dist/core/pom/base-page.d.ts +237 -0
- package/cli/dist/core/pom/base-page.js +354 -0
- package/cli/dist/core/pom/index.d.ts +22 -0
- package/cli/dist/core/pom/index.js +23 -0
- package/cli/dist/core/pom/loader.d.ts +118 -0
- package/cli/dist/core/pom/loader.js +382 -0
- package/cli/dist/core/pom/types.d.ts +112 -0
- package/cli/dist/core/pom/types.js +9 -0
- package/cli/dist/core/proof/bundle.d.ts +137 -0
- package/cli/dist/core/proof/bundle.js +160 -0
- package/cli/dist/core/proof/canonicalize.d.ts +47 -0
- package/cli/dist/core/proof/canonicalize.js +105 -0
- package/cli/dist/core/proof/index.d.ts +13 -0
- package/cli/dist/core/proof/index.js +18 -0
- package/cli/dist/core/proof/schema.d.ts +217 -0
- package/cli/dist/core/proof/schema.js +263 -0
- package/cli/dist/core/proof/signer.d.ts +111 -0
- package/cli/dist/core/proof/signer.js +226 -0
- package/cli/dist/core/proof/verifier.d.ts +97 -0
- package/cli/dist/core/proof/verifier.js +308 -0
- package/cli/dist/core/regression/detector.d.ts +107 -0
- package/cli/dist/core/regression/detector.js +497 -0
- package/cli/dist/core/regression/index.d.ts +9 -0
- package/cli/dist/core/regression/index.js +11 -0
- package/cli/dist/core/regression/trend-analyzer.d.ts +102 -0
- package/cli/dist/core/regression/trend-analyzer.js +345 -0
- package/cli/dist/core/regression/types.d.ts +222 -0
- package/cli/dist/core/regression/types.js +7 -0
- package/cli/dist/core/regression/vault.d.ts +87 -0
- package/cli/dist/core/regression/vault.js +289 -0
- package/cli/dist/core/repair/engine/fixer.d.ts +24 -0
- package/cli/dist/core/repair/engine/fixer.js +226 -0
- package/cli/dist/core/repair/engine/suggestion-engine.d.ts +18 -0
- package/cli/dist/core/repair/engine/suggestion-engine.js +187 -0
- package/cli/dist/core/repair/index.d.ts +10 -0
- package/cli/dist/core/repair/index.js +13 -0
- package/cli/dist/core/repair/repairer.d.ts +90 -0
- package/cli/dist/core/repair/repairer.js +284 -0
- package/cli/dist/core/repair/types.d.ts +91 -0
- package/cli/dist/core/repair/types.js +6 -0
- package/cli/dist/core/repair/utils/error-analyzer.d.ts +28 -0
- package/cli/dist/core/repair/utils/error-analyzer.js +264 -0
- package/cli/dist/core/reporting/html-reporter.d.ts +119 -0
- package/cli/dist/core/reporting/html-reporter.js +737 -0
- package/cli/dist/core/reporting/index.d.ts +6 -0
- package/cli/dist/core/reporting/index.js +6 -0
- package/cli/dist/core/retry/flakiness-integration.d.ts +60 -0
- package/cli/dist/core/retry/flakiness-integration.js +228 -0
- package/cli/dist/core/retry/index.d.ts +14 -0
- package/cli/dist/core/retry/index.js +16 -0
- package/cli/dist/core/retry/retry-engine.d.ts +80 -0
- package/cli/dist/core/retry/retry-engine.js +296 -0
- package/cli/dist/core/retry/types.d.ts +178 -0
- package/cli/dist/core/retry/types.js +52 -0
- package/cli/dist/core/retry/vault.d.ts +77 -0
- package/cli/dist/core/retry/vault.js +304 -0
- package/cli/dist/core/runner/e2e-helpers.d.ts +102 -0
- package/cli/dist/core/runner/e2e-helpers.js +153 -0
- package/cli/dist/core/runner/phase3-runner.d.ts +249 -0
- package/cli/dist/core/runner/phase3-runner.js +1312 -0
- package/cli/dist/core/schemas/pack.schema.json +236 -0
- package/cli/dist/core/secrets/crypto.d.ts +75 -0
- package/cli/dist/core/secrets/crypto.js +223 -0
- package/cli/dist/core/secrets/manager.d.ts +76 -0
- package/cli/dist/core/secrets/manager.js +219 -0
- package/cli/dist/core/security/redaction-patterns-extended.d.ts +27 -0
- package/cli/dist/core/security/redaction-patterns-extended.js +247 -0
- package/cli/dist/core/security/redactor.d.ts +71 -0
- package/cli/dist/core/security/redactor.js +279 -0
- package/cli/dist/core/self-healing/assertion-healer.d.ts +97 -0
- package/cli/dist/core/self-healing/assertion-healer.js +371 -0
- package/cli/dist/core/self-healing/engine.d.ts +122 -0
- package/cli/dist/core/self-healing/engine.js +538 -0
- package/cli/dist/core/self-healing/index.d.ts +10 -0
- package/cli/dist/core/self-healing/index.js +11 -0
- package/cli/dist/core/self-healing/selector-healer.d.ts +103 -0
- package/cli/dist/core/self-healing/selector-healer.js +372 -0
- package/cli/dist/core/self-healing/types.d.ts +152 -0
- package/cli/dist/core/self-healing/types.js +6 -0
- package/cli/dist/core/serve/diagnostics-collector.d.ts +32 -0
- package/cli/dist/core/serve/diagnostics-collector.js +149 -0
- package/cli/dist/core/serve/health-checker.d.ts +44 -0
- package/cli/dist/core/serve/health-checker.js +219 -0
- package/cli/dist/core/serve/index.d.ts +8 -0
- package/cli/dist/core/serve/index.js +8 -0
- package/cli/dist/core/serve/metrics-collector.d.ts +24 -0
- package/cli/dist/core/serve/metrics-collector.js +322 -0
- package/cli/dist/core/serve/process-manager.d.ts +36 -0
- package/cli/dist/core/serve/process-manager.js +213 -0
- package/cli/dist/core/serve/server.d.ts +36 -0
- package/cli/dist/core/serve/server.js +191 -0
- package/cli/dist/core/slo/config.d.ts +107 -0
- package/cli/dist/core/slo/config.js +360 -0
- package/cli/dist/core/slo/index.d.ts +11 -0
- package/cli/dist/core/slo/index.js +15 -0
- package/cli/dist/core/slo/sli-calculator.d.ts +92 -0
- package/cli/dist/core/slo/sli-calculator.js +364 -0
- package/cli/dist/core/slo/slo-tracker.d.ts +148 -0
- package/cli/dist/core/slo/slo-tracker.js +379 -0
- package/cli/dist/core/slo/types.d.ts +281 -0
- package/cli/dist/core/slo/types.js +7 -0
- package/cli/dist/core/slo/vault.d.ts +102 -0
- package/cli/dist/core/slo/vault.js +427 -0
- package/cli/dist/core/tui/index.d.ts +7 -0
- package/cli/dist/core/tui/index.js +6 -0
- package/cli/dist/core/tui/monitor.d.ts +92 -0
- package/cli/dist/core/tui/monitor.js +271 -0
- package/cli/dist/core/tui/renderer.d.ts +33 -0
- package/cli/dist/core/tui/renderer.js +218 -0
- package/cli/dist/core/tui/types.d.ts +63 -0
- package/cli/dist/core/tui/types.js +5 -0
- package/cli/dist/core/types/pack-v1.d.ts +251 -0
- package/cli/dist/core/types/pack-v1.js +5 -0
- package/cli/dist/core/types/pack-v2.d.ts +456 -0
- package/cli/dist/core/types/pack-v2.js +8 -0
- package/cli/dist/core/types/trust-score.d.ts +69 -0
- package/cli/dist/core/types/trust-score.js +191 -0
- package/cli/dist/core/vault/cas.d.ts +90 -0
- package/cli/dist/core/vault/cas.js +261 -0
- package/cli/dist/core/vault/index.d.ts +326 -0
- package/cli/dist/core/vault/index.js +1042 -0
- package/cli/dist/core/visual/index.d.ts +6 -0
- package/cli/dist/core/visual/index.js +6 -0
- package/cli/dist/core/visual/visual-regression.d.ts +113 -0
- package/cli/dist/core/visual/visual-regression.js +236 -0
- package/cli/dist/core/watch/index.d.ts +7 -0
- package/cli/dist/core/watch/index.js +6 -0
- package/cli/dist/core/watch/watch-mode.d.ts +213 -0
- package/cli/dist/core/watch/watch-mode.js +389 -0
- package/cli/dist/generators/index.d.ts +5 -0
- package/cli/dist/generators/index.js +5 -0
- package/cli/dist/generators/json-reporter.d.ts +10 -0
- package/cli/dist/generators/json-reporter.js +12 -0
- package/cli/dist/generators/test-generator.d.ts +18 -0
- package/cli/dist/generators/test-generator.js +78 -0
- package/cli/dist/index.d.ts +8 -0
- package/cli/dist/index.js +262 -0
- package/cli/dist/scanners/dom-scanner.d.ts +52 -0
- package/cli/dist/scanners/dom-scanner.js +296 -0
- package/cli/dist/scanners/index.d.ts +4 -0
- package/cli/dist/scanners/index.js +4 -0
- package/cli/dist/schemas/pack.schema.json +236 -0
- package/cli/dist/types/scan.d.ts +68 -0
- package/cli/dist/types/scan.js +4 -0
- package/cli/dist/utils/config.d.ts +35 -0
- package/cli/dist/utils/config.js +196 -0
- package/cli/package.json +1 -1
- package/package.json +25 -2
- package/.BETA_TESTING_FEEDBACK.md +0 -256
- package/.claude/settings.local.json +0 -154
- package/.editorconfig +0 -21
- package/.github/CODEOWNERS +0 -23
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -108
- package/.github/ISSUE_TEMPLATE/feedback_dx.yml +0 -121
- package/.github/dependabot.yml +0 -35
- package/.github/workflows/mcp-dx.yml +0 -106
- package/.github/workflows/release.yml +0 -26
- package/.github/workflows/test.yml +0 -93
- package/.nvmrc +0 -1
- package/.qa360/vault.db +0 -0
- package/.qa360/vault.db-shm +0 -0
- package/.qa360/vault.db-wal +0 -0
- package/.qa360-artifacts/.gitkeep +0 -0
- package/.qa360-artifacts/baselines/.gitkeep +0 -0
- package/.qa360-artifacts/cache/.gitkeep +0 -0
- package/.qa360-artifacts/reports/.gitkeep +0 -0
- package/.qa360-artifacts/screenshots/.gitkeep +0 -0
- package/.qa360-baselines/www_xyqo_ai.baseline.json +0 -33
- package/CODEOWNERS +0 -43
- package/NOVICE_USER_GUIDE.md +0 -272
- package/adapters/README.md +0 -46
- package/check-branches.sh +0 -32
- package/cli/.qa360/keys/ed25519.key +0 -1
- package/cli/.qa360/keys/ed25519.pub +0 -1
- package/cli/examples/README.md +0 -160
- package/cli/examples/accessibility.yml +0 -48
- package/cli/examples/api-basic.yml +0 -27
- package/cli/examples/complete.yml +0 -146
- package/cli/examples/crawler.yml +0 -38
- package/cli/examples/fullstack.yml +0 -78
- package/cli/examples/security.yml +0 -58
- package/cli/examples/ui-advanced.yml +0 -49
- package/cli/examples/ui-basic.yml +0 -24
- package/cli/scripts/bundle-for-npm.sh +0 -51
- package/cli/scripts/validate-package.js +0 -116
- package/cli/src/__tests__/commands/doctor.test.ts +0 -108
- package/cli/src/__tests__/index.test.ts +0 -15
- package/cli/src/cli-minimal.ts +0 -44
- package/cli/src/commands/__tests__/crawl.test.ts +0 -412
- package/cli/src/commands/__tests__/doctor-qa360-home.test.ts +0 -156
- package/cli/src/commands/__tests__/e2e-ui-tests.test.ts +0 -494
- package/cli/src/commands/__tests__/e2e.test.ts +0 -187
- package/cli/src/commands/__tests__/flakiness.test.ts +0 -528
- package/cli/src/commands/__tests__/generate.test.ts +0 -507
- package/cli/src/commands/__tests__/history.integration.test.ts +0 -358
- package/cli/src/commands/__tests__/history.test.ts +0 -433
- package/cli/src/commands/__tests__/monitor-realworld.test.ts +0 -199
- package/cli/src/commands/__tests__/monitor.test.ts +0 -81
- package/cli/src/commands/__tests__/ollama.test.ts +0 -529
- package/cli/src/commands/__tests__/repair.test.ts +0 -225
- package/cli/src/commands/__tests__/report.integration.test.ts +0 -167
- package/cli/src/commands/__tests__/report.test.ts +0 -294
- package/cli/src/commands/__tests__/report.vitest.ts +0 -288
- package/cli/src/commands/__tests__/retry.test.ts +0 -78
- package/cli/src/commands/__tests__/run.integration.test.ts +0 -240
- package/cli/src/commands/__tests__/run.test.ts +0 -346
- package/cli/src/commands/__tests__/run.vitest.ts +0 -301
- package/cli/src/commands/__tests__/secrets.test.ts +0 -114
- package/cli/src/commands/__tests__/serve.test.ts +0 -80
- package/cli/src/commands/__tests__/verify.test.ts +0 -103
- package/cli/src/commands/ai.ts +0 -702
- package/cli/src/commands/ask.ts +0 -678
- package/cli/src/commands/coverage.ts +0 -305
- package/cli/src/commands/crawl.ts +0 -155
- package/cli/src/commands/doctor.ts +0 -610
- package/cli/src/commands/examples.ts +0 -248
- package/cli/src/commands/explain.ts +0 -710
- package/cli/src/commands/flakiness.ts +0 -560
- package/cli/src/commands/generate.ts +0 -566
- package/cli/src/commands/history.ts +0 -914
- package/cli/src/commands/init.ts +0 -777
- package/cli/src/commands/monitor.ts +0 -270
- package/cli/src/commands/ollama.ts +0 -337
- package/cli/src/commands/pack.ts +0 -497
- package/cli/src/commands/regression.ts +0 -400
- package/cli/src/commands/repair.ts +0 -356
- package/cli/src/commands/report.ts +0 -463
- package/cli/src/commands/retry.ts +0 -380
- package/cli/src/commands/run.ts +0 -220
- package/cli/src/commands/scan.ts +0 -177
- package/cli/src/commands/secrets.ts +0 -340
- package/cli/src/commands/serve.ts +0 -194
- package/cli/src/commands/slo.ts +0 -387
- package/cli/src/commands/verify-temp-note.md +0 -11
- package/cli/src/commands/verify.ts +0 -322
- package/cli/src/generators/index.ts +0 -6
- package/cli/src/generators/json-reporter.ts +0 -15
- package/cli/src/generators/test-generator.ts +0 -90
- package/cli/src/index.ts +0 -289
- package/cli/src/scanners/dom-scanner.ts +0 -360
- package/cli/src/scanners/index.ts +0 -5
- package/cli/src/types/scan.ts +0 -84
- package/cli/src/utils/config.ts +0 -145
- package/cli/tsconfig.bundle.json +0 -12
- package/cli/tsconfig.json +0 -23
- package/cli/vitest.config.ts +0 -59
- package/core/src/__tests__/adapters-contract/adapters-contract.test.md +0 -156
- package/core/src/__tests__/index.test.ts +0 -31
- package/core/src/__tests__/integration/phase3.test.ts +0 -405
- package/core/src/__tests__/pack/validator.test.ts +0 -312
- package/core/src/__tests__/secrets/crypto.test.ts +0 -190
- package/core/src/__tests__/secrets/manager.test.ts +0 -316
- package/core/src/__tests__/security/redactor-phase3.test.ts +0 -233
- package/core/src/__tests__/serve/health-checker.test.ts +0 -155
- package/core/src/__tests__/serve/process-manager.test.ts +0 -213
- package/core/src/__tests__/serve/server.test.ts +0 -103
- package/core/src/__tests__/vault/cas.test.ts +0 -178
- package/core/src/__tests__/vault/vault.test.ts +0 -296
- package/core/src/adapters/__tests__/fixtures/jest-coverage.json +0 -8
- package/core/src/adapters/__tests__/fixtures/jest-results.json +0 -41
- package/core/src/adapters/__tests__/fixtures/pytest-junit.xml +0 -16
- package/core/src/adapters/__tests__/fixtures/vitest-coverage.json +0 -8
- package/core/src/adapters/__tests__/fixtures/vitest-results.json +0 -50
- package/core/src/adapters/__tests__/gitleaks-secrets.test.ts +0 -452
- package/core/src/adapters/__tests__/jest-adapter.test.ts +0 -276
- package/core/src/adapters/__tests__/k6-perf.test.ts +0 -538
- package/core/src/adapters/__tests__/osv-deps.test.ts +0 -471
- package/core/src/adapters/__tests__/playwright-native-api.test.ts +0 -792
- package/core/src/adapters/__tests__/playwright-ui-e2e.test.ts +0 -431
- package/core/src/adapters/__tests__/playwright-ui.test.ts +0 -1073
- package/core/src/adapters/__tests__/pytest-adapter.test.ts +0 -207
- package/core/src/adapters/__tests__/semgrep-sast.test.ts +0 -436
- package/core/src/adapters/__tests__/vitest-adapter.test.ts +0 -208
- package/core/src/adapters/__tests__/zap-dast.test.ts +0 -453
- package/core/src/adapters/gitleaks-secrets.ts +0 -521
- package/core/src/adapters/jest-adapter.ts +0 -306
- package/core/src/adapters/k6-perf.ts +0 -479
- package/core/src/adapters/osv-deps.ts +0 -467
- package/core/src/adapters/playwright-native-adapter.ts +0 -472
- package/core/src/adapters/playwright-native-api.ts +0 -619
- package/core/src/adapters/playwright-ui.ts +0 -1088
- package/core/src/adapters/pytest-adapter.ts +0 -472
- package/core/src/adapters/semgrep-sast.ts +0 -410
- package/core/src/adapters/unit-test-types.ts +0 -106
- package/core/src/adapters/vitest-adapter.ts +0 -295
- package/core/src/adapters/zap-dast.ts +0 -551
- package/core/src/ai/__tests__/deepseek-provider.test.ts +0 -586
- package/core/src/ai/__tests__/ollama-provider.test.ts +0 -641
- package/core/src/ai/anthropic-provider.ts +0 -262
- package/core/src/ai/deepseek-provider.ts +0 -315
- package/core/src/ai/index.ts +0 -87
- package/core/src/ai/llm-client.ts +0 -52
- package/core/src/ai/mock-provider.ts +0 -146
- package/core/src/ai/ollama-provider.ts +0 -269
- package/core/src/ai/openai-provider.ts +0 -240
- package/core/src/ai/provider-factory.ts +0 -408
- package/core/src/artifacts/README.md +0 -78
- package/core/src/artifacts/index.ts +0 -16
- package/core/src/artifacts/ui-artifacts.ts +0 -412
- package/core/src/assertions/__tests__/engine.test.ts +0 -360
- package/core/src/assertions/engine.ts +0 -577
- package/core/src/assertions/index.ts +0 -13
- package/core/src/assertions/types.ts +0 -229
- package/core/src/auth/__tests__/api-key-provider.test.ts +0 -282
- package/core/src/auth/__tests__/auth-manager.test.ts +0 -430
- package/core/src/auth/__tests__/basic-auth-provider.test.ts +0 -364
- package/core/src/auth/__tests__/cloud-providers.test.ts +0 -751
- package/core/src/auth/__tests__/jwt-provider.test.ts +0 -400
- package/core/src/auth/__tests__/oauth2-provider.test.ts +0 -383
- package/core/src/auth/__tests__/totp-provider.test.ts +0 -294
- package/core/src/auth/__tests__/ui-login-provider.test.ts +0 -323
- package/core/src/auth/api-key-provider.ts +0 -75
- package/core/src/auth/aws-iam-provider.ts +0 -212
- package/core/src/auth/azure-ad-provider.ts +0 -126
- package/core/src/auth/basic-auth-provider.ts +0 -133
- package/core/src/auth/gcp-adc-provider.ts +0 -146
- package/core/src/auth/index.ts +0 -342
- package/core/src/auth/jwt-provider.ts +0 -193
- package/core/src/auth/manager.ts +0 -281
- package/core/src/auth/oauth2-provider.ts +0 -141
- package/core/src/auth/totp-provider.ts +0 -163
- package/core/src/auth/ui-login-provider.ts +0 -242
- package/core/src/cache/__tests__/lru-cache.test.ts +0 -564
- package/core/src/cache/index.ts +0 -13
- package/core/src/cache/lru-cache.ts +0 -536
- package/core/src/crawler/__tests__/journey-generator.test.ts +0 -344
- package/core/src/crawler/__tests__/selector-generator.test.ts +0 -211
- package/core/src/crawler/index.ts +0 -335
- package/core/src/crawler/journey-generator.ts +0 -471
- package/core/src/crawler/page-analyzer.ts +0 -857
- package/core/src/crawler/selector-generator.ts +0 -280
- package/core/src/crawler/types.ts +0 -475
- package/core/src/dashboard/__tests__/real-world.test.ts +0 -430
- package/core/src/dashboard/__tests__/server.test.ts +0 -283
- package/core/src/dashboard/__tests__/types.test.ts +0 -208
- package/core/src/dashboard/assets.ts +0 -692
- package/core/src/dashboard/index.ts +0 -17
- package/core/src/dashboard/server.ts +0 -401
- package/core/src/dashboard/types.ts +0 -78
- package/core/src/discoverer/__tests__/test-discoverer.test.ts +0 -444
- package/core/src/discoverer/index.ts +0 -374
- package/core/src/fixtures/__tests__/loader.test.ts +0 -246
- package/core/src/fixtures/__tests__/resolver.test.ts +0 -334
- package/core/src/fixtures/index.ts +0 -9
- package/core/src/fixtures/loader.ts +0 -200
- package/core/src/fixtures/resolver.ts +0 -221
- package/core/src/fixtures/types.ts +0 -86
- package/core/src/flakiness/__tests__/flakiness.test.ts +0 -554
- package/core/src/flakiness/index.ts +0 -536
- package/core/src/generation/__tests__/code-formatter.test.ts +0 -170
- package/core/src/generation/__tests__/code-generator-contract.test.ts +0 -207
- package/core/src/generation/__tests__/code-generator.test.ts +0 -586
- package/core/src/generation/__tests__/crawler-pack-generator.test.ts +0 -479
- package/core/src/generation/__tests__/generation-e2e-b2bshop.test.ts +0 -718
- package/core/src/generation/__tests__/generation-integration.test.ts +0 -655
- package/core/src/generation/__tests__/pack-generator.test.ts +0 -408
- package/core/src/generation/__tests__/prompt-builder.test.ts +0 -200
- package/core/src/generation/__tests__/real-provider-integration.test.ts +0 -414
- package/core/src/generation/__tests__/source-analyzer.test.ts +0 -774
- package/core/src/generation/__tests__/test-optimizer.test.ts +0 -255
- package/core/src/generation/code-formatter.ts +0 -408
- package/core/src/generation/code-generator.ts +0 -470
- package/core/src/generation/crawler-pack-generator.ts +0 -289
- package/core/src/generation/generator.ts +0 -113
- package/core/src/generation/index.ts +0 -59
- package/core/src/generation/pack-generator.ts +0 -527
- package/core/src/generation/prompt-builder.ts +0 -772
- package/core/src/generation/source-analyzer.ts +0 -830
- package/core/src/generation/test-optimizer.ts +0 -474
- package/core/src/generation/types.ts +0 -217
- package/core/src/hooks/__tests__/compose.test.ts +0 -636
- package/core/src/hooks/__tests__/runner.test.ts +0 -478
- package/core/src/hooks/compose.ts +0 -268
- package/core/src/hooks/runner.ts +0 -364
- package/core/src/index.ts +0 -255
- package/core/src/pack/__tests__/migrator.test.ts +0 -594
- package/core/src/pack/__tests__/validator.test.ts +0 -759
- package/core/src/pack/migrator.ts +0 -353
- package/core/src/pack/validator.ts +0 -359
- package/core/src/pack-v2/__tests__/loader.test.ts +0 -533
- package/core/src/pack-v2/__tests__/migrator.test.ts +0 -455
- package/core/src/pack-v2/__tests__/validator.test.ts +0 -609
- package/core/src/pack-v2/index.ts +0 -41
- package/core/src/pack-v2/loader.ts +0 -358
- package/core/src/pack-v2/migrator.ts +0 -540
- package/core/src/pack-v2/validator.ts +0 -731
- package/core/src/parallel/README.md +0 -143
- package/core/src/parallel/index.ts +0 -16
- package/core/src/parallel/parallel-runner.ts +0 -282
- package/core/src/pom/__tests__/loader.test.ts +0 -378
- package/core/src/pom/base-page.ts +0 -425
- package/core/src/pom/index.ts +0 -45
- package/core/src/pom/loader.ts +0 -480
- package/core/src/pom/types.ts +0 -146
- package/core/src/proof/__tests__/proof-roundtrip.test.ts +0 -149
- package/core/src/proof/__tests__/schema-validation-manual.mjs +0 -211
- package/core/src/proof/__tests__/schema-validation.test.ts +0 -336
- package/core/src/proof/__tests__/signer.test.ts +0 -486
- package/core/src/proof/__tests__/temporal-regression.test.ts +0 -537
- package/core/src/proof/__tests__/verifier-advanced.test.ts +0 -588
- package/core/src/proof/__tests__/verifier.test.ts +0 -413
- package/core/src/proof/bundle.ts +0 -290
- package/core/src/proof/canonicalize.ts +0 -116
- package/core/src/proof/index.ts +0 -74
- package/core/src/proof/schema.ts +0 -285
- package/core/src/proof/signer.ts +0 -293
- package/core/src/proof/verifier.ts +0 -380
- package/core/src/regression/__tests__/detector.test.ts +0 -396
- package/core/src/regression/__tests__/trend-analyzer.test.ts +0 -300
- package/core/src/regression/detector.ts +0 -629
- package/core/src/regression/index.ts +0 -34
- package/core/src/regression/trend-analyzer.ts +0 -468
- package/core/src/regression/types.ts +0 -295
- package/core/src/regression/vault.ts +0 -419
- package/core/src/repair/__tests__/repairer.test.ts +0 -572
- package/core/src/repair/__tests__/types.test.ts +0 -302
- package/core/src/repair/engine/__tests__/fixer.test.ts +0 -482
- package/core/src/repair/engine/__tests__/suggestion-engine.test.ts +0 -395
- package/core/src/repair/engine/fixer.ts +0 -271
- package/core/src/repair/engine/suggestion-engine.ts +0 -234
- package/core/src/repair/index.ts +0 -53
- package/core/src/repair/repairer.ts +0 -376
- package/core/src/repair/types.ts +0 -119
- package/core/src/repair/utils/__tests__/error-analyzer.test.ts +0 -454
- package/core/src/repair/utils/error-analyzer.ts +0 -308
- package/core/src/reporting/README.md +0 -144
- package/core/src/reporting/html-reporter.ts +0 -835
- package/core/src/reporting/index.ts +0 -16
- package/core/src/retry/README.md +0 -192
- package/core/src/retry/__tests__/flakiness-integration.test.ts +0 -475
- package/core/src/retry/__tests__/retry-engine.test.ts +0 -424
- package/core/src/retry/flakiness-integration.ts +0 -267
- package/core/src/retry/index.ts +0 -48
- package/core/src/retry/retry-engine.ts +0 -368
- package/core/src/retry/types.ts +0 -208
- package/core/src/retry/vault.ts +0 -413
- package/core/src/runner/__tests__/flakiness-integration.test.ts +0 -566
- package/core/src/runner/__tests__/phase3-e2e-b2bshop.test.ts +0 -218
- package/core/src/runner/__tests__/phase3-e2e-reqres.test.ts +0 -199
- package/core/src/runner/__tests__/phase3-runner.test.ts +0 -1118
- package/core/src/runner/e2e-helpers.ts +0 -216
- package/core/src/runner/phase3-runner.ts +0 -1536
- package/core/src/schemas/gherkin-report.json +0 -122
- package/core/src/secrets/__tests__/crypto.test.ts +0 -180
- package/core/src/secrets/crypto.ts +0 -289
- package/core/src/secrets/manager.ts +0 -272
- package/core/src/security/__tests__/hardening.test.ts +0 -480
- package/core/src/security/redaction-patterns-extended.ts +0 -278
- package/core/src/security/redactor.ts +0 -326
- package/core/src/self-healing/assertion-healer.ts +0 -485
- package/core/src/self-healing/engine.ts +0 -626
- package/core/src/self-healing/index.ts +0 -33
- package/core/src/self-healing/selector-healer.ts +0 -488
- package/core/src/self-healing/types.ts +0 -193
- package/core/src/serve/diagnostics-collector.ts +0 -201
- package/core/src/serve/health-checker.ts +0 -274
- package/core/src/serve/index.ts +0 -9
- package/core/src/serve/metrics-collector.ts +0 -386
- package/core/src/serve/process-manager.ts +0 -265
- package/core/src/serve/server.ts +0 -230
- package/core/src/slo/config.ts +0 -408
- package/core/src/slo/index.ts +0 -68
- package/core/src/slo/sli-calculator.ts +0 -474
- package/core/src/slo/slo-tracker.ts +0 -481
- package/core/src/slo/types.ts +0 -408
- package/core/src/slo/vault.ts +0 -600
- package/core/src/tui/__tests__/monitor.test.ts +0 -336
- package/core/src/tui/__tests__/real-world.test.ts +0 -376
- package/core/src/tui/__tests__/renderer.test.ts +0 -201
- package/core/src/tui/__tests__/types.test.ts +0 -295
- package/core/src/tui/index.ts +0 -19
- package/core/src/tui/monitor.ts +0 -331
- package/core/src/tui/renderer.ts +0 -269
- package/core/src/tui/types.ts +0 -68
- package/core/src/types/pack-v1.ts +0 -305
- package/core/src/types/pack-v2.ts +0 -525
- package/core/src/types/trust-score.ts +0 -258
- package/core/src/vault/__tests__/flakiness-vault.test.ts +0 -562
- package/core/src/vault/__tests__/vault.test.ts +0 -259
- package/core/src/vault/cas.ts +0 -323
- package/core/src/vault/index.ts +0 -1361
- package/core/src/vault/schema.sql +0 -168
- package/core/src/visual/README.md +0 -185
- package/core/src/visual/index.ts +0 -14
- package/core/src/visual/visual-regression.ts +0 -347
- package/core/src/watch/__tests__/watch-mode.test.ts +0 -192
- package/core/src/watch/index.ts +0 -14
- package/core/src/watch/watch-mode.ts +0 -565
- package/core/tsconfig.json +0 -12
- package/core/vitest.config.ts +0 -52
- package/docs/ARCHITECTURE.md +0 -901
- package/docs/AUDIT-GLOBAL-DEC2025.md +0 -271
- package/docs/BETA_TESTING.md +0 -257
- package/docs/BETA_TESTING_PLAN.md +0 -727
- package/docs/CERTIFICATION-REPORT.md +0 -142
- package/docs/COMPLETE_AUDIT_REFACTORING.md +0 -965
- package/docs/DEVELOPMENT.md +0 -545
- package/docs/DEVELOPMENT_HISTORY.md +0 -345
- package/docs/LIMITATIONS.md +0 -176
- package/docs/MIGRATION.md +0 -303
- package/docs/OPTION_3_4_EXPLORATION.md +0 -1257
- package/docs/PHASE1_PERFORMANCE.md +0 -144
- package/docs/QA360_Cloud.postman_collection.json +0 -89
- package/docs/QA360_TESTING_PHILOSOPHY.md +0 -769
- package/docs/QA_TEST_PLAN.md +0 -727
- package/docs/README.md +0 -50
- package/docs/STATUS.md +0 -198
- package/docs/STRATEGIC_STUDY_GOOSE_INTEGRATION.md +0 -615
- package/docs/USER_GUIDE.md +0 -687
- package/docs/WORK-DONE-ADAPTER-TESTS.md +0 -136
- package/docs/adapters-security.md +0 -485
- package/docs/architecture-diagram.mmd +0 -168
- package/docs/archive/ARCH-01-DAY6-BUILD-FIXES.md +0 -396
- package/docs/archive/ARCH-01-DAY6-FINAL-STATUS.md +0 -324
- package/docs/archive/ARCH-01_MCP_MERGE_ANALYSIS.md +0 -644
- package/docs/archive/ARCH-01_NEXT_STEPS.md +0 -60
- package/docs/archive/BRANCH_PROTECTION.md +0 -183
- package/docs/archive/CI_LOCKDOWN_CHECKLIST.md +0 -222
- package/docs/archive/HANDOFF_TEST-01.md +0 -669
- package/docs/archive/LEGAL_READY_PLACEHOLDERS.md +0 -372
- package/docs/archive/NODE_UPGRADE_GUIDE.md +0 -188
- package/docs/archive/PHASE1_COMPLETION.md +0 -386
- package/docs/archive/PHASE2_COMPLETION.md +0 -404
- package/docs/archive/PHASE3_AND_4_FINAL.md +0 -360
- package/docs/archive/PHASE3_COMPLETE.md +0 -301
- package/docs/archive/PHASE3_STATUS.md +0 -255
- package/docs/archive/PRE-WEEK2-AUDIT.md +0 -364
- package/docs/archive/README.md +0 -16
- package/docs/archive/SCHEMA_AJV_2020_FIX.md +0 -245
- package/docs/archive/TEST-01_AUDIT_REPORT.md +0 -240
- package/docs/archive/TEST-01_COVERAGE_PLAN.md +0 -423
- package/docs/archive/obsolete-proposals/dom-element-discovery-mode.md +0 -250
- package/docs/archive/obsolete-proposals/qa360-comprehensive-test-plan.md +0 -1249
- package/docs/archive/obsolete-proposals/qa360-quick-start-guide.md +0 -298
- package/docs/archive/obsolete-proposals/technical-plan-dom-discovery.md +0 -870
- package/docs/budgets-advanced.md +0 -308
- package/docs/examples/history-export-gc.md +0 -285
- package/docs/examples/pack-v2-complete.yaml +0 -158
- package/docs/examples/pack-v2-quickstart.yaml +0 -24
- package/docs/examples/pack-v2-ui-login.yaml +0 -81
- package/docs/examples/qa360-report.json +0 -50
- package/docs/history.md +0 -565
- package/docs/hooks.md +0 -304
- package/docs/llm-providers.md +0 -512
- package/docs/mcp-server.md +0 -651
- package/docs/mcp-tools.md +0 -1131
- package/docs/pack-v1.md +0 -383
- package/docs/pack-v2.md +0 -558
- package/docs/page-objects.md +0 -366
- package/docs/proofs.md +0 -670
- package/docs/quickstart-5min.md +0 -257
- package/docs/readiness-ci.md +0 -654
- package/docs/rfc/README.md +0 -20
- package/docs/rfc/proof-bundle-v1.md +0 -787
- package/docs/secrets.md +0 -392
- package/docs/serve.md +0 -494
- package/docs/unit-test-adapters.md +0 -168
- package/docs/vault.md +0 -491
- package/e2e/qa360-e2e.test.ts +0 -696
- package/e2e/vitest.config.ts +0 -18
- package/examples/README.md +0 -50
- package/examples/ci/docker-compose-serve.yml +0 -375
- package/examples/ci/github-actions-serve.yml +0 -345
- package/examples/ci/gitlab-ci-serve.yml +0 -407
- package/examples/datasets/README.md +0 -101
- package/examples/datasets/b2bshop.ts +0 -155
- package/examples/datasets/index.ts +0 -57
- package/examples/datasets/reqres.ts +0 -195
- package/examples/fixtures-demo/fixtures/users.yml +0 -39
- package/examples/fixtures-demo/pack.yml +0 -71
- package/examples/future-api/README.md +0 -16
- package/examples/future-api/diag.js +0 -7
- package/examples/future-api/health.js +0 -4
- package/examples/future-api/packs.js +0 -13
- package/examples/future-api/runpack.js +0 -10
- package/examples/generation/README.md +0 -148
- package/examples/generation/pack-generator-example.js +0 -115
- package/examples/generation/source-analyzer-example.js +0 -115
- package/examples/httpbin/pack.yml +0 -59
- package/examples/load-testing/mcp-load.yml +0 -115
- package/examples/load-testing/mcp-stdio.yml +0 -95
- package/examples/mcp/claude-desktop-config.json +0 -33
- package/examples/mcp/claude-desktop.json +0 -16
- package/examples/mcp/conversation-sample.md +0 -131
- package/examples/mcp/demo-60s.md +0 -330
- package/examples/mcp/sample-conversation.jsonl +0 -21
- package/examples/mcp/vscode-settings.json +0 -22
- package/examples/pack-v2-complete.yml +0 -242
- package/examples/pack-v2-examples.md +0 -244
- package/examples/pack-v2-quickstart.yml +0 -55
- package/examples/packs-business/ecommerce-api.yml +0 -121
- package/examples/packs-business/saas-dashboard-ui.yml +0 -133
- package/examples/packs-conformance/compose-multi.yml +0 -174
- package/examples/packs-conformance/full.yml +0 -152
- package/examples/packs-conformance/heavy-artifacts.yml +0 -152
- package/examples/packs-conformance/minimal.yml +0 -71
- package/examples/packs-conformance/secrets-missing.yml +0 -97
- package/examples/packs-conformance/timeouts.yml +0 -77
- package/examples/pom-demo/README.md +0 -104
- package/examples/pom-demo/pack.yml +0 -60
- package/examples/pom-demo/pages/DashboardPage.page.ts +0 -73
- package/examples/pom-demo/pages/LoginPage.page.ts +0 -76
- package/examples/proofs/e2e-playwright-proof.json +0 -75
- package/examples/proofs/httpbin-proof.json +0 -69
- package/examples/proofs/multi-adapter-proof.json +0 -117
- package/examples/proofs/test-proof.json +0 -26
- package/examples/restful-api-dev/README.md +0 -102
- package/examples/restful-api-dev/restful-api-advanced.yml +0 -29
- package/examples/restful-api-dev/restful-api-basic.yml +0 -29
- package/examples/web-lite/.github/workflows/qa360-phase3.yml +0 -73
- package/examples/web-lite/api-mock/server.js +0 -258
- package/examples/web-lite/pack.yml +0 -71
- package/examples/web-lite/services.yml +0 -43
- package/examples/web-lite/web-content/healthz +0 -1
- package/examples/web-lite/web-content/index.html +0 -259
- package/packages/mcp/CHANGELOG.md +0 -109
- package/packages/mcp/IMPLEMENTATION_SUMMARY.md +0 -350
- package/packages/mcp/LICENSE +0 -21
- package/packages/mcp/QUICK_START.md +0 -291
- package/packages/mcp/README.md +0 -294
- package/packages/mcp/TELEMETRY.md +0 -220
- package/packages/mcp/package.json +0 -91
- package/packages/mcp/scripts/generate-sbom-fallback.cjs +0 -84
- package/packages/mcp/scripts/safe-postinstall.cjs +0 -32
- package/packages/mcp/src/__tests__/contract.test.ts +0 -902
- package/packages/mcp/src/cli/cli.ts +0 -137
- package/packages/mcp/src/cli/doctor.ts +0 -286
- package/packages/mcp/src/cli/fix.ts +0 -99
- package/packages/mcp/src/cli/init.ts +0 -233
- package/packages/mcp/src/cli/postinstall.ts +0 -14
- package/packages/mcp/src/cli/reset.ts +0 -44
- package/packages/mcp/src/cli/telemetry.ts +0 -166
- package/packages/mcp/src/cli/test-dx.ts +0 -94
- package/packages/mcp/src/cli/uninstall.ts +0 -80
- package/packages/mcp/src/cli/up.ts +0 -178
- package/packages/mcp/src/index.ts +0 -12
- package/packages/mcp/src/scripts/e2e-local.ts +0 -337
- package/packages/mcp/src/scripts/verify-settings.ts +0 -242
- package/packages/mcp/src/security/audit.ts +0 -244
- package/packages/mcp/src/security/manager.ts +0 -242
- package/packages/mcp/src/server/full-server.ts +0 -212
- package/packages/mcp/src/server/minimal-server.ts +0 -134
- package/packages/mcp/src/tools/history.ts +0 -388
- package/packages/mcp/src/tools/pack.ts +0 -449
- package/packages/mcp/src/tools/registry.ts +0 -638
- package/packages/mcp/src/tools/report.ts +0 -100
- package/packages/mcp/src/tools/run.ts +0 -268
- package/packages/mcp/src/tools/secrets.ts +0 -198
- package/packages/mcp/src/tools/serve.ts +0 -221
- package/packages/mcp/src/tools/triage.ts +0 -532
- package/packages/mcp/src/tools/types.ts +0 -26
- package/packages/mcp/src/tools/vault.ts +0 -164
- package/packages/mcp/src/tools/verify.ts +0 -166
- package/packages/mcp/src/types/index.ts +0 -311
- package/packages/mcp/src/types/mcp-stubs.ts +0 -83
- package/packages/mcp/tsconfig.json +0 -16
- package/playwright.config.ts +0 -20
- package/pnpm-workspace.yaml +0 -4
- package/run-test-and-push.sh +0 -20
- package/scripts/build-proof-cli.sh +0 -110
- package/scripts/ci/check-windows-paths.js +0 -92
- package/scripts/ci/invariants.sh +0 -124
- package/scripts/ci/make-final-bundle.js +0 -106
- package/scripts/ci/mcp-run-multipack.js +0 -305
- package/scripts/ci/run-pack-suite.sh +0 -103
- package/scripts/ci/run-phase7-final.sh +0 -190
- package/scripts/ci/slo-assert.js +0 -158
- package/scripts/ci/test-fault-tolerance.sh +0 -301
- package/scripts/install-mcp.sh +0 -66
- package/scripts/mcp-smoke.mjs +0 -27
- package/scripts/smoke.sh +0 -26
- package/scripts/stress-test.js +0 -288
- package/scripts/sync-version.mjs +0 -50
- package/scripts/validate-examples.mjs +0 -404
- package/scripts/validation/simple-pack-check.sh +0 -51
- package/scripts/validation/validate-universal-pack.mjs +0 -77
- package/scripts/verify-persistence.js +0 -127
- package/test-pack.yaml +0 -43
- package/test-results/.last-run.json +0 -4
- package/test-runner.mjs +0 -87
- package/tests/artifacts.spec.js +0 -147
- package/tests/contracts.spec.js +0 -239
- package/tests/e2e/assertions.test.mjs +0 -370
- package/tests/e2e/crawler.test.mjs +0 -451
- package/tests/e2e/playwright-plus-plus.test.mjs +0 -604
- package/tests/e2e/proof-bundle.test.mjs +0 -258
- package/tests/e2e/real-world/saucedemo.test.mjs +0 -714
- package/tests/e2e/real-world/the-internet-herokuapp.test.mjs +0 -760
- package/tests/e2e/ui-actions.test.mjs +0 -546
- package/tests/gherkin.e2e.spec.ts +0 -310
- package/tests/no-console-errors.spec.js +0 -136
- package/tests/pdf.spec.ts +0 -252
- package/tests/run-pack.spec.ts +0 -58
- package/tsconfig.base.json +0 -15
- package/tsconfig.build.json +0 -8
- package/tsconfig.json +0 -37
- package/tsconfig.test.json +0 -18
- package/typedoc.json +0 -37
- package/ui/README.md +0 -50
- package/verify-proof.mjs +0 -60
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA360 Explain Command
|
|
3
|
+
*
|
|
4
|
+
* Advanced error and failure explanations with:
|
|
5
|
+
* - Static error code database
|
|
6
|
+
* - AI-powered explanations
|
|
7
|
+
* - Vault-based historical context
|
|
8
|
+
* - Flakiness insights
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* qa360 explain QX001 # Static error code
|
|
12
|
+
* qa360 explain --ai "my test failed" # AI explanation
|
|
13
|
+
* qa360 explain --run run-xxx # Explain run results
|
|
14
|
+
* qa360 explain --gate api_smoke # Explain gate failure
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
import { existsSync } from 'fs';
|
|
20
|
+
import { createBest, createLLMProvider } from '../core/index.js';
|
|
21
|
+
import { EvidenceVault } from '../core/index.js';
|
|
22
|
+
/**
|
|
23
|
+
* Static error code database
|
|
24
|
+
*/
|
|
25
|
+
const ERROR_CODES = {
|
|
26
|
+
'QX001': {
|
|
27
|
+
title: 'Node.js Version Incompatible',
|
|
28
|
+
cause: 'QA360 Core requires Node.js 18.0.0 or higher. You are running an older version.',
|
|
29
|
+
solution: 'Update Node.js: https://nodejs.org/ or use nvm/fnm: `nvm install 20`',
|
|
30
|
+
category: 'prerequisite'
|
|
31
|
+
},
|
|
32
|
+
'QX002': {
|
|
33
|
+
title: 'QA360 Directory Structure Missing',
|
|
34
|
+
cause: 'Required .qa360 directories not found in the current project.',
|
|
35
|
+
solution: 'Run "qa360 doctor --fix" to create missing directories automatically',
|
|
36
|
+
category: 'setup'
|
|
37
|
+
},
|
|
38
|
+
'QX003': {
|
|
39
|
+
title: 'Playwright Not Available',
|
|
40
|
+
cause: 'Playwright is not installed or not in PATH. Required for API and UI tests.',
|
|
41
|
+
solution: 'Install: "npx playwright install" or use --docker flag for containerized execution',
|
|
42
|
+
category: 'prerequisite'
|
|
43
|
+
},
|
|
44
|
+
'QX004': {
|
|
45
|
+
title: 'Puppeteer Not Available',
|
|
46
|
+
cause: 'Puppeteer is not installed (required for PDF report generation).',
|
|
47
|
+
solution: 'Install: "npm install puppeteer" or use --format json to skip PDF generation',
|
|
48
|
+
category: 'prerequisite'
|
|
49
|
+
},
|
|
50
|
+
'QX005': {
|
|
51
|
+
title: 'Network Connectivity Issues',
|
|
52
|
+
cause: 'Cannot reach external services (API, website). Check proxy/firewall settings.',
|
|
53
|
+
solution: 'Check network, configure proxy (export HTTP_PROXY), or test with local endpoints',
|
|
54
|
+
category: 'network'
|
|
55
|
+
},
|
|
56
|
+
'QX006': {
|
|
57
|
+
title: 'Secrets Configuration Missing',
|
|
58
|
+
cause: 'No secrets.enc file configured. Required for encrypted credential storage.',
|
|
59
|
+
solution: 'Run "qa360 doctor --fix" to create default secrets file',
|
|
60
|
+
category: 'setup'
|
|
61
|
+
},
|
|
62
|
+
'QX007': {
|
|
63
|
+
title: 'Cryptographic Keys Missing',
|
|
64
|
+
cause: 'Ed25519 key pair not found for signing proofs. Required for proof generation.',
|
|
65
|
+
solution: 'Run "qa360 doctor --fix" to generate new key pair automatically',
|
|
66
|
+
category: 'setup'
|
|
67
|
+
},
|
|
68
|
+
'QP100': {
|
|
69
|
+
title: 'Pack Validation Failed',
|
|
70
|
+
cause: 'The pack.yml file does not conform to the required schema or has invalid values.',
|
|
71
|
+
solution: 'Check pack.yml syntax with "qa360 pack validate". Ensure required fields (version, name, gates) are present.',
|
|
72
|
+
category: 'pack'
|
|
73
|
+
},
|
|
74
|
+
'QP200': {
|
|
75
|
+
title: 'Pack Version Not Supported',
|
|
76
|
+
cause: 'The pack version specified is not supported by this version of QA360.',
|
|
77
|
+
solution: 'Update QA360: "npm install -g qa360@latest" or use pack v1 format',
|
|
78
|
+
category: 'pack'
|
|
79
|
+
},
|
|
80
|
+
'QG200': {
|
|
81
|
+
title: 'Gate Execution Failed',
|
|
82
|
+
cause: 'A quality gate failed during execution. Check gate-specific error messages.',
|
|
83
|
+
solution: 'Review gate logs in .qa360/runs/ directory. Run with verbose mode for details.',
|
|
84
|
+
category: 'execution'
|
|
85
|
+
},
|
|
86
|
+
'QG300': {
|
|
87
|
+
title: 'Adapter Not Found',
|
|
88
|
+
cause: 'The required adapter for a gate is not available or not installed.',
|
|
89
|
+
solution: 'Ensure dependencies are installed. Run "qa360 doctor" to check prerequisites.',
|
|
90
|
+
category: 'execution'
|
|
91
|
+
},
|
|
92
|
+
'QV100': {
|
|
93
|
+
title: 'Proof Verification Failed',
|
|
94
|
+
cause: 'The proof signature is invalid or the proof has been tampered with.',
|
|
95
|
+
solution: 'Ensure the proof file has not been modified. Check the public key matches the signer.',
|
|
96
|
+
category: 'verification'
|
|
97
|
+
},
|
|
98
|
+
'QV200': {
|
|
99
|
+
title: 'Vault Corruption Detected',
|
|
100
|
+
cause: 'The evidence vault database (.qa360/vault.db) is corrupted or invalid.',
|
|
101
|
+
solution: 'Run "qa360 doctor --fix" to repair the vault. Restore from backup if available.',
|
|
102
|
+
category: 'vault'
|
|
103
|
+
},
|
|
104
|
+
'QT000': {
|
|
105
|
+
title: 'Test Timeout',
|
|
106
|
+
cause: 'A test exceeded the maximum allowed execution time.',
|
|
107
|
+
solution: 'Increase timeout in pack.yml (execution.timeout) or optimize the test',
|
|
108
|
+
category: 'execution'
|
|
109
|
+
},
|
|
110
|
+
'QT001': {
|
|
111
|
+
title: 'Flaky Test Detected',
|
|
112
|
+
cause: 'A test is showing inconsistent results across runs (flakiness score < 75).',
|
|
113
|
+
solution: 'Review "qa360 flakiness history" for patterns. Consider quarantining: "qa360 flakiness quarantine <testId>"',
|
|
114
|
+
category: 'flakiness'
|
|
115
|
+
},
|
|
116
|
+
'QD500': {
|
|
117
|
+
title: 'Dashboard Start Failed',
|
|
118
|
+
cause: 'The dashboard server cannot start (port in use or permission denied).',
|
|
119
|
+
solution: 'Use --port to specify a different port, or check if another instance is running.',
|
|
120
|
+
category: 'dashboard'
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Gate-specific explanations
|
|
125
|
+
*/
|
|
126
|
+
const GATE_EXPLANATIONS = {
|
|
127
|
+
'api_smoke': {
|
|
128
|
+
title: 'API Smoke Tests',
|
|
129
|
+
commonFailures: [
|
|
130
|
+
'Endpoint not reachable (404, connection refused)',
|
|
131
|
+
'Unexpected response status (expected 200, got 500)',
|
|
132
|
+
'Response format mismatch',
|
|
133
|
+
'Authentication failure (401, 403)'
|
|
134
|
+
],
|
|
135
|
+
tips: [
|
|
136
|
+
'Verify API is running: curl -I <apiUrl>',
|
|
137
|
+
'Check authentication tokens are valid',
|
|
138
|
+
'Review CORS settings for cross-origin requests',
|
|
139
|
+
'Ensure test environment matches expected configuration'
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
'ui': {
|
|
143
|
+
title: 'UI/E2E Tests',
|
|
144
|
+
commonFailures: [
|
|
145
|
+
'Page load timeout',
|
|
146
|
+
'Element not found (selector changed)',
|
|
147
|
+
'JavaScript errors in browser console',
|
|
148
|
+
'Viewport/responsive issues'
|
|
149
|
+
],
|
|
150
|
+
tips: [
|
|
151
|
+
'Use data-testid attributes for stable selectors',
|
|
152
|
+
'Add explicit waits for dynamic content',
|
|
153
|
+
'Check browser console for JavaScript errors',
|
|
154
|
+
'Test in headless mode matches real browser behavior'
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
'a11y': {
|
|
158
|
+
title: 'Accessibility Tests',
|
|
159
|
+
commonFailures: [
|
|
160
|
+
'Missing alt text on images',
|
|
161
|
+
'Low color contrast ratio',
|
|
162
|
+
'Missing ARIA labels on interactive elements',
|
|
163
|
+
'Keyboard navigation issues'
|
|
164
|
+
],
|
|
165
|
+
tips: [
|
|
166
|
+
'Use axe DevTools browser extension for debugging',
|
|
167
|
+
'Test with keyboard only (no mouse)',
|
|
168
|
+
'Run screen reader simulation to verify experience',
|
|
169
|
+
'Check contrast ratios with WCAG tools'
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
'perf': {
|
|
173
|
+
title: 'Performance Tests',
|
|
174
|
+
commonFailures: [
|
|
175
|
+
'Response time exceeds budget',
|
|
176
|
+
'Error rate too high under load',
|
|
177
|
+
'Resource exhaustion (memory, CPU)',
|
|
178
|
+
'Timeouts during peak load'
|
|
179
|
+
],
|
|
180
|
+
tips: [
|
|
181
|
+
'Start with low load and gradually increase',
|
|
182
|
+
'Monitor server resources during tests',
|
|
183
|
+
'Profile slow endpoints with performance tools',
|
|
184
|
+
'Consider caching and optimization strategies'
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
'sast': {
|
|
188
|
+
title: 'Static Application Security Testing',
|
|
189
|
+
commonFailures: [
|
|
190
|
+
'Hardcoded secrets or passwords',
|
|
191
|
+
'SQL injection vulnerabilities',
|
|
192
|
+
'Unsafe function usage',
|
|
193
|
+
'Dependency vulnerabilities'
|
|
194
|
+
],
|
|
195
|
+
tips: [
|
|
196
|
+
'Use environment variables for secrets',
|
|
197
|
+
'Parameterize all database queries',
|
|
198
|
+
'Keep dependencies updated',
|
|
199
|
+
'Review and understand each security finding'
|
|
200
|
+
]
|
|
201
|
+
},
|
|
202
|
+
'dast': {
|
|
203
|
+
title: 'Dynamic Application Security Testing',
|
|
204
|
+
commonFailures: [
|
|
205
|
+
'Injection vulnerabilities (SQL, XSS)',
|
|
206
|
+
'Authentication/authorization bypass',
|
|
207
|
+
'Sensitive data exposure',
|
|
208
|
+
'Misconfigurations'
|
|
209
|
+
],
|
|
210
|
+
tips: [
|
|
211
|
+
'Run against test environment only',
|
|
212
|
+
'DAST may trigger security alerts - inform your team',
|
|
213
|
+
'Review false positives carefully',
|
|
214
|
+
'Fix critical findings before production'
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
'secrets': {
|
|
218
|
+
title: 'Secrets Scanning',
|
|
219
|
+
commonFailures: [
|
|
220
|
+
'API keys in source code',
|
|
221
|
+
'Passwords in config files',
|
|
222
|
+
'Certificates committed to repo',
|
|
223
|
+
'Tokens in logs'
|
|
224
|
+
],
|
|
225
|
+
tips: [
|
|
226
|
+
'Use git-secrets or similar pre-commit hooks',
|
|
227
|
+
'Rotate any leaked credentials immediately',
|
|
228
|
+
'Use .env files with gitignore',
|
|
229
|
+
'Enable branch protection rules'
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
'deps': {
|
|
233
|
+
title: 'Dependency Vulnerability Scanning',
|
|
234
|
+
commonFailures: [
|
|
235
|
+
'Known CVEs in dependencies',
|
|
236
|
+
'Outdated packages with security fixes',
|
|
237
|
+
'Transitive dependency issues',
|
|
238
|
+
'License violations'
|
|
239
|
+
],
|
|
240
|
+
tips: [
|
|
241
|
+
'Run "npm audit fix" for automatic fixes',
|
|
242
|
+
'Review dependabot PRs promptly',
|
|
243
|
+
'Pin dependency versions where appropriate',
|
|
244
|
+
'Understand your dependency tree'
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* Explain an error code
|
|
250
|
+
*/
|
|
251
|
+
async function explainErrorCode(code, json = false) {
|
|
252
|
+
const error = ERROR_CODES[code];
|
|
253
|
+
if (!error) {
|
|
254
|
+
console.log(chalk.red(`\n[X] Unknown error code: ${code}`));
|
|
255
|
+
console.log(chalk.blue('\nAvailable error codes:'));
|
|
256
|
+
const grouped = groupErrorCodes();
|
|
257
|
+
for (const [category, codes] of Object.entries(grouped)) {
|
|
258
|
+
console.log(chalk.yellow(`\n ${category.toUpperCase()}:`));
|
|
259
|
+
console.log(chalk.gray(` ${codes.join(', ')}`));
|
|
260
|
+
}
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (json) {
|
|
264
|
+
console.log(JSON.stringify({ code, ...error }, null, 2));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
console.log(chalk.red(`\n[X] ${error.title}`));
|
|
268
|
+
console.log(chalk.gray(` Code: ${code}`));
|
|
269
|
+
console.log(chalk.gray(` Category: ${error.category}\n`));
|
|
270
|
+
console.log(chalk.yellow('Cause:'));
|
|
271
|
+
console.log(chalk.white(` ${error.cause}\n`));
|
|
272
|
+
console.log(chalk.green('Solution:'));
|
|
273
|
+
console.log(chalk.white(` ${error.solution}\n`));
|
|
274
|
+
// Show related commands
|
|
275
|
+
const relatedCommands = {
|
|
276
|
+
prerequisite: ['qa360 doctor', 'qa360 doctor --fix'],
|
|
277
|
+
setup: ['qa360 doctor --fix', 'qa360 secrets add'],
|
|
278
|
+
execution: ['qa360 run --verbose', 'qa360 history show <run-id>'],
|
|
279
|
+
pack: ['qa360 pack validate', 'qa360 init'],
|
|
280
|
+
vault: ['qa360 doctor --fix', 'qa360 history list'],
|
|
281
|
+
verification: ['qa360 verify --verbose'],
|
|
282
|
+
flakiness: ['qa360 flakiness history', 'qa360 flakiness quarantine'],
|
|
283
|
+
network: ['curl -I <url>', 'ping <host>'],
|
|
284
|
+
dashboard: ['qa360 dashboard --port 8081']
|
|
285
|
+
};
|
|
286
|
+
const commands = relatedCommands[error.category];
|
|
287
|
+
if (commands) {
|
|
288
|
+
console.log(chalk.cyan('Related commands:'));
|
|
289
|
+
commands.forEach(cmd => console.log(chalk.gray(` ${cmd}`)));
|
|
290
|
+
console.log('');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Group error codes by category
|
|
295
|
+
*/
|
|
296
|
+
function groupErrorCodes() {
|
|
297
|
+
const grouped = {};
|
|
298
|
+
for (const [code, error] of Object.entries(ERROR_CODES)) {
|
|
299
|
+
if (!grouped[error.category]) {
|
|
300
|
+
grouped[error.category] = [];
|
|
301
|
+
}
|
|
302
|
+
grouped[error.category].push(code);
|
|
303
|
+
}
|
|
304
|
+
return grouped;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Explain gate failure with context
|
|
308
|
+
*/
|
|
309
|
+
async function explainGate(gateName, runId, json = false) {
|
|
310
|
+
const info = GATE_EXPLANATIONS[gateName];
|
|
311
|
+
if (!info) {
|
|
312
|
+
console.log(chalk.yellow(`\n[!] No specific information available for gate: ${gateName}`));
|
|
313
|
+
console.log(chalk.gray('Available gates: ' + Object.keys(GATE_EXPLANATIONS).join(', ')));
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (json) {
|
|
317
|
+
console.log(JSON.stringify({ gate: gateName, ...info }, null, 2));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
console.log(chalk.bold(`\n${info.title} (${gateName})\n`));
|
|
321
|
+
console.log(chalk.yellow('Common failures:'));
|
|
322
|
+
info.commonFailures.forEach(f => console.log(chalk.gray(` - ${f}`)));
|
|
323
|
+
console.log(chalk.cyan('\nTips:'));
|
|
324
|
+
info.tips.forEach(t => console.log(chalk.gray(` - ${t}`)));
|
|
325
|
+
// Load from vault if runId provided
|
|
326
|
+
if (runId) {
|
|
327
|
+
await explainGateFromVault(gateName, runId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Load and display gate-specific data from vault
|
|
332
|
+
*/
|
|
333
|
+
async function explainGateFromVault(gateName, runId) {
|
|
334
|
+
const vaultDir = join(process.cwd(), '.qa360');
|
|
335
|
+
if (!existsSync(vaultDir)) {
|
|
336
|
+
console.log(chalk.yellow('\n[!] Vault not found in current directory'));
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
const vault = new EvidenceVault({ baseDir: vaultDir });
|
|
341
|
+
// Get gate results from the run
|
|
342
|
+
const runInfo = await vault.getRun(runId);
|
|
343
|
+
if (!runInfo) {
|
|
344
|
+
console.log(chalk.yellow(`\n[!] Run ${runId} not found in vault`));
|
|
345
|
+
await vault.close();
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const gateResults = await vault.getGates(runId);
|
|
349
|
+
const gateResult = gateResults.find((g) => g.name === gateName);
|
|
350
|
+
if (gateResult) {
|
|
351
|
+
console.log(chalk.bold('\nRun Results:'));
|
|
352
|
+
console.log(chalk.gray(` Status: ${gateResult.status}`));
|
|
353
|
+
console.log(chalk.gray(` Duration: ${gateResult.duration_ms}ms`));
|
|
354
|
+
if (gateResult.metrics_json) {
|
|
355
|
+
const metrics = JSON.parse(gateResult.metrics_json);
|
|
356
|
+
if (metrics.total || metrics.passed || metrics.failed) {
|
|
357
|
+
console.log(chalk.gray(` Tests: ${metrics.passed || 0}/${metrics.total || 0} passed`));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Get findings for this gate
|
|
361
|
+
const findings = await vault.getFindings(runId);
|
|
362
|
+
const gateFindings = findings.filter((f) => f.gate === gateName);
|
|
363
|
+
if (gateFindings.length > 0) {
|
|
364
|
+
console.log(chalk.yellow('\nFindings:'));
|
|
365
|
+
gateFindings.slice(0, 10).forEach((f) => {
|
|
366
|
+
console.log(chalk.gray(` - [${f.severity}] ${f.rule}: ${f.message}`));
|
|
367
|
+
});
|
|
368
|
+
if (gateFindings.length > 10) {
|
|
369
|
+
console.log(chalk.gray(` ... and ${gateFindings.length - 10} more`));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
await vault.close();
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
console.log(chalk.yellow(`\n[!] Could not load vault data: ${error.message}`));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* AI-powered explanation
|
|
381
|
+
*/
|
|
382
|
+
async function explainWithAI(query, provider, runId, json = false) {
|
|
383
|
+
const spinner = ora('Connecting to AI provider...').start();
|
|
384
|
+
try {
|
|
385
|
+
// Get the AI provider
|
|
386
|
+
const aiProvider = provider
|
|
387
|
+
? await createLLMProvider({ preferred: provider })
|
|
388
|
+
: await createBest();
|
|
389
|
+
if (!aiProvider) {
|
|
390
|
+
spinner.fail('No AI provider available');
|
|
391
|
+
console.log(chalk.yellow('\nSet up an AI provider:'));
|
|
392
|
+
console.log(chalk.gray(' qa360 ai list'));
|
|
393
|
+
console.log(chalk.gray(' export DEEPSEEK_API_KEY=your_key\n'));
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
spinner.text = `Using ${aiProvider.getProviderType()}...`;
|
|
397
|
+
// Build context from vault if available
|
|
398
|
+
let context = '';
|
|
399
|
+
if (runId) {
|
|
400
|
+
const vaultDir = join(process.cwd(), '.qa360');
|
|
401
|
+
if (existsSync(vaultDir)) {
|
|
402
|
+
try {
|
|
403
|
+
const vault = new EvidenceVault({ baseDir: vaultDir });
|
|
404
|
+
const runInfo = await vault.getRun(runId);
|
|
405
|
+
if (runInfo) {
|
|
406
|
+
const duration = runInfo.ended_at && runInfo.started_at
|
|
407
|
+
? runInfo.ended_at - runInfo.started_at
|
|
408
|
+
: undefined;
|
|
409
|
+
context = `\n\nContext from run ${runId}:
|
|
410
|
+
- Status: ${runInfo.status}
|
|
411
|
+
- Trust Score: ${runInfo.trust_score ?? 'N/A'}
|
|
412
|
+
- Pack: ${runInfo.pack_path || 'unknown'}
|
|
413
|
+
- Duration: ${duration ? `${duration}ms` : 'N/A'}
|
|
414
|
+
- Started: ${new Date(runInfo.started_at).toISOString()}`;
|
|
415
|
+
}
|
|
416
|
+
await vault.close();
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
// Vault access failed, continue without context
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// Build the explanation prompt
|
|
424
|
+
const systemPrompt = `You are QA360 Explain, an expert QA assistant.
|
|
425
|
+
Explain test failures, errors, and quality issues in clear, actionable terms.
|
|
426
|
+
|
|
427
|
+
Structure your response:
|
|
428
|
+
1. **Summary**: What happened in one sentence
|
|
429
|
+
2. **Root Cause**: Why it happened (technical explanation)
|
|
430
|
+
3. **Impact**: What this means for the project
|
|
431
|
+
4. **Solutions**: Specific steps to fix it (numbered list)
|
|
432
|
+
5. **Prevention**: How to avoid this in the future
|
|
433
|
+
|
|
434
|
+
Be concise but thorough. Use simple language but accurate technical terms.`;
|
|
435
|
+
const userPrompt = `Explain this QA issue:${context}\n\n${query}`;
|
|
436
|
+
const response = await aiProvider.generate({
|
|
437
|
+
prompt: userPrompt,
|
|
438
|
+
systemPrompt,
|
|
439
|
+
maxTokens: 2048,
|
|
440
|
+
temperature: 0.3
|
|
441
|
+
});
|
|
442
|
+
spinner.succeed(`Explanation using ${chalk.cyan(aiProvider.getProviderType())}\n`);
|
|
443
|
+
if (json) {
|
|
444
|
+
console.log(JSON.stringify({
|
|
445
|
+
provider: aiProvider.getProviderType(),
|
|
446
|
+
query,
|
|
447
|
+
explanation: response.content,
|
|
448
|
+
usage: response.usage
|
|
449
|
+
}, null, 2));
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
console.log(chalk.bold('Explanation:\n'));
|
|
453
|
+
console.log(chalk.gray('-'.repeat(70)));
|
|
454
|
+
console.log(response.content);
|
|
455
|
+
console.log(chalk.gray('-'.repeat(70)));
|
|
456
|
+
console.log(chalk.gray(`\nTokens: ${response.usage.totalTokens}`));
|
|
457
|
+
console.log(chalk.gray(` Prompt: ${response.usage.promptTokens}`));
|
|
458
|
+
console.log(chalk.gray(` Completion: ${response.usage.completionTokens}\n`));
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (error) {
|
|
462
|
+
spinner.fail('AI explanation failed');
|
|
463
|
+
console.log(chalk.red(`Error: ${error.message}`));
|
|
464
|
+
// Fallback to static explanation
|
|
465
|
+
console.log(chalk.yellow('\nYou can also try static explanations:'));
|
|
466
|
+
console.log(chalk.gray(' qa360 explain QX001 # List error codes'));
|
|
467
|
+
console.log(chalk.gray(' qa360 explain --gate api_smoke\n'));
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Explain a run result
|
|
472
|
+
*/
|
|
473
|
+
async function explainRun(runId, options) {
|
|
474
|
+
const vaultDir = join(process.cwd(), '.qa360');
|
|
475
|
+
if (!existsSync(vaultDir)) {
|
|
476
|
+
console.log(chalk.red('\n[X] Vault not found in current directory'));
|
|
477
|
+
console.log(chalk.yellow('Run "qa360 run" first to generate test results.\n'));
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const spinner = ora('Loading run data...').start();
|
|
481
|
+
try {
|
|
482
|
+
const vault = new EvidenceVault({ baseDir: vaultDir });
|
|
483
|
+
const runInfo = await vault.getRun(runId);
|
|
484
|
+
if (!runInfo) {
|
|
485
|
+
spinner.fail(`Run ${runId} not found`);
|
|
486
|
+
console.log(chalk.yellow('\nAvailable runs:'));
|
|
487
|
+
const runs = await vault.listRuns({ limit: 20 });
|
|
488
|
+
runs.forEach((r) => console.log(chalk.gray(` ${r.id} - ${r.status}`)));
|
|
489
|
+
await vault.close();
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
spinner.succeed('Run loaded\n');
|
|
493
|
+
if (options.json) {
|
|
494
|
+
console.log(JSON.stringify(runInfo, null, 2));
|
|
495
|
+
await vault.close();
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
// Calculate duration
|
|
499
|
+
const duration = runInfo.ended_at && runInfo.started_at
|
|
500
|
+
? runInfo.ended_at - runInfo.started_at
|
|
501
|
+
: undefined;
|
|
502
|
+
// Display run summary
|
|
503
|
+
console.log(chalk.bold(`Run: ${runId}`));
|
|
504
|
+
console.log(chalk.gray(` Status: ${runInfo.status}`));
|
|
505
|
+
console.log(chalk.gray(` Trust Score: ${runInfo.trust_score ?? 'N/A'}/100`));
|
|
506
|
+
console.log(chalk.gray(` Started: ${new Date(runInfo.started_at).toISOString()}`));
|
|
507
|
+
if (duration) {
|
|
508
|
+
console.log(chalk.gray(` Duration: ${duration}ms\n`));
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
console.log('');
|
|
512
|
+
}
|
|
513
|
+
// Get gate results
|
|
514
|
+
const gates = await vault.getGates(runId);
|
|
515
|
+
if (gates.length > 0) {
|
|
516
|
+
console.log(chalk.bold('Gates:'));
|
|
517
|
+
gates.forEach((g) => {
|
|
518
|
+
const icon = g.status === 'passed' ? '[OK]' : g.status === 'failed' ? '[FAIL]' : '[SKIP]';
|
|
519
|
+
const color = g.status === 'passed' ? chalk.green : g.status === 'failed' ? chalk.red : chalk.gray;
|
|
520
|
+
console.log(` ${icon} ${color(g.name)} (${g.duration_ms || 'N/A'}ms)`);
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
// Get findings
|
|
524
|
+
const findings = await vault.getFindings(runId);
|
|
525
|
+
if (findings.length > 0) {
|
|
526
|
+
console.log(chalk.bold('\nFindings:'));
|
|
527
|
+
const bySeverity = {};
|
|
528
|
+
findings.forEach((f) => {
|
|
529
|
+
if (!bySeverity[f.severity])
|
|
530
|
+
bySeverity[f.severity] = [];
|
|
531
|
+
bySeverity[f.severity].push(f);
|
|
532
|
+
});
|
|
533
|
+
['critical', 'high', 'medium', 'low', 'info'].forEach(sev => {
|
|
534
|
+
if (bySeverity[sev]?.length) {
|
|
535
|
+
console.log(chalk.red(` ${sev.toUpperCase()}: ${bySeverity[sev].length}`));
|
|
536
|
+
bySeverity[sev].slice(0, 5).forEach((f) => {
|
|
537
|
+
const msg = f.message.length > 60 ? f.message.substring(0, 60) + '...' : f.message;
|
|
538
|
+
console.log(chalk.gray(` - ${f.rule}: ${msg}`));
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
// Get flakiness data (may fail if vault doesn't have flakiness tables)
|
|
544
|
+
try {
|
|
545
|
+
const flakiness = await vault.getRunFlakiness(runId);
|
|
546
|
+
if (flakiness.length > 0) {
|
|
547
|
+
console.log(chalk.bold('\nFlakiness:'));
|
|
548
|
+
const unstable = flakiness.filter((f) => f.score < 75);
|
|
549
|
+
if (unstable.length > 0) {
|
|
550
|
+
console.log(chalk.yellow(` ${unstable.length} unstable tests detected`));
|
|
551
|
+
unstable.forEach((f) => {
|
|
552
|
+
console.log(chalk.gray(` - ${f.test_name}: score ${f.score}`));
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
console.log(chalk.green(' All tests are stable!'));
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
catch {
|
|
561
|
+
// Flakiness tables not available in this vault version
|
|
562
|
+
}
|
|
563
|
+
await vault.close();
|
|
564
|
+
// Offer AI explanation if requested
|
|
565
|
+
if (options.ai) {
|
|
566
|
+
console.log(chalk.cyan('\nGetting AI explanation...\n'));
|
|
567
|
+
await explainWithAI(`Explain this test run: ${runId} with status ${runInfo.status} and ${gates.length} gates`, options.provider, runId, options.json);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
spinner.fail('Failed to load run data');
|
|
572
|
+
console.log(chalk.red(`Error: ${error.message}`));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Main explain command
|
|
577
|
+
*/
|
|
578
|
+
export async function explainCommand(input, options = {}) {
|
|
579
|
+
// No input - show help
|
|
580
|
+
if (!input && !options.run && !options.gate) {
|
|
581
|
+
console.log(chalk.bold.cyan('\nQA360 Explain - Error and Failure Explanations\n'));
|
|
582
|
+
console.log(chalk.yellow('Usage:\n'));
|
|
583
|
+
console.log(chalk.gray(' qa360 explain QX001 # Explain error code'));
|
|
584
|
+
console.log(chalk.gray(' qa360 explain --ai "query" # AI-powered explanation'));
|
|
585
|
+
console.log(chalk.gray(' qa360 explain --run run-xxx # Explain test run'));
|
|
586
|
+
console.log(chalk.gray(' qa360 explain --gate api_smoke # Explain gate failures\n'));
|
|
587
|
+
console.log(chalk.yellow('Available Error Codes:\n'));
|
|
588
|
+
const grouped = groupErrorCodes();
|
|
589
|
+
for (const [category, codes] of Object.entries(grouped)) {
|
|
590
|
+
console.log(chalk.cyan(` ${category.toUpperCase()}:`));
|
|
591
|
+
codes.slice(0, 5).forEach(code => {
|
|
592
|
+
const error = ERROR_CODES[code];
|
|
593
|
+
console.log(chalk.gray(` ${code} - ${error?.title}`));
|
|
594
|
+
});
|
|
595
|
+
if (codes.length > 5) {
|
|
596
|
+
console.log(chalk.gray(` ... and ${codes.length - 5} more`));
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
console.log(chalk.yellow('\nAvailable Gates:\n'));
|
|
600
|
+
console.log(chalk.gray(' ' + Object.keys(GATE_EXPLANATIONS).join(', ') + '\n'));
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
// Run mode
|
|
604
|
+
if (options.run) {
|
|
605
|
+
await explainRun(options.run, options);
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
// Gate mode
|
|
609
|
+
if (options.gate) {
|
|
610
|
+
await explainGate(options.gate, options.run, options.json);
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
// AI mode
|
|
614
|
+
if (options.ai) {
|
|
615
|
+
await explainWithAI(input || '', options.provider, options.run, options.json);
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
// Error code mode (default)
|
|
619
|
+
if (input) {
|
|
620
|
+
// Check if it looks like an error code
|
|
621
|
+
if (/^Q[A-Z]\d{3}$/.test(input)) {
|
|
622
|
+
await explainErrorCode(input, options.json);
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
// Treat as AI query
|
|
626
|
+
await explainWithAI(input, options.provider, options.run, options.json);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
export default explainCommand;
|