qa360 2.2.20 → 2.3.1
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/README.md +155 -262
- package/{cli/dist → dist}/commands/ai.js +1 -1
- package/{cli/dist → dist}/commands/coverage.js +1 -1
- package/{cli/dist → dist}/commands/crawl.d.ts +12 -1
- package/{cli/dist → dist}/commands/crawl.js +70 -9
- package/{cli/dist → dist}/commands/doctor.js +2 -2
- package/{cli/dist → dist}/commands/explain.js +2 -2
- package/{cli/dist → dist}/commands/flakiness.js +1 -1
- package/{cli/dist → dist}/commands/generate.js +1 -1
- package/{cli/dist → dist}/commands/history.js +1 -1
- package/{cli/dist → dist}/commands/monitor.js +3 -3
- package/{cli/dist → dist}/commands/ollama.js +1 -1
- package/{cli/dist → dist}/commands/pack.js +2 -2
- package/{cli/dist → dist}/commands/regression.js +1 -1
- package/{cli/dist → dist}/commands/repair.js +1 -1
- package/{cli/dist → dist}/commands/retry.js +1 -1
- package/{cli/dist → dist}/commands/run.d.ts +1 -1
- package/{cli/dist → dist}/commands/run.js +1 -1
- package/{cli/dist → dist}/commands/secrets.js +1 -1
- package/{cli/dist → dist}/commands/serve.js +1 -1
- package/{cli/dist → dist}/commands/slo.js +1 -1
- package/{cli/dist → dist}/commands/verify.js +1 -1
- package/{cli/dist → dist}/core/adapters/playwright-native-api.d.ts +2 -0
- package/{cli/dist → dist}/core/adapters/playwright-native-api.js +20 -1
- package/{cli/dist → dist}/core/adapters/playwright-ui.d.ts +21 -0
- package/dist/core/adapters/playwright-ui.js +2050 -0
- package/{cli/dist → dist}/core/ai/ollama-provider.js +15 -3
- package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
- package/dist/core/auth/backup-codes-provider.d.ts +91 -0
- package/dist/core/auth/backup-codes-provider.js +215 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
- package/dist/core/auth/digest-auth-provider.d.ts +116 -0
- package/dist/core/auth/digest-auth-provider.js +244 -0
- package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
- package/dist/core/auth/hcaptcha-handler.js +288 -0
- package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
- package/{cli/dist → dist}/core/auth/index.js +15 -1
- package/dist/core/auth/oauth-handler.d.ts +408 -0
- package/dist/core/auth/oauth-handler.js +636 -0
- package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
- package/dist/core/auth/oauth2-provider.js +227 -0
- package/dist/core/auth/otp-provider.d.ts +93 -0
- package/dist/core/auth/otp-provider.js +288 -0
- package/dist/core/auth/recaptcha-handler.d.ts +119 -0
- package/dist/core/auth/recaptcha-handler.js +301 -0
- package/dist/core/auth/remember-me-handler.d.ts +142 -0
- package/dist/core/auth/remember-me-handler.js +255 -0
- package/dist/core/auth/saml-handler.d.ts +173 -0
- package/dist/core/auth/saml-handler.js +364 -0
- package/dist/core/auth/webauthn-handler.d.ts +182 -0
- package/dist/core/auth/webauthn-handler.js +310 -0
- package/dist/core/crawler/advanced-interactions.d.ts +342 -0
- package/dist/core/crawler/advanced-interactions.js +1069 -0
- package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
- package/dist/core/crawler/blob-url-download-handler.js +392 -0
- package/dist/core/crawler/consent-handler.d.ts +49 -0
- package/dist/core/crawler/consent-handler.js +258 -0
- package/dist/core/crawler/cookie-manager.d.ts +166 -0
- package/dist/core/crawler/cookie-manager.js +353 -0
- package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
- package/dist/core/crawler/coop-coep-handler.js +338 -0
- package/dist/core/crawler/csp-handler.d.ts +151 -0
- package/dist/core/crawler/csp-handler.js +415 -0
- package/dist/core/crawler/download-handler.d.ts +155 -0
- package/dist/core/crawler/download-handler.js +370 -0
- package/dist/core/crawler/email-testing-handler.d.ts +214 -0
- package/dist/core/crawler/email-testing-handler.js +398 -0
- package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
- package/dist/core/crawler/error-tracking-handler.js +378 -0
- package/dist/core/crawler/form-handler.d.ts +100 -0
- package/dist/core/crawler/form-handler.js +465 -0
- package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
- package/dist/core/crawler/framework-wait-handler.js +464 -0
- package/dist/core/crawler/geolocation-handler.d.ts +112 -0
- package/dist/core/crawler/geolocation-handler.js +276 -0
- package/dist/core/crawler/index.d.ts +78 -0
- package/{cli/dist → dist}/core/crawler/index.js +74 -1
- package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
- package/dist/core/crawler/intelligent-selector-generator.js +612 -0
- package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
- package/dist/core/crawler/permissions-handler.d.ts +112 -0
- package/dist/core/crawler/permissions-handler.js +236 -0
- package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
- package/dist/core/crawler/permissions-policy-handler.js +402 -0
- package/dist/core/crawler/presets.d.ts +100 -0
- package/dist/core/crawler/presets.js +887 -0
- package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
- package/dist/core/crawler/repl-debug-handler.js +552 -0
- package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
- package/dist/core/crawler/reporting-api-handler.js +344 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
- package/dist/core/crawler/site-profiler.d.ts +89 -0
- package/dist/core/crawler/site-profiler.js +290 -0
- package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
- package/dist/core/crawler/sourcemaps-handler.js +420 -0
- package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
- package/dist/core/crawler/stacked-modals-handler.js +429 -0
- package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
- package/dist/core/crawler/trusted-types-handler.js +413 -0
- package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
- package/dist/core/crawler/wait-strategies.d.ts +108 -0
- package/dist/core/crawler/wait-strategies.js +399 -0
- package/dist/core/fixtures/factories.d.ts +180 -0
- package/dist/core/fixtures/factories.js +279 -0
- package/dist/core/fixtures/index.d.ts +6 -0
- package/dist/core/fixtures/index.js +6 -0
- package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
- package/dist/core/generation/crawler-pack-generator.js +232 -0
- package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
- package/{cli/dist → dist}/core/generation/index.js +2 -0
- package/{cli/dist → dist}/core/index.d.ts +2 -0
- package/{cli/dist → dist}/core/index.js +4 -0
- package/dist/core/network/index.d.ts +7 -0
- package/dist/core/network/index.js +7 -0
- package/dist/core/network/network-manager.d.ts +237 -0
- package/dist/core/network/network-manager.js +343 -0
- package/dist/core/network/network-simulator.d.ts +158 -0
- package/dist/core/network/network-simulator.js +261 -0
- package/{cli/dist → dist}/core/pack/validator.js +2 -2
- package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
- package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
- package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
- package/{cli/dist → dist}/core/pom/base-page.js +1 -1
- package/{cli/dist → dist}/core/pom/loader.js +1 -1
- package/dist/core/reporting/index.d.ts +9 -0
- package/dist/core/reporting/index.js +10 -0
- package/dist/core/reporting/junit-reporter.d.ts +114 -0
- package/dist/core/reporting/junit-reporter.js +306 -0
- package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
- package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
- package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
- package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
- package/dist/core/sharding/test-sharding.d.ts +137 -0
- package/dist/core/sharding/test-sharding.js +233 -0
- package/dist/core/storage/cookie-manager.d.ts +160 -0
- package/dist/core/storage/cookie-manager.js +268 -0
- package/dist/core/storage/index.d.ts +7 -0
- package/dist/core/storage/index.js +7 -0
- package/dist/core/storage/storage-helpers.d.ts +138 -0
- package/dist/core/storage/storage-helpers.js +315 -0
- package/dist/core/test-helpers/index.d.ts +6 -0
- package/dist/core/test-helpers/index.js +6 -0
- package/dist/core/test-helpers/state-reset.d.ts +119 -0
- package/dist/core/test-helpers/state-reset.js +234 -0
- package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
- package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
- package/dist/core/upload/chunked-uploader.d.ts +150 -0
- package/dist/core/upload/chunked-uploader.js +289 -0
- package/dist/core/upload/index.d.ts +11 -0
- package/dist/core/upload/index.js +8 -0
- package/dist/core/upload/mime-validator.d.ts +119 -0
- package/dist/core/upload/mime-validator.js +373 -0
- package/dist/core/upload/presigned-uploader.d.ts +118 -0
- package/dist/core/upload/presigned-uploader.js +274 -0
- package/dist/core/utils/device-emulation.d.ts +194 -0
- package/dist/core/utils/device-emulation.js +380 -0
- package/dist/core/utils/index.d.ts +8 -0
- package/dist/core/utils/index.js +8 -0
- package/dist/core/utils/retry.d.ts +145 -0
- package/dist/core/utils/retry.js +242 -0
- package/dist/core/utils/smart-wait.d.ts +133 -0
- package/dist/core/utils/smart-wait.js +417 -0
- package/dist/core/visual/index.d.ts +7 -0
- package/dist/core/visual/index.js +7 -0
- package/dist/core/visual/pixel-diff.d.ts +87 -0
- package/dist/core/visual/pixel-diff.js +213 -0
- package/dist/core/visual/screenshot-helper.d.ts +130 -0
- package/dist/core/visual/screenshot-helper.js +223 -0
- package/{cli/dist → dist}/utils/config.d.ts +1 -1
- package/examples/README.md +160 -0
- package/examples/accessibility.yml +48 -0
- package/examples/api-basic.yml +27 -0
- package/examples/complete.yml +146 -0
- package/examples/crawler.yml +38 -0
- package/examples/fullstack.yml +78 -0
- package/examples/security.yml +58 -0
- package/examples/ui-advanced.yml +49 -0
- package/examples/ui-basic.yml +24 -0
- package/package.json +33 -67
- package/CHANGELOG.md +0 -262
- package/CONTRIBUTING.md +0 -273
- package/QUICK_START.md +0 -191
- package/cli/CHANGELOG.md +0 -84
- package/cli/LICENSE +0 -24
- package/cli/README.md +0 -222
- package/cli/dist/core/adapters/playwright-ui.js +0 -864
- package/cli/dist/core/auth/oauth2-provider.js +0 -114
- package/cli/dist/core/coverage/analyzer.d.ts +0 -101
- package/cli/dist/core/coverage/analyzer.js +0 -415
- package/cli/dist/core/coverage/collector.d.ts +0 -74
- package/cli/dist/core/coverage/collector.js +0 -459
- package/cli/dist/core/coverage/config.d.ts +0 -37
- package/cli/dist/core/coverage/config.js +0 -156
- package/cli/dist/core/coverage/index.d.ts +0 -11
- package/cli/dist/core/coverage/index.js +0 -15
- package/cli/dist/core/coverage/types.d.ts +0 -267
- package/cli/dist/core/coverage/types.js +0 -6
- package/cli/dist/core/coverage/vault.d.ts +0 -95
- package/cli/dist/core/coverage/vault.js +0 -405
- package/cli/dist/core/crawler/index.d.ts +0 -57
- package/cli/dist/core/fixtures/index.d.ts +0 -8
- package/cli/dist/core/fixtures/index.js +0 -8
- package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
- package/cli/dist/core/reporting/index.d.ts +0 -6
- package/cli/dist/core/reporting/index.js +0 -6
- package/cli/dist/core/visual/index.d.ts +0 -6
- package/cli/dist/core/visual/index.js +0 -6
- package/cli/package.json +0 -76
- package/core/LICENSE +0 -24
- package/core/README.md +0 -64
- package/core/package.json +0 -81
- package/core/schemas/pack.schema.json +0 -236
- /package/{cli/bin → bin}/qa360.js +0 -0
- /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
- /package/{cli/dist → dist}/cli-minimal.js +0 -0
- /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.js +0 -0
- /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
- /package/{cli/dist → dist}/commands/doctor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.js +0 -0
- /package/{cli/dist → dist}/commands/explain.d.ts +0 -0
- /package/{cli/dist → dist}/commands/flakiness.d.ts +0 -0
- /package/{cli/dist → dist}/commands/generate.d.ts +0 -0
- /package/{cli/dist → dist}/commands/history.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.js +0 -0
- /package/{cli/dist → dist}/commands/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ollama.d.ts +0 -0
- /package/{cli/dist → dist}/commands/pack.d.ts +0 -0
- /package/{cli/dist → dist}/commands/regression.d.ts +0 -0
- /package/{cli/dist → dist}/commands/repair.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.js +0 -0
- /package/{cli/dist → dist}/commands/retry.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.js +0 -0
- /package/{cli/dist → dist}/commands/secrets.d.ts +0 -0
- /package/{cli/dist → dist}/commands/serve.d.ts +0 -0
- /package/{cli/dist → dist}/commands/slo.d.ts +0 -0
- /package/{cli/dist → dist}/commands/verify.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.js +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.js +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.js +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.js +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.js +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.js +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/index.js +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.js +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/ollama-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/ui-artifacts.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.js +0 -0
- /package/{cli/dist → dist}/core/assertions/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/index.js +0 -0
- /package/{cli/dist → dist}/core/assertions/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/types.js +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/manager.js +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.js +0 -0
- /package/{cli/dist → dist}/core/cache/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/index.js +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.js +0 -0
- /package/{cli/dist → dist}/core/crawler/journey-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/crawler/types.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.js +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.js +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.js +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.js +0 -0
- /package/{cli/dist → dist}/core/generation/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/types.js +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.js +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.js +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.js +0 -0
- /package/{cli/dist → dist}/core/pack/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.js +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.js +0 -0
- /package/{cli/dist → dist}/core/pom/base-page.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.js +0 -0
- /package/{cli/dist → dist}/core/pom/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.js +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.js +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.js +0 -0
- /package/{cli/dist → dist}/core/proof/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/index.js +0 -0
- /package/{cli/dist → dist}/core/proof/schema.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/schema.js +0 -0
- /package/{cli/dist → dist}/core/proof/signer.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/signer.js +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.js +0 -0
- /package/{cli/dist → dist}/core/regression/detector.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/detector.js +0 -0
- /package/{cli/dist → dist}/core/regression/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/index.js +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/regression/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/types.js +0 -0
- /package/{cli/dist → dist}/core/regression/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/vault.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.js +0 -0
- /package/{cli/dist → dist}/core/repair/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/index.js +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.js +0 -0
- /package/{cli/dist → dist}/core/repair/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/types.js +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.js +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.js +0 -0
- /package/{cli/dist → dist}/core/retry/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/index.js +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.js +0 -0
- /package/{cli/dist → dist}/core/retry/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/types.js +0 -0
- /package/{cli/dist → dist}/core/retry/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/vault.js +0 -0
- /package/{cli/dist → dist}/core/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.js +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.js +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.js +0 -0
- /package/{cli/dist → dist}/core/security/redactor.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redactor.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.js +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.js +0 -0
- /package/{cli/dist → dist}/core/serve/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/index.js +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.js +0 -0
- /package/{cli/dist → dist}/core/serve/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/server.js +0 -0
- /package/{cli/dist → dist}/core/slo/config.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/config.js +0 -0
- /package/{cli/dist → dist}/core/slo/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/index.js +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.js +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.js +0 -0
- /package/{cli/dist → dist}/core/slo/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/types.js +0 -0
- /package/{cli/dist → dist}/core/slo/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/vault.js +0 -0
- /package/{cli/dist → dist}/core/tui/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/index.js +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.js +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.js +0 -0
- /package/{cli/dist → dist}/core/tui/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/types.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v1.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v2.js +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.d.ts +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.js +0 -0
- /package/{cli/dist → dist}/core/vault/cas.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/cas.js +0 -0
- /package/{cli/dist → dist}/core/vault/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/index.js +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.d.ts +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.js +0 -0
- /package/{cli/dist → dist}/core/watch/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/index.js +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.js +0 -0
- /package/{cli/dist → dist}/generators/index.d.ts +0 -0
- /package/{cli/dist → dist}/generators/index.js +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.js +0 -0
- /package/{cli/dist → dist}/generators/test-generator.d.ts +0 -0
- /package/{cli/dist → dist}/generators/test-generator.js +0 -0
- /package/{cli/dist → dist}/index.d.ts +0 -0
- /package/{cli/dist → dist}/index.js +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.js +0 -0
- /package/{cli/dist → dist}/scanners/index.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/index.js +0 -0
- /package/{cli/dist → dist}/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/types/scan.d.ts +0 -0
- /package/{cli/dist → dist}/types/scan.js +0 -0
- /package/{cli/dist → dist}/utils/config.js +0 -0
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* QA360 Crawl Command
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Universal crawler for all types of web applications.
|
|
5
|
+
* Supports presets for different platform types and custom auth/test data.
|
|
5
6
|
*/
|
|
6
7
|
import { Command } from 'commander';
|
|
7
8
|
import chalk from 'chalk';
|
|
8
9
|
import ora from 'ora';
|
|
9
|
-
import { generatePackFromCrawl, quickCrawl } from '
|
|
10
|
+
import { generatePackFromCrawl, quickCrawl } from '../core/index.js';
|
|
11
|
+
import { detectPresetFromUrl, getAllPresets, getPreset, getPresetList } from '../core/index.js';
|
|
10
12
|
/**
|
|
11
13
|
* Create crawl command
|
|
12
14
|
*/
|
|
13
15
|
export function createCrawlCommand() {
|
|
14
16
|
const cmd = new Command('crawl')
|
|
15
|
-
.description('
|
|
16
|
-
.argument('
|
|
17
|
+
.description('Universal crawler - Generate E2E tests for ANY website')
|
|
18
|
+
.argument('[url]', 'Website URL to crawl (required unless --list-presets)')
|
|
17
19
|
.option('-o, --output <file>', 'Output pack file path', 'pack.yml')
|
|
18
20
|
.option('--name <name>', 'Pack name')
|
|
21
|
+
.option('--preset <type>', 'Platform preset (ecommerce, saas, social, booking, job, etc.)')
|
|
22
|
+
.option('--list-presets', 'List all available presets')
|
|
19
23
|
.option('--max-depth <number>', 'Maximum crawl depth', '2')
|
|
20
24
|
.option('--max-pages <number>', 'Maximum pages to crawl', '20')
|
|
21
25
|
.option('--headed', 'Run crawler in headed mode (visible browser)')
|
|
22
26
|
.option('--a11y', 'Include accessibility tests')
|
|
23
27
|
.option('--exclude <patterns...>', 'URL patterns to exclude')
|
|
28
|
+
.option('--only <patterns...>', 'Only crawl URLs matching these patterns')
|
|
29
|
+
.option('--scenario <type>', 'Focus on specific scenario (login, checkout, etc.)')
|
|
30
|
+
.option('--auth-email <email>', 'Email for auto-authentication')
|
|
31
|
+
.option('--auth-password <password>', 'Password for auto-authentication')
|
|
32
|
+
.option('--auth-url <path>', 'Login page URL (default: auto-detect)')
|
|
33
|
+
.option('--test-data <json>', 'Test data as JSON string')
|
|
34
|
+
.option('--viewport <size>', 'Browser viewport size (default: 1280x720)')
|
|
35
|
+
.option('--slow-mo <ms>', 'Slow down actions by ms (for debugging)')
|
|
24
36
|
.option('--quick', 'Quick crawl (depth=1, max-pages=10)')
|
|
25
37
|
.action(async (url, options) => {
|
|
26
38
|
await crawlCommand(url, options);
|
|
@@ -31,10 +43,36 @@ export function createCrawlCommand() {
|
|
|
31
43
|
* Crawl command handler
|
|
32
44
|
*/
|
|
33
45
|
export async function crawlCommand(url, options = {}) {
|
|
34
|
-
|
|
46
|
+
// Handle --list-presets
|
|
47
|
+
if (options.listPresets) {
|
|
48
|
+
console.log(getPresetList());
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Validate URL is provided when not listing presets
|
|
52
|
+
if (!url) {
|
|
53
|
+
console.error(chalk.red('Error: URL is required when not using --list-presets'));
|
|
54
|
+
console.log(chalk.yellow('\nUsage: qa360 crawl <url> [options]'));
|
|
55
|
+
console.log(chalk.gray('Example: qa360 crawl https://example.com'));
|
|
56
|
+
console.log(chalk.gray('\nRun "qa360 crawl --list-presets" to see all platform types'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const spinner = ora('Initializing universal crawler...').start();
|
|
35
60
|
try {
|
|
36
61
|
// Validate URL
|
|
37
62
|
new URL(url);
|
|
63
|
+
// Determine preset
|
|
64
|
+
let preset = options.preset ? getPreset(options.preset) : detectPresetFromUrl(url);
|
|
65
|
+
if (!preset && !options.preset) {
|
|
66
|
+
spinner.info('No preset specified, using generic preset');
|
|
67
|
+
preset = getAllPresets().find(p => p.id === 'generic');
|
|
68
|
+
}
|
|
69
|
+
else if (options.preset && !preset) {
|
|
70
|
+
spinner.warn(`Preset "${options.preset}" not found, using generic`);
|
|
71
|
+
preset = getAllPresets().find(p => p.id === 'generic');
|
|
72
|
+
}
|
|
73
|
+
if (preset) {
|
|
74
|
+
spinner.text = `Crawling with preset: ${preset.name}`;
|
|
75
|
+
}
|
|
38
76
|
if (options.quick) {
|
|
39
77
|
spinner.info('Running quick crawl...');
|
|
40
78
|
const result = await quickCrawl(url, options.output);
|
|
@@ -51,19 +89,32 @@ export async function crawlCommand(url, options = {}) {
|
|
|
51
89
|
console.error(chalk.red(result.error));
|
|
52
90
|
return;
|
|
53
91
|
}
|
|
54
|
-
// Full crawl
|
|
55
|
-
spinner.info(
|
|
92
|
+
// Full crawl with preset support
|
|
93
|
+
spinner.info(`Crawling ${url}...`);
|
|
94
|
+
if (preset) {
|
|
95
|
+
spinner.text = `Using preset: ${preset.name}`;
|
|
96
|
+
}
|
|
97
|
+
// Build crawl options with preset data
|
|
56
98
|
const crawlOptions = {
|
|
57
99
|
baseUrl: url,
|
|
58
100
|
output: options.output,
|
|
59
101
|
packName: options.name,
|
|
60
102
|
includeA11y: options.a11y,
|
|
103
|
+
preset,
|
|
61
104
|
crawl: {
|
|
62
105
|
maxDepth: options.quick ? 1 : parseInt(options.maxDepth || '2', 10),
|
|
63
106
|
maxPages: options.quick ? 10 : parseInt(options.maxPages || '20', 10),
|
|
64
107
|
headless: !options.headed,
|
|
65
108
|
excludePatterns: options.exclude,
|
|
109
|
+
onlyPatterns: options.only,
|
|
66
110
|
},
|
|
111
|
+
auth: (options.authEmail || options.authPassword) ? {
|
|
112
|
+
email: options.authEmail,
|
|
113
|
+
password: options.authPassword,
|
|
114
|
+
// Only set URL if explicitly provided - otherwise let crawler intelligently detect the login page
|
|
115
|
+
...(options.authUrl && { url: options.authUrl })
|
|
116
|
+
} : undefined,
|
|
117
|
+
scenario: options.scenario,
|
|
67
118
|
};
|
|
68
119
|
const result = await generatePackFromCrawl(crawlOptions);
|
|
69
120
|
if (result.success) {
|
|
@@ -79,6 +130,14 @@ export async function crawlCommand(url, options = {}) {
|
|
|
79
130
|
if (siteMap.metadata.avgLoadTime) {
|
|
80
131
|
console.log(` Avg page load: ${chalk.gray(siteMap.metadata.avgLoadTime + 'ms')}`);
|
|
81
132
|
}
|
|
133
|
+
// Show preset info
|
|
134
|
+
if (preset) {
|
|
135
|
+
console.log(chalk.bold('\n Platform Type:'));
|
|
136
|
+
console.log(` ${chalk.cyan(preset.name)} - ${preset.description}`);
|
|
137
|
+
if (preset.scenarios && preset.scenarios.length > 0) {
|
|
138
|
+
console.log(chalk.gray(' Scenarios:'), preset.scenarios.slice(0, 4).join(', '));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
82
141
|
// Show journeys
|
|
83
142
|
if (userJourneys.length > 0) {
|
|
84
143
|
console.log(chalk.bold('\n Generated Journeys:'));
|
|
@@ -100,8 +159,9 @@ export async function crawlCommand(url, options = {}) {
|
|
|
100
159
|
console.log(chalk.bold('\n✅ Crawl complete!'));
|
|
101
160
|
console.log(chalk.gray(`\nNext steps:`));
|
|
102
161
|
console.log(chalk.gray(` 1. Review the generated pack: ${chalk.cyan(options.output || 'pack.yml')}`));
|
|
103
|
-
console.log(chalk.gray(` 2.
|
|
104
|
-
console.log(chalk.gray(` 3. Run
|
|
162
|
+
console.log(chalk.gray(` 2. Edit test data if needed (credentials, payment info, etc.)`));
|
|
163
|
+
console.log(chalk.gray(` 3. Run tests: ${chalk.cyan('qa360 run ' + (options.output || 'pack.yml'))}`));
|
|
164
|
+
console.log(chalk.gray(` 4. Run in headed mode: ${chalk.cyan('qa360 run --headed ' + (options.output || 'pack.yml'))}`));
|
|
105
165
|
}
|
|
106
166
|
else {
|
|
107
167
|
spinner.fail('Crawl failed');
|
|
@@ -115,6 +175,7 @@ export async function crawlCommand(url, options = {}) {
|
|
|
115
175
|
if (error instanceof Error && error.message.includes('URL')) {
|
|
116
176
|
console.log(chalk.yellow('\nUsage: qa360 crawl <url> [options]'));
|
|
117
177
|
console.log(chalk.gray('Example: qa360 crawl https://example.com'));
|
|
178
|
+
console.log(chalk.gray('\nRun "qa360 crawl --list-presets" to see all platform types'));
|
|
118
179
|
}
|
|
119
180
|
}
|
|
120
181
|
}
|
|
@@ -255,7 +255,7 @@ export class QA360Doctor {
|
|
|
255
255
|
}
|
|
256
256
|
async checkProofKeys() {
|
|
257
257
|
try {
|
|
258
|
-
const { ensureProofKeys } = await import('
|
|
258
|
+
const { ensureProofKeys } = await import('../core/index.js');
|
|
259
259
|
const result = await ensureProofKeys(this.qa360Dir);
|
|
260
260
|
// Validate result
|
|
261
261
|
if (!result) {
|
|
@@ -300,7 +300,7 @@ export class QA360Doctor {
|
|
|
300
300
|
}
|
|
301
301
|
async checkProofRoundtrip() {
|
|
302
302
|
try {
|
|
303
|
-
const coreModule = await import('
|
|
303
|
+
const coreModule = await import('../core/index.js');
|
|
304
304
|
const { generateKeys, createProofBundle, verifyProofBundle } = coreModule;
|
|
305
305
|
// Guard: Verify exports are functions
|
|
306
306
|
if (typeof generateKeys !== 'function') {
|
|
@@ -17,8 +17,8 @@ import chalk from 'chalk';
|
|
|
17
17
|
import ora from 'ora';
|
|
18
18
|
import { join } from 'path';
|
|
19
19
|
import { existsSync } from 'fs';
|
|
20
|
-
import { createBest, createLLMProvider } from '
|
|
21
|
-
import { EvidenceVault } from '
|
|
20
|
+
import { createBest, createLLMProvider } from '../core/index.js';
|
|
21
|
+
import { EvidenceVault } from '../core/index.js';
|
|
22
22
|
/**
|
|
23
23
|
* Static error code database
|
|
24
24
|
*/
|
|
@@ -8,7 +8,7 @@ import chalk from 'chalk';
|
|
|
8
8
|
import Table from 'cli-table3';
|
|
9
9
|
import { join } from 'path';
|
|
10
10
|
import { existsSync } from 'fs';
|
|
11
|
-
import { EvidenceVault, FLAKINESS_CATEGORIES } from '
|
|
11
|
+
import { EvidenceVault, FLAKINESS_CATEGORIES } from '../core/index.js';
|
|
12
12
|
/**
|
|
13
13
|
* Get the vault directory path
|
|
14
14
|
*/
|
|
@@ -11,7 +11,7 @@ import chalk from 'chalk';
|
|
|
11
11
|
import ora from 'ora';
|
|
12
12
|
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
13
13
|
import { dirname, resolve } from 'path';
|
|
14
|
-
import { generateTests, generateApiTestsFromOpenAPI, generateUiTestsFromUrl, generatePerfTests, generateUnitTests, checkGenerationAvailability, } from '
|
|
14
|
+
import { generateTests, generateApiTestsFromOpenAPI, generateUiTestsFromUrl, generatePerfTests, generateUnitTests, checkGenerationAvailability, } from '../core/index.js';
|
|
15
15
|
/**
|
|
16
16
|
* Create generate commands group
|
|
17
17
|
*/
|
|
@@ -7,7 +7,7 @@ import { existsSync, createWriteStream, readFileSync, statSync, readdirSync, unl
|
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import AdmZip from 'adm-zip';
|
|
10
|
-
import { EvidenceVault } from '
|
|
10
|
+
import { EvidenceVault } from '../core/index.js';
|
|
11
11
|
export class QA360History {
|
|
12
12
|
vault;
|
|
13
13
|
constructor() { }
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
|
-
import { TUIMonitor } from '
|
|
8
|
-
import { DashboardServer, EvidenceVault } from '
|
|
9
|
-
import { Phase3Runner } from '
|
|
7
|
+
import { TUIMonitor } from '../core/index.js';
|
|
8
|
+
import { DashboardServer, EvidenceVault } from '../core/index.js';
|
|
9
|
+
import { Phase3Runner } from '../core/index.js';
|
|
10
10
|
import { existsSync } from 'fs';
|
|
11
11
|
import { join } from 'path';
|
|
12
12
|
import { loadPackConfig } from '../utils/config.js';
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { Command } from 'commander';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import ora from 'ora';
|
|
10
|
-
import { checkOllamaSetup, OllamaProvider, OllamaError } from '
|
|
10
|
+
import { checkOllamaSetup, OllamaProvider, OllamaError } from '../core/index.js';
|
|
11
11
|
import { loadQA360Config, updateQA360Config, getConfigPath } from '../utils/config.js';
|
|
12
12
|
/**
|
|
13
13
|
* Test Ollama connection
|
|
@@ -9,8 +9,8 @@ import { resolve } from 'path';
|
|
|
9
9
|
import chalk from 'chalk';
|
|
10
10
|
import ora from 'ora';
|
|
11
11
|
import * as yaml from 'js-yaml';
|
|
12
|
-
import { PackValidator, PackMigrator as PackMigratorV1 } from '
|
|
13
|
-
import { PackValidatorV2, PackMigrator, PackLoaderV2 } from '
|
|
12
|
+
import { PackValidator, PackMigrator as PackMigratorV1 } from '../core/index.js';
|
|
13
|
+
import { PackValidatorV2, PackMigrator, PackLoaderV2 } from '../core/index.js';
|
|
14
14
|
export class QA360Pack {
|
|
15
15
|
qa360Dir = resolve(process.cwd(), '.qa360');
|
|
16
16
|
packPath = resolve(this.qa360Dir, 'pack.yml');
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* CLI command for regression detection and analysis.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import { createRegressionDetector, createRegressionTrendAnalyzer } from '
|
|
7
|
+
import { createRegressionDetector, createRegressionTrendAnalyzer } from '../core/index.js';
|
|
8
8
|
export const regressionCommand = new Command('regression');
|
|
9
9
|
regressionCommand.description('Regression detection and analysis');
|
|
10
10
|
// Detect regressions
|
|
@@ -7,7 +7,7 @@ import { Command } from 'commander';
|
|
|
7
7
|
import { readFile } from 'fs/promises';
|
|
8
8
|
import { existsSync } from 'fs';
|
|
9
9
|
import { resolve } from 'path';
|
|
10
|
-
import { TestRepairer, analyzeTestErrors, getQuickFixes } from '
|
|
10
|
+
import { TestRepairer, analyzeTestErrors, getQuickFixes } from '../core/index.js';
|
|
11
11
|
/**
|
|
12
12
|
* Parse test output to extract errors
|
|
13
13
|
*/
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { Command } from 'commander';
|
|
7
7
|
import chalk from 'chalk';
|
|
8
8
|
import Table from 'cli-table3';
|
|
9
|
-
import { createSmartRetryEngine, RetryStrategy } from '
|
|
9
|
+
import { createSmartRetryEngine, RetryStrategy } from '../core/index.js';
|
|
10
10
|
/**
|
|
11
11
|
* Display retry statistics in a formatted table
|
|
12
12
|
*/
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* qa360 run --output ./results
|
|
7
7
|
* qa360 run --verbose
|
|
8
8
|
*/
|
|
9
|
-
import { type Phase3RunResult, type PackConfigV1, type PackConfigV2 } from '
|
|
9
|
+
import { type Phase3RunResult, type PackConfigV1, type PackConfigV2 } from '../core/index.js';
|
|
10
10
|
/**
|
|
11
11
|
* CLI options for run command
|
|
12
12
|
*/
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { existsSync } from 'fs';
|
|
10
10
|
import { join, resolve, dirname } from 'path';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
|
-
import { Phase3Runner, PackLoaderV2 } from '
|
|
12
|
+
import { Phase3Runner, PackLoaderV2 } from '../core/index.js';
|
|
13
13
|
/**
|
|
14
14
|
* Format gates for display (handles both v1 array and v2 object formats)
|
|
15
15
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import ora from 'ora';
|
|
7
7
|
import inquirer from 'inquirer';
|
|
8
|
-
import { SecretsManager, SecretsCrypto } from '
|
|
8
|
+
import { SecretsManager, SecretsCrypto } from '../core/index.js';
|
|
9
9
|
export class QA360Secrets {
|
|
10
10
|
manager;
|
|
11
11
|
constructor() {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Démarre le serveur d'observabilité
|
|
4
4
|
*/
|
|
5
5
|
import { Command } from 'commander';
|
|
6
|
-
import { QA360Server } from '
|
|
6
|
+
import { QA360Server } from '../core/index.js';
|
|
7
7
|
export function createServeCommand() {
|
|
8
8
|
return new Command('serve')
|
|
9
9
|
.description('Start QA360 observability server')
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* CLI command for SLO/SLI management and reporting.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import { SLOTracker, createDefaultSLOConfig, createStrictSLOConfig, createRelaxedSLOConfig, TimeWindows } from '
|
|
7
|
+
import { SLOTracker, createDefaultSLOConfig, createStrictSLOConfig, createRelaxedSLOConfig, TimeWindows } from '../core/index.js';
|
|
8
8
|
export const sloCommand = new Command('slo');
|
|
9
9
|
sloCommand.description('Service Level Objectives and Indicators management');
|
|
10
10
|
// List all SLOs
|
|
@@ -14,7 +14,7 @@ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
|
|
|
14
14
|
import { join, resolve, basename } from 'path';
|
|
15
15
|
import chalk from 'chalk';
|
|
16
16
|
// Import from core
|
|
17
|
-
import { verifyProofFile, verifyPhase3Proof, VerificationCode, } from '
|
|
17
|
+
import { verifyProofFile, verifyPhase3Proof, VerificationCode, } from '../core/index.js';
|
|
18
18
|
/**
|
|
19
19
|
* Verify a proof file with automatic format detection
|
|
20
20
|
*/
|
|
@@ -104,6 +104,8 @@ export declare class PlaywrightNativeApiAdapter {
|
|
|
104
104
|
/**
|
|
105
105
|
* Parse test specification string
|
|
106
106
|
* Format: "GET /path -> 200" or "POST /api/users -> 201"
|
|
107
|
+
*
|
|
108
|
+
* Handles AI-generated YAML with quotes: '"GET /path -> 200"' -> 'GET /path -> 200'
|
|
107
109
|
*/
|
|
108
110
|
private parseTestSpec;
|
|
109
111
|
/**
|
|
@@ -243,12 +243,23 @@ export class PlaywrightNativeApiAdapter {
|
|
|
243
243
|
/**
|
|
244
244
|
* Parse test specification string
|
|
245
245
|
* Format: "GET /path -> 200" or "POST /api/users -> 201"
|
|
246
|
+
*
|
|
247
|
+
* Handles AI-generated YAML with quotes: '"GET /path -> 200"' -> 'GET /path -> 200'
|
|
246
248
|
*/
|
|
247
249
|
parseTestSpec(spec, baseUrl) {
|
|
248
250
|
// Validate baseUrl first
|
|
249
251
|
if (!baseUrl || typeof baseUrl !== 'string') {
|
|
250
252
|
throw new Error('baseUrl is required in gate configuration. Add "baseUrl: https://your-api.com" to the config section.');
|
|
251
253
|
}
|
|
254
|
+
// Handle AI-generated YAML with quotes around the entire spec
|
|
255
|
+
// e.g., '"GET /healthz -> 200"' should be parsed as 'GET /healthz -> 200'
|
|
256
|
+
spec = spec.trim();
|
|
257
|
+
if (spec.startsWith('"') && spec.endsWith('"')) {
|
|
258
|
+
spec = spec.slice(1, -1);
|
|
259
|
+
}
|
|
260
|
+
else if (spec.startsWith("'") && spec.endsWith("'")) {
|
|
261
|
+
spec = spec.slice(1, -1);
|
|
262
|
+
}
|
|
252
263
|
const match = spec.match(/^(\w+)\s+(.+?)\s*->\s*(\d+)$/);
|
|
253
264
|
if (!match) {
|
|
254
265
|
throw new Error(`Invalid test spec format: ${spec}. Expected: "METHOD /path -> STATUS"`);
|
|
@@ -362,7 +373,15 @@ export class PlaywrightNativeApiAdapter {
|
|
|
362
373
|
}
|
|
363
374
|
}
|
|
364
375
|
if (target.smoke) {
|
|
365
|
-
for (
|
|
376
|
+
for (let test of target.smoke) {
|
|
377
|
+
// Strip quotes from AI-generated YAML: '"GET /path -> 200"' -> 'GET /path -> 200'
|
|
378
|
+
test = test.trim();
|
|
379
|
+
if (test.startsWith('"') && test.endsWith('"')) {
|
|
380
|
+
test = test.slice(1, -1);
|
|
381
|
+
}
|
|
382
|
+
else if (test.startsWith("'") && test.endsWith("'")) {
|
|
383
|
+
test = test.slice(1, -1);
|
|
384
|
+
}
|
|
366
385
|
if (!/^\w+\s+.+\s*->\s*\d+$/.test(test)) {
|
|
367
386
|
errors.push(`Invalid smoke test format: ${test}. Expected: "METHOD /path -> STATUS"`);
|
|
368
387
|
}
|
|
@@ -114,6 +114,19 @@ export declare class PlaywrightUiAdapter {
|
|
|
114
114
|
private allScreenshots;
|
|
115
115
|
private allVideos;
|
|
116
116
|
private allTraces;
|
|
117
|
+
private lastDialog?;
|
|
118
|
+
private dialogBehavior;
|
|
119
|
+
private dialogPromptValue;
|
|
120
|
+
private openPages;
|
|
121
|
+
private currentPageIndex;
|
|
122
|
+
private globalDialogHandler?;
|
|
123
|
+
private pendingDialogHandler?;
|
|
124
|
+
private siteProfiler;
|
|
125
|
+
private siteAnalysis?;
|
|
126
|
+
private siteProfile?;
|
|
127
|
+
private selectorGenerator;
|
|
128
|
+
private consentHandler;
|
|
129
|
+
private currentFrame?;
|
|
117
130
|
constructor();
|
|
118
131
|
/**
|
|
119
132
|
* Set authentication credentials for requests
|
|
@@ -142,6 +155,14 @@ export declare class PlaywrightUiAdapter {
|
|
|
142
155
|
* Test single page with accessibility
|
|
143
156
|
*/
|
|
144
157
|
private testPage;
|
|
158
|
+
/**
|
|
159
|
+
* Test page with actions (for user journeys)
|
|
160
|
+
*/
|
|
161
|
+
private testPageWithActions;
|
|
162
|
+
/**
|
|
163
|
+
* Execute a single page action
|
|
164
|
+
*/
|
|
165
|
+
private executeAction;
|
|
145
166
|
/**
|
|
146
167
|
* Setup browser with all options
|
|
147
168
|
* Playwright++: Enhanced video/trace recording support
|