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,373 +1,373 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Scorer Registry - Generic registration system for language-specific scorers
|
|
3
|
-
|
|
4
|
-
This module provides a registry pattern for registering and retrieving
|
|
5
|
-
language-specific scorers, making it easy to add support for new languages
|
|
6
|
-
without modifying core code.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import logging
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
from ...core.config import ProjectConfig
|
|
13
|
-
from ...core.language_detector import Language
|
|
14
|
-
from .scoring import BaseScorer
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ScorerRegistry:
|
|
20
|
-
"""
|
|
21
|
-
Registry for language-specific scorers.
|
|
22
|
-
|
|
23
|
-
Supports:
|
|
24
|
-
- Registration of scorers for specific languages
|
|
25
|
-
- Fallback chains (e.g., React → TypeScript → Generic)
|
|
26
|
-
- Config-based scorer instantiation
|
|
27
|
-
- Automatic registration of built-in scorers (lazy initialization)
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
# Registry mapping language to scorer class
|
|
31
|
-
_scorers: dict[Language, type[BaseScorer]] = {}
|
|
32
|
-
|
|
33
|
-
# Fallback chains (language -> list of fallback languages)
|
|
34
|
-
_fallback_chains: dict[Language, list[Language]] = {
|
|
35
|
-
Language.REACT: [Language.TYPESCRIPT, Language.JAVASCRIPT],
|
|
36
|
-
Language.TYPESCRIPT: [Language.JAVASCRIPT],
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
# Track initialization state for lazy registration
|
|
40
|
-
_initialized: bool = False
|
|
41
|
-
|
|
42
|
-
@classmethod
|
|
43
|
-
def register(
|
|
44
|
-
cls,
|
|
45
|
-
language: Language,
|
|
46
|
-
scorer_class: type[BaseScorer],
|
|
47
|
-
*,
|
|
48
|
-
override: bool = False,
|
|
49
|
-
) -> None:
|
|
50
|
-
"""
|
|
51
|
-
Register a scorer class for a language.
|
|
52
|
-
|
|
53
|
-
Args:
|
|
54
|
-
language: Language to register scorer for
|
|
55
|
-
scorer_class: Scorer class (must implement BaseScorer)
|
|
56
|
-
override: If True, override existing registration
|
|
57
|
-
|
|
58
|
-
Raises:
|
|
59
|
-
ValueError: If language already registered and override=False
|
|
60
|
-
"""
|
|
61
|
-
if language in cls._scorers and not override:
|
|
62
|
-
raise ValueError(
|
|
63
|
-
f"Scorer for {language.value} already registered. "
|
|
64
|
-
"Use override=True to replace it."
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
# Validate that scorer_class implements BaseScorer interface
|
|
68
|
-
if not issubclass(scorer_class, BaseScorer):
|
|
69
|
-
raise TypeError(
|
|
70
|
-
f"Scorer class must inherit from BaseScorer, got {scorer_class.__name__}"
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
cls._scorers[language] = scorer_class
|
|
74
|
-
|
|
75
|
-
@classmethod
|
|
76
|
-
def unregister(cls, language: Language) -> None:
|
|
77
|
-
"""
|
|
78
|
-
Unregister a scorer for a language.
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
language: Language to unregister
|
|
82
|
-
"""
|
|
83
|
-
cls._scorers.pop(language, None)
|
|
84
|
-
|
|
85
|
-
@classmethod
|
|
86
|
-
def _ensure_initialized(cls) -> None:
|
|
87
|
-
"""
|
|
88
|
-
Ensure built-in scorers are registered (lazy initialization).
|
|
89
|
-
|
|
90
|
-
This method is called automatically before scorer lookup to ensure
|
|
91
|
-
all built-in scorers (Python, TypeScript, etc.) are registered.
|
|
92
|
-
|
|
93
|
-
Safe to call multiple times (idempotent).
|
|
94
|
-
"""
|
|
95
|
-
if cls._initialized:
|
|
96
|
-
return
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
cls._register_builtin_scorers()
|
|
100
|
-
# Only mark as initialized if at least Python scorer was registered
|
|
101
|
-
if cls.is_registered(Language.PYTHON):
|
|
102
|
-
cls._initialized = True
|
|
103
|
-
else:
|
|
104
|
-
# Force register Python scorer as fallback
|
|
105
|
-
logger.warning(
|
|
106
|
-
"Python scorer registration failed, attempting fallback registration"
|
|
107
|
-
)
|
|
108
|
-
try:
|
|
109
|
-
from .scoring import CodeScorer
|
|
110
|
-
cls.register(Language.PYTHON, CodeScorer, override=True)
|
|
111
|
-
cls._initialized = True
|
|
112
|
-
except Exception as fallback_error:
|
|
113
|
-
logger.error(
|
|
114
|
-
f"Failed to register Python scorer even with fallback: {fallback_error}",
|
|
115
|
-
exc_info=True,
|
|
116
|
-
)
|
|
117
|
-
# Don't set _initialized = True so it will retry next time
|
|
118
|
-
except Exception as e:
|
|
119
|
-
# Log error but try to register Python scorer as fallback
|
|
120
|
-
logger.warning(
|
|
121
|
-
f"Failed to auto-register built-in scorers: {e}. "
|
|
122
|
-
"Attempting fallback Python scorer registration.",
|
|
123
|
-
exc_info=True,
|
|
124
|
-
)
|
|
125
|
-
try:
|
|
126
|
-
from .scoring import CodeScorer
|
|
127
|
-
if not cls.is_registered(Language.PYTHON):
|
|
128
|
-
cls.register(Language.PYTHON, CodeScorer, override=True)
|
|
129
|
-
cls._initialized = True
|
|
130
|
-
except Exception as fallback_error:
|
|
131
|
-
logger.error(
|
|
132
|
-
f"Failed to register Python scorer as fallback: {fallback_error}",
|
|
133
|
-
exc_info=True,
|
|
134
|
-
)
|
|
135
|
-
# Don't set _initialized = True so it will retry next time
|
|
136
|
-
|
|
137
|
-
@classmethod
|
|
138
|
-
def _register_builtin_scorers(cls) -> None:
|
|
139
|
-
"""
|
|
140
|
-
Register all built-in language scorers.
|
|
141
|
-
|
|
142
|
-
This method registers:
|
|
143
|
-
- CodeScorer for Language.PYTHON
|
|
144
|
-
- TypeScriptScorer for Language.TYPESCRIPT (if available)
|
|
145
|
-
- ReactScorer for Language.REACT (if available)
|
|
146
|
-
|
|
147
|
-
Uses lazy imports to avoid circular dependencies.
|
|
148
|
-
"""
|
|
149
|
-
# Register Python scorer
|
|
150
|
-
from .scoring import CodeScorer
|
|
151
|
-
|
|
152
|
-
if not cls.is_registered(Language.PYTHON):
|
|
153
|
-
cls.register(Language.PYTHON, CodeScorer, override=False)
|
|
154
|
-
|
|
155
|
-
# Register TypeScript scorer (if available)
|
|
156
|
-
try:
|
|
157
|
-
from .typescript_scorer import TypeScriptScorer
|
|
158
|
-
|
|
159
|
-
if not cls.is_registered(Language.TYPESCRIPT):
|
|
160
|
-
cls.register(Language.TYPESCRIPT, TypeScriptScorer, override=False)
|
|
161
|
-
except ImportError:
|
|
162
|
-
# TypeScript scorer not available - skip silently
|
|
163
|
-
pass
|
|
164
|
-
|
|
165
|
-
# Register React scorer (if available)
|
|
166
|
-
try:
|
|
167
|
-
from .react_scorer import ReactScorer
|
|
168
|
-
|
|
169
|
-
if not cls.is_registered(Language.REACT):
|
|
170
|
-
cls.register(Language.REACT, ReactScorer, override=False)
|
|
171
|
-
except ImportError:
|
|
172
|
-
# React scorer not available - skip silently
|
|
173
|
-
pass
|
|
174
|
-
|
|
175
|
-
@classmethod
|
|
176
|
-
def get_scorer(cls, language: Language, config: ProjectConfig | None = None) -> BaseScorer:
|
|
177
|
-
"""
|
|
178
|
-
Get appropriate scorer for a language, with fallback support.
|
|
179
|
-
|
|
180
|
-
Args:
|
|
181
|
-
language: Detected language
|
|
182
|
-
config: Optional project configuration
|
|
183
|
-
|
|
184
|
-
Returns:
|
|
185
|
-
BaseScorer instance appropriate for the language
|
|
186
|
-
|
|
187
|
-
Raises:
|
|
188
|
-
ValueError: If no scorer found and no fallback available
|
|
189
|
-
"""
|
|
190
|
-
# Ensure built-in scorers are registered (lazy initialization)
|
|
191
|
-
cls._ensure_initialized()
|
|
192
|
-
|
|
193
|
-
# Try to get scorer for this language
|
|
194
|
-
scorer_class = cls._scorers.get(language)
|
|
195
|
-
|
|
196
|
-
if scorer_class:
|
|
197
|
-
return cls._instantiate_scorer(scorer_class, language, config)
|
|
198
|
-
|
|
199
|
-
# Try fallback chain
|
|
200
|
-
fallback_chain = cls._fallback_chains.get(language, [])
|
|
201
|
-
for fallback_language in fallback_chain:
|
|
202
|
-
fallback_scorer_class = cls._scorers.get(fallback_language)
|
|
203
|
-
if fallback_scorer_class:
|
|
204
|
-
return cls._instantiate_scorer(
|
|
205
|
-
fallback_scorer_class, fallback_language, config
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
# If still no scorer, try to ensure initialization one more time
|
|
209
|
-
# (in case initialization failed previously)
|
|
210
|
-
if not cls._initialized:
|
|
211
|
-
cls._ensure_initialized()
|
|
212
|
-
scorer_class = cls._scorers.get(language)
|
|
213
|
-
if scorer_class:
|
|
214
|
-
return cls._instantiate_scorer(scorer_class, language, config)
|
|
215
|
-
|
|
216
|
-
# Try fallback chain again after re-initialization
|
|
217
|
-
fallback_chain = cls._fallback_chains.get(language, [])
|
|
218
|
-
for fallback_language in fallback_chain:
|
|
219
|
-
fallback_scorer_class = cls._scorers.get(fallback_language)
|
|
220
|
-
if fallback_scorer_class:
|
|
221
|
-
return cls._instantiate_scorer(
|
|
222
|
-
fallback_scorer_class, fallback_language, config
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
# If still no scorer, raise error
|
|
226
|
-
# In the future, we could return a GenericScorer here
|
|
227
|
-
available_languages = [lang.value for lang in cls._scorers.keys()]
|
|
228
|
-
raise ValueError(
|
|
229
|
-
f"No scorer registered for language {language.value} "
|
|
230
|
-
f"and no fallback available. Available languages: {available_languages}"
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
@classmethod
|
|
234
|
-
def _instantiate_scorer(
|
|
235
|
-
cls,
|
|
236
|
-
scorer_class: type[BaseScorer],
|
|
237
|
-
language: Language,
|
|
238
|
-
config: ProjectConfig | None = None,
|
|
239
|
-
) -> BaseScorer:
|
|
240
|
-
"""
|
|
241
|
-
Instantiate a scorer class with appropriate configuration.
|
|
242
|
-
|
|
243
|
-
This method handles the complexity of extracting config values
|
|
244
|
-
and passing them to the scorer constructor.
|
|
245
|
-
"""
|
|
246
|
-
# Extract config values
|
|
247
|
-
scoring_config = config.scoring if config else None
|
|
248
|
-
quality_tools = config.quality_tools if config else None
|
|
249
|
-
weights = scoring_config.weights if scoring_config else None
|
|
250
|
-
|
|
251
|
-
# Try to instantiate with common constructor patterns
|
|
252
|
-
# Different scorers may have different constructor signatures
|
|
253
|
-
|
|
254
|
-
# Pattern 1: (eslint_config, tsconfig_path) - TypeScript/React scorers
|
|
255
|
-
if language in [Language.TYPESCRIPT, Language.REACT, Language.JAVASCRIPT]:
|
|
256
|
-
eslint_config = quality_tools.eslint_config if quality_tools else None
|
|
257
|
-
tsconfig_path = quality_tools.tsconfig_path if quality_tools else None
|
|
258
|
-
|
|
259
|
-
# ReactScorer has different constructor signature
|
|
260
|
-
if language == Language.REACT:
|
|
261
|
-
from .react_scorer import ReactScorer
|
|
262
|
-
return ReactScorer(
|
|
263
|
-
eslint_config=eslint_config, tsconfig_path=tsconfig_path
|
|
264
|
-
)
|
|
265
|
-
else:
|
|
266
|
-
from .typescript_scorer import TypeScriptScorer
|
|
267
|
-
return TypeScriptScorer(
|
|
268
|
-
eslint_config=eslint_config, tsconfig_path=tsconfig_path
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
# Pattern 2: (weights, ruff_enabled, mypy_enabled, ...) - Python scorer
|
|
272
|
-
elif language == Language.PYTHON:
|
|
273
|
-
from .scoring import CodeScorer
|
|
274
|
-
|
|
275
|
-
ruff_enabled = quality_tools.ruff_enabled if quality_tools else True
|
|
276
|
-
mypy_enabled = quality_tools.mypy_enabled if quality_tools else True
|
|
277
|
-
jscpd_enabled = quality_tools.jscpd_enabled if quality_tools else True
|
|
278
|
-
duplication_threshold = (
|
|
279
|
-
quality_tools.duplication_threshold if quality_tools else 3.0
|
|
280
|
-
)
|
|
281
|
-
min_duplication_lines = (
|
|
282
|
-
quality_tools.min_duplication_lines if quality_tools else 5
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
return CodeScorer(
|
|
286
|
-
weights=weights,
|
|
287
|
-
ruff_enabled=ruff_enabled,
|
|
288
|
-
mypy_enabled=mypy_enabled,
|
|
289
|
-
jscpd_enabled=jscpd_enabled,
|
|
290
|
-
duplication_threshold=duplication_threshold,
|
|
291
|
-
min_duplication_lines=min_duplication_lines,
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
# Pattern 3: Generic instantiation (try no-args first, then with config)
|
|
295
|
-
try:
|
|
296
|
-
return scorer_class()
|
|
297
|
-
except TypeError:
|
|
298
|
-
# If no-args fails, try with config dict
|
|
299
|
-
try:
|
|
300
|
-
return scorer_class(config=config)
|
|
301
|
-
except TypeError:
|
|
302
|
-
# Last resort: try with language
|
|
303
|
-
return scorer_class(language=language)
|
|
304
|
-
|
|
305
|
-
@classmethod
|
|
306
|
-
def list_registered_languages(cls) -> list[Language]:
|
|
307
|
-
"""
|
|
308
|
-
Get list of languages with registered scorers.
|
|
309
|
-
|
|
310
|
-
Returns:
|
|
311
|
-
List of languages that have scorers registered
|
|
312
|
-
"""
|
|
313
|
-
return list(cls._scorers.keys())
|
|
314
|
-
|
|
315
|
-
@classmethod
|
|
316
|
-
def is_registered(cls, language: Language) -> bool:
|
|
317
|
-
"""
|
|
318
|
-
Check if a language has a scorer registered.
|
|
319
|
-
|
|
320
|
-
Args:
|
|
321
|
-
language: Language to check
|
|
322
|
-
|
|
323
|
-
Returns:
|
|
324
|
-
True if scorer is registered for this language
|
|
325
|
-
"""
|
|
326
|
-
return language in cls._scorers
|
|
327
|
-
|
|
328
|
-
@classmethod
|
|
329
|
-
def register_fallback_chain(
|
|
330
|
-
cls, language: Language, fallback_chain: list[Language]
|
|
331
|
-
) -> None:
|
|
332
|
-
"""
|
|
333
|
-
Register a fallback chain for a language.
|
|
334
|
-
|
|
335
|
-
Args:
|
|
336
|
-
language: Primary language
|
|
337
|
-
fallback_chain: List of languages to fall back to (in order)
|
|
338
|
-
"""
|
|
339
|
-
cls._fallback_chains[language] = fallback_chain
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def register_scorer(
|
|
343
|
-
language: Language, *, override: bool = False
|
|
344
|
-
) -> Any:
|
|
345
|
-
"""
|
|
346
|
-
Decorator to register a scorer class for a language.
|
|
347
|
-
|
|
348
|
-
Usage:
|
|
349
|
-
@register_scorer(Language.PYTHON)
|
|
350
|
-
class PythonScorer(BaseScorer):
|
|
351
|
-
...
|
|
352
|
-
|
|
353
|
-
Args:
|
|
354
|
-
language: Language to register for
|
|
355
|
-
override: If True, override existing registration
|
|
356
|
-
|
|
357
|
-
Returns:
|
|
358
|
-
Decorator function
|
|
359
|
-
"""
|
|
360
|
-
def decorator(scorer_class: type[BaseScorer]) -> type[BaseScorer]:
|
|
361
|
-
ScorerRegistry.register(language, scorer_class, override=override)
|
|
362
|
-
return scorer_class
|
|
363
|
-
|
|
364
|
-
return decorator
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
# Note: Built-in scorers are registered lazily via _ensure_initialized()
|
|
368
|
-
# which is called automatically when get_scorer() is first invoked.
|
|
369
|
-
# This avoids circular import issues while ensuring scorers are available.
|
|
370
|
-
#
|
|
371
|
-
# For explicit registration, use the @register_scorer decorator or
|
|
372
|
-
# ScorerRegistry.register() method directly.
|
|
373
|
-
|
|
1
|
+
"""
|
|
2
|
+
Scorer Registry - Generic registration system for language-specific scorers
|
|
3
|
+
|
|
4
|
+
This module provides a registry pattern for registering and retrieving
|
|
5
|
+
language-specific scorers, making it easy to add support for new languages
|
|
6
|
+
without modifying core code.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from ...core.config import ProjectConfig
|
|
13
|
+
from ...core.language_detector import Language
|
|
14
|
+
from .scoring import BaseScorer
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ScorerRegistry:
|
|
20
|
+
"""
|
|
21
|
+
Registry for language-specific scorers.
|
|
22
|
+
|
|
23
|
+
Supports:
|
|
24
|
+
- Registration of scorers for specific languages
|
|
25
|
+
- Fallback chains (e.g., React → TypeScript → Generic)
|
|
26
|
+
- Config-based scorer instantiation
|
|
27
|
+
- Automatic registration of built-in scorers (lazy initialization)
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
# Registry mapping language to scorer class
|
|
31
|
+
_scorers: dict[Language, type[BaseScorer]] = {}
|
|
32
|
+
|
|
33
|
+
# Fallback chains (language -> list of fallback languages)
|
|
34
|
+
_fallback_chains: dict[Language, list[Language]] = {
|
|
35
|
+
Language.REACT: [Language.TYPESCRIPT, Language.JAVASCRIPT],
|
|
36
|
+
Language.TYPESCRIPT: [Language.JAVASCRIPT],
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Track initialization state for lazy registration
|
|
40
|
+
_initialized: bool = False
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def register(
|
|
44
|
+
cls,
|
|
45
|
+
language: Language,
|
|
46
|
+
scorer_class: type[BaseScorer],
|
|
47
|
+
*,
|
|
48
|
+
override: bool = False,
|
|
49
|
+
) -> None:
|
|
50
|
+
"""
|
|
51
|
+
Register a scorer class for a language.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
language: Language to register scorer for
|
|
55
|
+
scorer_class: Scorer class (must implement BaseScorer)
|
|
56
|
+
override: If True, override existing registration
|
|
57
|
+
|
|
58
|
+
Raises:
|
|
59
|
+
ValueError: If language already registered and override=False
|
|
60
|
+
"""
|
|
61
|
+
if language in cls._scorers and not override:
|
|
62
|
+
raise ValueError(
|
|
63
|
+
f"Scorer for {language.value} already registered. "
|
|
64
|
+
"Use override=True to replace it."
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# Validate that scorer_class implements BaseScorer interface
|
|
68
|
+
if not issubclass(scorer_class, BaseScorer):
|
|
69
|
+
raise TypeError(
|
|
70
|
+
f"Scorer class must inherit from BaseScorer, got {scorer_class.__name__}"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
cls._scorers[language] = scorer_class
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def unregister(cls, language: Language) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Unregister a scorer for a language.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
language: Language to unregister
|
|
82
|
+
"""
|
|
83
|
+
cls._scorers.pop(language, None)
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def _ensure_initialized(cls) -> None:
|
|
87
|
+
"""
|
|
88
|
+
Ensure built-in scorers are registered (lazy initialization).
|
|
89
|
+
|
|
90
|
+
This method is called automatically before scorer lookup to ensure
|
|
91
|
+
all built-in scorers (Python, TypeScript, etc.) are registered.
|
|
92
|
+
|
|
93
|
+
Safe to call multiple times (idempotent).
|
|
94
|
+
"""
|
|
95
|
+
if cls._initialized:
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
cls._register_builtin_scorers()
|
|
100
|
+
# Only mark as initialized if at least Python scorer was registered
|
|
101
|
+
if cls.is_registered(Language.PYTHON):
|
|
102
|
+
cls._initialized = True
|
|
103
|
+
else:
|
|
104
|
+
# Force register Python scorer as fallback
|
|
105
|
+
logger.warning(
|
|
106
|
+
"Python scorer registration failed, attempting fallback registration"
|
|
107
|
+
)
|
|
108
|
+
try:
|
|
109
|
+
from .scoring import CodeScorer
|
|
110
|
+
cls.register(Language.PYTHON, CodeScorer, override=True)
|
|
111
|
+
cls._initialized = True
|
|
112
|
+
except Exception as fallback_error:
|
|
113
|
+
logger.error(
|
|
114
|
+
f"Failed to register Python scorer even with fallback: {fallback_error}",
|
|
115
|
+
exc_info=True,
|
|
116
|
+
)
|
|
117
|
+
# Don't set _initialized = True so it will retry next time
|
|
118
|
+
except Exception as e:
|
|
119
|
+
# Log error but try to register Python scorer as fallback
|
|
120
|
+
logger.warning(
|
|
121
|
+
f"Failed to auto-register built-in scorers: {e}. "
|
|
122
|
+
"Attempting fallback Python scorer registration.",
|
|
123
|
+
exc_info=True,
|
|
124
|
+
)
|
|
125
|
+
try:
|
|
126
|
+
from .scoring import CodeScorer
|
|
127
|
+
if not cls.is_registered(Language.PYTHON):
|
|
128
|
+
cls.register(Language.PYTHON, CodeScorer, override=True)
|
|
129
|
+
cls._initialized = True
|
|
130
|
+
except Exception as fallback_error:
|
|
131
|
+
logger.error(
|
|
132
|
+
f"Failed to register Python scorer as fallback: {fallback_error}",
|
|
133
|
+
exc_info=True,
|
|
134
|
+
)
|
|
135
|
+
# Don't set _initialized = True so it will retry next time
|
|
136
|
+
|
|
137
|
+
@classmethod
|
|
138
|
+
def _register_builtin_scorers(cls) -> None:
|
|
139
|
+
"""
|
|
140
|
+
Register all built-in language scorers.
|
|
141
|
+
|
|
142
|
+
This method registers:
|
|
143
|
+
- CodeScorer for Language.PYTHON
|
|
144
|
+
- TypeScriptScorer for Language.TYPESCRIPT (if available)
|
|
145
|
+
- ReactScorer for Language.REACT (if available)
|
|
146
|
+
|
|
147
|
+
Uses lazy imports to avoid circular dependencies.
|
|
148
|
+
"""
|
|
149
|
+
# Register Python scorer
|
|
150
|
+
from .scoring import CodeScorer
|
|
151
|
+
|
|
152
|
+
if not cls.is_registered(Language.PYTHON):
|
|
153
|
+
cls.register(Language.PYTHON, CodeScorer, override=False)
|
|
154
|
+
|
|
155
|
+
# Register TypeScript scorer (if available)
|
|
156
|
+
try:
|
|
157
|
+
from .typescript_scorer import TypeScriptScorer
|
|
158
|
+
|
|
159
|
+
if not cls.is_registered(Language.TYPESCRIPT):
|
|
160
|
+
cls.register(Language.TYPESCRIPT, TypeScriptScorer, override=False)
|
|
161
|
+
except ImportError:
|
|
162
|
+
# TypeScript scorer not available - skip silently
|
|
163
|
+
pass
|
|
164
|
+
|
|
165
|
+
# Register React scorer (if available)
|
|
166
|
+
try:
|
|
167
|
+
from .react_scorer import ReactScorer
|
|
168
|
+
|
|
169
|
+
if not cls.is_registered(Language.REACT):
|
|
170
|
+
cls.register(Language.REACT, ReactScorer, override=False)
|
|
171
|
+
except ImportError:
|
|
172
|
+
# React scorer not available - skip silently
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
@classmethod
|
|
176
|
+
def get_scorer(cls, language: Language, config: ProjectConfig | None = None) -> BaseScorer:
|
|
177
|
+
"""
|
|
178
|
+
Get appropriate scorer for a language, with fallback support.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
language: Detected language
|
|
182
|
+
config: Optional project configuration
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
BaseScorer instance appropriate for the language
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
ValueError: If no scorer found and no fallback available
|
|
189
|
+
"""
|
|
190
|
+
# Ensure built-in scorers are registered (lazy initialization)
|
|
191
|
+
cls._ensure_initialized()
|
|
192
|
+
|
|
193
|
+
# Try to get scorer for this language
|
|
194
|
+
scorer_class = cls._scorers.get(language)
|
|
195
|
+
|
|
196
|
+
if scorer_class:
|
|
197
|
+
return cls._instantiate_scorer(scorer_class, language, config)
|
|
198
|
+
|
|
199
|
+
# Try fallback chain
|
|
200
|
+
fallback_chain = cls._fallback_chains.get(language, [])
|
|
201
|
+
for fallback_language in fallback_chain:
|
|
202
|
+
fallback_scorer_class = cls._scorers.get(fallback_language)
|
|
203
|
+
if fallback_scorer_class:
|
|
204
|
+
return cls._instantiate_scorer(
|
|
205
|
+
fallback_scorer_class, fallback_language, config
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# If still no scorer, try to ensure initialization one more time
|
|
209
|
+
# (in case initialization failed previously)
|
|
210
|
+
if not cls._initialized:
|
|
211
|
+
cls._ensure_initialized()
|
|
212
|
+
scorer_class = cls._scorers.get(language)
|
|
213
|
+
if scorer_class:
|
|
214
|
+
return cls._instantiate_scorer(scorer_class, language, config)
|
|
215
|
+
|
|
216
|
+
# Try fallback chain again after re-initialization
|
|
217
|
+
fallback_chain = cls._fallback_chains.get(language, [])
|
|
218
|
+
for fallback_language in fallback_chain:
|
|
219
|
+
fallback_scorer_class = cls._scorers.get(fallback_language)
|
|
220
|
+
if fallback_scorer_class:
|
|
221
|
+
return cls._instantiate_scorer(
|
|
222
|
+
fallback_scorer_class, fallback_language, config
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# If still no scorer, raise error
|
|
226
|
+
# In the future, we could return a GenericScorer here
|
|
227
|
+
available_languages = [lang.value for lang in cls._scorers.keys()]
|
|
228
|
+
raise ValueError(
|
|
229
|
+
f"No scorer registered for language {language.value} "
|
|
230
|
+
f"and no fallback available. Available languages: {available_languages}"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
@classmethod
|
|
234
|
+
def _instantiate_scorer(
|
|
235
|
+
cls,
|
|
236
|
+
scorer_class: type[BaseScorer],
|
|
237
|
+
language: Language,
|
|
238
|
+
config: ProjectConfig | None = None,
|
|
239
|
+
) -> BaseScorer:
|
|
240
|
+
"""
|
|
241
|
+
Instantiate a scorer class with appropriate configuration.
|
|
242
|
+
|
|
243
|
+
This method handles the complexity of extracting config values
|
|
244
|
+
and passing them to the scorer constructor.
|
|
245
|
+
"""
|
|
246
|
+
# Extract config values
|
|
247
|
+
scoring_config = config.scoring if config else None
|
|
248
|
+
quality_tools = config.quality_tools if config else None
|
|
249
|
+
weights = scoring_config.weights if scoring_config else None
|
|
250
|
+
|
|
251
|
+
# Try to instantiate with common constructor patterns
|
|
252
|
+
# Different scorers may have different constructor signatures
|
|
253
|
+
|
|
254
|
+
# Pattern 1: (eslint_config, tsconfig_path) - TypeScript/React scorers
|
|
255
|
+
if language in [Language.TYPESCRIPT, Language.REACT, Language.JAVASCRIPT]:
|
|
256
|
+
eslint_config = quality_tools.eslint_config if quality_tools else None
|
|
257
|
+
tsconfig_path = quality_tools.tsconfig_path if quality_tools else None
|
|
258
|
+
|
|
259
|
+
# ReactScorer has different constructor signature
|
|
260
|
+
if language == Language.REACT:
|
|
261
|
+
from .react_scorer import ReactScorer
|
|
262
|
+
return ReactScorer(
|
|
263
|
+
eslint_config=eslint_config, tsconfig_path=tsconfig_path
|
|
264
|
+
)
|
|
265
|
+
else:
|
|
266
|
+
from .typescript_scorer import TypeScriptScorer
|
|
267
|
+
return TypeScriptScorer(
|
|
268
|
+
eslint_config=eslint_config, tsconfig_path=tsconfig_path
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
# Pattern 2: (weights, ruff_enabled, mypy_enabled, ...) - Python scorer
|
|
272
|
+
elif language == Language.PYTHON:
|
|
273
|
+
from .scoring import CodeScorer
|
|
274
|
+
|
|
275
|
+
ruff_enabled = quality_tools.ruff_enabled if quality_tools else True
|
|
276
|
+
mypy_enabled = quality_tools.mypy_enabled if quality_tools else True
|
|
277
|
+
jscpd_enabled = quality_tools.jscpd_enabled if quality_tools else True
|
|
278
|
+
duplication_threshold = (
|
|
279
|
+
quality_tools.duplication_threshold if quality_tools else 3.0
|
|
280
|
+
)
|
|
281
|
+
min_duplication_lines = (
|
|
282
|
+
quality_tools.min_duplication_lines if quality_tools else 5
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
return CodeScorer(
|
|
286
|
+
weights=weights,
|
|
287
|
+
ruff_enabled=ruff_enabled,
|
|
288
|
+
mypy_enabled=mypy_enabled,
|
|
289
|
+
jscpd_enabled=jscpd_enabled,
|
|
290
|
+
duplication_threshold=duplication_threshold,
|
|
291
|
+
min_duplication_lines=min_duplication_lines,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
# Pattern 3: Generic instantiation (try no-args first, then with config)
|
|
295
|
+
try:
|
|
296
|
+
return scorer_class()
|
|
297
|
+
except TypeError:
|
|
298
|
+
# If no-args fails, try with config dict
|
|
299
|
+
try:
|
|
300
|
+
return scorer_class(config=config)
|
|
301
|
+
except TypeError:
|
|
302
|
+
# Last resort: try with language
|
|
303
|
+
return scorer_class(language=language)
|
|
304
|
+
|
|
305
|
+
@classmethod
|
|
306
|
+
def list_registered_languages(cls) -> list[Language]:
|
|
307
|
+
"""
|
|
308
|
+
Get list of languages with registered scorers.
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
List of languages that have scorers registered
|
|
312
|
+
"""
|
|
313
|
+
return list(cls._scorers.keys())
|
|
314
|
+
|
|
315
|
+
@classmethod
|
|
316
|
+
def is_registered(cls, language: Language) -> bool:
|
|
317
|
+
"""
|
|
318
|
+
Check if a language has a scorer registered.
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
language: Language to check
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
True if scorer is registered for this language
|
|
325
|
+
"""
|
|
326
|
+
return language in cls._scorers
|
|
327
|
+
|
|
328
|
+
@classmethod
|
|
329
|
+
def register_fallback_chain(
|
|
330
|
+
cls, language: Language, fallback_chain: list[Language]
|
|
331
|
+
) -> None:
|
|
332
|
+
"""
|
|
333
|
+
Register a fallback chain for a language.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
language: Primary language
|
|
337
|
+
fallback_chain: List of languages to fall back to (in order)
|
|
338
|
+
"""
|
|
339
|
+
cls._fallback_chains[language] = fallback_chain
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def register_scorer(
|
|
343
|
+
language: Language, *, override: bool = False
|
|
344
|
+
) -> Any:
|
|
345
|
+
"""
|
|
346
|
+
Decorator to register a scorer class for a language.
|
|
347
|
+
|
|
348
|
+
Usage:
|
|
349
|
+
@register_scorer(Language.PYTHON)
|
|
350
|
+
class PythonScorer(BaseScorer):
|
|
351
|
+
...
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
language: Language to register for
|
|
355
|
+
override: If True, override existing registration
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
Decorator function
|
|
359
|
+
"""
|
|
360
|
+
def decorator(scorer_class: type[BaseScorer]) -> type[BaseScorer]:
|
|
361
|
+
ScorerRegistry.register(language, scorer_class, override=override)
|
|
362
|
+
return scorer_class
|
|
363
|
+
|
|
364
|
+
return decorator
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
# Note: Built-in scorers are registered lazily via _ensure_initialized()
|
|
368
|
+
# which is called automatically when get_scorer() is first invoked.
|
|
369
|
+
# This avoids circular import issues while ensuring scorers are available.
|
|
370
|
+
#
|
|
371
|
+
# For explicit registration, use the @register_scorer decorator or
|
|
372
|
+
# ScorerRegistry.register() method directly.
|
|
373
|
+
|