qa360 2.2.1 → 2.2.13
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.
- 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/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 +309 -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 +245 -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 +330 -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 +62 -0
- package/cli/dist/core/pack-v2/migrator.js +505 -0
- package/cli/dist/core/pack-v2/validator.d.ts +65 -0
- package/cli/dist/core/pack-v2/validator.js +629 -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 +1323 -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 +26 -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
|
@@ -1,714 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* QA360 Real-World E2E Tests - SauceDemo
|
|
4
|
-
*
|
|
5
|
-
* Tests on https://www.saucedemo.com/
|
|
6
|
-
* This is a popular e-commerce testing site.
|
|
7
|
-
*
|
|
8
|
-
* Usage: node tests/e2e/real-world/saucedemo.test.mjs
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { chromium } from '@playwright/test';
|
|
12
|
-
import { join, dirname } from 'path';
|
|
13
|
-
import { fileURLToPath } from 'url';
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
-
const __dirname = dirname(__filename);
|
|
17
|
-
|
|
18
|
-
// Test utilities
|
|
19
|
-
let testsPassed = 0;
|
|
20
|
-
let testsFailed = 0;
|
|
21
|
-
|
|
22
|
-
// Timeout configuration for real-world tests (network can be slow)
|
|
23
|
-
const TIMEOUTS = {
|
|
24
|
-
default: 10000, // 10s for normal operations
|
|
25
|
-
navigation: 15000, // 15s for page loads
|
|
26
|
-
network: 20000, // 20s for network idle
|
|
27
|
-
dialog: 5000, // 5s for dialogs
|
|
28
|
-
short: 3000, // 3s for quick transitions
|
|
29
|
-
animation: 1000, // 1s for animations
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
function log(message, type = 'info') {
|
|
33
|
-
const colors = {
|
|
34
|
-
info: '\x1b[36m',
|
|
35
|
-
success: '\x1b[32m',
|
|
36
|
-
error: '\x1b[31m',
|
|
37
|
-
warning: '\x1b[33m',
|
|
38
|
-
dim: '\x1b[90m',
|
|
39
|
-
};
|
|
40
|
-
const reset = '\x1b[0m';
|
|
41
|
-
console.log(`${colors[type] || ''}${message}${reset}`);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function assert(condition, message) {
|
|
45
|
-
if (condition) {
|
|
46
|
-
testsPassed++;
|
|
47
|
-
log(` OK ${message}`, 'success');
|
|
48
|
-
} else {
|
|
49
|
-
testsFailed++;
|
|
50
|
-
log(` FAIL ${message}`, 'error');
|
|
51
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function assertEqual(actual, expected, message) {
|
|
56
|
-
if (actual === expected) {
|
|
57
|
-
testsPassed++;
|
|
58
|
-
log(` OK ${message}`, 'success');
|
|
59
|
-
} else {
|
|
60
|
-
testsFailed++;
|
|
61
|
-
log(` FAIL ${message}`, 'error');
|
|
62
|
-
log(` Expected: "${expected}"`, 'dim');
|
|
63
|
-
log(` Got: "${actual}"`, 'dim');
|
|
64
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function assertContains(haystack, needle, message) {
|
|
69
|
-
if (haystack.includes(needle)) {
|
|
70
|
-
testsPassed++;
|
|
71
|
-
log(` OK ${message}`, 'success');
|
|
72
|
-
} else {
|
|
73
|
-
testsFailed++;
|
|
74
|
-
log(` FAIL ${message}`, 'error');
|
|
75
|
-
log(` Expected to contain: "${needle}"`, 'dim');
|
|
76
|
-
log(` In: "${haystack}"`, 'dim');
|
|
77
|
-
throw new Error(`Assertion failed: ${message}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const BASE_URL = 'https://www.saucedemo.com';
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// TESTS
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
async function testHomePageLoads() {
|
|
88
|
-
log('\n[Test 1] Home page loads', 'info');
|
|
89
|
-
|
|
90
|
-
const browser = await chromium.launch({ headless: true });
|
|
91
|
-
const context = await browser.newContext();
|
|
92
|
-
const page = await context.newPage();
|
|
93
|
-
|
|
94
|
-
try {
|
|
95
|
-
await page.goto(BASE_URL);
|
|
96
|
-
await page.waitForLoadState('networkidle');
|
|
97
|
-
|
|
98
|
-
// Check login form exists
|
|
99
|
-
const loginButton = await page.$('#login-button');
|
|
100
|
-
assert(loginButton !== null, 'Login button exists');
|
|
101
|
-
|
|
102
|
-
const usernameInput = await page.$('#user-name');
|
|
103
|
-
assert(usernameInput !== null, 'Username input exists');
|
|
104
|
-
|
|
105
|
-
const passwordInput = await page.$('#password');
|
|
106
|
-
assert(passwordInput !== null, 'Password input exists');
|
|
107
|
-
|
|
108
|
-
} finally {
|
|
109
|
-
await browser.close();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function testValidLogin() {
|
|
114
|
-
log('\n[Test 2] Valid user login', 'info');
|
|
115
|
-
|
|
116
|
-
const browser = await chromium.launch({ headless: true });
|
|
117
|
-
const context = await browser.newContext();
|
|
118
|
-
const page = await context.newPage();
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
await page.goto(BASE_URL);
|
|
122
|
-
|
|
123
|
-
// Fill in credentials
|
|
124
|
-
await page.fill('#user-name', 'standard_user');
|
|
125
|
-
await page.fill('#password', 'secret_sauce');
|
|
126
|
-
|
|
127
|
-
// Click login
|
|
128
|
-
await page.click('#login-button');
|
|
129
|
-
|
|
130
|
-
// Wait for redirect to inventory
|
|
131
|
-
await page.waitForURL('**/inventory.html');
|
|
132
|
-
|
|
133
|
-
const currentUrl = page.url();
|
|
134
|
-
assert(currentUrl.includes('inventory.html'), 'Redirected to inventory page');
|
|
135
|
-
|
|
136
|
-
// Check that products are displayed
|
|
137
|
-
const products = await page.locator('.inventory_item').count();
|
|
138
|
-
assert(products > 0, `Found ${products} products`);
|
|
139
|
-
|
|
140
|
-
} finally {
|
|
141
|
-
await browser.close();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async function testInvalidLogin() {
|
|
146
|
-
log('\n[Test 3] Invalid credentials', 'info');
|
|
147
|
-
|
|
148
|
-
const browser = await chromium.launch({ headless: true });
|
|
149
|
-
const context = await browser.newContext();
|
|
150
|
-
const page = await context.newPage();
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
await page.goto(BASE_URL);
|
|
154
|
-
|
|
155
|
-
// Fill in wrong credentials
|
|
156
|
-
await page.fill('#user-name', 'invalid_user');
|
|
157
|
-
await page.fill('#password', 'wrong_password');
|
|
158
|
-
|
|
159
|
-
// Click login
|
|
160
|
-
await page.click('#login-button');
|
|
161
|
-
|
|
162
|
-
// Wait for error message
|
|
163
|
-
await page.waitForSelector('.error-button', { state: 'visible' });
|
|
164
|
-
|
|
165
|
-
const errorBox = await page.$('.error-message-container');
|
|
166
|
-
assert(errorBox !== null, 'Error message is displayed');
|
|
167
|
-
|
|
168
|
-
const errorText = await page.textContent('.error-message-container');
|
|
169
|
-
assert(
|
|
170
|
-
errorText?.toLowerCase().includes('username and password') ||
|
|
171
|
-
errorText?.toLowerCase().includes('epic sad'),
|
|
172
|
-
'Error message indicates wrong credentials'
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
} finally {
|
|
176
|
-
await browser.close();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async function testProductListing() {
|
|
181
|
-
log('\n[Test 4] Product listing', 'info');
|
|
182
|
-
|
|
183
|
-
const browser = await chromium.launch({ headless: true });
|
|
184
|
-
const context = await browser.newContext();
|
|
185
|
-
const page = await context.newPage();
|
|
186
|
-
|
|
187
|
-
try {
|
|
188
|
-
// Login first
|
|
189
|
-
await page.goto(BASE_URL);
|
|
190
|
-
await page.fill('#user-name', 'standard_user');
|
|
191
|
-
await page.fill('#password', 'secret_sauce');
|
|
192
|
-
await page.click('#login-button');
|
|
193
|
-
await page.waitForURL('**/inventory.html');
|
|
194
|
-
|
|
195
|
-
// Check product list
|
|
196
|
-
const products = await page.locator('.inventory_item').count();
|
|
197
|
-
assertEqual(products, 6, 'There are 6 products');
|
|
198
|
-
|
|
199
|
-
// Check product details
|
|
200
|
-
const firstProductName = await page.locator('.inventory_item_name').first().textContent();
|
|
201
|
-
assert(firstProductName, 'Product name is displayed');
|
|
202
|
-
|
|
203
|
-
const firstProductPrice = await page.locator('.inventory_item_price').first().textContent();
|
|
204
|
-
assert(firstProductPrice?.includes('$'), 'Product price is displayed');
|
|
205
|
-
|
|
206
|
-
const productImages = await page.locator('.inventory_item_img').count();
|
|
207
|
-
assert(productImages > 0, 'Product images are displayed');
|
|
208
|
-
|
|
209
|
-
} finally {
|
|
210
|
-
await browser.close();
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
async function testAddToCart() {
|
|
215
|
-
log('\n[Test 5] Add to cart', 'info');
|
|
216
|
-
|
|
217
|
-
const browser = await chromium.launch({ headless: true });
|
|
218
|
-
const context = await browser.newContext();
|
|
219
|
-
const page = await context.newPage();
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
// Login first
|
|
223
|
-
await page.goto(BASE_URL, { timeout: TIMEOUTS.navigation });
|
|
224
|
-
await page.fill('#user-name', 'standard_user');
|
|
225
|
-
await page.fill('#password', 'secret_sauce');
|
|
226
|
-
await page.click('#login-button');
|
|
227
|
-
await page.waitForURL('**/inventory.html', { timeout: TIMEOUTS.navigation });
|
|
228
|
-
|
|
229
|
-
// Add first item to cart
|
|
230
|
-
await page.click('.inventory_item:first-child button');
|
|
231
|
-
|
|
232
|
-
// Wait for cart badge to appear and update (conditional wait, not timeout)
|
|
233
|
-
await page.waitForSelector('.shopping_cart_badge', { state: 'visible', timeout: TIMEOUTS.default });
|
|
234
|
-
|
|
235
|
-
// Check cart badge updated
|
|
236
|
-
const newCartCount = await page.textContent('.shopping_cart_badge');
|
|
237
|
-
assert(newCartCount !== null, 'Cart badge is displayed after adding item');
|
|
238
|
-
|
|
239
|
-
// Check button text changed
|
|
240
|
-
await page.waitForSelector('.inventory_item:first-child button:has-text("Remove")', { timeout: TIMEOUTS.short });
|
|
241
|
-
const buttonText = await page.textContent('.inventory_item:first-child button');
|
|
242
|
-
assertEqual(buttonText, 'Remove', 'Button changed to Remove');
|
|
243
|
-
|
|
244
|
-
} finally {
|
|
245
|
-
await browser.close();
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
async function testRemoveFromCart() {
|
|
250
|
-
log('\n[Test 6] Remove from cart', 'info');
|
|
251
|
-
|
|
252
|
-
const browser = await chromium.launch({ headless: true });
|
|
253
|
-
const context = await browser.newContext();
|
|
254
|
-
const page = await context.newPage();
|
|
255
|
-
|
|
256
|
-
try {
|
|
257
|
-
// Login and add item
|
|
258
|
-
await page.goto(BASE_URL);
|
|
259
|
-
await page.fill('#user-name', 'standard_user');
|
|
260
|
-
await page.fill('#password', 'secret_sauce');
|
|
261
|
-
await page.click('#login-button');
|
|
262
|
-
await page.waitForURL('**/inventory.html');
|
|
263
|
-
|
|
264
|
-
// Add first item
|
|
265
|
-
await page.click('.inventory_item:first-child button');
|
|
266
|
-
await page.waitForTimeout(500);
|
|
267
|
-
|
|
268
|
-
// Remove it
|
|
269
|
-
await page.click('.inventory_item:first-child button');
|
|
270
|
-
await page.waitForTimeout(500);
|
|
271
|
-
|
|
272
|
-
// Check button text changed back
|
|
273
|
-
const buttonText = await page.textContent('.inventory_item:first-child button');
|
|
274
|
-
assertEqual(buttonText, 'Add to cart', 'Button changed back to Add to cart');
|
|
275
|
-
|
|
276
|
-
} finally {
|
|
277
|
-
await browser.close();
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
async function testCartPage() {
|
|
282
|
-
log('\n[Test 7] Cart page', 'info');
|
|
283
|
-
|
|
284
|
-
const browser = await chromium.launch({ headless: true });
|
|
285
|
-
const context = await browser.newContext();
|
|
286
|
-
const page = await context.newPage();
|
|
287
|
-
|
|
288
|
-
try {
|
|
289
|
-
// Login and add items
|
|
290
|
-
await page.goto(BASE_URL);
|
|
291
|
-
await page.fill('#user-name', 'standard_user');
|
|
292
|
-
await page.fill('#password', 'secret_sauce');
|
|
293
|
-
await page.click('#login-button');
|
|
294
|
-
await page.waitForURL('**/inventory.html');
|
|
295
|
-
|
|
296
|
-
// Add two items
|
|
297
|
-
await page.click('.inventory_item:nth-child(1) button');
|
|
298
|
-
await page.click('.inventory_item:nth-child(2) button');
|
|
299
|
-
await page.waitForTimeout(500);
|
|
300
|
-
|
|
301
|
-
// Click cart icon
|
|
302
|
-
await page.click('.shopping_cart_link');
|
|
303
|
-
await page.waitForURL('**/cart.html');
|
|
304
|
-
|
|
305
|
-
// Verify cart page
|
|
306
|
-
const cartItems = await page.locator('.cart_item').count();
|
|
307
|
-
assertEqual(cartItems, 2, 'Cart has 2 items');
|
|
308
|
-
|
|
309
|
-
// Check continue button exists
|
|
310
|
-
const continueButton = await page.$('#continue-shopping');
|
|
311
|
-
assert(continueButton !== null, 'Continue shopping button exists');
|
|
312
|
-
|
|
313
|
-
// Check checkout button exists
|
|
314
|
-
const checkoutButton = await page.$('#checkout');
|
|
315
|
-
assert(checkoutButton !== null, 'Checkout button exists');
|
|
316
|
-
|
|
317
|
-
} finally {
|
|
318
|
-
await browser.close();
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
async function testSortProducts() {
|
|
323
|
-
log('\n[Test 8] Sort products', 'info');
|
|
324
|
-
|
|
325
|
-
const browser = await chromium.launch({ headless: true });
|
|
326
|
-
const context = await browser.newContext();
|
|
327
|
-
const page = await context.newPage();
|
|
328
|
-
|
|
329
|
-
try {
|
|
330
|
-
// Login
|
|
331
|
-
await page.goto(BASE_URL);
|
|
332
|
-
await page.fill('#user-name', 'standard_user');
|
|
333
|
-
await page.fill('#password', 'secret_sauce');
|
|
334
|
-
await page.click('#login-button');
|
|
335
|
-
await page.waitForURL('**/inventory.html');
|
|
336
|
-
|
|
337
|
-
// Get initial product order
|
|
338
|
-
const firstProductBefore = await page.locator('.inventory_item_name').first().textContent();
|
|
339
|
-
|
|
340
|
-
// Sort by price (low to high)
|
|
341
|
-
await page.selectOption('.product_sort_container', 'lohi');
|
|
342
|
-
await page.waitForTimeout(500);
|
|
343
|
-
|
|
344
|
-
// Verify sorting worked (different order)
|
|
345
|
-
const firstProductAfter = await page.locator('.inventory_item_name').first().textContent();
|
|
346
|
-
// These should be different after sorting
|
|
347
|
-
const productsExist = firstProductAfter !== null;
|
|
348
|
-
assert(productsExist, 'Products are still displayed after sorting');
|
|
349
|
-
|
|
350
|
-
// Check sort options exist
|
|
351
|
-
const sortOptions = await page.locator('.product_sort_container option').count();
|
|
352
|
-
assert(sortOptions === 4, 'Sort dropdown has 4 options');
|
|
353
|
-
|
|
354
|
-
} finally {
|
|
355
|
-
await browser.close();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
async function testProductDetails() {
|
|
360
|
-
log('\n[Test 9] Product details', 'info');
|
|
361
|
-
|
|
362
|
-
const browser = await chromium.launch({ headless: true });
|
|
363
|
-
const context = await browser.newContext();
|
|
364
|
-
const page = await context.newPage();
|
|
365
|
-
|
|
366
|
-
try {
|
|
367
|
-
// Login
|
|
368
|
-
await page.goto(BASE_URL);
|
|
369
|
-
await page.fill('#user-name', 'standard_user');
|
|
370
|
-
await page.fill('#password', 'secret_sauce');
|
|
371
|
-
await page.click('#login-button');
|
|
372
|
-
await page.waitForURL('**/inventory.html');
|
|
373
|
-
|
|
374
|
-
// Click on first product
|
|
375
|
-
await page.click('.inventory_item_name:first-child');
|
|
376
|
-
await page.waitForURL('**/inventory-item.html');
|
|
377
|
-
|
|
378
|
-
// Verify product details page
|
|
379
|
-
const productName = await page.textContent('.inventory_details_name');
|
|
380
|
-
assert(productName, 'Product name is displayed on details page');
|
|
381
|
-
|
|
382
|
-
const productDesc = await page.textContent('.inventory_details_desc');
|
|
383
|
-
assert(productDesc, 'Product description is displayed');
|
|
384
|
-
|
|
385
|
-
const productPrice = await page.textContent('.inventory_details_price');
|
|
386
|
-
assert(productPrice?.includes('$'), 'Product price is displayed');
|
|
387
|
-
|
|
388
|
-
// Check back button
|
|
389
|
-
const backButton = await page.$('#back-to-products');
|
|
390
|
-
assert(backButton !== null, 'Back to products button exists');
|
|
391
|
-
|
|
392
|
-
} finally {
|
|
393
|
-
await browser.close();
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
async function testCheckoutFlow() {
|
|
398
|
-
log('\n[Test 10] Checkout flow', 'info');
|
|
399
|
-
|
|
400
|
-
const browser = await chromium.launch({ headless: true });
|
|
401
|
-
const context = await browser.newContext();
|
|
402
|
-
const page = await context.newPage();
|
|
403
|
-
|
|
404
|
-
try {
|
|
405
|
-
// Login
|
|
406
|
-
await page.goto(BASE_URL);
|
|
407
|
-
await page.fill('#user-name', 'standard_user');
|
|
408
|
-
await page.fill('#password', 'secret_sauce');
|
|
409
|
-
await page.click('#login-button');
|
|
410
|
-
await page.waitForURL('**/inventory.html');
|
|
411
|
-
|
|
412
|
-
// Add item to cart
|
|
413
|
-
await page.click('.inventory_item:first-child button');
|
|
414
|
-
await page.waitForTimeout(500);
|
|
415
|
-
|
|
416
|
-
// Go to cart
|
|
417
|
-
await page.click('.shopping_cart_link');
|
|
418
|
-
await page.waitForURL('**/cart.html');
|
|
419
|
-
|
|
420
|
-
// Click checkout
|
|
421
|
-
await page.click('#checkout');
|
|
422
|
-
await page.waitForURL('**/checkout-step-one.html');
|
|
423
|
-
|
|
424
|
-
// Fill checkout form
|
|
425
|
-
await page.fill('#first-name', 'John');
|
|
426
|
-
await page.fill('#last-name', 'Doe');
|
|
427
|
-
await page.fill('#postal-code', '12345');
|
|
428
|
-
|
|
429
|
-
// Continue
|
|
430
|
-
await page.click('#continue');
|
|
431
|
-
await page.waitForURL('**/checkout-step-two.html');
|
|
432
|
-
|
|
433
|
-
// Verify checkout overview
|
|
434
|
-
const summaryLabel = await page.textContent('.summary_info_label');
|
|
435
|
-
assert(summaryLabel?.includes('Summary') || summaryLabel?.includes('Payment'), 'Checkout summary is displayed');
|
|
436
|
-
|
|
437
|
-
// Finish
|
|
438
|
-
await page.click('#finish');
|
|
439
|
-
await page.waitForURL('**/checkout-complete.html');
|
|
440
|
-
|
|
441
|
-
// Verify completion message
|
|
442
|
-
const completeMessage = await page.textContent('.complete-header');
|
|
443
|
-
assertEqual(completeMessage, 'Thank you for your order!', 'Order completion message is displayed');
|
|
444
|
-
|
|
445
|
-
} finally {
|
|
446
|
-
await browser.close();
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
async function testLogout() {
|
|
451
|
-
log('\n[Test 11] Logout', 'info');
|
|
452
|
-
|
|
453
|
-
const browser = await chromium.launch({ headless: true });
|
|
454
|
-
const context = await browser.newContext();
|
|
455
|
-
const page = await context.newPage();
|
|
456
|
-
|
|
457
|
-
try {
|
|
458
|
-
// Login
|
|
459
|
-
await page.goto(BASE_URL);
|
|
460
|
-
await page.fill('#user-name', 'standard_user');
|
|
461
|
-
await page.fill('#password', 'secret_sauce');
|
|
462
|
-
await page.click('#login-button');
|
|
463
|
-
await page.waitForURL('**/inventory.html');
|
|
464
|
-
|
|
465
|
-
// Click menu
|
|
466
|
-
await page.click('#react-burger-menu-btn');
|
|
467
|
-
await page.waitForSelector('.bm-menu', { state: 'visible' });
|
|
468
|
-
|
|
469
|
-
// Click logout
|
|
470
|
-
await page.click('#logout_sidebar_link');
|
|
471
|
-
await page.waitForURL('**/');
|
|
472
|
-
|
|
473
|
-
// Verify back on login page
|
|
474
|
-
const loginButton = await page.$('#login-button');
|
|
475
|
-
assert(loginButton !== null, 'Back on login page after logout');
|
|
476
|
-
|
|
477
|
-
} finally {
|
|
478
|
-
await browser.close();
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
async function testMenuNavigation() {
|
|
483
|
-
log('\n[Test 12] Menu navigation', 'info');
|
|
484
|
-
|
|
485
|
-
const browser = await chromium.launch({ headless: true });
|
|
486
|
-
const context = await browser.newContext();
|
|
487
|
-
const page = await context.newPage();
|
|
488
|
-
|
|
489
|
-
try {
|
|
490
|
-
// Login
|
|
491
|
-
await page.goto(BASE_URL);
|
|
492
|
-
await page.fill('#user-name', 'standard_user');
|
|
493
|
-
await page.fill('#password', 'secret_sauce');
|
|
494
|
-
await page.click('#login-button');
|
|
495
|
-
await page.waitForURL('**/inventory.html');
|
|
496
|
-
|
|
497
|
-
// Open menu
|
|
498
|
-
await page.click('#react-burger-menu-btn');
|
|
499
|
-
await page.waitForSelector('.bm-menu', { state: 'visible' });
|
|
500
|
-
|
|
501
|
-
// Check menu items
|
|
502
|
-
const allItemsLink = await page.$('#inventory_sidebar_link');
|
|
503
|
-
assert(allItemsLink !== null, 'All Items link exists');
|
|
504
|
-
|
|
505
|
-
const aboutLink = await page.$('#about_sidebar_link');
|
|
506
|
-
assert(aboutLink !== null, 'About link exists');
|
|
507
|
-
|
|
508
|
-
const logoutLink = await page.$('#logout_sidebar_link');
|
|
509
|
-
assert(logoutLink !== null, 'Logout link exists');
|
|
510
|
-
|
|
511
|
-
const resetLink = await page.$('#reset_sidebar_link');
|
|
512
|
-
assert(resetLink !== null, 'Reset App State link exists');
|
|
513
|
-
|
|
514
|
-
// Close menu
|
|
515
|
-
await page.click('#react-burger-cross-btn');
|
|
516
|
-
await page.waitForSelector('.bm-menu', { state: 'hidden' }).catch(() => {});
|
|
517
|
-
|
|
518
|
-
} finally {
|
|
519
|
-
await browser.close();
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
async function testAboutLink() {
|
|
524
|
-
log('\n[Test 13] About link', 'info');
|
|
525
|
-
|
|
526
|
-
const browser = await chromium.launch({ headless: true });
|
|
527
|
-
const context = await browser.newContext();
|
|
528
|
-
const page = await context.newPage();
|
|
529
|
-
|
|
530
|
-
try {
|
|
531
|
-
// Login
|
|
532
|
-
await page.goto(BASE_URL);
|
|
533
|
-
await page.fill('#user-name', 'standard_user');
|
|
534
|
-
await page.fill('#password', 'secret_sauce');
|
|
535
|
-
await page.click('#login-button');
|
|
536
|
-
await page.waitForURL('**/inventory.html');
|
|
537
|
-
|
|
538
|
-
// Open menu
|
|
539
|
-
await page.click('#react-burger-menu-btn');
|
|
540
|
-
await page.waitForSelector('.bm-menu', { state: 'visible' });
|
|
541
|
-
|
|
542
|
-
// Click About (should open saucelabs.com)
|
|
543
|
-
const newPagePromise = context.waitForEvent('page');
|
|
544
|
-
await page.click('#about_sidebar_link');
|
|
545
|
-
|
|
546
|
-
const newPage = await newPagePromise;
|
|
547
|
-
await newPage.waitForLoadState('networkidle');
|
|
548
|
-
|
|
549
|
-
const newUrl = newPage.url();
|
|
550
|
-
assert(newUrl.includes('saucelabs.com'), 'Opened SauceLabs website');
|
|
551
|
-
|
|
552
|
-
} finally {
|
|
553
|
-
await browser.close();
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
async function testCartRemoval() {
|
|
558
|
-
log('\n[Test 14] Remove from cart page', 'info');
|
|
559
|
-
|
|
560
|
-
const browser = await chromium.launch({ headless: true });
|
|
561
|
-
const context = await browser.newContext();
|
|
562
|
-
const page = await context.newPage();
|
|
563
|
-
|
|
564
|
-
try {
|
|
565
|
-
// Login
|
|
566
|
-
await page.goto(BASE_URL);
|
|
567
|
-
await page.fill('#user-name', 'standard_user');
|
|
568
|
-
await page.fill('#password', 'secret_sauce');
|
|
569
|
-
await page.click('#login-button');
|
|
570
|
-
await page.waitForURL('**/inventory.html');
|
|
571
|
-
|
|
572
|
-
// Add item
|
|
573
|
-
await page.click('.inventory_item:first-child button');
|
|
574
|
-
await page.waitForTimeout(500);
|
|
575
|
-
|
|
576
|
-
// Go to cart
|
|
577
|
-
await page.click('.shopping_cart_link');
|
|
578
|
-
await page.waitForURL('**/cart.html');
|
|
579
|
-
|
|
580
|
-
// Remove item from cart
|
|
581
|
-
await page.click('.cart_item button');
|
|
582
|
-
|
|
583
|
-
// Verify cart is empty
|
|
584
|
-
const cartItems = await page.locator('.cart_item').count();
|
|
585
|
-
assertEqual(cartItems, 0, 'Cart is empty after removal');
|
|
586
|
-
|
|
587
|
-
} finally {
|
|
588
|
-
await browser.close();
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
async function testContinueShopping() {
|
|
593
|
-
log('\n[Test 15] Continue shopping button', 'info');
|
|
594
|
-
|
|
595
|
-
const browser = await chromium.launch({ headless: true });
|
|
596
|
-
const context = await browser.newContext();
|
|
597
|
-
const page = await context.newPage();
|
|
598
|
-
|
|
599
|
-
try {
|
|
600
|
-
// Login
|
|
601
|
-
await page.goto(BASE_URL);
|
|
602
|
-
await page.fill('#user-name', 'standard_user');
|
|
603
|
-
await page.fill('#password', 'secret_sauce');
|
|
604
|
-
await page.click('#login-button');
|
|
605
|
-
await page.waitForURL('**/inventory.html');
|
|
606
|
-
|
|
607
|
-
// Add item
|
|
608
|
-
await page.click('.inventory_item:first-child button');
|
|
609
|
-
await page.waitForTimeout(500);
|
|
610
|
-
|
|
611
|
-
// Go to cart
|
|
612
|
-
await page.click('.shopping_cart_link');
|
|
613
|
-
await page.waitForURL('**/cart.html');
|
|
614
|
-
|
|
615
|
-
// Click continue shopping
|
|
616
|
-
await page.click('#continue-shopping');
|
|
617
|
-
await page.waitForURL('**/inventory.html');
|
|
618
|
-
|
|
619
|
-
const currentUrl = page.url();
|
|
620
|
-
assert(currentUrl.includes('inventory.html'), 'Back to inventory page');
|
|
621
|
-
|
|
622
|
-
} finally {
|
|
623
|
-
await browser.close();
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
async function testCheckoutCancel() {
|
|
628
|
-
log('\n[Test 16] Checkout cancel', 'info');
|
|
629
|
-
|
|
630
|
-
const browser = await chromium.launch({ headless: true });
|
|
631
|
-
const context = await browser.newContext();
|
|
632
|
-
const page = await context.newPage();
|
|
633
|
-
|
|
634
|
-
try {
|
|
635
|
-
// Login
|
|
636
|
-
await page.goto(BASE_URL);
|
|
637
|
-
await page.fill('#user-name', 'standard_user');
|
|
638
|
-
await page.fill('#password', 'secret_sauce');
|
|
639
|
-
await page.click('#login-button');
|
|
640
|
-
await page.waitForURL('**/inventory.html');
|
|
641
|
-
|
|
642
|
-
// Add item
|
|
643
|
-
await page.click('.inventory_item:first-child button');
|
|
644
|
-
await page.waitForTimeout(500);
|
|
645
|
-
|
|
646
|
-
// Go to cart and checkout
|
|
647
|
-
await page.click('.shopping_cart_link');
|
|
648
|
-
await page.waitForURL('**/cart.html');
|
|
649
|
-
await page.click('#checkout');
|
|
650
|
-
await page.waitForURL('**/checkout-step-one.html');
|
|
651
|
-
|
|
652
|
-
// Cancel checkout
|
|
653
|
-
await page.click('#cancel');
|
|
654
|
-
await page.waitForURL('**/cart.html');
|
|
655
|
-
|
|
656
|
-
const currentUrl = page.url();
|
|
657
|
-
assert(currentUrl.includes('cart.html'), 'Back to cart page');
|
|
658
|
-
|
|
659
|
-
} finally {
|
|
660
|
-
await browser.close();
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// ============================================================================
|
|
665
|
-
// MAIN
|
|
666
|
-
// ============================================================================
|
|
667
|
-
|
|
668
|
-
async function main() {
|
|
669
|
-
log('\nQA360 Real-World E2E Tests - SauceDemo', 'info');
|
|
670
|
-
log('='.repeat(60), 'info');
|
|
671
|
-
|
|
672
|
-
const tests = [
|
|
673
|
-
testHomePageLoads,
|
|
674
|
-
testValidLogin,
|
|
675
|
-
testInvalidLogin,
|
|
676
|
-
testProductListing,
|
|
677
|
-
testAddToCart,
|
|
678
|
-
testRemoveFromCart,
|
|
679
|
-
testCartPage,
|
|
680
|
-
testSortProducts,
|
|
681
|
-
testProductDetails,
|
|
682
|
-
testCheckoutFlow,
|
|
683
|
-
testLogout,
|
|
684
|
-
testMenuNavigation,
|
|
685
|
-
testAboutLink,
|
|
686
|
-
testCartRemoval,
|
|
687
|
-
testContinueShopping,
|
|
688
|
-
testCheckoutCancel,
|
|
689
|
-
];
|
|
690
|
-
|
|
691
|
-
for (const test of tests) {
|
|
692
|
-
try {
|
|
693
|
-
await test();
|
|
694
|
-
} catch (error) {
|
|
695
|
-
if (!error.message.includes('Assertion failed')) {
|
|
696
|
-
log(` ERROR ${error.message}`, 'error');
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
log('\n' + '='.repeat(60), 'info');
|
|
702
|
-
log(`\nResults: ${testsPassed} passed, ${testsFailed} failed`, 'info');
|
|
703
|
-
|
|
704
|
-
if (testsFailed > 0) {
|
|
705
|
-
process.exit(1);
|
|
706
|
-
} else {
|
|
707
|
-
log('\nAll real-world E2E tests passed!', 'success');
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
main().catch(error => {
|
|
712
|
-
console.error(error);
|
|
713
|
-
process.exit(1);
|
|
714
|
-
});
|