@agentic-qe/v3 3.0.0-alpha.6 → 3.0.0-alpha.8
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/assets/agents/v3/subagents/v3-qe-code-reviewer.md +339 -0
- package/assets/agents/v3/subagents/v3-qe-integration-reviewer.md +344 -0
- package/assets/agents/v3/subagents/v3-qe-performance-reviewer.md +351 -0
- package/assets/agents/v3/subagents/v3-qe-security-reviewer.md +374 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-green.md +334 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-red.md +329 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-refactor.md +361 -0
- package/assets/agents/v3/v3-qe-accessibility-auditor.md +266 -0
- package/assets/agents/v3/v3-qe-bdd-generator.md +279 -0
- package/assets/agents/v3/v3-qe-chaos-engineer.md +265 -0
- package/assets/agents/v3/v3-qe-code-complexity.md +298 -0
- package/assets/agents/v3/v3-qe-code-intelligence.md +262 -0
- package/assets/agents/v3/v3-qe-contract-validator.md +267 -0
- package/assets/agents/v3/v3-qe-coverage-specialist.md +227 -0
- package/assets/agents/v3/v3-qe-defect-predictor.md +251 -0
- package/assets/agents/v3/v3-qe-dependency-mapper.md +277 -0
- package/assets/agents/v3/v3-qe-deployment-advisor.md +275 -0
- package/assets/agents/v3/v3-qe-flaky-hunter.md +248 -0
- package/assets/agents/v3/v3-qe-fleet-commander.md +293 -0
- package/assets/agents/v3/v3-qe-gap-detector.md +260 -0
- package/assets/agents/v3/v3-qe-graphql-tester.md +308 -0
- package/assets/agents/v3/v3-qe-impact-analyzer.md +299 -0
- package/assets/agents/v3/v3-qe-integration-tester.md +238 -0
- package/assets/agents/v3/v3-qe-kg-builder.md +273 -0
- package/assets/agents/v3/v3-qe-learning-coordinator.md +226 -0
- package/assets/agents/v3/v3-qe-load-tester.md +280 -0
- package/assets/agents/v3/v3-qe-metrics-optimizer.md +300 -0
- package/assets/agents/v3/v3-qe-mutation-tester.md +301 -0
- package/assets/agents/v3/v3-qe-parallel-executor.md +240 -0
- package/assets/agents/v3/v3-qe-pattern-learner.md +271 -0
- package/assets/agents/v3/v3-qe-performance-tester.md +262 -0
- package/assets/agents/v3/v3-qe-property-tester.md +247 -0
- package/assets/agents/v3/v3-qe-quality-gate.md +218 -0
- package/assets/agents/v3/v3-qe-queen-coordinator.md +214 -0
- package/assets/agents/v3/v3-qe-qx-partner.md +313 -0
- package/assets/agents/v3/v3-qe-regression-analyzer.md +322 -0
- package/assets/agents/v3/v3-qe-requirements-validator.md +360 -0
- package/assets/agents/v3/v3-qe-responsive-tester.md +311 -0
- package/assets/agents/v3/v3-qe-retry-handler.md +256 -0
- package/assets/agents/v3/v3-qe-risk-assessor.md +273 -0
- package/assets/agents/v3/v3-qe-root-cause-analyzer.md +286 -0
- package/assets/agents/v3/v3-qe-security-auditor.md +299 -0
- package/assets/agents/v3/v3-qe-security-scanner.md +235 -0
- package/assets/agents/v3/v3-qe-tdd-specialist.md +239 -0
- package/assets/agents/v3/v3-qe-test-architect.md +233 -0
- package/assets/agents/v3/v3-qe-transfer-specialist.md +295 -0
- package/assets/agents/v3/v3-qe-visual-tester.md +232 -0
- package/assets/skills/accessibility-testing/SKILL.md +216 -0
- package/assets/skills/agentdb-advanced/SKILL.md +550 -0
- package/assets/skills/agentdb-learning/SKILL.md +545 -0
- package/assets/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/assets/skills/agentdb-optimization/SKILL.md +509 -0
- package/assets/skills/agentdb-vector-search/SKILL.md +339 -0
- package/assets/skills/agentic-jujutsu/SKILL.md +645 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +335 -0
- package/assets/skills/api-testing-patterns/SKILL.md +294 -0
- package/assets/skills/aqe-v2-v3-migration/skill.md +322 -0
- package/assets/skills/brutal-honesty-review/README.md +218 -0
- package/assets/skills/brutal-honesty-review/SKILL.md +235 -0
- package/assets/skills/brutal-honesty-review/resources/assessment-rubrics.md +295 -0
- package/assets/skills/brutal-honesty-review/resources/review-template.md +102 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-code.sh +179 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-tests.sh +223 -0
- package/assets/skills/bug-reporting-excellence/SKILL.md +225 -0
- package/assets/skills/chaos-engineering-resilience/SKILL.md +158 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/README.md +304 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/SKILL.md +315 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/microservice-pipeline.md +239 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/mobile-pipeline.md +375 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/monolith-pipeline.md +268 -0
- package/assets/skills/code-review-quality/SKILL.md +227 -0
- package/assets/skills/compatibility-testing/SKILL.md +205 -0
- package/assets/skills/compliance-testing/SKILL.md +225 -0
- package/assets/skills/consultancy-practices/SKILL.md +202 -0
- package/assets/skills/context-driven-testing/SKILL.md +196 -0
- package/assets/skills/contract-testing/SKILL.md +222 -0
- package/assets/skills/database-testing/SKILL.md +244 -0
- package/assets/skills/exploratory-testing-advanced/SKILL.md +201 -0
- package/assets/skills/flow-nexus-neural/SKILL.md +738 -0
- package/assets/skills/flow-nexus-platform/SKILL.md +1157 -0
- package/assets/skills/flow-nexus-swarm/SKILL.md +610 -0
- package/assets/skills/github-code-review/SKILL.md +1140 -0
- package/assets/skills/github-multi-repo/SKILL.md +874 -0
- package/assets/skills/github-project-management/SKILL.md +1277 -0
- package/assets/skills/github-release-management/SKILL.md +1081 -0
- package/assets/skills/github-workflow-automation/SKILL.md +1065 -0
- package/assets/skills/hive-mind-advanced/SKILL.md +712 -0
- package/assets/skills/holistic-testing-pact/SKILL.md +171 -0
- package/assets/skills/hooks-automation/SKILL.md +1201 -0
- package/assets/skills/localization-testing/SKILL.md +221 -0
- package/assets/skills/mobile-testing/SKILL.md +219 -0
- package/assets/skills/mutation-testing/SKILL.md +229 -0
- package/assets/skills/n8n-expression-testing/SKILL.md +434 -0
- package/assets/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
- package/assets/skills/n8n-security-testing/SKILL.md +599 -0
- package/assets/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
- package/assets/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
- package/assets/skills/pair-programming/SKILL.md +1202 -0
- package/assets/skills/performance-analysis/SKILL.md +563 -0
- package/assets/skills/performance-testing/SKILL.md +310 -0
- package/assets/skills/quality-metrics/SKILL.md +225 -0
- package/assets/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/assets/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/assets/skills/refactoring-patterns/SKILL.md +205 -0
- package/assets/skills/regression-testing/SKILL.md +227 -0
- package/assets/skills/risk-based-testing/SKILL.md +206 -0
- package/assets/skills/security-testing/SKILL.md +306 -0
- package/assets/skills/sherlock-review/SKILL.md +250 -0
- package/assets/skills/shift-left-testing/SKILL.md +225 -0
- package/assets/skills/shift-right-testing/SKILL.md +227 -0
- package/assets/skills/six-thinking-hats/README.md +190 -0
- package/assets/skills/six-thinking-hats/SKILL.md +280 -0
- package/assets/skills/six-thinking-hats/resources/examples/api-testing-example.md +345 -0
- package/assets/skills/six-thinking-hats/resources/templates/solo-session-template.md +167 -0
- package/assets/skills/six-thinking-hats/resources/templates/team-session-template.md +336 -0
- package/assets/skills/skill-builder/SKILL.md +910 -0
- package/assets/skills/sparc-methodology/SKILL.md +1115 -0
- package/assets/skills/stream-chain/SKILL.md +563 -0
- package/assets/skills/swarm-advanced/SKILL.md +973 -0
- package/assets/skills/swarm-orchestration/SKILL.md +179 -0
- package/assets/skills/tdd-london-chicago/SKILL.md +244 -0
- package/assets/skills/technical-writing/SKILL.md +178 -0
- package/assets/skills/test-automation-strategy/SKILL.md +230 -0
- package/assets/skills/test-data-management/SKILL.md +270 -0
- package/assets/skills/test-design-techniques/SKILL.md +244 -0
- package/assets/skills/test-environment-management/SKILL.md +243 -0
- package/assets/skills/test-reporting-analytics/SKILL.md +214 -0
- package/assets/skills/testability-scoring/README.md +71 -0
- package/assets/skills/testability-scoring/SKILL.md +346 -0
- package/assets/skills/testability-scoring/resources/templates/config.template.js +84 -0
- package/assets/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
- package/assets/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
- package/assets/skills/testability-scoring/scripts/run-assessment.sh +70 -0
- package/assets/skills/v3-qe-chaos-resilience/SKILL.md +238 -0
- package/assets/skills/v3-qe-code-intelligence/SKILL.md +209 -0
- package/assets/skills/v3-qe-contract-testing/SKILL.md +218 -0
- package/assets/skills/v3-qe-coverage-analysis/SKILL.md +187 -0
- package/assets/skills/v3-qe-defect-intelligence/SKILL.md +205 -0
- package/assets/skills/v3-qe-learning-optimization/SKILL.md +238 -0
- package/assets/skills/v3-qe-quality-assessment/SKILL.md +213 -0
- package/assets/skills/v3-qe-requirements-validation/SKILL.md +248 -0
- package/assets/skills/v3-qe-test-execution/SKILL.md +182 -0
- package/assets/skills/v3-qe-test-generation/SKILL.md +141 -0
- package/assets/skills/v3-qe-visual-accessibility/SKILL.md +242 -0
- package/assets/skills/verification-quality/SKILL.md +649 -0
- package/assets/skills/visual-testing-advanced/SKILL.md +219 -0
- package/assets/skills/xp-practices/SKILL.md +229 -0
- package/dist/cli/bundle.js +23 -13
- package/dist/init/agents-installer.js +4 -4
- package/dist/init/agents-installer.js.map +1 -1
- package/dist/init/init-wizard.d.ts.map +1 -1
- package/dist/init/init-wizard.js +15 -5
- package/dist/init/init-wizard.js.map +1 -1
- package/dist/init/skills-installer.js +4 -4
- package/dist/init/skills-installer.js.map +1 -1
- package/package.json +7 -1
- package/docs/analysis/V3-INIT-REQUIREMENTS-ANALYSIS.md +0 -352
- package/implementation/README.md +0 -90
- package/implementation/adrs/ADR-030-coherence-gated-quality-gates.md +0 -312
- package/implementation/adrs/ADR-031-strange-loop-self-awareness.md +0 -484
- package/implementation/adrs/ADR-032-time-crystal-scheduling.md +0 -530
- package/implementation/adrs/ADR-033-early-exit-testing.md +0 -634
- package/implementation/adrs/ADR-034-neural-topology-optimizer.md +0 -589
- package/implementation/adrs/ADR-035-causal-discovery.md +0 -610
- package/implementation/adrs/ADR-036-result-persistence.md +0 -326
- package/implementation/adrs/ADR-037-v3-qe-agent-naming.md +0 -105
- package/implementation/adrs/ADR-038-v3-qe-memory-unification.md +0 -154
- package/implementation/adrs/ADR-039-v3-qe-mcp-optimization.md +0 -179
- package/implementation/adrs/ADR-040-v3-qe-agentic-flow-integration.md +0 -240
- package/implementation/adrs/ADR-041-v3-qe-cli-enhancement.md +0 -296
- package/implementation/adrs/ADR-042-v3-qe-token-tracking-integration.md +0 -517
- package/implementation/adrs/v3-adrs.md +0 -2783
- package/implementation/planning/AQE-V3-MASTER-PLAN.md +0 -815
- package/security-scan-report-2026-01-11.md +0 -410
- package/security-verification-report-2026-01-11.md +0 -278
- package/src/benchmarks/performance-benchmarks.ts +0 -646
- package/src/benchmarks/run-benchmarks.ts +0 -324
- package/src/causal-discovery/causal-graph.ts +0 -450
- package/src/causal-discovery/discovery-engine.ts +0 -438
- package/src/causal-discovery/index.ts +0 -117
- package/src/causal-discovery/types.ts +0 -456
- package/src/causal-discovery/weight-matrix.ts +0 -453
- package/src/cli/commands/qe-tools.ts +0 -634
- package/src/cli/index.ts +0 -1976
- package/src/compatibility/agent-mapper.ts +0 -291
- package/src/compatibility/cli-adapter.ts +0 -277
- package/src/compatibility/config-migrator.ts +0 -334
- package/src/compatibility/index.ts +0 -112
- package/src/compatibility/mcp-adapter.ts +0 -248
- package/src/compatibility/types.ts +0 -156
- package/src/coordination/claims/claim-repository.ts +0 -636
- package/src/coordination/claims/claim-service.ts +0 -675
- package/src/coordination/claims/handoff-manager.ts +0 -535
- package/src/coordination/claims/index.ts +0 -276
- package/src/coordination/claims/interfaces.ts +0 -687
- package/src/coordination/claims/work-stealing.ts +0 -436
- package/src/coordination/cross-domain-router.ts +0 -492
- package/src/coordination/index.ts +0 -127
- package/src/coordination/interfaces.ts +0 -691
- package/src/coordination/protocol-executor.ts +0 -760
- package/src/coordination/protocols/code-intelligence-index.ts +0 -855
- package/src/coordination/protocols/defect-investigation.ts +0 -1184
- package/src/coordination/protocols/index.ts +0 -11
- package/src/coordination/protocols/learning-consolidation.ts +0 -1181
- package/src/coordination/protocols/morning-sync.ts +0 -1055
- package/src/coordination/protocols/quality-gate.ts +0 -1566
- package/src/coordination/protocols/security-audit.ts +0 -1587
- package/src/coordination/queen-coordinator.ts +0 -1176
- package/src/coordination/result-saver.ts +0 -780
- package/src/coordination/task-executor.ts +0 -1146
- package/src/coordination/workflow-orchestrator.ts +0 -1917
- package/src/domains/chaos-resilience/coordinator.ts +0 -1032
- package/src/domains/chaos-resilience/index.ts +0 -143
- package/src/domains/chaos-resilience/interfaces.ts +0 -659
- package/src/domains/chaos-resilience/plugin.ts +0 -691
- package/src/domains/chaos-resilience/services/chaos-engineer.ts +0 -1097
- package/src/domains/chaos-resilience/services/index.ts +0 -19
- package/src/domains/chaos-resilience/services/load-tester.ts +0 -799
- package/src/domains/chaos-resilience/services/performance-profiler.ts +0 -792
- package/src/domains/code-intelligence/coordinator.ts +0 -631
- package/src/domains/code-intelligence/index.ts +0 -86
- package/src/domains/code-intelligence/interfaces.ts +0 -162
- package/src/domains/code-intelligence/plugin.ts +0 -451
- package/src/domains/code-intelligence/services/impact-analyzer.ts +0 -567
- package/src/domains/code-intelligence/services/index.ts +0 -26
- package/src/domains/code-intelligence/services/knowledge-graph.ts +0 -1067
- package/src/domains/code-intelligence/services/semantic-analyzer.ts +0 -901
- package/src/domains/contract-testing/coordinator.ts +0 -1038
- package/src/domains/contract-testing/index.ts +0 -122
- package/src/domains/contract-testing/interfaces.ts +0 -458
- package/src/domains/contract-testing/plugin.ts +0 -746
- package/src/domains/contract-testing/services/api-compatibility.ts +0 -748
- package/src/domains/contract-testing/services/contract-validator.ts +0 -1700
- package/src/domains/contract-testing/services/index.ts +0 -19
- package/src/domains/contract-testing/services/schema-validator.ts +0 -1102
- package/src/domains/coverage-analysis/coordinator.ts +0 -485
- package/src/domains/coverage-analysis/index.ts +0 -114
- package/src/domains/coverage-analysis/interfaces.ts +0 -142
- package/src/domains/coverage-analysis/plugin.ts +0 -172
- package/src/domains/coverage-analysis/services/coverage-analyzer.ts +0 -449
- package/src/domains/coverage-analysis/services/coverage-embedder.ts +0 -733
- package/src/domains/coverage-analysis/services/coverage-parser.ts +0 -753
- package/src/domains/coverage-analysis/services/gap-detector.ts +0 -592
- package/src/domains/coverage-analysis/services/hnsw-index.ts +0 -728
- package/src/domains/coverage-analysis/services/index.ts +0 -61
- package/src/domains/coverage-analysis/services/risk-scorer.ts +0 -540
- package/src/domains/coverage-analysis/services/sublinear-analyzer.ts +0 -747
- package/src/domains/defect-intelligence/coordinator.ts +0 -635
- package/src/domains/defect-intelligence/index.ts +0 -83
- package/src/domains/defect-intelligence/interfaces.ts +0 -152
- package/src/domains/defect-intelligence/plugin.ts +0 -483
- package/src/domains/defect-intelligence/services/causal-root-cause-analyzer.ts +0 -494
- package/src/domains/defect-intelligence/services/defect-predictor.ts +0 -852
- package/src/domains/defect-intelligence/services/index.ts +0 -37
- package/src/domains/defect-intelligence/services/pattern-learner.ts +0 -738
- package/src/domains/defect-intelligence/services/root-cause-analyzer.ts +0 -637
- package/src/domains/domain-interface.ts +0 -77
- package/src/domains/index.ts +0 -23
- package/src/domains/learning-optimization/coordinator.ts +0 -1215
- package/src/domains/learning-optimization/index.ts +0 -127
- package/src/domains/learning-optimization/interfaces.ts +0 -570
- package/src/domains/learning-optimization/plugin.ts +0 -851
- package/src/domains/learning-optimization/services/index.ts +0 -29
- package/src/domains/learning-optimization/services/learning-coordinator.ts +0 -972
- package/src/domains/learning-optimization/services/metrics-optimizer.ts +0 -915
- package/src/domains/learning-optimization/services/production-intel.ts +0 -971
- package/src/domains/learning-optimization/services/transfer-specialist.ts +0 -723
- package/src/domains/quality-assessment/coherence/gate-controller.ts +0 -549
- package/src/domains/quality-assessment/coherence/index.ts +0 -211
- package/src/domains/quality-assessment/coherence/lambda-calculator.ts +0 -384
- package/src/domains/quality-assessment/coherence/partition-detector.ts +0 -469
- package/src/domains/quality-assessment/coherence/types.ts +0 -384
- package/src/domains/quality-assessment/coordinator.ts +0 -605
- package/src/domains/quality-assessment/index.ts +0 -97
- package/src/domains/quality-assessment/interfaces.ts +0 -152
- package/src/domains/quality-assessment/plugin.ts +0 -496
- package/src/domains/quality-assessment/services/coherence-gate.ts +0 -358
- package/src/domains/quality-assessment/services/deployment-advisor.ts +0 -571
- package/src/domains/quality-assessment/services/index.ts +0 -34
- package/src/domains/quality-assessment/services/quality-analyzer.ts +0 -670
- package/src/domains/quality-assessment/services/quality-gate.ts +0 -384
- package/src/domains/requirements-validation/coordinator.ts +0 -812
- package/src/domains/requirements-validation/index.ts +0 -92
- package/src/domains/requirements-validation/interfaces.ts +0 -303
- package/src/domains/requirements-validation/plugin.ts +0 -576
- package/src/domains/requirements-validation/services/bdd-scenario-writer.ts +0 -676
- package/src/domains/requirements-validation/services/index.ts +0 -20
- package/src/domains/requirements-validation/services/requirements-validator.ts +0 -559
- package/src/domains/requirements-validation/services/testability-scorer.ts +0 -639
- package/src/domains/security-compliance/coordinator.ts +0 -757
- package/src/domains/security-compliance/index.ts +0 -120
- package/src/domains/security-compliance/interfaces.ts +0 -434
- package/src/domains/security-compliance/plugin.ts +0 -509
- package/src/domains/security-compliance/services/compliance-validator.ts +0 -1226
- package/src/domains/security-compliance/services/index.ts +0 -31
- package/src/domains/security-compliance/services/security-auditor.ts +0 -2227
- package/src/domains/security-compliance/services/security-scanner.ts +0 -2354
- package/src/domains/security-compliance/services/semgrep-integration.ts +0 -289
- package/src/domains/test-execution/coordinator.ts +0 -426
- package/src/domains/test-execution/index.ts +0 -76
- package/src/domains/test-execution/interfaces.ts +0 -119
- package/src/domains/test-execution/plugin.ts +0 -208
- package/src/domains/test-execution/services/flaky-detector.ts +0 -1240
- package/src/domains/test-execution/services/index.ts +0 -8
- package/src/domains/test-execution/services/retry-handler.ts +0 -820
- package/src/domains/test-execution/services/test-executor.ts +0 -885
- package/src/domains/test-generation/coordinator.ts +0 -656
- package/src/domains/test-generation/index.ts +0 -77
- package/src/domains/test-generation/interfaces.ts +0 -118
- package/src/domains/test-generation/plugin.ts +0 -397
- package/src/domains/test-generation/services/index.ts +0 -23
- package/src/domains/test-generation/services/pattern-matcher.ts +0 -1725
- package/src/domains/test-generation/services/test-generator.ts +0 -2750
- package/src/domains/visual-accessibility/coordinator.ts +0 -860
- package/src/domains/visual-accessibility/index.ts +0 -116
- package/src/domains/visual-accessibility/interfaces.ts +0 -435
- package/src/domains/visual-accessibility/plugin.ts +0 -568
- package/src/domains/visual-accessibility/services/accessibility-tester.ts +0 -982
- package/src/domains/visual-accessibility/services/axe-core-audit.ts +0 -630
- package/src/domains/visual-accessibility/services/index.ts +0 -28
- package/src/domains/visual-accessibility/services/responsive-tester.ts +0 -934
- package/src/domains/visual-accessibility/services/visual-tester.ts +0 -458
- package/src/early-exit/early-exit-controller.ts +0 -490
- package/src/early-exit/early-exit-decision.ts +0 -391
- package/src/early-exit/index.ts +0 -115
- package/src/early-exit/quality-signal.ts +0 -389
- package/src/early-exit/speculative-executor.ts +0 -505
- package/src/early-exit/types.ts +0 -407
- package/src/feedback/coverage-learner.ts +0 -456
- package/src/feedback/feedback-loop.ts +0 -426
- package/src/feedback/index.ts +0 -72
- package/src/feedback/pattern-promotion.ts +0 -373
- package/src/feedback/quality-score-calculator.ts +0 -334
- package/src/feedback/test-outcome-tracker.ts +0 -450
- package/src/feedback/types.ts +0 -497
- package/src/index.ts +0 -224
- package/src/init/agents-installer.ts +0 -536
- package/src/init/index.ts +0 -80
- package/src/init/init-wizard.ts +0 -1061
- package/src/init/project-analyzer.ts +0 -696
- package/src/init/self-configurator.ts +0 -488
- package/src/init/skills-installer.ts +0 -467
- package/src/init/types.ts +0 -432
- package/src/integrations/ruvector/ast-complexity.ts +0 -470
- package/src/integrations/ruvector/coverage-router.ts +0 -594
- package/src/integrations/ruvector/diff-risk-classifier.ts +0 -759
- package/src/integrations/ruvector/fallback.ts +0 -942
- package/src/integrations/ruvector/graph-boundaries.ts +0 -809
- package/src/integrations/ruvector/index.ts +0 -363
- package/src/integrations/ruvector/interfaces.ts +0 -609
- package/src/integrations/ruvector/q-learning-router.ts +0 -550
- package/src/kernel/agent-coordinator.ts +0 -165
- package/src/kernel/agentdb-backend.ts +0 -504
- package/src/kernel/event-bus.ts +0 -129
- package/src/kernel/hybrid-backend.ts +0 -538
- package/src/kernel/index.ts +0 -28
- package/src/kernel/interfaces.ts +0 -257
- package/src/kernel/kernel.ts +0 -285
- package/src/kernel/memory-backend.ts +0 -169
- package/src/kernel/memory-factory.ts +0 -293
- package/src/kernel/plugin-loader.ts +0 -179
- package/src/learning/index.ts +0 -219
- package/src/learning/pattern-store.ts +0 -990
- package/src/learning/qe-guidance.ts +0 -832
- package/src/learning/qe-hooks.ts +0 -644
- package/src/learning/qe-patterns.ts +0 -449
- package/src/learning/qe-reasoning-bank.ts +0 -951
- package/src/learning/real-embeddings.ts +0 -277
- package/src/learning/real-qe-reasoning-bank.ts +0 -833
- package/src/learning/sqlite-persistence.ts +0 -554
- package/src/mcp/entry.ts +0 -59
- package/src/mcp/handlers/agent-handlers.ts +0 -285
- package/src/mcp/handlers/core-handlers.ts +0 -317
- package/src/mcp/handlers/domain-handlers.ts +0 -1444
- package/src/mcp/handlers/index.ts +0 -57
- package/src/mcp/handlers/memory-handlers.ts +0 -338
- package/src/mcp/handlers/task-handlers.ts +0 -363
- package/src/mcp/index.ts +0 -30
- package/src/mcp/metrics/index.ts +0 -14
- package/src/mcp/metrics/metrics-collector.ts +0 -503
- package/src/mcp/protocol-server.ts +0 -752
- package/src/mcp/security/cve-prevention.ts +0 -742
- package/src/mcp/security/index.ts +0 -356
- package/src/mcp/security/oauth21-provider.ts +0 -821
- package/src/mcp/security/rate-limiter.ts +0 -615
- package/src/mcp/security/sampling-server.ts +0 -662
- package/src/mcp/security/schema-validator.ts +0 -855
- package/src/mcp/server.ts +0 -657
- package/src/mcp/tool-registry.ts +0 -391
- package/src/mcp/tools/base.ts +0 -399
- package/src/mcp/tools/chaos-resilience/inject.ts +0 -699
- package/src/mcp/tools/code-intelligence/analyze.ts +0 -745
- package/src/mcp/tools/contract-testing/validate.ts +0 -708
- package/src/mcp/tools/coverage-analysis/index.ts +0 -770
- package/src/mcp/tools/defect-intelligence/predict.ts +0 -466
- package/src/mcp/tools/index.ts +0 -214
- package/src/mcp/tools/learning-optimization/optimize.ts +0 -772
- package/src/mcp/tools/quality-assessment/evaluate.ts +0 -385
- package/src/mcp/tools/registry.ts +0 -248
- package/src/mcp/tools/requirements-validation/validate.ts +0 -394
- package/src/mcp/tools/security-compliance/scan.ts +0 -365
- package/src/mcp/tools/test-execution/execute.ts +0 -291
- package/src/mcp/tools/test-generation/generate.ts +0 -544
- package/src/mcp/tools/visual-accessibility/index.ts +0 -791
- package/src/mcp/transport/index.ts +0 -31
- package/src/mcp/transport/stdio.ts +0 -318
- package/src/mcp/types.ts +0 -543
- package/src/neural-optimizer/index.ts +0 -111
- package/src/neural-optimizer/replay-buffer.ts +0 -455
- package/src/neural-optimizer/swarm-topology.ts +0 -508
- package/src/neural-optimizer/topology-optimizer.ts +0 -828
- package/src/neural-optimizer/types.ts +0 -481
- package/src/neural-optimizer/value-network.ts +0 -351
- package/src/optimization/auto-tuner.ts +0 -817
- package/src/optimization/index.ts +0 -77
- package/src/optimization/metric-collectors.ts +0 -474
- package/src/optimization/qe-workers.ts +0 -704
- package/src/optimization/tuning-algorithm.ts +0 -401
- package/src/optimization/types.ts +0 -314
- package/src/routing/index.ts +0 -51
- package/src/routing/qe-agent-registry.ts +0 -963
- package/src/routing/qe-task-router.ts +0 -564
- package/src/routing/routing-feedback.ts +0 -365
- package/src/routing/types.ts +0 -406
- package/src/shared/embeddings/embedding-cache.ts +0 -157
- package/src/shared/embeddings/index.ts +0 -50
- package/src/shared/embeddings/nomic-embedder.ts +0 -404
- package/src/shared/embeddings/ollama-client.ts +0 -195
- package/src/shared/embeddings/types.ts +0 -147
- package/src/shared/entities/agent.ts +0 -141
- package/src/shared/entities/base-entity.ts +0 -79
- package/src/shared/entities/index.ts +0 -6
- package/src/shared/events/domain-events.ts +0 -259
- package/src/shared/events/index.ts +0 -5
- package/src/shared/git/git-analyzer.ts +0 -656
- package/src/shared/git/index.ts +0 -11
- package/src/shared/http/http-client.ts +0 -420
- package/src/shared/http/index.ts +0 -13
- package/src/shared/index.ts +0 -41
- package/src/shared/io/file-reader.ts +0 -525
- package/src/shared/io/index.ts +0 -25
- package/src/shared/llm/cache.ts +0 -473
- package/src/shared/llm/circuit-breaker.ts +0 -369
- package/src/shared/llm/cost-tracker.ts +0 -460
- package/src/shared/llm/index.ts +0 -140
- package/src/shared/llm/interfaces.ts +0 -629
- package/src/shared/llm/provider-manager.ts +0 -685
- package/src/shared/llm/providers/claude.ts +0 -524
- package/src/shared/llm/providers/index.ts +0 -8
- package/src/shared/llm/providers/ollama.ts +0 -575
- package/src/shared/llm/providers/openai.ts +0 -609
- package/src/shared/metrics/code-metrics.ts +0 -520
- package/src/shared/metrics/index.ts +0 -23
- package/src/shared/metrics/system-metrics.ts +0 -353
- package/src/shared/parsers/index.ts +0 -6
- package/src/shared/parsers/typescript-parser.ts +0 -841
- package/src/shared/security/compliance-patterns.ts +0 -666
- package/src/shared/security/index.ts +0 -30
- package/src/shared/security/osv-client.ts +0 -468
- package/src/shared/types/index.ts +0 -150
- package/src/shared/value-objects/index.ts +0 -273
- package/src/strange-loop/healing-controller.ts +0 -833
- package/src/strange-loop/index.ts +0 -104
- package/src/strange-loop/self-model.ts +0 -494
- package/src/strange-loop/strange-loop.ts +0 -446
- package/src/strange-loop/swarm-observer.ts +0 -448
- package/src/strange-loop/topology-analyzer.ts +0 -565
- package/src/strange-loop/types.ts +0 -640
- package/src/time-crystal/default-phases.ts +0 -520
- package/src/time-crystal/index.ts +0 -164
- package/src/time-crystal/oscillator.ts +0 -425
- package/src/time-crystal/phase-executor.ts +0 -521
- package/src/time-crystal/scheduler.ts +0 -1025
- package/src/time-crystal/test-runner.ts +0 -787
- package/src/time-crystal/types.ts +0 -421
- package/src/workers/base-worker.ts +0 -304
- package/src/workers/daemon.ts +0 -264
- package/src/workers/index.ts +0 -119
- package/src/workers/interfaces.ts +0 -393
- package/src/workers/worker-manager.ts +0 -424
- package/src/workers/workers/compliance-checker.ts +0 -445
- package/src/workers/workers/coverage-tracker.ts +0 -344
- package/src/workers/workers/defect-predictor.ts +0 -375
- package/src/workers/workers/flaky-detector.ts +0 -390
- package/src/workers/workers/index.ts +0 -17
- package/src/workers/workers/learning-consolidation.ts +0 -442
- package/src/workers/workers/performance-baseline.ts +0 -434
- package/src/workers/workers/quality-gate.ts +0 -419
- package/src/workers/workers/regression-monitor.ts +0 -357
- package/src/workers/workers/security-scan.ts +0 -349
- package/src/workers/workers/test-health.ts +0 -359
- package/tests/integration/code-intelligence/knowledge-graph-real.test.ts +0 -540
- package/tests/integration/coordination/cross-domain-router.test.ts +0 -403
- package/tests/integration/coordination/protocol-executor.test.ts +0 -454
- package/tests/integration/coordination/workflow-orchestrator.test.ts +0 -418
- package/tests/integration/feedback/feedback-loop-integration.test.ts +0 -560
- package/tests/integration/migration/v2-to-v3-migration.test.ts +0 -471
- package/tests/integration/parsers/typescript-parser.test.ts +0 -463
- package/tests/integration/security/vulnerability-detection.test.ts +0 -628
- package/tests/integration/test-execution/coordinator.test.ts +0 -410
- package/tests/integration/test-generation/coordinator.test.ts +0 -361
- package/tests/mocks/index.ts +0 -228
- package/tests/time-crystal/default-phases.test.ts +0 -476
- package/tests/time-crystal/oscillator.test.ts +0 -541
- package/tests/time-crystal/phase-executor.test.ts +0 -653
- package/tests/time-crystal/scheduler.test.ts +0 -626
- package/tests/time-crystal/test-runner.test.ts +0 -594
- package/tests/unit/causal-discovery/causal-graph.test.ts +0 -504
- package/tests/unit/causal-discovery/causal-root-cause-analyzer.test.ts +0 -347
- package/tests/unit/causal-discovery/discovery-engine.test.ts +0 -435
- package/tests/unit/causal-discovery/weight-matrix.test.ts +0 -328
- package/tests/unit/cli/cli.test.ts +0 -341
- package/tests/unit/cli/commands.test.ts +0 -414
- package/tests/unit/cli/init-command.test.ts +0 -274
- package/tests/unit/cli/migrate-command.test.ts +0 -396
- package/tests/unit/coordination/claims/claim-service.test.ts +0 -949
- package/tests/unit/coordination/claims/handoff-manager.test.ts +0 -773
- package/tests/unit/coordination/claims/work-stealing.test.ts +0 -492
- package/tests/unit/coordination/queen-coordinator.test.ts +0 -966
- package/tests/unit/coordination/result-saver.test.ts +0 -653
- package/tests/unit/coordination/task-executor.test.ts +0 -810
- package/tests/unit/domains/chaos-resilience/chaos-engineer.test.ts +0 -484
- package/tests/unit/domains/chaos-resilience/load-tester.test.ts +0 -559
- package/tests/unit/domains/chaos-resilience/performance-profiler.test.ts +0 -490
- package/tests/unit/domains/code-intelligence/impact-analyzer.test.ts +0 -560
- package/tests/unit/domains/code-intelligence/knowledge-graph.test.ts +0 -460
- package/tests/unit/domains/code-intelligence/semantic-analyzer.test.ts +0 -584
- package/tests/unit/domains/contract-testing/api-compatibility.test.ts +0 -483
- package/tests/unit/domains/contract-testing/contract-validator.test.ts +0 -370
- package/tests/unit/domains/contract-testing/schema-validator.test.ts +0 -610
- package/tests/unit/domains/coverage-analysis/coverage-embedder.test.ts +0 -298
- package/tests/unit/domains/coverage-analysis/hnsw-index.test.ts +0 -292
- package/tests/unit/domains/coverage-analysis/sublinear-analyzer.test.ts +0 -506
- package/tests/unit/domains/defect-intelligence/defect-predictor.test.ts +0 -370
- package/tests/unit/domains/defect-intelligence/pattern-learner.test.ts +0 -546
- package/tests/unit/domains/defect-intelligence/root-cause-analyzer.test.ts +0 -534
- package/tests/unit/domains/learning-optimization/learning-coordinator.test.ts +0 -541
- package/tests/unit/domains/learning-optimization/metrics-optimizer.test.ts +0 -552
- package/tests/unit/domains/learning-optimization/production-intel.test.ts +0 -589
- package/tests/unit/domains/learning-optimization/transfer-specialist.test.ts +0 -453
- package/tests/unit/domains/quality-assessment/coherence-gate.test.ts +0 -1006
- package/tests/unit/domains/quality-assessment/deployment-advisor.test.ts +0 -515
- package/tests/unit/domains/quality-assessment/quality-analyzer.test.ts +0 -401
- package/tests/unit/domains/quality-assessment/quality-gate.test.ts +0 -324
- package/tests/unit/domains/requirements-validation/bdd-scenario-writer.test.ts +0 -479
- package/tests/unit/domains/requirements-validation/requirements-validator.test.ts +0 -452
- package/tests/unit/domains/requirements-validation/testability-scorer.test.ts +0 -505
- package/tests/unit/domains/security-compliance/compliance-validator.test.ts +0 -500
- package/tests/unit/domains/security-compliance/security-auditor.test.ts +0 -498
- package/tests/unit/domains/security-compliance/security-scanner.test.ts +0 -412
- package/tests/unit/domains/visual-accessibility/accessibility-tester.test.ts +0 -432
- package/tests/unit/domains/visual-accessibility/responsive-tester.test.ts +0 -506
- package/tests/unit/domains/visual-accessibility/visual-tester.test.ts +0 -412
- package/tests/unit/early-exit/early-exit-controller.test.ts +0 -548
- package/tests/unit/early-exit/early-exit-decision.test.ts +0 -617
- package/tests/unit/early-exit/index.test.ts +0 -254
- package/tests/unit/early-exit/quality-signal.test.ts +0 -589
- package/tests/unit/early-exit/speculative-executor.test.ts +0 -453
- package/tests/unit/feedback/coverage-learner.test.ts +0 -288
- package/tests/unit/feedback/feedback-loop.test.ts +0 -458
- package/tests/unit/feedback/pattern-promotion.test.ts +0 -390
- package/tests/unit/feedback/quality-score-calculator.test.ts +0 -364
- package/tests/unit/feedback/test-outcome-tracker.test.ts +0 -243
- package/tests/unit/init/init-wizard.test.ts +0 -881
- package/tests/unit/init/project-analyzer.test.ts +0 -807
- package/tests/unit/init/self-configurator.test.ts +0 -493
- package/tests/unit/integrations/ruvector/ast-complexity.test.ts +0 -240
- package/tests/unit/integrations/ruvector/coverage-router.test.ts +0 -366
- package/tests/unit/integrations/ruvector/diff-risk-classifier.test.ts +0 -340
- package/tests/unit/integrations/ruvector/graph-boundaries.test.ts +0 -355
- package/tests/unit/integrations/ruvector/q-learning-router.test.ts +0 -314
- package/tests/unit/kernel/agent-coordinator.test.ts +0 -220
- package/tests/unit/kernel/event-bus.test.ts +0 -197
- package/tests/unit/learning/qe-reasoning-bank.test.ts +0 -666
- package/tests/unit/learning/real-qe-reasoning-bank.benchmark.test.ts +0 -415
- package/tests/unit/mcp/mcp-server.test.ts +0 -544
- package/tests/unit/mcp/metrics/metrics-collector.test.ts +0 -340
- package/tests/unit/mcp/security/cve-prevention.test.ts +0 -512
- package/tests/unit/mcp/security/oauth21-provider.test.ts +0 -624
- package/tests/unit/mcp/security/rate-limiter.test.ts +0 -410
- package/tests/unit/mcp/security/sampling-server.test.ts +0 -420
- package/tests/unit/mcp/security/schema-validator.test.ts +0 -494
- package/tests/unit/mcp/tools/base.test.ts +0 -336
- package/tests/unit/mcp/tools/domain-tools.test.ts +0 -759
- package/tests/unit/mcp/tools/registry.test.ts +0 -240
- package/tests/unit/neural-optimizer/replay-buffer.test.ts +0 -403
- package/tests/unit/neural-optimizer/swarm-topology.test.ts +0 -473
- package/tests/unit/neural-optimizer/topology-optimizer.test.ts +0 -595
- package/tests/unit/neural-optimizer/value-network.test.ts +0 -343
- package/tests/unit/optimization/auto-tuner.test.ts +0 -506
- package/tests/unit/optimization/metric-collectors.test.ts +0 -352
- package/tests/unit/optimization/qe-workers.test.ts +0 -407
- package/tests/unit/optimization/tuning-algorithm.test.ts +0 -467
- package/tests/unit/routing/qe-agent-registry.test.ts +0 -229
- package/tests/unit/routing/qe-task-router.test.ts +0 -390
- package/tests/unit/routing/routing-feedback.test.ts +0 -339
- package/tests/unit/shared/embeddings/nomic-embedder.test.ts +0 -419
- package/tests/unit/shared/http/http-client.test.ts +0 -719
- package/tests/unit/shared/io/file-reader.test.ts +0 -511
- package/tests/unit/shared/llm/cache.test.ts +0 -391
- package/tests/unit/shared/llm/circuit-breaker.test.ts +0 -293
- package/tests/unit/shared/llm/cost-tracker.test.ts +0 -431
- package/tests/unit/shared/llm/provider-manager.test.ts +0 -550
- package/tests/unit/shared/llm/providers.test.ts +0 -532
- package/tests/unit/shared/parsers/typescript-parser.test.ts +0 -693
- package/tests/unit/shared/value-objects.test.ts +0 -184
- package/tests/unit/strange-loop/strange-loop.test.ts +0 -1170
- package/tests/unit/workers/base-worker.test.ts +0 -341
- package/tests/unit/workers/daemon.test.ts +0 -291
- package/tests/unit/workers/worker-manager.test.ts +0 -284
- package/tsconfig.json +0 -32
- package/vitest.config.ts +0 -27
|
@@ -1,934 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Responsive Testing Service
|
|
3
|
-
* Implements responsive design and cross-device testing
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
-
import { Result, ok, err } from '../../../shared/types/index.js';
|
|
8
|
-
import { MemoryBackend } from '../../../kernel/interfaces.js';
|
|
9
|
-
import {
|
|
10
|
-
Viewport,
|
|
11
|
-
Screenshot,
|
|
12
|
-
VisualDiff,
|
|
13
|
-
} from '../interfaces.js';
|
|
14
|
-
import { FilePath } from '../../../shared/value-objects/index.js';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Responsive testing interfaces
|
|
18
|
-
*/
|
|
19
|
-
export interface ResponsiveTestResult {
|
|
20
|
-
readonly url: string;
|
|
21
|
-
readonly timestamp: Date;
|
|
22
|
-
readonly viewports: ViewportResult[];
|
|
23
|
-
readonly breakpointIssues: BreakpointIssue[];
|
|
24
|
-
readonly layoutScore: number;
|
|
25
|
-
readonly recommendations: string[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface ViewportResult {
|
|
29
|
-
readonly viewport: Viewport;
|
|
30
|
-
readonly screenshot: Screenshot;
|
|
31
|
-
readonly layoutIssues: LayoutIssue[];
|
|
32
|
-
readonly renderTime: number;
|
|
33
|
-
readonly passed: boolean;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface LayoutIssue {
|
|
37
|
-
readonly type: LayoutIssueType;
|
|
38
|
-
readonly severity: 'critical' | 'warning' | 'info';
|
|
39
|
-
readonly element: string;
|
|
40
|
-
readonly description: string;
|
|
41
|
-
readonly viewport: Viewport;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export type LayoutIssueType =
|
|
45
|
-
| 'horizontal-overflow'
|
|
46
|
-
| 'text-overflow'
|
|
47
|
-
| 'overlapping-elements'
|
|
48
|
-
| 'hidden-content'
|
|
49
|
-
| 'touch-target-size'
|
|
50
|
-
| 'font-size-too-small'
|
|
51
|
-
| 'image-not-responsive';
|
|
52
|
-
|
|
53
|
-
export interface BreakpointIssue {
|
|
54
|
-
readonly breakpoint: number;
|
|
55
|
-
readonly description: string;
|
|
56
|
-
readonly affectedElements: string[];
|
|
57
|
-
readonly suggestion: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface ResponsiveTestConfig {
|
|
61
|
-
viewports: Viewport[];
|
|
62
|
-
breakpoints: number[];
|
|
63
|
-
checkTouchTargets: boolean;
|
|
64
|
-
minFontSize: number;
|
|
65
|
-
minTouchTargetSize: number;
|
|
66
|
-
/**
|
|
67
|
-
* Enable simulation mode for testing purposes only.
|
|
68
|
-
* When true, returns deterministic stub data for layout issues.
|
|
69
|
-
* When false (default), returns empty results (no browser available).
|
|
70
|
-
*/
|
|
71
|
-
simulationMode: boolean;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Predefined device viewports
|
|
76
|
-
*/
|
|
77
|
-
export const DEVICE_VIEWPORTS: Record<string, Viewport> = {
|
|
78
|
-
'iphone-se': {
|
|
79
|
-
width: 375,
|
|
80
|
-
height: 667,
|
|
81
|
-
deviceScaleFactor: 2,
|
|
82
|
-
isMobile: true,
|
|
83
|
-
hasTouch: true,
|
|
84
|
-
},
|
|
85
|
-
'iphone-14': {
|
|
86
|
-
width: 390,
|
|
87
|
-
height: 844,
|
|
88
|
-
deviceScaleFactor: 3,
|
|
89
|
-
isMobile: true,
|
|
90
|
-
hasTouch: true,
|
|
91
|
-
},
|
|
92
|
-
'iphone-14-pro-max': {
|
|
93
|
-
width: 430,
|
|
94
|
-
height: 932,
|
|
95
|
-
deviceScaleFactor: 3,
|
|
96
|
-
isMobile: true,
|
|
97
|
-
hasTouch: true,
|
|
98
|
-
},
|
|
99
|
-
'ipad-mini': {
|
|
100
|
-
width: 768,
|
|
101
|
-
height: 1024,
|
|
102
|
-
deviceScaleFactor: 2,
|
|
103
|
-
isMobile: true,
|
|
104
|
-
hasTouch: true,
|
|
105
|
-
},
|
|
106
|
-
'ipad-pro': {
|
|
107
|
-
width: 1024,
|
|
108
|
-
height: 1366,
|
|
109
|
-
deviceScaleFactor: 2,
|
|
110
|
-
isMobile: true,
|
|
111
|
-
hasTouch: true,
|
|
112
|
-
},
|
|
113
|
-
'pixel-7': {
|
|
114
|
-
width: 412,
|
|
115
|
-
height: 915,
|
|
116
|
-
deviceScaleFactor: 2.625,
|
|
117
|
-
isMobile: true,
|
|
118
|
-
hasTouch: true,
|
|
119
|
-
},
|
|
120
|
-
'galaxy-s21': {
|
|
121
|
-
width: 360,
|
|
122
|
-
height: 800,
|
|
123
|
-
deviceScaleFactor: 3,
|
|
124
|
-
isMobile: true,
|
|
125
|
-
hasTouch: true,
|
|
126
|
-
},
|
|
127
|
-
'desktop-hd': {
|
|
128
|
-
width: 1920,
|
|
129
|
-
height: 1080,
|
|
130
|
-
deviceScaleFactor: 1,
|
|
131
|
-
isMobile: false,
|
|
132
|
-
hasTouch: false,
|
|
133
|
-
},
|
|
134
|
-
'desktop-2k': {
|
|
135
|
-
width: 2560,
|
|
136
|
-
height: 1440,
|
|
137
|
-
deviceScaleFactor: 1,
|
|
138
|
-
isMobile: false,
|
|
139
|
-
hasTouch: false,
|
|
140
|
-
},
|
|
141
|
-
'laptop': {
|
|
142
|
-
width: 1366,
|
|
143
|
-
height: 768,
|
|
144
|
-
deviceScaleFactor: 1,
|
|
145
|
-
isMobile: false,
|
|
146
|
-
hasTouch: false,
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const DEFAULT_CONFIG: ResponsiveTestConfig = {
|
|
151
|
-
viewports: [
|
|
152
|
-
DEVICE_VIEWPORTS['iphone-14'],
|
|
153
|
-
DEVICE_VIEWPORTS['ipad-mini'],
|
|
154
|
-
DEVICE_VIEWPORTS['laptop'],
|
|
155
|
-
DEVICE_VIEWPORTS['desktop-hd'],
|
|
156
|
-
],
|
|
157
|
-
breakpoints: [320, 480, 768, 1024, 1280, 1920],
|
|
158
|
-
checkTouchTargets: true,
|
|
159
|
-
minFontSize: 12,
|
|
160
|
-
minTouchTargetSize: 44,
|
|
161
|
-
simulationMode: false,
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Responsive Tester Service
|
|
166
|
-
*/
|
|
167
|
-
export interface IResponsiveTestingService {
|
|
168
|
-
/**
|
|
169
|
-
* Test responsive design across viewports
|
|
170
|
-
*/
|
|
171
|
-
testResponsiveness(url: string, options?: Partial<ResponsiveTestConfig>): Promise<Result<ResponsiveTestResult, Error>>;
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Compare layouts between viewports
|
|
175
|
-
*/
|
|
176
|
-
compareViewports(url: string, viewport1: Viewport, viewport2: Viewport): Promise<Result<VisualDiff, Error>>;
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Test specific breakpoint
|
|
180
|
-
*/
|
|
181
|
-
testBreakpoint(url: string, breakpoint: number): Promise<Result<ViewportResult, Error>>;
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Get recommended breakpoints based on content
|
|
185
|
-
*/
|
|
186
|
-
analyzeBreakpoints(url: string): Promise<Result<BreakpointAnalysis, Error>>;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export interface BreakpointAnalysis {
|
|
190
|
-
readonly currentBreakpoints: number[];
|
|
191
|
-
readonly suggestedBreakpoints: number[];
|
|
192
|
-
readonly contentBreaks: ContentBreak[];
|
|
193
|
-
readonly coverageScore: number;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export interface ContentBreak {
|
|
197
|
-
readonly width: number;
|
|
198
|
-
readonly reason: string;
|
|
199
|
-
readonly affectedElements: string[];
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Responsive Testing Service Implementation
|
|
204
|
-
*/
|
|
205
|
-
export class ResponsiveTesterService implements IResponsiveTestingService {
|
|
206
|
-
private readonly config: ResponsiveTestConfig;
|
|
207
|
-
|
|
208
|
-
constructor(
|
|
209
|
-
private readonly memory: MemoryBackend,
|
|
210
|
-
config: Partial<ResponsiveTestConfig> = {}
|
|
211
|
-
) {
|
|
212
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Test responsive design across viewports
|
|
217
|
-
*/
|
|
218
|
-
async testResponsiveness(
|
|
219
|
-
url: string,
|
|
220
|
-
options?: Partial<ResponsiveTestConfig>
|
|
221
|
-
): Promise<Result<ResponsiveTestResult, Error>> {
|
|
222
|
-
try {
|
|
223
|
-
const testConfig = { ...this.config, ...options };
|
|
224
|
-
const viewportResults: ViewportResult[] = [];
|
|
225
|
-
const allIssues: LayoutIssue[] = [];
|
|
226
|
-
|
|
227
|
-
// Test each viewport
|
|
228
|
-
for (const viewport of testConfig.viewports) {
|
|
229
|
-
const result = await this.testViewport(url, viewport, testConfig);
|
|
230
|
-
viewportResults.push(result);
|
|
231
|
-
allIssues.push(...result.layoutIssues);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Detect breakpoint issues
|
|
235
|
-
const breakpointIssues = this.detectBreakpointIssues(
|
|
236
|
-
url,
|
|
237
|
-
viewportResults,
|
|
238
|
-
testConfig
|
|
239
|
-
);
|
|
240
|
-
|
|
241
|
-
// Calculate layout score
|
|
242
|
-
const layoutScore = this.calculateLayoutScore(viewportResults, allIssues);
|
|
243
|
-
|
|
244
|
-
// Generate recommendations
|
|
245
|
-
const recommendations = this.generateRecommendations(allIssues, breakpointIssues);
|
|
246
|
-
|
|
247
|
-
const result: ResponsiveTestResult = {
|
|
248
|
-
url,
|
|
249
|
-
timestamp: new Date(),
|
|
250
|
-
viewports: viewportResults,
|
|
251
|
-
breakpointIssues,
|
|
252
|
-
layoutScore,
|
|
253
|
-
recommendations,
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
// Store result
|
|
257
|
-
await this.storeResult(result);
|
|
258
|
-
|
|
259
|
-
return ok(result);
|
|
260
|
-
} catch (error) {
|
|
261
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Compare layouts between viewports
|
|
267
|
-
*/
|
|
268
|
-
async compareViewports(
|
|
269
|
-
url: string,
|
|
270
|
-
viewport1: Viewport,
|
|
271
|
-
viewport2: Viewport
|
|
272
|
-
): Promise<Result<VisualDiff, Error>> {
|
|
273
|
-
try {
|
|
274
|
-
// Capture screenshots for both viewports
|
|
275
|
-
const screenshot1 = this.createScreenshot(url, viewport1);
|
|
276
|
-
const screenshot2 = this.createScreenshot(url, viewport2);
|
|
277
|
-
|
|
278
|
-
// Calculate structural diff (not pixel diff)
|
|
279
|
-
const diff = this.calculateStructuralDiff(screenshot1, screenshot2);
|
|
280
|
-
|
|
281
|
-
return ok(diff);
|
|
282
|
-
} catch (error) {
|
|
283
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Test specific breakpoint
|
|
289
|
-
*/
|
|
290
|
-
async testBreakpoint(
|
|
291
|
-
url: string,
|
|
292
|
-
breakpoint: number
|
|
293
|
-
): Promise<Result<ViewportResult, Error>> {
|
|
294
|
-
try {
|
|
295
|
-
const viewport: Viewport = {
|
|
296
|
-
width: breakpoint,
|
|
297
|
-
height: 800,
|
|
298
|
-
deviceScaleFactor: 1,
|
|
299
|
-
isMobile: breakpoint < 768,
|
|
300
|
-
hasTouch: breakpoint < 1024,
|
|
301
|
-
};
|
|
302
|
-
|
|
303
|
-
const result = await this.testViewport(url, viewport, this.config);
|
|
304
|
-
return ok(result);
|
|
305
|
-
} catch (error) {
|
|
306
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* Analyze breakpoints based on content
|
|
312
|
-
*/
|
|
313
|
-
async analyzeBreakpoints(url: string): Promise<Result<BreakpointAnalysis, Error>> {
|
|
314
|
-
try {
|
|
315
|
-
// Test across a range of widths to find content breaks
|
|
316
|
-
const contentBreaks = this.findContentBreaks(url);
|
|
317
|
-
|
|
318
|
-
// Compare with current breakpoints
|
|
319
|
-
const currentBreakpoints = this.config.breakpoints;
|
|
320
|
-
const suggestedBreakpoints = this.suggestBreakpoints(contentBreaks);
|
|
321
|
-
|
|
322
|
-
// Calculate coverage score
|
|
323
|
-
const coverageScore = this.calculateBreakpointCoverage(
|
|
324
|
-
currentBreakpoints,
|
|
325
|
-
contentBreaks
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
return ok({
|
|
329
|
-
currentBreakpoints,
|
|
330
|
-
suggestedBreakpoints,
|
|
331
|
-
contentBreaks,
|
|
332
|
-
coverageScore,
|
|
333
|
-
});
|
|
334
|
-
} catch (error) {
|
|
335
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// ============================================================================
|
|
340
|
-
// Private Helper Methods
|
|
341
|
-
// ============================================================================
|
|
342
|
-
|
|
343
|
-
private async testViewport(
|
|
344
|
-
url: string,
|
|
345
|
-
viewport: Viewport,
|
|
346
|
-
config: ResponsiveTestConfig
|
|
347
|
-
): Promise<ViewportResult> {
|
|
348
|
-
const screenshot = this.createScreenshot(url, viewport);
|
|
349
|
-
const layoutIssues = this.detectLayoutIssues(url, viewport, config);
|
|
350
|
-
|
|
351
|
-
// Deterministic render time based on URL hash and viewport
|
|
352
|
-
const urlHash = this.hashUrl(url);
|
|
353
|
-
const hashNum = parseInt(urlHash, 36);
|
|
354
|
-
const renderTime = 200 + ((hashNum + viewport.width) % 1000);
|
|
355
|
-
|
|
356
|
-
const passed = layoutIssues.filter((i) => i.severity === 'critical').length === 0;
|
|
357
|
-
|
|
358
|
-
return {
|
|
359
|
-
viewport,
|
|
360
|
-
screenshot,
|
|
361
|
-
layoutIssues,
|
|
362
|
-
renderTime,
|
|
363
|
-
passed,
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
private createScreenshot(url: string, viewport: Viewport): Screenshot {
|
|
368
|
-
// Deterministic load time based on URL hash and viewport
|
|
369
|
-
const urlHash = this.hashUrl(url);
|
|
370
|
-
const hashNum = parseInt(urlHash, 36);
|
|
371
|
-
const loadTime = 500 + ((hashNum + viewport.width + viewport.height) % 2000);
|
|
372
|
-
|
|
373
|
-
return {
|
|
374
|
-
id: uuidv4(),
|
|
375
|
-
url,
|
|
376
|
-
viewport,
|
|
377
|
-
timestamp: new Date(),
|
|
378
|
-
path: FilePath.create(`.visual-tests/responsive/${viewport.width}x${viewport.height}.png`),
|
|
379
|
-
metadata: {
|
|
380
|
-
browser: 'chromium',
|
|
381
|
-
os: process.platform,
|
|
382
|
-
fullPage: false,
|
|
383
|
-
loadTime,
|
|
384
|
-
},
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
private detectLayoutIssues(
|
|
389
|
-
url: string,
|
|
390
|
-
viewport: Viewport,
|
|
391
|
-
config: ResponsiveTestConfig
|
|
392
|
-
): LayoutIssue[] {
|
|
393
|
-
// Simulation mode: use deterministic results based on URL hash and viewport
|
|
394
|
-
if (config.simulationMode) {
|
|
395
|
-
return this.detectLayoutIssuesSimulation(url, viewport, config);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// Production mode: perform heuristic-based responsive analysis
|
|
399
|
-
// without browser automation (static analysis based on URL patterns and viewport)
|
|
400
|
-
return this.detectLayoutIssuesHeuristic(url, viewport, config);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Heuristic-based responsive layout issue detection for production mode.
|
|
405
|
-
* Analyzes URL patterns and viewport characteristics to identify likely issues.
|
|
406
|
-
*/
|
|
407
|
-
private detectLayoutIssuesHeuristic(
|
|
408
|
-
url: string,
|
|
409
|
-
viewport: Viewport,
|
|
410
|
-
config: ResponsiveTestConfig
|
|
411
|
-
): LayoutIssue[] {
|
|
412
|
-
const issues: LayoutIssue[] = [];
|
|
413
|
-
const urlLower = url.toLowerCase();
|
|
414
|
-
|
|
415
|
-
// === Check CSS breakpoint coverage ===
|
|
416
|
-
// Identify pages that commonly have breakpoint issues
|
|
417
|
-
const hasResponsivePatterns = this.hasResponsivePatterns(urlLower);
|
|
418
|
-
|
|
419
|
-
// Check for horizontal overflow risk at small viewports
|
|
420
|
-
if (viewport.width < 768) {
|
|
421
|
-
// Pages with tables, wide images, or fixed-width elements
|
|
422
|
-
if (this.hasWideContentPatterns(urlLower)) {
|
|
423
|
-
issues.push({
|
|
424
|
-
type: 'horizontal-overflow',
|
|
425
|
-
severity: 'critical',
|
|
426
|
-
element: '.wide-content, table, pre',
|
|
427
|
-
description: 'Wide content elements may cause horizontal overflow on mobile',
|
|
428
|
-
viewport,
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Pages without responsive patterns
|
|
433
|
-
if (!hasResponsivePatterns) {
|
|
434
|
-
issues.push({
|
|
435
|
-
type: 'horizontal-overflow',
|
|
436
|
-
severity: 'warning',
|
|
437
|
-
element: '.container',
|
|
438
|
-
description: 'Page may lack responsive CSS breakpoints for mobile',
|
|
439
|
-
viewport,
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// === Check viewport meta tag issues ===
|
|
445
|
-
// Very small widths without proper viewport handling
|
|
446
|
-
if (viewport.width <= 320) {
|
|
447
|
-
issues.push({
|
|
448
|
-
type: 'text-overflow',
|
|
449
|
-
severity: 'warning',
|
|
450
|
-
element: 'body',
|
|
451
|
-
description: 'Verify viewport meta tag is set correctly for very small screens',
|
|
452
|
-
viewport,
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
// === Check touch target sizes ===
|
|
457
|
-
if (config.checkTouchTargets && viewport.hasTouch) {
|
|
458
|
-
// Interactive pages need proper touch targets
|
|
459
|
-
if (this.hasInteractiveElements(urlLower)) {
|
|
460
|
-
issues.push({
|
|
461
|
-
type: 'touch-target-size',
|
|
462
|
-
severity: 'warning',
|
|
463
|
-
element: 'button, a, input',
|
|
464
|
-
description: `Touch targets should be at least ${config.minTouchTargetSize}px for accessibility`,
|
|
465
|
-
viewport,
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// Navigation links on mobile
|
|
470
|
-
if (viewport.isMobile && this.hasNavigationElements(urlLower)) {
|
|
471
|
-
issues.push({
|
|
472
|
-
type: 'touch-target-size',
|
|
473
|
-
severity: 'info',
|
|
474
|
-
element: 'nav a',
|
|
475
|
-
description: 'Navigation links may be too small for touch on mobile devices',
|
|
476
|
-
viewport,
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// === Check font size readability ===
|
|
482
|
-
if (viewport.isMobile && config.minFontSize > 0) {
|
|
483
|
-
// Forms and data-heavy pages often have small text
|
|
484
|
-
if (this.hasDataDensePatterns(urlLower)) {
|
|
485
|
-
issues.push({
|
|
486
|
-
type: 'font-size-too-small',
|
|
487
|
-
severity: 'warning',
|
|
488
|
-
element: '.data, .table, .form-label',
|
|
489
|
-
description: `Font size may be below ${config.minFontSize}px on mobile`,
|
|
490
|
-
viewport,
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
// === Check image responsiveness ===
|
|
496
|
-
if (this.hasImagePatterns(urlLower)) {
|
|
497
|
-
// Large viewports should use higher resolution images
|
|
498
|
-
if (viewport.deviceScaleFactor > 1) {
|
|
499
|
-
issues.push({
|
|
500
|
-
type: 'image-not-responsive',
|
|
501
|
-
severity: 'info',
|
|
502
|
-
element: 'img',
|
|
503
|
-
description: 'Verify images use srcset for high-DPI displays',
|
|
504
|
-
viewport,
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
// Small viewports should use appropriately sized images
|
|
509
|
-
if (viewport.width < 480) {
|
|
510
|
-
issues.push({
|
|
511
|
-
type: 'image-not-responsive',
|
|
512
|
-
severity: 'info',
|
|
513
|
-
element: 'img',
|
|
514
|
-
description: 'Verify images are resized for mobile to reduce bandwidth',
|
|
515
|
-
viewport,
|
|
516
|
-
});
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
// === Check media query coverage ===
|
|
521
|
-
// Analyze standard breakpoint coverage
|
|
522
|
-
const nearestBreakpoint = this.findNearestBreakpoint(viewport.width, config.breakpoints);
|
|
523
|
-
if (nearestBreakpoint.gap > 200) {
|
|
524
|
-
issues.push({
|
|
525
|
-
type: 'hidden-content',
|
|
526
|
-
severity: 'info',
|
|
527
|
-
element: 'body',
|
|
528
|
-
description: `Viewport ${viewport.width}px is ${nearestBreakpoint.gap}px from nearest breakpoint (${nearestBreakpoint.value}px)`,
|
|
529
|
-
viewport,
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// === Check element overlap risks ===
|
|
534
|
-
if (this.hasOverlapRiskPatterns(urlLower) && viewport.width < 1024) {
|
|
535
|
-
issues.push({
|
|
536
|
-
type: 'overlapping-elements',
|
|
537
|
-
severity: 'warning',
|
|
538
|
-
element: '.positioned, .absolute, .fixed',
|
|
539
|
-
description: 'Positioned elements may overlap on smaller screens',
|
|
540
|
-
viewport,
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
return issues;
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
// URL pattern detection helpers for responsive analysis
|
|
548
|
-
private hasResponsivePatterns(url: string): boolean {
|
|
549
|
-
// URLs that typically have responsive design
|
|
550
|
-
return url.includes('mobile') || url.includes('responsive') ||
|
|
551
|
-
url.includes('bootstrap') || url.includes('tailwind') ||
|
|
552
|
-
url.includes('material') || url.includes('foundation');
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
private hasWideContentPatterns(url: string): boolean {
|
|
556
|
-
return url.includes('table') || url.includes('data') || url.includes('report') ||
|
|
557
|
-
url.includes('code') || url.includes('pre') || url.includes('spreadsheet');
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
private hasInteractiveElements(url: string): boolean {
|
|
561
|
-
return url.includes('form') || url.includes('button') || url.includes('input') ||
|
|
562
|
-
url.includes('select') || url.includes('click') || url.includes('action');
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
private hasNavigationElements(url: string): boolean {
|
|
566
|
-
return url.includes('nav') || url.includes('menu') || url.includes('header') ||
|
|
567
|
-
url.includes('sidebar') || url.includes('footer') || url.includes('breadcrumb');
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
private hasDataDensePatterns(url: string): boolean {
|
|
571
|
-
return url.includes('dashboard') || url.includes('analytics') || url.includes('report') ||
|
|
572
|
-
url.includes('table') || url.includes('stats') || url.includes('metrics');
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
private hasImagePatterns(url: string): boolean {
|
|
576
|
-
return url.includes('gallery') || url.includes('photo') || url.includes('image') ||
|
|
577
|
-
url.includes('media') || url.includes('portfolio') || url.includes('hero');
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
private hasOverlapRiskPatterns(url: string): boolean {
|
|
581
|
-
return url.includes('modal') || url.includes('overlay') || url.includes('tooltip') ||
|
|
582
|
-
url.includes('dropdown') || url.includes('popup') || url.includes('float');
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
private findNearestBreakpoint(width: number, breakpoints: number[]): { value: number; gap: number } {
|
|
586
|
-
let nearest = breakpoints[0] || 0;
|
|
587
|
-
let minGap = Math.abs(width - nearest);
|
|
588
|
-
|
|
589
|
-
for (const bp of breakpoints) {
|
|
590
|
-
const gap = Math.abs(width - bp);
|
|
591
|
-
if (gap < minGap) {
|
|
592
|
-
minGap = gap;
|
|
593
|
-
nearest = bp;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
return { value: nearest, gap: minGap };
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
/**
|
|
601
|
-
* Simulation mode layout issue detection with deterministic results.
|
|
602
|
-
*/
|
|
603
|
-
private detectLayoutIssuesSimulation(
|
|
604
|
-
url: string,
|
|
605
|
-
viewport: Viewport,
|
|
606
|
-
config: ResponsiveTestConfig
|
|
607
|
-
): LayoutIssue[] {
|
|
608
|
-
const issues: LayoutIssue[] = [];
|
|
609
|
-
const urlHash = this.hashUrl(url);
|
|
610
|
-
const hashNum = parseInt(urlHash, 36);
|
|
611
|
-
|
|
612
|
-
// Deterministic check for horizontal overflow (more likely on small screens)
|
|
613
|
-
// Use hash + viewport width for determinism
|
|
614
|
-
const overflowDeterminant = ((hashNum + viewport.width) % 100) / 100;
|
|
615
|
-
if (viewport.width < 768 && overflowDeterminant < 0.2) {
|
|
616
|
-
issues.push({
|
|
617
|
-
type: 'horizontal-overflow',
|
|
618
|
-
severity: 'critical',
|
|
619
|
-
element: '.container',
|
|
620
|
-
description: 'Content overflows horizontally causing horizontal scroll',
|
|
621
|
-
viewport,
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
// Deterministic check for text overflow
|
|
626
|
-
const textOverflowDeterminant = ((hashNum + viewport.width + 100) % 100) / 100;
|
|
627
|
-
if (viewport.width < 480 && textOverflowDeterminant < 0.15) {
|
|
628
|
-
issues.push({
|
|
629
|
-
type: 'text-overflow',
|
|
630
|
-
severity: 'warning',
|
|
631
|
-
element: '.long-text',
|
|
632
|
-
description: 'Text content is truncated or overflows container',
|
|
633
|
-
viewport,
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
// Deterministic check for touch target size on mobile
|
|
638
|
-
const touchDeterminant = ((hashNum + viewport.width + 200) % 100) / 100;
|
|
639
|
-
if (config.checkTouchTargets && viewport.isMobile && touchDeterminant < 0.25) {
|
|
640
|
-
issues.push({
|
|
641
|
-
type: 'touch-target-size',
|
|
642
|
-
severity: 'warning',
|
|
643
|
-
element: '.small-button',
|
|
644
|
-
description: `Touch target is smaller than ${config.minTouchTargetSize}px minimum`,
|
|
645
|
-
viewport,
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
// Deterministic check for font size
|
|
650
|
-
const fontDeterminant = ((hashNum + viewport.width + 300) % 100) / 100;
|
|
651
|
-
if (viewport.isMobile && fontDeterminant < 0.1) {
|
|
652
|
-
issues.push({
|
|
653
|
-
type: 'font-size-too-small',
|
|
654
|
-
severity: 'warning',
|
|
655
|
-
element: '.fine-print',
|
|
656
|
-
description: `Font size is below ${config.minFontSize}px minimum for readability`,
|
|
657
|
-
viewport,
|
|
658
|
-
});
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Deterministic check for non-responsive images
|
|
662
|
-
const imageDeterminant = ((hashNum + viewport.width + 400) % 100) / 100;
|
|
663
|
-
if (imageDeterminant < 0.15) {
|
|
664
|
-
issues.push({
|
|
665
|
-
type: 'image-not-responsive',
|
|
666
|
-
severity: 'info',
|
|
667
|
-
element: 'img.hero-image',
|
|
668
|
-
description: 'Image does not scale properly for viewport width',
|
|
669
|
-
viewport,
|
|
670
|
-
});
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
return issues;
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
private detectBreakpointIssues(
|
|
677
|
-
url: string,
|
|
678
|
-
viewportResults: ViewportResult[],
|
|
679
|
-
config: ResponsiveTestConfig
|
|
680
|
-
): BreakpointIssue[] {
|
|
681
|
-
// In production mode (simulationMode: false), return empty results
|
|
682
|
-
// since we can't detect breakpoint issues without a real browser
|
|
683
|
-
if (!config.simulationMode) {
|
|
684
|
-
return [];
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
const issues: BreakpointIssue[] = [];
|
|
688
|
-
const urlHash = this.hashUrl(url);
|
|
689
|
-
const hashNum = parseInt(urlHash, 36);
|
|
690
|
-
|
|
691
|
-
// Sort results by viewport width
|
|
692
|
-
const sorted = [...viewportResults].sort(
|
|
693
|
-
(a, b) => a.viewport.width - b.viewport.width
|
|
694
|
-
);
|
|
695
|
-
|
|
696
|
-
// Check for issues at each breakpoint
|
|
697
|
-
for (let i = 0; i < sorted.length - 1; i++) {
|
|
698
|
-
const current = sorted[i];
|
|
699
|
-
const next = sorted[i + 1];
|
|
700
|
-
|
|
701
|
-
// Check if there's a breakpoint between these viewports
|
|
702
|
-
const breakpointBetween = config.breakpoints.find(
|
|
703
|
-
(bp) => bp > current.viewport.width && bp < next.viewport.width
|
|
704
|
-
);
|
|
705
|
-
|
|
706
|
-
// Deterministic decision based on hash and breakpoint
|
|
707
|
-
if (breakpointBetween) {
|
|
708
|
-
const determinant = ((hashNum + breakpointBetween + i * 100) % 100) / 100;
|
|
709
|
-
if (determinant < 0.2) {
|
|
710
|
-
issues.push({
|
|
711
|
-
breakpoint: breakpointBetween,
|
|
712
|
-
description: 'Layout shifts abruptly at this breakpoint',
|
|
713
|
-
affectedElements: ['.navigation', '.sidebar'],
|
|
714
|
-
suggestion: 'Consider adding intermediate styles or adjusting breakpoint',
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
return issues;
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
private calculateLayoutScore(
|
|
724
|
-
viewportResults: ViewportResult[],
|
|
725
|
-
issues: LayoutIssue[]
|
|
726
|
-
): number {
|
|
727
|
-
const baseScore = 100;
|
|
728
|
-
|
|
729
|
-
// Deduct points for issues
|
|
730
|
-
const criticalPenalty = issues.filter((i) => i.severity === 'critical').length * 15;
|
|
731
|
-
const warningPenalty = issues.filter((i) => i.severity === 'warning').length * 5;
|
|
732
|
-
const infoPenalty = issues.filter((i) => i.severity === 'info').length * 1;
|
|
733
|
-
|
|
734
|
-
// Bonus for passing all viewport tests
|
|
735
|
-
const passingBonus = viewportResults.every((r) => r.passed) ? 5 : 0;
|
|
736
|
-
|
|
737
|
-
return Math.max(0, baseScore - criticalPenalty - warningPenalty - infoPenalty + passingBonus);
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
private generateRecommendations(
|
|
741
|
-
layoutIssues: LayoutIssue[],
|
|
742
|
-
breakpointIssues: BreakpointIssue[]
|
|
743
|
-
): string[] {
|
|
744
|
-
const recommendations: string[] = [];
|
|
745
|
-
|
|
746
|
-
// Group issues by type
|
|
747
|
-
const issuesByType = new Map<LayoutIssueType, LayoutIssue[]>();
|
|
748
|
-
for (const issue of layoutIssues) {
|
|
749
|
-
const existing = issuesByType.get(issue.type) || [];
|
|
750
|
-
issuesByType.set(issue.type, [...existing, issue]);
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
// Generate recommendations for each issue type
|
|
754
|
-
if (issuesByType.has('horizontal-overflow')) {
|
|
755
|
-
recommendations.push(
|
|
756
|
-
'Use CSS overflow-x: hidden or adjust element widths to prevent horizontal scrolling'
|
|
757
|
-
);
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
if (issuesByType.has('touch-target-size')) {
|
|
761
|
-
recommendations.push(
|
|
762
|
-
'Increase touch target sizes to at least 44x44 pixels for better mobile usability'
|
|
763
|
-
);
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
if (issuesByType.has('font-size-too-small')) {
|
|
767
|
-
recommendations.push(
|
|
768
|
-
'Use relative font units (rem/em) and ensure minimum 16px base font size on mobile'
|
|
769
|
-
);
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
if (issuesByType.has('image-not-responsive')) {
|
|
773
|
-
recommendations.push(
|
|
774
|
-
'Use srcset and sizes attributes for responsive images, or CSS max-width: 100%'
|
|
775
|
-
);
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
if (breakpointIssues.length > 0) {
|
|
779
|
-
recommendations.push(
|
|
780
|
-
'Review CSS media queries to ensure smooth transitions between breakpoints'
|
|
781
|
-
);
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
return recommendations;
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
private calculateStructuralDiff(
|
|
788
|
-
screenshot1: Screenshot,
|
|
789
|
-
screenshot2: Screenshot
|
|
790
|
-
): VisualDiff {
|
|
791
|
-
// Calculate difference based on viewport changes
|
|
792
|
-
const widthDiff = Math.abs(screenshot1.viewport.width - screenshot2.viewport.width);
|
|
793
|
-
const heightDiff = Math.abs(screenshot1.viewport.height - screenshot2.viewport.height);
|
|
794
|
-
|
|
795
|
-
// Larger viewport differences typically mean more layout changes
|
|
796
|
-
const diffPercentage = Math.min(50, (widthDiff + heightDiff) / 20);
|
|
797
|
-
|
|
798
|
-
return {
|
|
799
|
-
baselineId: screenshot1.id,
|
|
800
|
-
comparisonId: screenshot2.id,
|
|
801
|
-
diffPercentage,
|
|
802
|
-
diffPixels: Math.floor(diffPercentage * 1000),
|
|
803
|
-
regions: [],
|
|
804
|
-
status: diffPercentage < 10 ? 'acceptable' : 'changed',
|
|
805
|
-
};
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
/**
|
|
809
|
-
* Find content break points by analyzing URL structure
|
|
810
|
-
* In production, this would test rendering at many widths
|
|
811
|
-
*/
|
|
812
|
-
private findContentBreaks(url: string): ContentBreak[] {
|
|
813
|
-
const breaks: ContentBreak[] = [];
|
|
814
|
-
|
|
815
|
-
// Use URL hash for deterministic results
|
|
816
|
-
const urlHash = this.hashUrl(url);
|
|
817
|
-
const hashNum = parseInt(urlHash.substring(0, 6), 36);
|
|
818
|
-
|
|
819
|
-
// Common responsive breakpoints to test
|
|
820
|
-
const potentialBreaks = [375, 540, 768, 992, 1200, 1400];
|
|
821
|
-
|
|
822
|
-
// Analyze URL patterns to determine likely break points
|
|
823
|
-
const isEcommerce = url.includes('shop') || url.includes('product') || url.includes('cart');
|
|
824
|
-
const isDashboard = url.includes('dashboard') || url.includes('admin') || url.includes('panel');
|
|
825
|
-
const isContent = url.includes('blog') || url.includes('article') || url.includes('news');
|
|
826
|
-
|
|
827
|
-
for (let i = 0; i < potentialBreaks.length; i++) {
|
|
828
|
-
const width = potentialBreaks[i];
|
|
829
|
-
|
|
830
|
-
// Deterministic decision based on hash and URL type
|
|
831
|
-
const determinant = (hashNum + i * 100 + width) % 100;
|
|
832
|
-
|
|
833
|
-
// Different page types have different break point patterns
|
|
834
|
-
let threshold: number;
|
|
835
|
-
let elements: string[];
|
|
836
|
-
let reason: string;
|
|
837
|
-
|
|
838
|
-
if (isEcommerce) {
|
|
839
|
-
threshold = 40; // E-commerce often has more breakpoints
|
|
840
|
-
elements = ['.product-grid', '.cart-items', '.checkout-form', '.filters'];
|
|
841
|
-
reason = 'Product grid layout adjusts for viewport';
|
|
842
|
-
} else if (isDashboard) {
|
|
843
|
-
threshold = 50;
|
|
844
|
-
elements = ['.sidebar', '.dashboard-cards', '.data-table', '.nav-menu'];
|
|
845
|
-
reason = 'Dashboard layout reorganizes for smaller screens';
|
|
846
|
-
} else if (isContent) {
|
|
847
|
-
threshold = 60;
|
|
848
|
-
elements = ['.article-content', '.sidebar-widgets', '.comments'];
|
|
849
|
-
reason = 'Content width and sidebar visibility changes';
|
|
850
|
-
} else {
|
|
851
|
-
threshold = 55;
|
|
852
|
-
elements = ['.container', '.grid', '.navigation', '.footer'];
|
|
853
|
-
reason = 'Content layout changes significantly';
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
if (determinant < threshold) {
|
|
857
|
-
// Select affected elements based on breakpoint width
|
|
858
|
-
const affectedCount = Math.min(
|
|
859
|
-
elements.length,
|
|
860
|
-
1 + Math.floor((hashNum + width) % elements.length)
|
|
861
|
-
);
|
|
862
|
-
const affectedElements = elements.slice(0, affectedCount);
|
|
863
|
-
|
|
864
|
-
breaks.push({
|
|
865
|
-
width,
|
|
866
|
-
reason,
|
|
867
|
-
affectedElements,
|
|
868
|
-
});
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
return breaks;
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
/**
|
|
876
|
-
* Hash URL for deterministic results
|
|
877
|
-
*/
|
|
878
|
-
private hashUrl(url: string): string {
|
|
879
|
-
let hash = 0;
|
|
880
|
-
for (let i = 0; i < url.length; i++) {
|
|
881
|
-
const char = url.charCodeAt(i);
|
|
882
|
-
hash = (hash << 5) - hash + char;
|
|
883
|
-
hash = hash & hash;
|
|
884
|
-
}
|
|
885
|
-
return Math.abs(hash).toString(36);
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
private suggestBreakpoints(contentBreaks: ContentBreak[]): number[] {
|
|
889
|
-
// Suggest breakpoints based on content breaks
|
|
890
|
-
const suggestions = new Set<number>();
|
|
891
|
-
|
|
892
|
-
for (const breakItem of contentBreaks) {
|
|
893
|
-
// Round to nearest common breakpoint
|
|
894
|
-
const rounded = Math.round(breakItem.width / 100) * 100;
|
|
895
|
-
suggestions.add(rounded);
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
// Add standard breakpoints if not covered
|
|
899
|
-
const standard = [576, 768, 992, 1200, 1400];
|
|
900
|
-
for (const bp of standard) {
|
|
901
|
-
if (!Array.from(suggestions).some((s) => Math.abs(s - bp) < 50)) {
|
|
902
|
-
suggestions.add(bp);
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
return Array.from(suggestions).sort((a, b) => a - b);
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
private calculateBreakpointCoverage(
|
|
910
|
-
current: number[],
|
|
911
|
-
contentBreaks: ContentBreak[]
|
|
912
|
-
): number {
|
|
913
|
-
if (contentBreaks.length === 0) return 100;
|
|
914
|
-
|
|
915
|
-
let covered = 0;
|
|
916
|
-
for (const breakItem of contentBreaks) {
|
|
917
|
-
// Check if any current breakpoint is within 50px
|
|
918
|
-
if (current.some((bp) => Math.abs(bp - breakItem.width) < 50)) {
|
|
919
|
-
covered++;
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
return Math.round((covered / contentBreaks.length) * 100);
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
private async storeResult(result: ResponsiveTestResult): Promise<void> {
|
|
927
|
-
const resultId = uuidv4();
|
|
928
|
-
await this.memory.set(
|
|
929
|
-
`visual-accessibility:responsive:${resultId}`,
|
|
930
|
-
result,
|
|
931
|
-
{ namespace: 'visual-accessibility', persist: true }
|
|
932
|
-
);
|
|
933
|
-
}
|
|
934
|
-
}
|