tapps-agents 3.5.40__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 -219
- 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 -2196
- 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 -111
- 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.40.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.40.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.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,357 +1,357 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Context-Aware Performance Scorer - Language-aware performance analysis
|
|
3
|
-
|
|
4
|
-
Phase 3.2: Performance Scoring Enhancement
|
|
5
|
-
|
|
6
|
-
Uses Strategy pattern to provide language-specific performance scoring
|
|
7
|
-
with pattern recognition for performance optimizations.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import ast
|
|
13
|
-
import re
|
|
14
|
-
from abc import ABC, abstractmethod
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
from ...core.language_detector import Language
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class PerformanceStrategy(ABC):
|
|
22
|
-
"""Base strategy for language-specific performance scoring."""
|
|
23
|
-
|
|
24
|
-
@abstractmethod
|
|
25
|
-
def calculate(
|
|
26
|
-
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
27
|
-
) -> float:
|
|
28
|
-
"""
|
|
29
|
-
Calculate performance score (0-10 scale, higher is better).
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
code: Source code content
|
|
33
|
-
file_path: Optional path to the file
|
|
34
|
-
context: Optional context (other scores, config, etc.)
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
Performance score (0.0-10.0)
|
|
38
|
-
"""
|
|
39
|
-
pass
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class PythonPerformanceStrategy(PerformanceStrategy):
|
|
43
|
-
"""Python-specific performance scoring strategy."""
|
|
44
|
-
|
|
45
|
-
def calculate(
|
|
46
|
-
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
47
|
-
) -> float:
|
|
48
|
-
"""
|
|
49
|
-
Calculate Python performance score.
|
|
50
|
-
|
|
51
|
-
Checks for:
|
|
52
|
-
- Caching (functools.lru_cache, functools.cache)
|
|
53
|
-
- Async/await patterns
|
|
54
|
-
- Lazy evaluation (generators)
|
|
55
|
-
- Inefficient patterns (nested loops, large comprehensions)
|
|
56
|
-
"""
|
|
57
|
-
score = 10.0
|
|
58
|
-
issues = []
|
|
59
|
-
optimizations = []
|
|
60
|
-
|
|
61
|
-
try:
|
|
62
|
-
tree = ast.parse(code)
|
|
63
|
-
|
|
64
|
-
# Check for caching patterns
|
|
65
|
-
has_cache = False
|
|
66
|
-
for node in ast.walk(tree):
|
|
67
|
-
if isinstance(node, ast.Call):
|
|
68
|
-
if isinstance(node.func, ast.Attribute):
|
|
69
|
-
if (
|
|
70
|
-
isinstance(node.func.value, ast.Name)
|
|
71
|
-
and node.func.value.id == "functools"
|
|
72
|
-
and node.func.attr in ["lru_cache", "cache"]
|
|
73
|
-
):
|
|
74
|
-
has_cache = True
|
|
75
|
-
optimizations.append("caching")
|
|
76
|
-
elif isinstance(node.func, ast.Name):
|
|
77
|
-
if node.func.id in ["lru_cache", "cache"]:
|
|
78
|
-
has_cache = True
|
|
79
|
-
optimizations.append("caching")
|
|
80
|
-
|
|
81
|
-
# Check for async/await patterns
|
|
82
|
-
has_async = False
|
|
83
|
-
for node in ast.walk(tree):
|
|
84
|
-
if isinstance(node, ast.FunctionDef) and node.args:
|
|
85
|
-
if any("async" in str(kwarg) for kwarg in node.args.kwonlyargs):
|
|
86
|
-
pass # async keyword
|
|
87
|
-
if isinstance(node, ast.FunctionDef) and hasattr(node, "async_"):
|
|
88
|
-
if node.async_:
|
|
89
|
-
has_async = True
|
|
90
|
-
optimizations.append("async_patterns")
|
|
91
|
-
elif isinstance(node, ast.AsyncFunctionDef):
|
|
92
|
-
has_async = True
|
|
93
|
-
optimizations.append("async_patterns")
|
|
94
|
-
|
|
95
|
-
# Check for generators (lazy evaluation)
|
|
96
|
-
for node in ast.walk(tree):
|
|
97
|
-
if isinstance(node, ast.FunctionDef):
|
|
98
|
-
if any(isinstance(n, ast.Yield) or isinstance(n, ast.YieldFrom) for n in ast.walk(node)):
|
|
99
|
-
optimizations.append("generators")
|
|
100
|
-
|
|
101
|
-
# Check for inefficient patterns
|
|
102
|
-
for node in ast.walk(tree):
|
|
103
|
-
if isinstance(node, ast.FunctionDef):
|
|
104
|
-
# Check function size
|
|
105
|
-
if hasattr(node, "end_lineno") and node.end_lineno is not None:
|
|
106
|
-
func_lines = node.end_lineno - node.lineno
|
|
107
|
-
else:
|
|
108
|
-
func_lines = len(code.split("\n")[node.lineno - 1 : node.lineno + 49])
|
|
109
|
-
|
|
110
|
-
if func_lines > 100:
|
|
111
|
-
issues.append("very_large_function")
|
|
112
|
-
elif func_lines > 50:
|
|
113
|
-
issues.append("large_function")
|
|
114
|
-
|
|
115
|
-
# Check nesting depth
|
|
116
|
-
max_depth = self._get_max_nesting_depth(node)
|
|
117
|
-
if max_depth > 6:
|
|
118
|
-
issues.append("very_deep_nesting")
|
|
119
|
-
elif max_depth > 4:
|
|
120
|
-
issues.append("deep_nesting")
|
|
121
|
-
|
|
122
|
-
# Check for nested loops
|
|
123
|
-
if isinstance(node, ast.For):
|
|
124
|
-
for child in ast.walk(node):
|
|
125
|
-
if isinstance(child, ast.For) and child != node:
|
|
126
|
-
issues.append("nested_loops")
|
|
127
|
-
break
|
|
128
|
-
|
|
129
|
-
# Check for expensive comprehensions
|
|
130
|
-
if isinstance(node, ast.ListComp):
|
|
131
|
-
func_calls = sum(1 for n in ast.walk(node) if isinstance(n, ast.Call))
|
|
132
|
-
if func_calls > 5:
|
|
133
|
-
issues.append("expensive_comprehension")
|
|
134
|
-
|
|
135
|
-
except SyntaxError:
|
|
136
|
-
return 0.0
|
|
137
|
-
except Exception:
|
|
138
|
-
return 5.0 # Neutral score on parse errors
|
|
139
|
-
|
|
140
|
-
# Apply penalties
|
|
141
|
-
penalty_map = {
|
|
142
|
-
"large_function": 0.5,
|
|
143
|
-
"very_large_function": 1.5,
|
|
144
|
-
"deep_nesting": 1.0,
|
|
145
|
-
"very_deep_nesting": 2.0,
|
|
146
|
-
"nested_loops": 1.5,
|
|
147
|
-
"expensive_comprehension": 0.5,
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
seen_issues = set()
|
|
151
|
-
for issue in issues:
|
|
152
|
-
if issue not in seen_issues:
|
|
153
|
-
score -= penalty_map.get(issue, 0.5)
|
|
154
|
-
seen_issues.add(issue)
|
|
155
|
-
|
|
156
|
-
# Apply bonuses for optimizations
|
|
157
|
-
bonus_map = {
|
|
158
|
-
"caching": 1.5,
|
|
159
|
-
"async_patterns": 1.0,
|
|
160
|
-
"generators": 0.5,
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
seen_optimizations = set()
|
|
164
|
-
for opt in optimizations:
|
|
165
|
-
if opt not in seen_optimizations:
|
|
166
|
-
score += bonus_map.get(opt, 0.5)
|
|
167
|
-
seen_optimizations.add(opt)
|
|
168
|
-
|
|
169
|
-
return max(0.0, min(10.0, score))
|
|
170
|
-
|
|
171
|
-
def _get_max_nesting_depth(self, node: ast.AST) -> int:
|
|
172
|
-
"""Calculate maximum nesting depth in a function."""
|
|
173
|
-
max_depth = 0
|
|
174
|
-
|
|
175
|
-
def visit(node: ast.AST, depth: int) -> None:
|
|
176
|
-
nonlocal max_depth
|
|
177
|
-
max_depth = max(max_depth, depth)
|
|
178
|
-
|
|
179
|
-
for child in ast.iter_child_nodes(node):
|
|
180
|
-
if isinstance(child, (ast.If, ast.For, ast.While, ast.Try, ast.With)):
|
|
181
|
-
visit(child, depth + 1)
|
|
182
|
-
else:
|
|
183
|
-
visit(child, depth)
|
|
184
|
-
|
|
185
|
-
visit(node, 0)
|
|
186
|
-
return max_depth
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
class TypeScriptPerformanceStrategy(PerformanceStrategy):
|
|
190
|
-
"""TypeScript-specific performance scoring strategy."""
|
|
191
|
-
|
|
192
|
-
def calculate(
|
|
193
|
-
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
194
|
-
) -> float:
|
|
195
|
-
"""
|
|
196
|
-
Calculate TypeScript performance score.
|
|
197
|
-
|
|
198
|
-
Checks for:
|
|
199
|
-
- Type optimizations (const assertions, type narrowing)
|
|
200
|
-
- Compilation optimizations (readonly, as const)
|
|
201
|
-
- Efficient type definitions
|
|
202
|
-
"""
|
|
203
|
-
score = 7.0 # Start with neutral score
|
|
204
|
-
optimizations = []
|
|
205
|
-
|
|
206
|
-
# Check for const assertions (as const)
|
|
207
|
-
if re.search(r"\bas\s+const\b", code):
|
|
208
|
-
optimizations.append("const_assertions")
|
|
209
|
-
score += 1.0
|
|
210
|
-
|
|
211
|
-
# Check for readonly modifiers
|
|
212
|
-
readonly_count = len(re.findall(r"\breadonly\b", code))
|
|
213
|
-
if readonly_count > 0:
|
|
214
|
-
optimizations.append("readonly_types")
|
|
215
|
-
score += min(readonly_count * 0.1, 0.5)
|
|
216
|
-
|
|
217
|
-
# Check for type narrowing patterns
|
|
218
|
-
if re.search(r"if\s*\([^)]*\)\s*\{[^}]*typeof\s+[^}]+\}", code):
|
|
219
|
-
optimizations.append("type_narrowing")
|
|
220
|
-
score += 0.5
|
|
221
|
-
|
|
222
|
-
# Check for efficient type definitions (type vs interface)
|
|
223
|
-
# Prefer type for unions/intersections, interface for objects
|
|
224
|
-
type_defs = len(re.findall(r"\btype\s+\w+\s*=", code))
|
|
225
|
-
interface_defs = len(re.findall(r"\binterface\s+\w+", code))
|
|
226
|
-
|
|
227
|
-
# Check for const enums (compile-time optimization)
|
|
228
|
-
if re.search(r"\bconst\s+enum\b", code):
|
|
229
|
-
optimizations.append("const_enums")
|
|
230
|
-
score += 0.5
|
|
231
|
-
|
|
232
|
-
# Check for efficient array/object patterns
|
|
233
|
-
if re.search(r"Object\.freeze|Object\.seal", code):
|
|
234
|
-
optimizations.append("immutable_objects")
|
|
235
|
-
score += 0.5
|
|
236
|
-
|
|
237
|
-
# Penalize any patterns (weaker performance)
|
|
238
|
-
if re.search(r"any\s*[:\[]", code):
|
|
239
|
-
score -= 0.5
|
|
240
|
-
|
|
241
|
-
# Check for inefficient patterns
|
|
242
|
-
# Nested object destructuring can be expensive
|
|
243
|
-
deep_destructuring = re.search(r"\{[^}]*\{[^}]*\{[^}]*\}[^}]*\}[^}]*\}", code)
|
|
244
|
-
if deep_destructuring:
|
|
245
|
-
score -= 0.5
|
|
246
|
-
|
|
247
|
-
return max(0.0, min(10.0, score))
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
class ReactPerformanceStrategy(PerformanceStrategy):
|
|
251
|
-
"""React-specific performance scoring strategy."""
|
|
252
|
-
|
|
253
|
-
def calculate(
|
|
254
|
-
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
255
|
-
) -> float:
|
|
256
|
-
"""
|
|
257
|
-
Calculate React performance score.
|
|
258
|
-
|
|
259
|
-
Checks for:
|
|
260
|
-
- Memoization (useMemo, useCallback, React.memo)
|
|
261
|
-
- Lazy loading (React.lazy, dynamic imports)
|
|
262
|
-
- Code splitting
|
|
263
|
-
- Re-render optimization patterns
|
|
264
|
-
"""
|
|
265
|
-
score = 7.0 # Start with neutral score
|
|
266
|
-
optimizations = []
|
|
267
|
-
|
|
268
|
-
# Memoization patterns (highest impact)
|
|
269
|
-
memo_count = len(re.findall(r"React\.memo\(|memo\(", code))
|
|
270
|
-
use_memo_count = len(re.findall(r"useMemo\(", code))
|
|
271
|
-
use_callback_count = len(re.findall(r"useCallback\(", code))
|
|
272
|
-
|
|
273
|
-
if memo_count > 0 or use_memo_count > 0 or use_callback_count > 0:
|
|
274
|
-
optimizations.append("memoization")
|
|
275
|
-
# Cap bonus at 2.0 for memoization
|
|
276
|
-
memo_bonus = min((memo_count * 0.5 + use_memo_count * 0.3 + use_callback_count * 0.3), 2.0)
|
|
277
|
-
score += memo_bonus
|
|
278
|
-
|
|
279
|
-
# Lazy loading (React.lazy)
|
|
280
|
-
lazy_count = len(re.findall(r"lazy\(|React\.lazy", code))
|
|
281
|
-
if lazy_count > 0:
|
|
282
|
-
optimizations.append("lazy_loading")
|
|
283
|
-
score += min(lazy_count * 0.5, 1.0)
|
|
284
|
-
|
|
285
|
-
# Code splitting (dynamic imports)
|
|
286
|
-
dynamic_import_count = len(re.findall(r"import\(|dynamic\s+import", code))
|
|
287
|
-
if dynamic_import_count > 0:
|
|
288
|
-
optimizations.append("code_splitting")
|
|
289
|
-
score += min(dynamic_import_count * 0.3, 0.5)
|
|
290
|
-
|
|
291
|
-
# Check for proper key usage in lists (prevents unnecessary re-renders)
|
|
292
|
-
jsx_list_pattern = re.search(r"\.map\s*\([^)]*=>\s*\([^)]*<[^>]+", code)
|
|
293
|
-
has_key_in_map = bool(re.search(r"\.map\s*\([^)]*key\s*=", code))
|
|
294
|
-
if jsx_list_pattern and not has_key_in_map:
|
|
295
|
-
score -= 1.0 # Missing keys in lists
|
|
296
|
-
|
|
297
|
-
# Check for expensive operations in render
|
|
298
|
-
# useEffect is good, direct async in render is bad
|
|
299
|
-
has_use_effect = bool(re.search(r"useEffect\(", code))
|
|
300
|
-
has_async_in_render = bool(re.search(r"(const|let|var)\s+\w+\s*=\s*async\s*\(\)\s*=>", code))
|
|
301
|
-
if has_async_in_render and not has_use_effect:
|
|
302
|
-
score -= 0.5
|
|
303
|
-
|
|
304
|
-
# Check for unnecessary re-renders (inline functions in JSX)
|
|
305
|
-
inline_fn_count = len(re.findall(r"onClick\s*=\s*\{[^}]*\(\)\s*=>", code))
|
|
306
|
-
if inline_fn_count > 5:
|
|
307
|
-
score -= min(inline_fn_count * 0.1, 1.0)
|
|
308
|
-
|
|
309
|
-
return max(0.0, min(10.0, score))
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
class PerformanceScorer:
|
|
313
|
-
"""
|
|
314
|
-
Context-aware performance scorer using Strategy pattern.
|
|
315
|
-
|
|
316
|
-
Phase 3.2: Performance Scoring Enhancement
|
|
317
|
-
"""
|
|
318
|
-
|
|
319
|
-
_strategies: dict[Language, PerformanceStrategy] = {}
|
|
320
|
-
|
|
321
|
-
def __init__(self):
|
|
322
|
-
"""Initialize performance scorer with language strategies."""
|
|
323
|
-
if not PerformanceScorer._strategies:
|
|
324
|
-
PerformanceScorer._strategies = {
|
|
325
|
-
Language.PYTHON: PythonPerformanceStrategy(),
|
|
326
|
-
Language.TYPESCRIPT: TypeScriptPerformanceStrategy(),
|
|
327
|
-
Language.JAVASCRIPT: TypeScriptPerformanceStrategy(), # Use TypeScript strategy for JS
|
|
328
|
-
Language.REACT: ReactPerformanceStrategy(),
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
def calculate(
|
|
332
|
-
self,
|
|
333
|
-
code: str,
|
|
334
|
-
language: Language,
|
|
335
|
-
file_path: Path | None = None,
|
|
336
|
-
context: dict[str, Any] | None = None,
|
|
337
|
-
) -> float:
|
|
338
|
-
"""
|
|
339
|
-
Calculate performance score for code in the given language.
|
|
340
|
-
|
|
341
|
-
Args:
|
|
342
|
-
code: Source code content
|
|
343
|
-
language: Detected language
|
|
344
|
-
file_path: Optional path to the file
|
|
345
|
-
context: Optional context (other scores, config, etc.)
|
|
346
|
-
|
|
347
|
-
Returns:
|
|
348
|
-
Performance score (0.0-10.0)
|
|
349
|
-
"""
|
|
350
|
-
strategy = PerformanceScorer._strategies.get(language)
|
|
351
|
-
|
|
352
|
-
if not strategy:
|
|
353
|
-
# Fallback: use Python strategy (most comprehensive)
|
|
354
|
-
strategy = PerformanceScorer._strategies.get(Language.PYTHON, PythonPerformanceStrategy())
|
|
355
|
-
|
|
356
|
-
return strategy.calculate(code, file_path, context)
|
|
357
|
-
|
|
1
|
+
"""
|
|
2
|
+
Context-Aware Performance Scorer - Language-aware performance analysis
|
|
3
|
+
|
|
4
|
+
Phase 3.2: Performance Scoring Enhancement
|
|
5
|
+
|
|
6
|
+
Uses Strategy pattern to provide language-specific performance scoring
|
|
7
|
+
with pattern recognition for performance optimizations.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import ast
|
|
13
|
+
import re
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from ...core.language_detector import Language
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PerformanceStrategy(ABC):
|
|
22
|
+
"""Base strategy for language-specific performance scoring."""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def calculate(
|
|
26
|
+
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
27
|
+
) -> float:
|
|
28
|
+
"""
|
|
29
|
+
Calculate performance score (0-10 scale, higher is better).
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
code: Source code content
|
|
33
|
+
file_path: Optional path to the file
|
|
34
|
+
context: Optional context (other scores, config, etc.)
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Performance score (0.0-10.0)
|
|
38
|
+
"""
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PythonPerformanceStrategy(PerformanceStrategy):
|
|
43
|
+
"""Python-specific performance scoring strategy."""
|
|
44
|
+
|
|
45
|
+
def calculate(
|
|
46
|
+
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
47
|
+
) -> float:
|
|
48
|
+
"""
|
|
49
|
+
Calculate Python performance score.
|
|
50
|
+
|
|
51
|
+
Checks for:
|
|
52
|
+
- Caching (functools.lru_cache, functools.cache)
|
|
53
|
+
- Async/await patterns
|
|
54
|
+
- Lazy evaluation (generators)
|
|
55
|
+
- Inefficient patterns (nested loops, large comprehensions)
|
|
56
|
+
"""
|
|
57
|
+
score = 10.0
|
|
58
|
+
issues = []
|
|
59
|
+
optimizations = []
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
tree = ast.parse(code)
|
|
63
|
+
|
|
64
|
+
# Check for caching patterns
|
|
65
|
+
has_cache = False
|
|
66
|
+
for node in ast.walk(tree):
|
|
67
|
+
if isinstance(node, ast.Call):
|
|
68
|
+
if isinstance(node.func, ast.Attribute):
|
|
69
|
+
if (
|
|
70
|
+
isinstance(node.func.value, ast.Name)
|
|
71
|
+
and node.func.value.id == "functools"
|
|
72
|
+
and node.func.attr in ["lru_cache", "cache"]
|
|
73
|
+
):
|
|
74
|
+
has_cache = True
|
|
75
|
+
optimizations.append("caching")
|
|
76
|
+
elif isinstance(node.func, ast.Name):
|
|
77
|
+
if node.func.id in ["lru_cache", "cache"]:
|
|
78
|
+
has_cache = True
|
|
79
|
+
optimizations.append("caching")
|
|
80
|
+
|
|
81
|
+
# Check for async/await patterns
|
|
82
|
+
has_async = False
|
|
83
|
+
for node in ast.walk(tree):
|
|
84
|
+
if isinstance(node, ast.FunctionDef) and node.args:
|
|
85
|
+
if any("async" in str(kwarg) for kwarg in node.args.kwonlyargs):
|
|
86
|
+
pass # async keyword
|
|
87
|
+
if isinstance(node, ast.FunctionDef) and hasattr(node, "async_"):
|
|
88
|
+
if node.async_:
|
|
89
|
+
has_async = True
|
|
90
|
+
optimizations.append("async_patterns")
|
|
91
|
+
elif isinstance(node, ast.AsyncFunctionDef):
|
|
92
|
+
has_async = True
|
|
93
|
+
optimizations.append("async_patterns")
|
|
94
|
+
|
|
95
|
+
# Check for generators (lazy evaluation)
|
|
96
|
+
for node in ast.walk(tree):
|
|
97
|
+
if isinstance(node, ast.FunctionDef):
|
|
98
|
+
if any(isinstance(n, ast.Yield) or isinstance(n, ast.YieldFrom) for n in ast.walk(node)):
|
|
99
|
+
optimizations.append("generators")
|
|
100
|
+
|
|
101
|
+
# Check for inefficient patterns
|
|
102
|
+
for node in ast.walk(tree):
|
|
103
|
+
if isinstance(node, ast.FunctionDef):
|
|
104
|
+
# Check function size
|
|
105
|
+
if hasattr(node, "end_lineno") and node.end_lineno is not None:
|
|
106
|
+
func_lines = node.end_lineno - node.lineno
|
|
107
|
+
else:
|
|
108
|
+
func_lines = len(code.split("\n")[node.lineno - 1 : node.lineno + 49])
|
|
109
|
+
|
|
110
|
+
if func_lines > 100:
|
|
111
|
+
issues.append("very_large_function")
|
|
112
|
+
elif func_lines > 50:
|
|
113
|
+
issues.append("large_function")
|
|
114
|
+
|
|
115
|
+
# Check nesting depth
|
|
116
|
+
max_depth = self._get_max_nesting_depth(node)
|
|
117
|
+
if max_depth > 6:
|
|
118
|
+
issues.append("very_deep_nesting")
|
|
119
|
+
elif max_depth > 4:
|
|
120
|
+
issues.append("deep_nesting")
|
|
121
|
+
|
|
122
|
+
# Check for nested loops
|
|
123
|
+
if isinstance(node, ast.For):
|
|
124
|
+
for child in ast.walk(node):
|
|
125
|
+
if isinstance(child, ast.For) and child != node:
|
|
126
|
+
issues.append("nested_loops")
|
|
127
|
+
break
|
|
128
|
+
|
|
129
|
+
# Check for expensive comprehensions
|
|
130
|
+
if isinstance(node, ast.ListComp):
|
|
131
|
+
func_calls = sum(1 for n in ast.walk(node) if isinstance(n, ast.Call))
|
|
132
|
+
if func_calls > 5:
|
|
133
|
+
issues.append("expensive_comprehension")
|
|
134
|
+
|
|
135
|
+
except SyntaxError:
|
|
136
|
+
return 0.0
|
|
137
|
+
except Exception:
|
|
138
|
+
return 5.0 # Neutral score on parse errors
|
|
139
|
+
|
|
140
|
+
# Apply penalties
|
|
141
|
+
penalty_map = {
|
|
142
|
+
"large_function": 0.5,
|
|
143
|
+
"very_large_function": 1.5,
|
|
144
|
+
"deep_nesting": 1.0,
|
|
145
|
+
"very_deep_nesting": 2.0,
|
|
146
|
+
"nested_loops": 1.5,
|
|
147
|
+
"expensive_comprehension": 0.5,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
seen_issues = set()
|
|
151
|
+
for issue in issues:
|
|
152
|
+
if issue not in seen_issues:
|
|
153
|
+
score -= penalty_map.get(issue, 0.5)
|
|
154
|
+
seen_issues.add(issue)
|
|
155
|
+
|
|
156
|
+
# Apply bonuses for optimizations
|
|
157
|
+
bonus_map = {
|
|
158
|
+
"caching": 1.5,
|
|
159
|
+
"async_patterns": 1.0,
|
|
160
|
+
"generators": 0.5,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
seen_optimizations = set()
|
|
164
|
+
for opt in optimizations:
|
|
165
|
+
if opt not in seen_optimizations:
|
|
166
|
+
score += bonus_map.get(opt, 0.5)
|
|
167
|
+
seen_optimizations.add(opt)
|
|
168
|
+
|
|
169
|
+
return max(0.0, min(10.0, score))
|
|
170
|
+
|
|
171
|
+
def _get_max_nesting_depth(self, node: ast.AST) -> int:
|
|
172
|
+
"""Calculate maximum nesting depth in a function."""
|
|
173
|
+
max_depth = 0
|
|
174
|
+
|
|
175
|
+
def visit(node: ast.AST, depth: int) -> None:
|
|
176
|
+
nonlocal max_depth
|
|
177
|
+
max_depth = max(max_depth, depth)
|
|
178
|
+
|
|
179
|
+
for child in ast.iter_child_nodes(node):
|
|
180
|
+
if isinstance(child, (ast.If, ast.For, ast.While, ast.Try, ast.With)):
|
|
181
|
+
visit(child, depth + 1)
|
|
182
|
+
else:
|
|
183
|
+
visit(child, depth)
|
|
184
|
+
|
|
185
|
+
visit(node, 0)
|
|
186
|
+
return max_depth
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class TypeScriptPerformanceStrategy(PerformanceStrategy):
|
|
190
|
+
"""TypeScript-specific performance scoring strategy."""
|
|
191
|
+
|
|
192
|
+
def calculate(
|
|
193
|
+
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
194
|
+
) -> float:
|
|
195
|
+
"""
|
|
196
|
+
Calculate TypeScript performance score.
|
|
197
|
+
|
|
198
|
+
Checks for:
|
|
199
|
+
- Type optimizations (const assertions, type narrowing)
|
|
200
|
+
- Compilation optimizations (readonly, as const)
|
|
201
|
+
- Efficient type definitions
|
|
202
|
+
"""
|
|
203
|
+
score = 7.0 # Start with neutral score
|
|
204
|
+
optimizations = []
|
|
205
|
+
|
|
206
|
+
# Check for const assertions (as const)
|
|
207
|
+
if re.search(r"\bas\s+const\b", code):
|
|
208
|
+
optimizations.append("const_assertions")
|
|
209
|
+
score += 1.0
|
|
210
|
+
|
|
211
|
+
# Check for readonly modifiers
|
|
212
|
+
readonly_count = len(re.findall(r"\breadonly\b", code))
|
|
213
|
+
if readonly_count > 0:
|
|
214
|
+
optimizations.append("readonly_types")
|
|
215
|
+
score += min(readonly_count * 0.1, 0.5)
|
|
216
|
+
|
|
217
|
+
# Check for type narrowing patterns
|
|
218
|
+
if re.search(r"if\s*\([^)]*\)\s*\{[^}]*typeof\s+[^}]+\}", code):
|
|
219
|
+
optimizations.append("type_narrowing")
|
|
220
|
+
score += 0.5
|
|
221
|
+
|
|
222
|
+
# Check for efficient type definitions (type vs interface)
|
|
223
|
+
# Prefer type for unions/intersections, interface for objects
|
|
224
|
+
type_defs = len(re.findall(r"\btype\s+\w+\s*=", code))
|
|
225
|
+
interface_defs = len(re.findall(r"\binterface\s+\w+", code))
|
|
226
|
+
|
|
227
|
+
# Check for const enums (compile-time optimization)
|
|
228
|
+
if re.search(r"\bconst\s+enum\b", code):
|
|
229
|
+
optimizations.append("const_enums")
|
|
230
|
+
score += 0.5
|
|
231
|
+
|
|
232
|
+
# Check for efficient array/object patterns
|
|
233
|
+
if re.search(r"Object\.freeze|Object\.seal", code):
|
|
234
|
+
optimizations.append("immutable_objects")
|
|
235
|
+
score += 0.5
|
|
236
|
+
|
|
237
|
+
# Penalize any patterns (weaker performance)
|
|
238
|
+
if re.search(r"any\s*[:\[]", code):
|
|
239
|
+
score -= 0.5
|
|
240
|
+
|
|
241
|
+
# Check for inefficient patterns
|
|
242
|
+
# Nested object destructuring can be expensive
|
|
243
|
+
deep_destructuring = re.search(r"\{[^}]*\{[^}]*\{[^}]*\}[^}]*\}[^}]*\}", code)
|
|
244
|
+
if deep_destructuring:
|
|
245
|
+
score -= 0.5
|
|
246
|
+
|
|
247
|
+
return max(0.0, min(10.0, score))
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class ReactPerformanceStrategy(PerformanceStrategy):
|
|
251
|
+
"""React-specific performance scoring strategy."""
|
|
252
|
+
|
|
253
|
+
def calculate(
|
|
254
|
+
self, code: str, file_path: Path | None = None, context: dict[str, Any] | None = None
|
|
255
|
+
) -> float:
|
|
256
|
+
"""
|
|
257
|
+
Calculate React performance score.
|
|
258
|
+
|
|
259
|
+
Checks for:
|
|
260
|
+
- Memoization (useMemo, useCallback, React.memo)
|
|
261
|
+
- Lazy loading (React.lazy, dynamic imports)
|
|
262
|
+
- Code splitting
|
|
263
|
+
- Re-render optimization patterns
|
|
264
|
+
"""
|
|
265
|
+
score = 7.0 # Start with neutral score
|
|
266
|
+
optimizations = []
|
|
267
|
+
|
|
268
|
+
# Memoization patterns (highest impact)
|
|
269
|
+
memo_count = len(re.findall(r"React\.memo\(|memo\(", code))
|
|
270
|
+
use_memo_count = len(re.findall(r"useMemo\(", code))
|
|
271
|
+
use_callback_count = len(re.findall(r"useCallback\(", code))
|
|
272
|
+
|
|
273
|
+
if memo_count > 0 or use_memo_count > 0 or use_callback_count > 0:
|
|
274
|
+
optimizations.append("memoization")
|
|
275
|
+
# Cap bonus at 2.0 for memoization
|
|
276
|
+
memo_bonus = min((memo_count * 0.5 + use_memo_count * 0.3 + use_callback_count * 0.3), 2.0)
|
|
277
|
+
score += memo_bonus
|
|
278
|
+
|
|
279
|
+
# Lazy loading (React.lazy)
|
|
280
|
+
lazy_count = len(re.findall(r"lazy\(|React\.lazy", code))
|
|
281
|
+
if lazy_count > 0:
|
|
282
|
+
optimizations.append("lazy_loading")
|
|
283
|
+
score += min(lazy_count * 0.5, 1.0)
|
|
284
|
+
|
|
285
|
+
# Code splitting (dynamic imports)
|
|
286
|
+
dynamic_import_count = len(re.findall(r"import\(|dynamic\s+import", code))
|
|
287
|
+
if dynamic_import_count > 0:
|
|
288
|
+
optimizations.append("code_splitting")
|
|
289
|
+
score += min(dynamic_import_count * 0.3, 0.5)
|
|
290
|
+
|
|
291
|
+
# Check for proper key usage in lists (prevents unnecessary re-renders)
|
|
292
|
+
jsx_list_pattern = re.search(r"\.map\s*\([^)]*=>\s*\([^)]*<[^>]+", code)
|
|
293
|
+
has_key_in_map = bool(re.search(r"\.map\s*\([^)]*key\s*=", code))
|
|
294
|
+
if jsx_list_pattern and not has_key_in_map:
|
|
295
|
+
score -= 1.0 # Missing keys in lists
|
|
296
|
+
|
|
297
|
+
# Check for expensive operations in render
|
|
298
|
+
# useEffect is good, direct async in render is bad
|
|
299
|
+
has_use_effect = bool(re.search(r"useEffect\(", code))
|
|
300
|
+
has_async_in_render = bool(re.search(r"(const|let|var)\s+\w+\s*=\s*async\s*\(\)\s*=>", code))
|
|
301
|
+
if has_async_in_render and not has_use_effect:
|
|
302
|
+
score -= 0.5
|
|
303
|
+
|
|
304
|
+
# Check for unnecessary re-renders (inline functions in JSX)
|
|
305
|
+
inline_fn_count = len(re.findall(r"onClick\s*=\s*\{[^}]*\(\)\s*=>", code))
|
|
306
|
+
if inline_fn_count > 5:
|
|
307
|
+
score -= min(inline_fn_count * 0.1, 1.0)
|
|
308
|
+
|
|
309
|
+
return max(0.0, min(10.0, score))
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class PerformanceScorer:
|
|
313
|
+
"""
|
|
314
|
+
Context-aware performance scorer using Strategy pattern.
|
|
315
|
+
|
|
316
|
+
Phase 3.2: Performance Scoring Enhancement
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
_strategies: dict[Language, PerformanceStrategy] = {}
|
|
320
|
+
|
|
321
|
+
def __init__(self):
|
|
322
|
+
"""Initialize performance scorer with language strategies."""
|
|
323
|
+
if not PerformanceScorer._strategies:
|
|
324
|
+
PerformanceScorer._strategies = {
|
|
325
|
+
Language.PYTHON: PythonPerformanceStrategy(),
|
|
326
|
+
Language.TYPESCRIPT: TypeScriptPerformanceStrategy(),
|
|
327
|
+
Language.JAVASCRIPT: TypeScriptPerformanceStrategy(), # Use TypeScript strategy for JS
|
|
328
|
+
Language.REACT: ReactPerformanceStrategy(),
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
def calculate(
|
|
332
|
+
self,
|
|
333
|
+
code: str,
|
|
334
|
+
language: Language,
|
|
335
|
+
file_path: Path | None = None,
|
|
336
|
+
context: dict[str, Any] | None = None,
|
|
337
|
+
) -> float:
|
|
338
|
+
"""
|
|
339
|
+
Calculate performance score for code in the given language.
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
code: Source code content
|
|
343
|
+
language: Detected language
|
|
344
|
+
file_path: Optional path to the file
|
|
345
|
+
context: Optional context (other scores, config, etc.)
|
|
346
|
+
|
|
347
|
+
Returns:
|
|
348
|
+
Performance score (0.0-10.0)
|
|
349
|
+
"""
|
|
350
|
+
strategy = PerformanceScorer._strategies.get(language)
|
|
351
|
+
|
|
352
|
+
if not strategy:
|
|
353
|
+
# Fallback: use Python strategy (most comprehensive)
|
|
354
|
+
strategy = PerformanceScorer._strategies.get(Language.PYTHON, PythonPerformanceStrategy())
|
|
355
|
+
|
|
356
|
+
return strategy.calculate(code, file_path, context)
|
|
357
|
+
|