tapps-agents 3.5.41__py3-none-any.whl → 3.6.0__py3-none-any.whl
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.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2337
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.41.dist-info/RECORD +0 -760
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.41.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,320 +1,320 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Performance Monitor using Playwright network requests.
|
|
3
|
-
|
|
4
|
-
Collects Core Web Vitals and performance metrics from page loads.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
import time
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
from ...core.playwright_mcp_controller import PerformanceMetrics
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
@dataclass
|
|
20
|
-
class PerformanceThresholds:
|
|
21
|
-
"""Performance thresholds for Core Web Vitals."""
|
|
22
|
-
|
|
23
|
-
lcp_good: float = 2.5 # Largest Contentful Paint (seconds) - good
|
|
24
|
-
lcp_needs_improvement: float = 4.0 # LCP - needs improvement
|
|
25
|
-
|
|
26
|
-
fid_good: float = 100.0 # First Input Delay (milliseconds) - good
|
|
27
|
-
fid_needs_improvement: float = 300.0 # FID - needs improvement
|
|
28
|
-
|
|
29
|
-
cls_good: float = 0.1 # Cumulative Layout Shift - good
|
|
30
|
-
cls_needs_improvement: float = 0.25 # CLS - needs improvement
|
|
31
|
-
|
|
32
|
-
fcp_good: float = 1.8 # First Contentful Paint (seconds) - good
|
|
33
|
-
fcp_needs_improvement: float = 3.0 # FCP - needs improvement
|
|
34
|
-
|
|
35
|
-
load_time_good: float = 2.0 # Total load time (seconds) - good
|
|
36
|
-
load_time_needs_improvement: float = 4.0 # Load time - needs improvement
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class PerformanceMonitor:
|
|
40
|
-
"""
|
|
41
|
-
Monitor performance metrics using Playwright.
|
|
42
|
-
|
|
43
|
-
Collects Core Web Vitals and other performance metrics.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def __init__(self, thresholds: PerformanceThresholds | None = None):
|
|
47
|
-
"""
|
|
48
|
-
Initialize performance monitor.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
thresholds: Performance thresholds (uses defaults if None)
|
|
52
|
-
"""
|
|
53
|
-
self.thresholds = thresholds or PerformanceThresholds()
|
|
54
|
-
self.start_time: float | None = None
|
|
55
|
-
self.metrics: PerformanceMetrics | None = None
|
|
56
|
-
|
|
57
|
-
def start_monitoring(self):
|
|
58
|
-
"""Start performance monitoring."""
|
|
59
|
-
self.start_time = time.time()
|
|
60
|
-
self.metrics = PerformanceMetrics()
|
|
61
|
-
|
|
62
|
-
def collect_metrics(
|
|
63
|
-
self,
|
|
64
|
-
network_requests: list[dict[str, Any]],
|
|
65
|
-
console_messages: list[dict[str, Any]] | None = None,
|
|
66
|
-
) -> PerformanceMetrics:
|
|
67
|
-
"""
|
|
68
|
-
Collect performance metrics from network requests.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
network_requests: List of network requests from Playwright
|
|
72
|
-
console_messages: Optional console messages for additional metrics
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
PerformanceMetrics with collected data
|
|
76
|
-
"""
|
|
77
|
-
if self.metrics is None:
|
|
78
|
-
self.metrics = PerformanceMetrics()
|
|
79
|
-
|
|
80
|
-
# Calculate load time
|
|
81
|
-
if self.start_time:
|
|
82
|
-
self.metrics.load_time = time.time() - self.start_time
|
|
83
|
-
|
|
84
|
-
# Analyze network requests
|
|
85
|
-
self.metrics.network_requests = len(network_requests)
|
|
86
|
-
self.metrics.failed_requests = sum(
|
|
87
|
-
1 for req in network_requests if req.get("status", 200) >= 400
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
# Extract timing information from requests
|
|
91
|
-
if network_requests:
|
|
92
|
-
# Find main document request
|
|
93
|
-
main_doc = next(
|
|
94
|
-
(
|
|
95
|
-
req
|
|
96
|
-
for req in network_requests
|
|
97
|
-
if req.get("type") == "document" or req.get("url", "").endswith(".html")
|
|
98
|
-
),
|
|
99
|
-
None,
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
if main_doc:
|
|
103
|
-
timing = main_doc.get("timing", {})
|
|
104
|
-
if isinstance(timing, dict):
|
|
105
|
-
# Calculate FCP (simplified - would need actual paint timing)
|
|
106
|
-
if "responseStart" in timing and "requestStart" in timing:
|
|
107
|
-
self.metrics.fcp = (
|
|
108
|
-
timing.get("responseStart", 0) - timing.get("requestStart", 0)
|
|
109
|
-
) / 1000.0
|
|
110
|
-
|
|
111
|
-
# Calculate DOMContentLoaded
|
|
112
|
-
if "domContentLoadedEventEnd" in timing:
|
|
113
|
-
self.metrics.dom_content_loaded = (
|
|
114
|
-
timing.get("domContentLoadedEventEnd", 0) / 1000.0
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
# Extract Core Web Vitals from console messages if available
|
|
118
|
-
if console_messages:
|
|
119
|
-
for msg in console_messages:
|
|
120
|
-
text = msg.get("text", "")
|
|
121
|
-
# Look for performance marks (if page uses Performance API)
|
|
122
|
-
if "LCP" in text:
|
|
123
|
-
# Extract LCP value (simplified)
|
|
124
|
-
try:
|
|
125
|
-
lcp_match = text.split("LCP:")[1].split()[0]
|
|
126
|
-
self.metrics.lcp = float(lcp_match)
|
|
127
|
-
except (IndexError, ValueError):
|
|
128
|
-
pass
|
|
129
|
-
|
|
130
|
-
# If metrics not available from network/console, use defaults based on load time
|
|
131
|
-
if self.metrics.lcp is None and self.metrics.load_time:
|
|
132
|
-
# Estimate LCP as 60% of load time (simplified)
|
|
133
|
-
self.metrics.lcp = self.metrics.load_time * 0.6
|
|
134
|
-
|
|
135
|
-
if self.metrics.fcp is None and self.metrics.load_time:
|
|
136
|
-
# Estimate FCP as 40% of load time (simplified)
|
|
137
|
-
self.metrics.fcp = self.metrics.load_time * 0.4
|
|
138
|
-
|
|
139
|
-
return self.metrics
|
|
140
|
-
|
|
141
|
-
def evaluate_performance(self, metrics: PerformanceMetrics) -> dict[str, Any]:
|
|
142
|
-
"""
|
|
143
|
-
Evaluate performance metrics against thresholds.
|
|
144
|
-
|
|
145
|
-
Args:
|
|
146
|
-
metrics: PerformanceMetrics to evaluate
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
Dictionary with evaluation results
|
|
150
|
-
"""
|
|
151
|
-
results = {
|
|
152
|
-
"overall_score": 0.0,
|
|
153
|
-
"lcp_status": "unknown",
|
|
154
|
-
"fid_status": "unknown",
|
|
155
|
-
"cls_status": "unknown",
|
|
156
|
-
"fcp_status": "unknown",
|
|
157
|
-
"load_time_status": "unknown",
|
|
158
|
-
"issues": [],
|
|
159
|
-
"recommendations": [],
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
scores = []
|
|
163
|
-
|
|
164
|
-
# Evaluate LCP
|
|
165
|
-
if metrics.lcp is not None:
|
|
166
|
-
if metrics.lcp <= self.thresholds.lcp_good:
|
|
167
|
-
results["lcp_status"] = "good"
|
|
168
|
-
scores.append(100)
|
|
169
|
-
elif metrics.lcp <= self.thresholds.lcp_needs_improvement:
|
|
170
|
-
results["lcp_status"] = "needs_improvement"
|
|
171
|
-
scores.append(70)
|
|
172
|
-
results["issues"].append(
|
|
173
|
-
f"LCP ({metrics.lcp:.2f}s) needs improvement (target: <{self.thresholds.lcp_good}s)"
|
|
174
|
-
)
|
|
175
|
-
results["recommendations"].append(
|
|
176
|
-
"Optimize Largest Contentful Paint: reduce server response time, "
|
|
177
|
-
"optimize images, preload key resources"
|
|
178
|
-
)
|
|
179
|
-
else:
|
|
180
|
-
results["lcp_status"] = "poor"
|
|
181
|
-
scores.append(40)
|
|
182
|
-
results["issues"].append(
|
|
183
|
-
f"LCP ({metrics.lcp:.2f}s) is poor (target: <{self.thresholds.lcp_good}s)"
|
|
184
|
-
)
|
|
185
|
-
results["recommendations"].append(
|
|
186
|
-
"Urgently optimize LCP: use CDN, optimize images, reduce render-blocking resources"
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
# Evaluate FID (if available)
|
|
190
|
-
if metrics.fid is not None:
|
|
191
|
-
if metrics.fid <= self.thresholds.fid_good:
|
|
192
|
-
results["fid_status"] = "good"
|
|
193
|
-
scores.append(100)
|
|
194
|
-
elif metrics.fid <= self.thresholds.fid_needs_improvement:
|
|
195
|
-
results["fid_status"] = "needs_improvement"
|
|
196
|
-
scores.append(70)
|
|
197
|
-
results["issues"].append(
|
|
198
|
-
f"FID ({metrics.fid:.1f}ms) needs improvement (target: <{self.thresholds.fid_good}ms)"
|
|
199
|
-
)
|
|
200
|
-
results["recommendations"].append(
|
|
201
|
-
"Optimize First Input Delay: reduce JavaScript execution time, "
|
|
202
|
-
"break up long tasks, use web workers"
|
|
203
|
-
)
|
|
204
|
-
else:
|
|
205
|
-
results["fid_status"] = "poor"
|
|
206
|
-
scores.append(40)
|
|
207
|
-
|
|
208
|
-
# Evaluate CLS (if available)
|
|
209
|
-
if metrics.cls is not None:
|
|
210
|
-
if metrics.cls <= self.thresholds.cls_good:
|
|
211
|
-
results["cls_status"] = "good"
|
|
212
|
-
scores.append(100)
|
|
213
|
-
elif metrics.cls <= self.thresholds.cls_needs_improvement:
|
|
214
|
-
results["cls_status"] = "needs_improvement"
|
|
215
|
-
scores.append(70)
|
|
216
|
-
results["issues"].append(
|
|
217
|
-
f"CLS ({metrics.cls:.3f}) needs improvement (target: <{self.thresholds.cls_good})"
|
|
218
|
-
)
|
|
219
|
-
results["recommendations"].append(
|
|
220
|
-
"Optimize Cumulative Layout Shift: set size attributes on images/videos, "
|
|
221
|
-
"avoid inserting content above existing content"
|
|
222
|
-
)
|
|
223
|
-
else:
|
|
224
|
-
results["cls_status"] = "poor"
|
|
225
|
-
scores.append(40)
|
|
226
|
-
|
|
227
|
-
# Evaluate FCP
|
|
228
|
-
if metrics.fcp is not None:
|
|
229
|
-
if metrics.fcp <= self.thresholds.fcp_good:
|
|
230
|
-
results["fcp_status"] = "good"
|
|
231
|
-
scores.append(100)
|
|
232
|
-
elif metrics.fcp <= self.thresholds.fcp_needs_improvement:
|
|
233
|
-
results["fcp_status"] = "needs_improvement"
|
|
234
|
-
scores.append(70)
|
|
235
|
-
else:
|
|
236
|
-
results["fcp_status"] = "poor"
|
|
237
|
-
scores.append(40)
|
|
238
|
-
|
|
239
|
-
# Evaluate Load Time
|
|
240
|
-
if metrics.load_time is not None:
|
|
241
|
-
if metrics.load_time <= self.thresholds.load_time_good:
|
|
242
|
-
results["load_time_status"] = "good"
|
|
243
|
-
scores.append(100)
|
|
244
|
-
elif metrics.load_time <= self.thresholds.load_time_needs_improvement:
|
|
245
|
-
results["load_time_status"] = "needs_improvement"
|
|
246
|
-
scores.append(70)
|
|
247
|
-
results["issues"].append(
|
|
248
|
-
f"Load time ({metrics.load_time:.2f}s) needs improvement (target: <{self.thresholds.load_time_good}s)"
|
|
249
|
-
)
|
|
250
|
-
else:
|
|
251
|
-
results["load_time_status"] = "poor"
|
|
252
|
-
scores.append(40)
|
|
253
|
-
|
|
254
|
-
# Calculate overall score
|
|
255
|
-
if scores:
|
|
256
|
-
results["overall_score"] = sum(scores) / len(scores)
|
|
257
|
-
else:
|
|
258
|
-
results["overall_score"] = 0.0
|
|
259
|
-
|
|
260
|
-
return results
|
|
261
|
-
|
|
262
|
-
def generate_test_assertions(
|
|
263
|
-
self, metrics: PerformanceMetrics, thresholds: PerformanceThresholds | None = None
|
|
264
|
-
) -> list[str]:
|
|
265
|
-
"""
|
|
266
|
-
Generate test assertions from performance metrics.
|
|
267
|
-
|
|
268
|
-
Args:
|
|
269
|
-
metrics: PerformanceMetrics to generate assertions for
|
|
270
|
-
thresholds: Optional custom thresholds
|
|
271
|
-
|
|
272
|
-
Returns:
|
|
273
|
-
List of test assertion code strings
|
|
274
|
-
"""
|
|
275
|
-
thresholds = thresholds or self.thresholds
|
|
276
|
-
assertions = []
|
|
277
|
-
|
|
278
|
-
# LCP assertion
|
|
279
|
-
if metrics.lcp is not None:
|
|
280
|
-
assertions.append(
|
|
281
|
-
f"assert lcp <= {thresholds.lcp_good}, "
|
|
282
|
-
f"'LCP {metrics.lcp:.2f}s exceeds good threshold {thresholds.lcp_good}s'"
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
# FID assertion
|
|
286
|
-
if metrics.fid is not None:
|
|
287
|
-
assertions.append(
|
|
288
|
-
f"assert fid <= {thresholds.fid_good}, "
|
|
289
|
-
f"'FID {metrics.fid:.1f}ms exceeds good threshold {thresholds.fid_good}ms'"
|
|
290
|
-
)
|
|
291
|
-
|
|
292
|
-
# CLS assertion
|
|
293
|
-
if metrics.cls is not None:
|
|
294
|
-
assertions.append(
|
|
295
|
-
f"assert cls <= {thresholds.cls_good}, "
|
|
296
|
-
f"'CLS {metrics.cls:.3f} exceeds good threshold {thresholds.cls_good}'"
|
|
297
|
-
)
|
|
298
|
-
|
|
299
|
-
# FCP assertion
|
|
300
|
-
if metrics.fcp is not None:
|
|
301
|
-
assertions.append(
|
|
302
|
-
f"assert fcp <= {thresholds.fcp_good}, "
|
|
303
|
-
f"'FCP {metrics.fcp:.2f}s exceeds good threshold {thresholds.fcp_good}s'"
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
# Load time assertion
|
|
307
|
-
if metrics.load_time is not None:
|
|
308
|
-
assertions.append(
|
|
309
|
-
f"assert load_time <= {thresholds.load_time_good}, "
|
|
310
|
-
f"'Load time {metrics.load_time:.2f}s exceeds good threshold {thresholds.load_time_good}s'"
|
|
311
|
-
)
|
|
312
|
-
|
|
313
|
-
# Network requests assertion
|
|
314
|
-
if metrics.network_requests > 0:
|
|
315
|
-
assertions.append(
|
|
316
|
-
f"assert failed_requests == 0, "
|
|
317
|
-
f"'Found {metrics.failed_requests} failed network requests'"
|
|
318
|
-
)
|
|
319
|
-
|
|
320
|
-
return assertions
|
|
1
|
+
"""
|
|
2
|
+
Performance Monitor using Playwright network requests.
|
|
3
|
+
|
|
4
|
+
Collects Core Web Vitals and performance metrics from page loads.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import time
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from ...core.playwright_mcp_controller import PerformanceMetrics
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class PerformanceThresholds:
|
|
21
|
+
"""Performance thresholds for Core Web Vitals."""
|
|
22
|
+
|
|
23
|
+
lcp_good: float = 2.5 # Largest Contentful Paint (seconds) - good
|
|
24
|
+
lcp_needs_improvement: float = 4.0 # LCP - needs improvement
|
|
25
|
+
|
|
26
|
+
fid_good: float = 100.0 # First Input Delay (milliseconds) - good
|
|
27
|
+
fid_needs_improvement: float = 300.0 # FID - needs improvement
|
|
28
|
+
|
|
29
|
+
cls_good: float = 0.1 # Cumulative Layout Shift - good
|
|
30
|
+
cls_needs_improvement: float = 0.25 # CLS - needs improvement
|
|
31
|
+
|
|
32
|
+
fcp_good: float = 1.8 # First Contentful Paint (seconds) - good
|
|
33
|
+
fcp_needs_improvement: float = 3.0 # FCP - needs improvement
|
|
34
|
+
|
|
35
|
+
load_time_good: float = 2.0 # Total load time (seconds) - good
|
|
36
|
+
load_time_needs_improvement: float = 4.0 # Load time - needs improvement
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PerformanceMonitor:
|
|
40
|
+
"""
|
|
41
|
+
Monitor performance metrics using Playwright.
|
|
42
|
+
|
|
43
|
+
Collects Core Web Vitals and other performance metrics.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, thresholds: PerformanceThresholds | None = None):
|
|
47
|
+
"""
|
|
48
|
+
Initialize performance monitor.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
thresholds: Performance thresholds (uses defaults if None)
|
|
52
|
+
"""
|
|
53
|
+
self.thresholds = thresholds or PerformanceThresholds()
|
|
54
|
+
self.start_time: float | None = None
|
|
55
|
+
self.metrics: PerformanceMetrics | None = None
|
|
56
|
+
|
|
57
|
+
def start_monitoring(self):
|
|
58
|
+
"""Start performance monitoring."""
|
|
59
|
+
self.start_time = time.time()
|
|
60
|
+
self.metrics = PerformanceMetrics()
|
|
61
|
+
|
|
62
|
+
def collect_metrics(
|
|
63
|
+
self,
|
|
64
|
+
network_requests: list[dict[str, Any]],
|
|
65
|
+
console_messages: list[dict[str, Any]] | None = None,
|
|
66
|
+
) -> PerformanceMetrics:
|
|
67
|
+
"""
|
|
68
|
+
Collect performance metrics from network requests.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
network_requests: List of network requests from Playwright
|
|
72
|
+
console_messages: Optional console messages for additional metrics
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
PerformanceMetrics with collected data
|
|
76
|
+
"""
|
|
77
|
+
if self.metrics is None:
|
|
78
|
+
self.metrics = PerformanceMetrics()
|
|
79
|
+
|
|
80
|
+
# Calculate load time
|
|
81
|
+
if self.start_time:
|
|
82
|
+
self.metrics.load_time = time.time() - self.start_time
|
|
83
|
+
|
|
84
|
+
# Analyze network requests
|
|
85
|
+
self.metrics.network_requests = len(network_requests)
|
|
86
|
+
self.metrics.failed_requests = sum(
|
|
87
|
+
1 for req in network_requests if req.get("status", 200) >= 400
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Extract timing information from requests
|
|
91
|
+
if network_requests:
|
|
92
|
+
# Find main document request
|
|
93
|
+
main_doc = next(
|
|
94
|
+
(
|
|
95
|
+
req
|
|
96
|
+
for req in network_requests
|
|
97
|
+
if req.get("type") == "document" or req.get("url", "").endswith(".html")
|
|
98
|
+
),
|
|
99
|
+
None,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
if main_doc:
|
|
103
|
+
timing = main_doc.get("timing", {})
|
|
104
|
+
if isinstance(timing, dict):
|
|
105
|
+
# Calculate FCP (simplified - would need actual paint timing)
|
|
106
|
+
if "responseStart" in timing and "requestStart" in timing:
|
|
107
|
+
self.metrics.fcp = (
|
|
108
|
+
timing.get("responseStart", 0) - timing.get("requestStart", 0)
|
|
109
|
+
) / 1000.0
|
|
110
|
+
|
|
111
|
+
# Calculate DOMContentLoaded
|
|
112
|
+
if "domContentLoadedEventEnd" in timing:
|
|
113
|
+
self.metrics.dom_content_loaded = (
|
|
114
|
+
timing.get("domContentLoadedEventEnd", 0) / 1000.0
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# Extract Core Web Vitals from console messages if available
|
|
118
|
+
if console_messages:
|
|
119
|
+
for msg in console_messages:
|
|
120
|
+
text = msg.get("text", "")
|
|
121
|
+
# Look for performance marks (if page uses Performance API)
|
|
122
|
+
if "LCP" in text:
|
|
123
|
+
# Extract LCP value (simplified)
|
|
124
|
+
try:
|
|
125
|
+
lcp_match = text.split("LCP:")[1].split()[0]
|
|
126
|
+
self.metrics.lcp = float(lcp_match)
|
|
127
|
+
except (IndexError, ValueError):
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
# If metrics not available from network/console, use defaults based on load time
|
|
131
|
+
if self.metrics.lcp is None and self.metrics.load_time:
|
|
132
|
+
# Estimate LCP as 60% of load time (simplified)
|
|
133
|
+
self.metrics.lcp = self.metrics.load_time * 0.6
|
|
134
|
+
|
|
135
|
+
if self.metrics.fcp is None and self.metrics.load_time:
|
|
136
|
+
# Estimate FCP as 40% of load time (simplified)
|
|
137
|
+
self.metrics.fcp = self.metrics.load_time * 0.4
|
|
138
|
+
|
|
139
|
+
return self.metrics
|
|
140
|
+
|
|
141
|
+
def evaluate_performance(self, metrics: PerformanceMetrics) -> dict[str, Any]:
|
|
142
|
+
"""
|
|
143
|
+
Evaluate performance metrics against thresholds.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
metrics: PerformanceMetrics to evaluate
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Dictionary with evaluation results
|
|
150
|
+
"""
|
|
151
|
+
results = {
|
|
152
|
+
"overall_score": 0.0,
|
|
153
|
+
"lcp_status": "unknown",
|
|
154
|
+
"fid_status": "unknown",
|
|
155
|
+
"cls_status": "unknown",
|
|
156
|
+
"fcp_status": "unknown",
|
|
157
|
+
"load_time_status": "unknown",
|
|
158
|
+
"issues": [],
|
|
159
|
+
"recommendations": [],
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
scores = []
|
|
163
|
+
|
|
164
|
+
# Evaluate LCP
|
|
165
|
+
if metrics.lcp is not None:
|
|
166
|
+
if metrics.lcp <= self.thresholds.lcp_good:
|
|
167
|
+
results["lcp_status"] = "good"
|
|
168
|
+
scores.append(100)
|
|
169
|
+
elif metrics.lcp <= self.thresholds.lcp_needs_improvement:
|
|
170
|
+
results["lcp_status"] = "needs_improvement"
|
|
171
|
+
scores.append(70)
|
|
172
|
+
results["issues"].append(
|
|
173
|
+
f"LCP ({metrics.lcp:.2f}s) needs improvement (target: <{self.thresholds.lcp_good}s)"
|
|
174
|
+
)
|
|
175
|
+
results["recommendations"].append(
|
|
176
|
+
"Optimize Largest Contentful Paint: reduce server response time, "
|
|
177
|
+
"optimize images, preload key resources"
|
|
178
|
+
)
|
|
179
|
+
else:
|
|
180
|
+
results["lcp_status"] = "poor"
|
|
181
|
+
scores.append(40)
|
|
182
|
+
results["issues"].append(
|
|
183
|
+
f"LCP ({metrics.lcp:.2f}s) is poor (target: <{self.thresholds.lcp_good}s)"
|
|
184
|
+
)
|
|
185
|
+
results["recommendations"].append(
|
|
186
|
+
"Urgently optimize LCP: use CDN, optimize images, reduce render-blocking resources"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# Evaluate FID (if available)
|
|
190
|
+
if metrics.fid is not None:
|
|
191
|
+
if metrics.fid <= self.thresholds.fid_good:
|
|
192
|
+
results["fid_status"] = "good"
|
|
193
|
+
scores.append(100)
|
|
194
|
+
elif metrics.fid <= self.thresholds.fid_needs_improvement:
|
|
195
|
+
results["fid_status"] = "needs_improvement"
|
|
196
|
+
scores.append(70)
|
|
197
|
+
results["issues"].append(
|
|
198
|
+
f"FID ({metrics.fid:.1f}ms) needs improvement (target: <{self.thresholds.fid_good}ms)"
|
|
199
|
+
)
|
|
200
|
+
results["recommendations"].append(
|
|
201
|
+
"Optimize First Input Delay: reduce JavaScript execution time, "
|
|
202
|
+
"break up long tasks, use web workers"
|
|
203
|
+
)
|
|
204
|
+
else:
|
|
205
|
+
results["fid_status"] = "poor"
|
|
206
|
+
scores.append(40)
|
|
207
|
+
|
|
208
|
+
# Evaluate CLS (if available)
|
|
209
|
+
if metrics.cls is not None:
|
|
210
|
+
if metrics.cls <= self.thresholds.cls_good:
|
|
211
|
+
results["cls_status"] = "good"
|
|
212
|
+
scores.append(100)
|
|
213
|
+
elif metrics.cls <= self.thresholds.cls_needs_improvement:
|
|
214
|
+
results["cls_status"] = "needs_improvement"
|
|
215
|
+
scores.append(70)
|
|
216
|
+
results["issues"].append(
|
|
217
|
+
f"CLS ({metrics.cls:.3f}) needs improvement (target: <{self.thresholds.cls_good})"
|
|
218
|
+
)
|
|
219
|
+
results["recommendations"].append(
|
|
220
|
+
"Optimize Cumulative Layout Shift: set size attributes on images/videos, "
|
|
221
|
+
"avoid inserting content above existing content"
|
|
222
|
+
)
|
|
223
|
+
else:
|
|
224
|
+
results["cls_status"] = "poor"
|
|
225
|
+
scores.append(40)
|
|
226
|
+
|
|
227
|
+
# Evaluate FCP
|
|
228
|
+
if metrics.fcp is not None:
|
|
229
|
+
if metrics.fcp <= self.thresholds.fcp_good:
|
|
230
|
+
results["fcp_status"] = "good"
|
|
231
|
+
scores.append(100)
|
|
232
|
+
elif metrics.fcp <= self.thresholds.fcp_needs_improvement:
|
|
233
|
+
results["fcp_status"] = "needs_improvement"
|
|
234
|
+
scores.append(70)
|
|
235
|
+
else:
|
|
236
|
+
results["fcp_status"] = "poor"
|
|
237
|
+
scores.append(40)
|
|
238
|
+
|
|
239
|
+
# Evaluate Load Time
|
|
240
|
+
if metrics.load_time is not None:
|
|
241
|
+
if metrics.load_time <= self.thresholds.load_time_good:
|
|
242
|
+
results["load_time_status"] = "good"
|
|
243
|
+
scores.append(100)
|
|
244
|
+
elif metrics.load_time <= self.thresholds.load_time_needs_improvement:
|
|
245
|
+
results["load_time_status"] = "needs_improvement"
|
|
246
|
+
scores.append(70)
|
|
247
|
+
results["issues"].append(
|
|
248
|
+
f"Load time ({metrics.load_time:.2f}s) needs improvement (target: <{self.thresholds.load_time_good}s)"
|
|
249
|
+
)
|
|
250
|
+
else:
|
|
251
|
+
results["load_time_status"] = "poor"
|
|
252
|
+
scores.append(40)
|
|
253
|
+
|
|
254
|
+
# Calculate overall score
|
|
255
|
+
if scores:
|
|
256
|
+
results["overall_score"] = sum(scores) / len(scores)
|
|
257
|
+
else:
|
|
258
|
+
results["overall_score"] = 0.0
|
|
259
|
+
|
|
260
|
+
return results
|
|
261
|
+
|
|
262
|
+
def generate_test_assertions(
|
|
263
|
+
self, metrics: PerformanceMetrics, thresholds: PerformanceThresholds | None = None
|
|
264
|
+
) -> list[str]:
|
|
265
|
+
"""
|
|
266
|
+
Generate test assertions from performance metrics.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
metrics: PerformanceMetrics to generate assertions for
|
|
270
|
+
thresholds: Optional custom thresholds
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
List of test assertion code strings
|
|
274
|
+
"""
|
|
275
|
+
thresholds = thresholds or self.thresholds
|
|
276
|
+
assertions = []
|
|
277
|
+
|
|
278
|
+
# LCP assertion
|
|
279
|
+
if metrics.lcp is not None:
|
|
280
|
+
assertions.append(
|
|
281
|
+
f"assert lcp <= {thresholds.lcp_good}, "
|
|
282
|
+
f"'LCP {metrics.lcp:.2f}s exceeds good threshold {thresholds.lcp_good}s'"
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# FID assertion
|
|
286
|
+
if metrics.fid is not None:
|
|
287
|
+
assertions.append(
|
|
288
|
+
f"assert fid <= {thresholds.fid_good}, "
|
|
289
|
+
f"'FID {metrics.fid:.1f}ms exceeds good threshold {thresholds.fid_good}ms'"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# CLS assertion
|
|
293
|
+
if metrics.cls is not None:
|
|
294
|
+
assertions.append(
|
|
295
|
+
f"assert cls <= {thresholds.cls_good}, "
|
|
296
|
+
f"'CLS {metrics.cls:.3f} exceeds good threshold {thresholds.cls_good}'"
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
# FCP assertion
|
|
300
|
+
if metrics.fcp is not None:
|
|
301
|
+
assertions.append(
|
|
302
|
+
f"assert fcp <= {thresholds.fcp_good}, "
|
|
303
|
+
f"'FCP {metrics.fcp:.2f}s exceeds good threshold {thresholds.fcp_good}s'"
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
# Load time assertion
|
|
307
|
+
if metrics.load_time is not None:
|
|
308
|
+
assertions.append(
|
|
309
|
+
f"assert load_time <= {thresholds.load_time_good}, "
|
|
310
|
+
f"'Load time {metrics.load_time:.2f}s exceeds good threshold {thresholds.load_time_good}s'"
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
# Network requests assertion
|
|
314
|
+
if metrics.network_requests > 0:
|
|
315
|
+
assertions.append(
|
|
316
|
+
f"assert failed_requests == 0, "
|
|
317
|
+
f"'Found {metrics.failed_requests} failed network requests'"
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
return assertions
|