qa360 2.3.0 → 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.js +2 -2
- 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 -330
- 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 -105
- package/core/package.json +0 -90
- 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/crawl.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
package/README.md
CHANGED
|
@@ -1,329 +1,222 @@
|
|
|
1
|
-
#
|
|
1
|
+
# qa360
|
|
2
2
|
|
|
3
|
-
**Quality as Cryptographic Proof
|
|
3
|
+
**QA360 Proof CLI** - Quality as Cryptographic Proof
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/qa360)
|
|
6
|
+
[](https://github.com/xyqotech/qa360/blob/main/LICENSE)
|
|
7
|
+
[](https://github.com/xyqotech/qa360)
|
|
8
|
+
[](https://github.com/xyqotech/qa360)
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-

|
|
9
|
-

|
|
10
|
-

|
|
11
|
-

|
|
12
|
-

|
|
10
|
+
> **Official package** published by [xyqotech](https://github.com/xyqotech) with npm provenance signatures
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
## Installation
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## 🚀 Install
|
|
19
|
-
|
|
20
|
-
### Installation (npm)
|
|
14
|
+
### Option 1: Global installation (recommended for regular use)
|
|
21
15
|
|
|
22
16
|
```bash
|
|
23
|
-
#
|
|
17
|
+
# macOS: use sudo if you get EACCES permission errors
|
|
18
|
+
sudo npm install -g qa360
|
|
19
|
+
|
|
20
|
+
# Or configure npm prefix (one-time setup)
|
|
21
|
+
mkdir -p ~/.npm-global
|
|
22
|
+
npm config set prefix '~/.npm-global'
|
|
23
|
+
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
|
|
24
|
+
source ~/.zshrc
|
|
24
25
|
npm install -g qa360
|
|
26
|
+
```
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
pnpm add -g qa360
|
|
28
|
+
### Option 2: Direct usage with npx (no installation needed)
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
```bash
|
|
31
|
+
# Run directly without installing
|
|
32
|
+
npx qa360@latest run test.yml
|
|
33
|
+
npx qa360@latest verify proof.json
|
|
34
|
+
npx qa360@latest doctor
|
|
31
35
|
```
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
**Note**: On first run, Playwright browsers will be automatically downloaded (~100MB). This happens only once.
|
|
34
38
|
|
|
35
|
-
##
|
|
39
|
+
## Quick Start
|
|
36
40
|
|
|
37
|
-
|
|
41
|
+
### 1. Generate a test pack
|
|
38
42
|
|
|
39
43
|
```bash
|
|
40
|
-
#
|
|
41
|
-
qa360
|
|
44
|
+
# Option 1: Interactive mode (recommended for first-time users)
|
|
45
|
+
qa360 init
|
|
42
46
|
|
|
43
|
-
#
|
|
44
|
-
qa360
|
|
45
|
-
|
|
46
|
-
# Verify cryptographic proof
|
|
47
|
-
qa360 verify .qa360/runs/<run-id>-proof.json
|
|
47
|
+
# Option 2: Use a template directly
|
|
48
|
+
qa360 init --template api-basic --yes
|
|
48
49
|
|
|
49
|
-
#
|
|
50
|
-
qa360
|
|
50
|
+
# Option 3: Copy an example
|
|
51
|
+
qa360 examples copy api-basic
|
|
52
|
+
qa360 examples list # See all available examples
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
### 2. Run tests
|
|
54
56
|
|
|
55
57
|
```bash
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# Verify proof signature
|
|
60
|
-
qa360 verify .qa360/runs/proof.json
|
|
58
|
+
qa360 run
|
|
59
|
+
```
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
qa360 doctor --fix
|
|
61
|
+
### 3. Verify proof
|
|
64
62
|
|
|
65
|
-
|
|
66
|
-
qa360
|
|
63
|
+
```bash
|
|
64
|
+
qa360 verify .qa360/runs/
|
|
67
65
|
```
|
|
68
66
|
|
|
69
|
-
##
|
|
70
|
-
|
|
71
|
-
- **🔒 Local-first** - No network dependencies, 100% offline
|
|
72
|
-
- **🔐 Cryptographic trust** - Ed25519 signatures, SHA-256 hashing
|
|
73
|
-
- **🌍 Cross-OS verified** - Windows, macOS, Linux
|
|
74
|
-
- **⚡ Zero friction** - Auto-generates keys, clear error messages
|
|
75
|
-
- **
|
|
76
|
-
- **🧠 AI-Native** - Local test generation with Ollama (100% free)
|
|
77
|
-
- **🚀 Playwright Native** - 87% faster API tests, 80% less memory
|
|
78
|
-
- **📦 Smart Caching** - LRU cache for HTTP responses, 96% faster cache hits
|
|
67
|
+
## Usage
|
|
79
68
|
|
|
80
|
-
|
|
69
|
+
```bash
|
|
70
|
+
# Generate test pack (interactive)
|
|
71
|
+
qa360 init
|
|
81
72
|
|
|
82
|
-
|
|
73
|
+
# Generate with template
|
|
74
|
+
qa360 init --template api-basic
|
|
75
|
+
qa360 init --template fullstack
|
|
76
|
+
qa360 init --template security
|
|
77
|
+
qa360 init --template complete
|
|
83
78
|
|
|
84
|
-
|
|
79
|
+
# Examples commands
|
|
80
|
+
qa360 examples list # List all examples
|
|
81
|
+
qa360 examples copy api-basic # Copy example to qa360.yml
|
|
82
|
+
qa360 examples show fullstack # Preview example content
|
|
85
83
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
├── cli/ # CLI interface (@qa360/cli v1.4.5)
|
|
89
|
-
│ └── src/commands/ # 22 CLI commands
|
|
90
|
-
├── core/ # Proof generation engine (qa360-core v1.0.1)
|
|
91
|
-
│ └── src/adapters/ # 7 test framework adapters
|
|
92
|
-
│ ├── playwright-native-api.ts # API testing (87% faster)
|
|
93
|
-
│ ├── playwright-ui.ts # UI/E2E + A11y
|
|
94
|
-
│ ├── k6-perf.ts # Performance testing
|
|
95
|
-
│ ├── semgrep-sast.ts # SAST analysis
|
|
96
|
-
│ ├── gitleaks-secrets.ts # Secret scanning
|
|
97
|
-
│ ├── osv-deps.ts # Dependency vulnerabilities
|
|
98
|
-
│ └── zap-dast.ts # DAST security scanning
|
|
99
|
-
├── packages/mcp/ # MCP server (@qa360/mcp v1.0.0, 23 tools)
|
|
100
|
-
├── docs/ # 54 documentation files
|
|
101
|
-
├── examples/ # 15 example packs
|
|
102
|
-
└── tests/ # 100 test files (2177 tests passing)
|
|
103
|
-
```
|
|
84
|
+
# System health check
|
|
85
|
+
qa360 doctor
|
|
104
86
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
- ✅ **Smart Retry Engine**: 6 retry strategies (NONE, FIXED, LINEAR, EXPONENTIAL, ADAPTIVE, INTELLIGENT)
|
|
109
|
-
- ✅ **Flakiness-Aware Retry**: Integrates with flakiness scoring for intelligent retry decisions
|
|
110
|
-
- ✅ **Pattern-Based Retry**: Adjusts strategy based on failure patterns (timing, race conditions, selectors)
|
|
111
|
-
- ✅ **Non-Retriable Error Detection**: Automatically identifies unrecoverable errors
|
|
112
|
-
- ✅ **Jitter Support**: Avoids thundering herd problem with configurable jitter
|
|
113
|
-
- 📊 **Tests**: 48 passing tests
|
|
114
|
-
|
|
115
|
-
**January 2, 2025** - Phase 1 Performance Optimizations:
|
|
116
|
-
- ✅ **Playwright Native API**: Zero-overhead HTTP testing (87% faster, 80% less memory)
|
|
117
|
-
- ✅ **LRU Cache**: Intelligent HTTP response caching (96% faster cache hits)
|
|
118
|
-
- ✅ **Watch Mode**: Continuous testing with file monitoring
|
|
119
|
-
- ✅ **Benchmark Mode**: Performance testing with detailed statistics
|
|
120
|
-
- 📊 **Performance**: See [`docs/PHASE1_PERFORMANCE.md`](./docs/PHASE1_PERFORMANCE.md)
|
|
121
|
-
|
|
122
|
-
**December 23, 2024** - Major architecture improvements:
|
|
123
|
-
- ✅ **Unified MCP Package**: Merged 2 MCP packages into 1 (`@qa360/mcp v1.2.0`)
|
|
124
|
-
- ✅ **Removed Duplicates**: Deleted 4 empty packages + eliminated 10,503 duplicate lines
|
|
125
|
-
- ✅ **Clean Structure**: Moved `/api` to `examples/future-api/` (Phase 3)
|
|
126
|
-
- ✅ **Build Performance**: +50% faster builds after consolidation
|
|
127
|
-
|
|
128
|
-
**See:** [`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md) for complete documentation.
|
|
129
|
-
|
|
130
|
-
## 🧠 AI Integration with Ollama
|
|
131
|
-
|
|
132
|
-
QA360 is an **AI-native testing platform** using [Ollama](https://ollama.com/) for 100% free, local LLM inference.
|
|
133
|
-
|
|
134
|
-
### Phase 4 Complete ✅ - AI Test Generation
|
|
135
|
-
|
|
136
|
-
**January 2, 2025** - AI Test Generation Module:
|
|
137
|
-
- ✅ **SourceAnalyzer**: Analyze TypeScript, JavaScript, Python, and Go source code
|
|
138
|
-
- Extract functions, classes, imports, and complexity metrics
|
|
139
|
-
- Generate test suggestions (unit/integration/e2e)
|
|
140
|
-
- Generate API specs from Express/Fastify handlers
|
|
141
|
-
- ✅ **PackGenerator**: Convert AI-generated specs to QA360 pack YAML (v2 format)
|
|
142
|
-
- ✅ **CodeGenerator**: Generate test code using LLM providers (Ollama, DeepSeek, etc.)
|
|
143
|
-
- ✅ **Real Provider Integration**: Tests for Ollama and DeepSeek providers
|
|
144
|
-
- 📊 **Test Coverage**: 160 generation tests + 187 real-world tests
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
// Example: Analyze source code and generate tests
|
|
148
|
-
import { SourceAnalyzer, PackGenerator } from 'qa360/core/generation';
|
|
149
|
-
|
|
150
|
-
const analyzer = new SourceAnalyzer();
|
|
151
|
-
const analysis = analyzer.analyzeFile('./src/userService.ts');
|
|
152
|
-
|
|
153
|
-
// Generate test suggestions
|
|
154
|
-
const suggestions = analyzer.generateSuggestions(analysis);
|
|
155
|
-
// → [{ type: 'unit', priority: 'high', description: 'Test UserService.createUser', ... }]
|
|
156
|
-
|
|
157
|
-
// Generate API spec from handlers
|
|
158
|
-
const apiSpec = analyzer.generateApiSpec(analysis);
|
|
159
|
-
// → { type: 'api', baseUrl: 'https://...', endpoints: [...] }
|
|
160
|
-
|
|
161
|
-
// Convert to pack YAML
|
|
162
|
-
const packGenerator = new PackGenerator();
|
|
163
|
-
const packYaml = packGenerator.generateFromApiSpec(apiSpec);
|
|
164
|
-
```
|
|
87
|
+
# Run test pack
|
|
88
|
+
qa360 run # Auto-detects qa360.yml
|
|
89
|
+
qa360 run custom-pack.yml # Use specific file
|
|
165
90
|
|
|
166
|
-
|
|
91
|
+
# Verify proof bundle
|
|
92
|
+
qa360 verify .qa360/runs/
|
|
93
|
+
qa360 verify proof.json
|
|
167
94
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
| TestDiscoverer | ✅ Complete | 55 tests |
|
|
172
|
-
| PackConfig | ✅ Complete | - |
|
|
173
|
-
| Auth Module (9 providers) | ✅ Complete | 92 tests |
|
|
174
|
-
| Pack Validation | ✅ Complete | 210+ tests |
|
|
175
|
-
| **Phase 4 Generation** | ✅ Complete | **160 tests** |
|
|
95
|
+
# View run history
|
|
96
|
+
qa360 history list
|
|
97
|
+
qa360 history show <run-id>
|
|
176
98
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
qa360 ollama test
|
|
99
|
+
# Export proof bundle
|
|
100
|
+
qa360 history export <run-id> --bundle proof-bundle.zip
|
|
180
101
|
|
|
181
|
-
#
|
|
182
|
-
qa360
|
|
102
|
+
# Clean up old runs (garbage collection)
|
|
103
|
+
qa360 history gc # Default: keep last 10 runs
|
|
104
|
+
qa360 history gc --keep-last 20 # Keep last 20 runs
|
|
105
|
+
qa360 history gc --dry-run # Preview what would be deleted
|
|
183
106
|
|
|
184
|
-
#
|
|
185
|
-
qa360
|
|
107
|
+
# Pin/unpin runs (pinned runs are never deleted by gc)
|
|
108
|
+
qa360 history pin <run-id>
|
|
109
|
+
qa360 history unpin <run-id>
|
|
186
110
|
|
|
187
|
-
#
|
|
188
|
-
qa360
|
|
111
|
+
# With JSON output (CI-friendly)
|
|
112
|
+
qa360 doctor --json
|
|
113
|
+
qa360 verify proof.json --json
|
|
114
|
+
qa360 history list --json
|
|
189
115
|
```
|
|
190
116
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
## 📋 Development Phases
|
|
194
|
-
|
|
195
|
-
QA360 Core is developed in structured phases:
|
|
196
|
-
|
|
197
|
-
### Core Platform
|
|
198
|
-
- **Phase 0**: ✅ Initialization & Structure
|
|
199
|
-
- **Phase 1**: ✅ Runner CLI "zero friction"
|
|
200
|
-
- **Phase 2**: ✅ Pack configuration + encrypted secrets
|
|
201
|
-
- **Phase 3**: ✅ Declarative hooks + Docker provisioning
|
|
202
|
-
- **Phase 4**: ✅ OOTB Adapters (Playwright, k6, Semgrep, ZAP, etc.)
|
|
203
|
-
- **Phase 5**: ✅ Health/Diag/Metrics endpoints
|
|
204
|
-
- **Phase 6**: ✅ Evidence Vault + SQLite WAL history
|
|
205
|
-
- **Phase 7**: ✅ Complete Proof Bundle
|
|
117
|
+
## Available Templates
|
|
206
118
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
119
|
+
| Template | Description | Gates |
|
|
120
|
+
|----------|-------------|-------|
|
|
121
|
+
| **api-basic** | Simple API smoke tests | api_smoke |
|
|
122
|
+
| **ui-basic** | Basic UI/E2E tests | ui |
|
|
123
|
+
| **fullstack** | API + UI + Performance | api_smoke, ui, perf |
|
|
124
|
+
| **security** | Security testing suite | sast, dast, secrets, deps |
|
|
125
|
+
| **accessibility** | Accessibility testing | ui, a11y |
|
|
126
|
+
| **complete** | All quality gates | All (8 gates) |
|
|
213
127
|
|
|
214
|
-
|
|
215
|
-
- **Phase 8**: ✅ TUI & Dashboard (COMPLETE)
|
|
216
|
-
- **Phase 9**: ⏳ Parallel CI → consolidated proof
|
|
128
|
+
## Example Files
|
|
217
129
|
|
|
218
|
-
|
|
130
|
+
Pre-made examples are included in the package:
|
|
219
131
|
|
|
220
|
-
|
|
132
|
+
```bash
|
|
133
|
+
# List examples
|
|
134
|
+
ls examples/
|
|
221
135
|
|
|
222
|
-
|
|
136
|
+
# Copy an example
|
|
137
|
+
cp examples/api-basic.yml qa360.yml
|
|
223
138
|
|
|
224
|
-
|
|
139
|
+
# Run example directly
|
|
140
|
+
qa360 run examples/api-basic.yml
|
|
141
|
+
```
|
|
225
142
|
|
|
226
|
-
|
|
227
|
-
2. ✅ **Run bundle script**: `cd cli && bash scripts/bundle-for-npm.sh`
|
|
228
|
-
3. ✅ **Test with npm pack**: `npm pack && tar -tzf qa360-*.tgz | grep "cli/dist/core/index.js"`
|
|
229
|
-
4. ✅ **Test installation**: `cd /tmp && npm install -g ./qa360-*.tgz && qa360 --version`
|
|
230
|
-
5. ✅ **Get EXPLICIT authorization** from maintainer before publishing
|
|
231
|
-
6. ✅ **Publish from MAIN branch only** - NEVER from `develop`
|
|
143
|
+
## Commands
|
|
232
144
|
|
|
233
|
-
|
|
145
|
+
| Command | Description |
|
|
146
|
+
|---------|-------------|
|
|
147
|
+
| `init` | Generate test pack interactively |
|
|
148
|
+
| `examples` | Manage example templates (list, copy, show) |
|
|
149
|
+
| `run` | Execute test pack |
|
|
150
|
+
| `verify` | Verify cryptographic proof bundles |
|
|
151
|
+
| `doctor` | Check system health, auto-fix issues |
|
|
152
|
+
| `history` | View run history and results |
|
|
153
|
+
| `report` | Generate reports |
|
|
154
|
+
| `secrets` | Manage encrypted secrets |
|
|
155
|
+
| `pack` | Pack validation and linting |
|
|
234
156
|
|
|
235
|
-
|
|
236
|
-
|---------|---------|--------|
|
|
237
|
-
| **2.2.4** | Published without CI check | CI was failing - broken package |
|
|
238
|
-
| **2.2.5** | Published without bundle script | Missing `cli/dist/core/` - completely broken |
|
|
239
|
-
| **2.2.6** | Followed full checklist | ✅ Working package |
|
|
157
|
+
### History Commands
|
|
240
158
|
|
|
241
|
-
|
|
159
|
+
The `history` command provides comprehensive management of test run history stored in the Evidence Vault:
|
|
242
160
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
# 3. Wait for CI to pass on main
|
|
254
|
-
gh run watch --branch main
|
|
255
|
-
|
|
256
|
-
# 4. CREATE THE BUNDLE (THIS IS CRITICAL)
|
|
257
|
-
cd cli
|
|
258
|
-
bash scripts/bundle-for-npm.sh
|
|
259
|
-
cd ..
|
|
260
|
-
|
|
261
|
-
# 5. Verify bundle was created
|
|
262
|
-
ls -la cli/dist/core/index.js # Must exist
|
|
263
|
-
grep "from '../core/index.js'" cli/dist/commands/ai.js # Must show this, NOT qa360-core
|
|
264
|
-
|
|
265
|
-
# 6. Test the package locally
|
|
266
|
-
npm pack
|
|
267
|
-
tar -tzf qa360-*.tgz | grep "cli/dist/core/index.js" # Must exist
|
|
268
|
-
cd /tmp && npm install -g /path/to/qa360-*.tgz && qa360 --version
|
|
269
|
-
|
|
270
|
-
# 7. ONLY AFTER ALL TESTS PASS: Get authorization, then publish
|
|
271
|
-
npm version patch # or minor/major
|
|
272
|
-
npm publish --access public
|
|
273
|
-
git push origin main --tags
|
|
274
|
-
|
|
275
|
-
# 8. ALWAYS return to develop
|
|
276
|
-
git checkout develop
|
|
277
|
-
```
|
|
161
|
+
| Subcommand | Description | Example |
|
|
162
|
+
|------------|-------------|---------|
|
|
163
|
+
| `list` | List recent test runs | `qa360 history list --limit 20` |
|
|
164
|
+
| `show <run-id>` | Show detailed run information | `qa360 history show abc123` |
|
|
165
|
+
| `diff <id1> <id2>` | Compare two test runs | `qa360 history diff abc123 def456` |
|
|
166
|
+
| `trend` | Show trust score trends | `qa360 history trend --window 30` |
|
|
167
|
+
| `export <run-id>` | Export run as ZIP bundle | `qa360 history export abc123 --bundle proof.zip` |
|
|
168
|
+
| `gc` | Garbage collect old runs | `qa360 history gc --keep-last 10` |
|
|
169
|
+
| `pin <run-id>` | Pin run (protect from gc) | `qa360 history pin abc123` |
|
|
170
|
+
| `unpin <run-id>` | Unpin run | `qa360 history unpin abc123` |
|
|
278
171
|
|
|
279
|
-
|
|
172
|
+
#### Export Bundle Contents
|
|
280
173
|
|
|
281
|
-
|
|
282
|
-
1. Copies `core/src/*` into `cli/src/core/`
|
|
283
|
-
2. Changes imports from `'qa360-core'` to `'../core/index.js'`
|
|
284
|
-
3. Builds TypeScript → `cli/dist/`
|
|
285
|
-
4. **Result**: `cli/dist/core/` contains the bundled core engine
|
|
174
|
+
When exporting a run with `qa360 history export <run-id> --bundle proof.zip`, the ZIP contains:
|
|
286
175
|
|
|
287
|
-
|
|
176
|
+
- `proof.json` - Cryptographically signed proof document
|
|
177
|
+
- `report.pdf` - Human-readable PDF report (if generated)
|
|
178
|
+
- `run.json` - Complete run details (gates, findings, artifacts)
|
|
179
|
+
- `artifacts/` - All test artifacts (screenshots, logs, etc.)
|
|
180
|
+
- `VERIFICATION.json` - Verification instructions and metadata
|
|
288
181
|
|
|
289
|
-
|
|
182
|
+
#### Garbage Collection
|
|
290
183
|
|
|
291
|
-
|
|
292
|
-
1. **Fix the issue** on `develop`
|
|
293
|
-
2. **Follow the FULL checklist** above
|
|
294
|
-
3. **Publish a patch version** (e.g., 2.2.5 → 2.2.6)
|
|
295
|
-
4. **Add a warning** in CHANGELOG about broken versions
|
|
184
|
+
The `gc` command removes old test runs and orphaned artifacts to free disk space:
|
|
296
185
|
|
|
297
|
-
|
|
186
|
+
```bash
|
|
187
|
+
# Preview what would be deleted (dry-run)
|
|
188
|
+
qa360 history gc --dry-run
|
|
298
189
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
- **Crypto**: Ed25519 signatures for proof verification
|
|
302
|
-
- **AI**: Ollama for local LLM inference (100% free)
|
|
303
|
-
- **PDF**: Puppeteer for report generation
|
|
304
|
-
- **Testing**: Vitest for unit/integration tests
|
|
190
|
+
# Keep last 20 runs, delete older ones
|
|
191
|
+
qa360 history gc --keep-last 20
|
|
305
192
|
|
|
306
|
-
|
|
193
|
+
# Default behavior (keeps last 10 unpinned runs)
|
|
194
|
+
qa360 history gc
|
|
195
|
+
```
|
|
307
196
|
|
|
308
|
-
|
|
309
|
-
- [User Guide](./docs/USER_GUIDE.md) - Complete documentation
|
|
310
|
-
- [Beta Testing Plan](./docs/BETA_TESTING_PLAN.md) - User testing program
|
|
311
|
-
- [Contributing Guide](./CONTRIBUTING.md)
|
|
312
|
-
- [Changelog](./CHANGELOG.md)
|
|
313
|
-
- [Code Owners](./CODEOWNERS)
|
|
197
|
+
**Important**: Pinned runs are NEVER deleted by garbage collection. Use `qa360 history pin <run-id>` to protect important runs.
|
|
314
198
|
|
|
315
|
-
##
|
|
199
|
+
## Exit Codes
|
|
316
200
|
|
|
317
|
-
|
|
201
|
+
| Code | Meaning |
|
|
202
|
+
|------|---------|
|
|
203
|
+
| 0 | Success |
|
|
204
|
+
| 1 | Verification failed |
|
|
205
|
+
| 2 | File not found |
|
|
206
|
+
| 3 | Invalid schema |
|
|
207
|
+
| 4 | Missing key |
|
|
208
|
+
| 5 | Internal error |
|
|
318
209
|
|
|
319
|
-
|
|
210
|
+
## Requirements
|
|
320
211
|
|
|
321
|
-
|
|
212
|
+
- Node.js >= 18.0.0
|
|
213
|
+
- npm or pnpm
|
|
322
214
|
|
|
323
|
-
##
|
|
215
|
+
## Documentation
|
|
324
216
|
|
|
325
|
-
|
|
217
|
+
- [Quick Start](https://github.com/xyqotech/qa360/blob/main/docs/quickstart-5min.md)
|
|
218
|
+
- [Full Documentation](https://github.com/xyqotech/qa360/blob/main/docs/README.md)
|
|
326
219
|
|
|
327
|
-
|
|
220
|
+
## License
|
|
328
221
|
|
|
329
|
-
|
|
222
|
+
MIT
|
|
@@ -10,7 +10,7 @@ import { Command } from 'commander';
|
|
|
10
10
|
import chalk from 'chalk';
|
|
11
11
|
import ora from 'ora';
|
|
12
12
|
import Table from 'cli-table3';
|
|
13
|
-
import { createBest, getProviderInfo, getProviderStatus, createLLMProvider, DeepSeekProvider, DeepSeekError, OllamaProvider, OllamaError, OpenAIProvider, OpenAIError, AnthropicProvider, AnthropicError } from '
|
|
13
|
+
import { createBest, getProviderInfo, getProviderStatus, createLLMProvider, DeepSeekProvider, DeepSeekError, OllamaProvider, OllamaError, OpenAIProvider, OpenAIError, AnthropicProvider, AnthropicError } from '../core/index.js';
|
|
14
14
|
/**
|
|
15
15
|
* List all available AI providers
|
|
16
16
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
7
|
import { existsSync } from 'fs';
|
|
8
|
-
import { CoverageCollector, CoverageAnalyzer, parseCoverageThreshold, formatCoverageThreshold } from '
|
|
8
|
+
import { CoverageCollector, CoverageAnalyzer, parseCoverageThreshold, formatCoverageThreshold } from '../core/index.js';
|
|
9
9
|
export const coverageCommand = new Command('coverage');
|
|
10
10
|
coverageCommand.description('Coverage analytics and reporting');
|
|
11
11
|
// Show coverage for a specific file or run
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import { Command } from 'commander';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import ora from 'ora';
|
|
10
|
-
import { generatePackFromCrawl, quickCrawl } from '
|
|
11
|
-
import { detectPresetFromUrl, getAllPresets, getPreset, getPresetList } from '
|
|
10
|
+
import { generatePackFromCrawl, quickCrawl } from '../core/index.js';
|
|
11
|
+
import { detectPresetFromUrl, getAllPresets, getPreset, getPresetList } from '../core/index.js';
|
|
12
12
|
/**
|
|
13
13
|
* Create crawl command
|
|
14
14
|
*/
|
|
@@ -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
|
*/
|