tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__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/service_discovery.py +534 -534
- 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/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/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/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/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.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- 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/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/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- 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/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- 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/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_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/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,507 +1,507 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Score Validator - Score validation, calibration, and explanation
|
|
3
|
-
|
|
4
|
-
Phase 3.3: Score Validation and Explanation
|
|
5
|
-
|
|
6
|
-
Provides:
|
|
7
|
-
- Score range validation (0-10)
|
|
8
|
-
- Score explanations (why score is what it is)
|
|
9
|
-
- Improvement suggestions
|
|
10
|
-
- Calibration utilities
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from dataclasses import dataclass, field
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
from ...core.language_detector import Language
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@dataclass
|
|
22
|
-
class ValidationResult:
|
|
23
|
-
"""Result of score validation."""
|
|
24
|
-
|
|
25
|
-
valid: bool
|
|
26
|
-
score: float
|
|
27
|
-
category: str
|
|
28
|
-
error: str | None = None
|
|
29
|
-
explanation: str | None = None
|
|
30
|
-
suggestions: list[str] = field(default_factory=list)
|
|
31
|
-
calibrated_score: float | None = None
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@dataclass
|
|
35
|
-
class ScoreExplanation:
|
|
36
|
-
"""Explanation of why a score is what it is."""
|
|
37
|
-
|
|
38
|
-
score: float
|
|
39
|
-
category: str
|
|
40
|
-
breakdown: dict[str, float] = field(default_factory=dict)
|
|
41
|
-
factors: list[str] = field(default_factory=list)
|
|
42
|
-
strengths: list[str] = field(default_factory=list)
|
|
43
|
-
weaknesses: list[str] = field(default_factory=list)
|
|
44
|
-
improvement_suggestions: list[str] = field(default_factory=list)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class ScoreValidator:
|
|
48
|
-
"""
|
|
49
|
-
Validates scores and provides explanations and improvement suggestions.
|
|
50
|
-
|
|
51
|
-
Phase 3.3: Score Validation
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
# Valid score ranges by category
|
|
55
|
-
SCORE_RANGES = {
|
|
56
|
-
"complexity": (0.0, 10.0),
|
|
57
|
-
"security": (0.0, 10.0),
|
|
58
|
-
"maintainability": (0.0, 10.0),
|
|
59
|
-
"test_coverage": (0.0, 10.0),
|
|
60
|
-
"performance": (0.0, 10.0),
|
|
61
|
-
"overall": (0.0, 100.0),
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
# Score thresholds for categorization
|
|
65
|
-
EXCELLENT_THRESHOLD = 8.5
|
|
66
|
-
GOOD_THRESHOLD = 7.0
|
|
67
|
-
ACCEPTABLE_THRESHOLD = 5.0
|
|
68
|
-
POOR_THRESHOLD = 3.0
|
|
69
|
-
|
|
70
|
-
def validate_score(
|
|
71
|
-
self,
|
|
72
|
-
score: float,
|
|
73
|
-
category: str,
|
|
74
|
-
language: Language | None = None,
|
|
75
|
-
context: dict[str, Any] | None = None,
|
|
76
|
-
) -> ValidationResult:
|
|
77
|
-
"""
|
|
78
|
-
Validate a score and provide explanation.
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
score: The score to validate
|
|
82
|
-
category: Score category (complexity, security, maintainability, etc.)
|
|
83
|
-
language: Optional language for language-specific validation
|
|
84
|
-
context: Optional context (metrics, other scores, etc.)
|
|
85
|
-
|
|
86
|
-
Returns:
|
|
87
|
-
ValidationResult with validation status, explanation, and suggestions
|
|
88
|
-
"""
|
|
89
|
-
# Type checking: ensure score is numeric
|
|
90
|
-
# Handle case where a dict might be passed instead of a float
|
|
91
|
-
if isinstance(score, dict):
|
|
92
|
-
# Try to extract a numeric score from the dict
|
|
93
|
-
# Common keys that might contain the actual score
|
|
94
|
-
numeric_score = None
|
|
95
|
-
for key in ["score", "value", category, f"{category}_score"]:
|
|
96
|
-
if key in score and isinstance(score[key], (int, float)):
|
|
97
|
-
numeric_score = float(score[key])
|
|
98
|
-
break
|
|
99
|
-
|
|
100
|
-
if numeric_score is None:
|
|
101
|
-
# No numeric value found in dict, return error
|
|
102
|
-
return ValidationResult(
|
|
103
|
-
valid=False,
|
|
104
|
-
score=0.0,
|
|
105
|
-
category=category,
|
|
106
|
-
error=f"Invalid score type: expected float/int, got dict. Dict contents: {score}",
|
|
107
|
-
explanation=f"Score validation failed: received dict instead of numeric value for {category}",
|
|
108
|
-
suggestions=[
|
|
109
|
-
"Ensure score calculation returns numeric values (float/int), not dictionaries",
|
|
110
|
-
"Check score calculation logic to return raw numeric scores",
|
|
111
|
-
],
|
|
112
|
-
)
|
|
113
|
-
score = numeric_score
|
|
114
|
-
elif not isinstance(score, (int, float)):
|
|
115
|
-
# Handle other non-numeric types
|
|
116
|
-
return ValidationResult(
|
|
117
|
-
valid=False,
|
|
118
|
-
score=0.0,
|
|
119
|
-
category=category,
|
|
120
|
-
error=f"Invalid score type: expected float/int, got {type(score).__name__}",
|
|
121
|
-
explanation=f"Score validation failed: received {type(score).__name__} instead of numeric value for {category}",
|
|
122
|
-
suggestions=[
|
|
123
|
-
"Ensure score calculation returns numeric values (float/int)",
|
|
124
|
-
f"Check that score is not a {type(score).__name__}",
|
|
125
|
-
],
|
|
126
|
-
)
|
|
127
|
-
else:
|
|
128
|
-
# Ensure score is a float for consistent handling
|
|
129
|
-
score = float(score)
|
|
130
|
-
|
|
131
|
-
# Get valid range for category
|
|
132
|
-
min_score, max_score = self.SCORE_RANGES.get(
|
|
133
|
-
category, (0.0, 10.0 if category != "overall" else 100.0)
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
# Validate range
|
|
137
|
-
if score < min_score or score > max_score:
|
|
138
|
-
return ValidationResult(
|
|
139
|
-
valid=False,
|
|
140
|
-
score=score,
|
|
141
|
-
category=category,
|
|
142
|
-
error=f"Score {score} is outside valid range [{min_score}, {max_score}]",
|
|
143
|
-
explanation=f"Invalid score: {score} (expected range: {min_score}-{max_score})",
|
|
144
|
-
suggestions=[
|
|
145
|
-
f"Ensure score calculation returns values in range [{min_score}, {max_score}]",
|
|
146
|
-
"Check for calculation errors or uninitialized values",
|
|
147
|
-
],
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
# Clamp score to valid range (defensive)
|
|
151
|
-
clamped_score = max(min_score, min(max_score, score))
|
|
152
|
-
|
|
153
|
-
# Generate explanation and suggestions
|
|
154
|
-
explanation_obj = self.explain_score(
|
|
155
|
-
clamped_score, category, language=language, context=context
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
# Build explanation string from explanation object
|
|
159
|
-
explanation_parts = []
|
|
160
|
-
if explanation_obj.strengths:
|
|
161
|
-
explanation_parts.append(f"Strengths: {', '.join(explanation_obj.strengths)}")
|
|
162
|
-
if explanation_obj.weaknesses:
|
|
163
|
-
explanation_parts.append(f"Areas for improvement: {', '.join(explanation_obj.weaknesses)}")
|
|
164
|
-
if not explanation_parts:
|
|
165
|
-
explanation_parts.append(f"Score: {clamped_score:.1f}/10 ({category})")
|
|
166
|
-
|
|
167
|
-
explanation_str = ". ".join(explanation_parts) if explanation_parts else None
|
|
168
|
-
|
|
169
|
-
return ValidationResult(
|
|
170
|
-
valid=True,
|
|
171
|
-
score=clamped_score,
|
|
172
|
-
category=category,
|
|
173
|
-
explanation=explanation_str,
|
|
174
|
-
suggestions=explanation_obj.improvement_suggestions,
|
|
175
|
-
calibrated_score=clamped_score,
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
def explain_score(
|
|
179
|
-
self,
|
|
180
|
-
score: float,
|
|
181
|
-
category: str,
|
|
182
|
-
language: Language | None = None,
|
|
183
|
-
context: dict[str, Any] | None = None,
|
|
184
|
-
) -> ScoreExplanation:
|
|
185
|
-
"""
|
|
186
|
-
Explain why a score is what it is.
|
|
187
|
-
|
|
188
|
-
Args:
|
|
189
|
-
score: The score to explain
|
|
190
|
-
category: Score category
|
|
191
|
-
language: Optional language for language-specific explanations
|
|
192
|
-
context: Optional context (metrics, breakdown, etc.)
|
|
193
|
-
|
|
194
|
-
Returns:
|
|
195
|
-
ScoreExplanation with breakdown, factors, and suggestions
|
|
196
|
-
"""
|
|
197
|
-
# Normalize score to 0-10 range if it's overall (0-100)
|
|
198
|
-
normalized_score = score / 10.0 if category == "overall" else score
|
|
199
|
-
|
|
200
|
-
# Determine score category
|
|
201
|
-
if normalized_score >= self.EXCELLENT_THRESHOLD:
|
|
202
|
-
quality_level = "excellent"
|
|
203
|
-
elif normalized_score >= self.GOOD_THRESHOLD:
|
|
204
|
-
quality_level = "good"
|
|
205
|
-
elif normalized_score >= self.ACCEPTABLE_THRESHOLD:
|
|
206
|
-
quality_level = "acceptable"
|
|
207
|
-
elif normalized_score >= self.POOR_THRESHOLD:
|
|
208
|
-
quality_level = "poor"
|
|
209
|
-
else:
|
|
210
|
-
quality_level = "critical"
|
|
211
|
-
|
|
212
|
-
# Extract breakdown from context if available
|
|
213
|
-
breakdown = context.get("breakdown", {}) if context else {}
|
|
214
|
-
factors = context.get("factors", []) if context else []
|
|
215
|
-
|
|
216
|
-
# Generate strengths and weaknesses based on score
|
|
217
|
-
strengths = []
|
|
218
|
-
weaknesses = []
|
|
219
|
-
improvement_suggestions = []
|
|
220
|
-
|
|
221
|
-
if normalized_score >= self.EXCELLENT_THRESHOLD:
|
|
222
|
-
strengths.append(f"{category} is excellent ({score:.1f}/10)")
|
|
223
|
-
strengths.append("Code demonstrates best practices")
|
|
224
|
-
elif normalized_score >= self.GOOD_THRESHOLD:
|
|
225
|
-
strengths.append(f"{category} is good ({score:.1f}/10)")
|
|
226
|
-
improvement_suggestions.append(
|
|
227
|
-
f"Consider minor improvements to reach excellent level (>{self.EXCELLENT_THRESHOLD:.1f})"
|
|
228
|
-
)
|
|
229
|
-
elif normalized_score >= self.ACCEPTABLE_THRESHOLD:
|
|
230
|
-
weaknesses.append(f"{category} is acceptable but could be improved ({score:.1f}/10)")
|
|
231
|
-
improvement_suggestions.extend(
|
|
232
|
-
self._generate_category_suggestions(category, normalized_score, language)
|
|
233
|
-
)
|
|
234
|
-
else:
|
|
235
|
-
weaknesses.append(f"{category} needs significant improvement ({score:.1f}/10)")
|
|
236
|
-
improvement_suggestions.extend(
|
|
237
|
-
self._generate_category_suggestions(category, normalized_score, language)
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
return ScoreExplanation(
|
|
241
|
-
score=score,
|
|
242
|
-
category=category,
|
|
243
|
-
breakdown=breakdown,
|
|
244
|
-
factors=factors,
|
|
245
|
-
strengths=strengths,
|
|
246
|
-
weaknesses=weaknesses,
|
|
247
|
-
improvement_suggestions=improvement_suggestions,
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
def _generate_category_suggestions(
|
|
251
|
-
self, category: str, score: float, language: Language | None = None
|
|
252
|
-
) -> list[str]:
|
|
253
|
-
"""Generate category-specific improvement suggestions."""
|
|
254
|
-
suggestions = []
|
|
255
|
-
|
|
256
|
-
if category == "complexity":
|
|
257
|
-
suggestions.extend(
|
|
258
|
-
[
|
|
259
|
-
"Break down complex functions into smaller, focused functions",
|
|
260
|
-
"Reduce nesting depth (aim for < 4 levels)",
|
|
261
|
-
"Extract complex logic into separate functions or modules",
|
|
262
|
-
"Use early returns to reduce nesting",
|
|
263
|
-
]
|
|
264
|
-
)
|
|
265
|
-
if language == Language.PYTHON:
|
|
266
|
-
suggestions.append("Consider using list comprehensions or generator expressions")
|
|
267
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
268
|
-
suggestions.append("Use array methods (map, filter, reduce) instead of loops")
|
|
269
|
-
elif category == "security":
|
|
270
|
-
suggestions.extend(
|
|
271
|
-
[
|
|
272
|
-
"Review and sanitize all user inputs",
|
|
273
|
-
"Use parameterized queries/prepared statements",
|
|
274
|
-
"Implement proper authentication and authorization",
|
|
275
|
-
"Keep dependencies updated and scan for vulnerabilities",
|
|
276
|
-
]
|
|
277
|
-
)
|
|
278
|
-
if language == Language.PYTHON:
|
|
279
|
-
suggestions.append("Use secrets module for sensitive operations")
|
|
280
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
281
|
-
suggestions.append("Avoid using eval() or innerHTML with user input")
|
|
282
|
-
elif category == "maintainability":
|
|
283
|
-
suggestions.extend(
|
|
284
|
-
[
|
|
285
|
-
"Add comprehensive docstrings/comments",
|
|
286
|
-
"Follow consistent naming conventions",
|
|
287
|
-
"Reduce code duplication (DRY principle)",
|
|
288
|
-
"Improve code organization and structure",
|
|
289
|
-
]
|
|
290
|
-
)
|
|
291
|
-
if language == Language.PYTHON:
|
|
292
|
-
suggestions.append("Use type hints for better code clarity")
|
|
293
|
-
elif language in [Language.TYPESCRIPT, Language.REACT]:
|
|
294
|
-
suggestions.append("Use TypeScript for better type safety")
|
|
295
|
-
elif category == "test_coverage":
|
|
296
|
-
suggestions.extend(
|
|
297
|
-
[
|
|
298
|
-
f"Increase test coverage to at least {self.GOOD_THRESHOLD*10:.0f}%",
|
|
299
|
-
"Add unit tests for critical functions",
|
|
300
|
-
"Include edge cases and error handling in tests",
|
|
301
|
-
"Add integration tests for important workflows",
|
|
302
|
-
]
|
|
303
|
-
)
|
|
304
|
-
elif category == "performance":
|
|
305
|
-
suggestions.extend(
|
|
306
|
-
[
|
|
307
|
-
"Profile code to identify bottlenecks",
|
|
308
|
-
"Optimize hot paths and frequently called functions",
|
|
309
|
-
"Consider caching results of expensive operations",
|
|
310
|
-
"Use appropriate data structures for the use case",
|
|
311
|
-
]
|
|
312
|
-
)
|
|
313
|
-
if language == Language.REACT:
|
|
314
|
-
suggestions.extend(
|
|
315
|
-
[
|
|
316
|
-
"Use React.memo, useMemo, or useCallback to prevent unnecessary re-renders",
|
|
317
|
-
"Implement code splitting for large components",
|
|
318
|
-
]
|
|
319
|
-
)
|
|
320
|
-
elif language == Language.PYTHON:
|
|
321
|
-
suggestions.extend(
|
|
322
|
-
[
|
|
323
|
-
"Use async/await for I/O-bound operations",
|
|
324
|
-
"Consider using functools.lru_cache for expensive computations",
|
|
325
|
-
]
|
|
326
|
-
)
|
|
327
|
-
elif category == "linting":
|
|
328
|
-
suggestions.extend(
|
|
329
|
-
[
|
|
330
|
-
"Run linting tool to identify specific code style issues",
|
|
331
|
-
"Fix code style violations (PEP 8 for Python, ESLint rules for JS/TS)",
|
|
332
|
-
"Address all errors (E) and fatal issues (F) first, then warnings (W)",
|
|
333
|
-
"Review and fix warnings for better code quality",
|
|
334
|
-
]
|
|
335
|
-
)
|
|
336
|
-
if language == Language.PYTHON:
|
|
337
|
-
suggestions.extend(
|
|
338
|
-
[
|
|
339
|
-
"Run 'ruff check' to identify specific linting issues",
|
|
340
|
-
"Run 'ruff check --fix' to auto-fix many issues automatically",
|
|
341
|
-
"Configure ruff in pyproject.toml for project-specific rules",
|
|
342
|
-
"Ensure consistent import ordering and formatting",
|
|
343
|
-
"Fix line length violations (aim for 88-100 characters per line)",
|
|
344
|
-
]
|
|
345
|
-
)
|
|
346
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
347
|
-
suggestions.extend(
|
|
348
|
-
[
|
|
349
|
-
"Run 'eslint' to identify specific linting issues",
|
|
350
|
-
"Run 'eslint --fix' to auto-fix many issues automatically",
|
|
351
|
-
"Configure ESLint rules in .eslintrc or package.json",
|
|
352
|
-
"Ensure consistent code formatting (integrate Prettier if needed)",
|
|
353
|
-
"Fix TypeScript-specific linting issues (strict mode violations)",
|
|
354
|
-
]
|
|
355
|
-
)
|
|
356
|
-
elif category == "type_checking":
|
|
357
|
-
suggestions.extend(
|
|
358
|
-
[
|
|
359
|
-
"Add type annotations to function parameters and return types",
|
|
360
|
-
"Fix type errors reported by type checker",
|
|
361
|
-
"Use type hints consistently throughout the codebase",
|
|
362
|
-
"Enable strict type checking mode for better type safety",
|
|
363
|
-
]
|
|
364
|
-
)
|
|
365
|
-
if language == Language.PYTHON:
|
|
366
|
-
suggestions.extend(
|
|
367
|
-
[
|
|
368
|
-
"Run 'mypy <file>' to see specific type errors",
|
|
369
|
-
"Add type hints using typing module or Python 3.9+ built-in types",
|
|
370
|
-
"Use Optional[T] for nullable types, Union[T, U] for multiple types",
|
|
371
|
-
"Consider using mypy --strict for maximum type safety",
|
|
372
|
-
"Add return type annotations: 'def func() -> int:'",
|
|
373
|
-
"Use TypeVar for generic types, Protocol for structural typing",
|
|
374
|
-
]
|
|
375
|
-
)
|
|
376
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
377
|
-
suggestions.extend(
|
|
378
|
-
[
|
|
379
|
-
"Enable strict mode in tsconfig.json (strict: true)",
|
|
380
|
-
"Add explicit return types to functions",
|
|
381
|
-
"Use proper interface/type definitions instead of 'any'",
|
|
382
|
-
"Fix TypeScript compiler errors systematically",
|
|
383
|
-
"Avoid using 'any' type - use 'unknown' or specific types",
|
|
384
|
-
"Use type guards for runtime type checking",
|
|
385
|
-
]
|
|
386
|
-
)
|
|
387
|
-
elif category == "duplication":
|
|
388
|
-
suggestions.extend(
|
|
389
|
-
[
|
|
390
|
-
"Identify and extract duplicate code into reusable functions",
|
|
391
|
-
"Use helper functions or utility modules for common patterns",
|
|
392
|
-
"Consider refactoring similar code blocks into shared components",
|
|
393
|
-
"Aim for < 3% code duplication across the project",
|
|
394
|
-
]
|
|
395
|
-
)
|
|
396
|
-
if language == Language.PYTHON:
|
|
397
|
-
suggestions.extend(
|
|
398
|
-
[
|
|
399
|
-
"Run 'jscpd' to identify specific duplicate code blocks",
|
|
400
|
-
"Extract common logic into utility functions or classes",
|
|
401
|
-
"Use decorators or context managers for repeated patterns",
|
|
402
|
-
"Create shared utility modules for common functionality",
|
|
403
|
-
"Consider using mixins for shared class behavior",
|
|
404
|
-
]
|
|
405
|
-
)
|
|
406
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
407
|
-
suggestions.extend(
|
|
408
|
-
[
|
|
409
|
-
"Extract duplicate code into shared utility functions",
|
|
410
|
-
"Create reusable React components for repeated UI patterns",
|
|
411
|
-
"Use higher-order components (HOCs) or custom hooks for common logic",
|
|
412
|
-
"Create shared utility modules or helper functions",
|
|
413
|
-
"Use composition over duplication for React components",
|
|
414
|
-
]
|
|
415
|
-
)
|
|
416
|
-
elif category == "overall":
|
|
417
|
-
# For overall score, provide general improvement suggestions
|
|
418
|
-
# Focus on the most impactful areas
|
|
419
|
-
suggestions.extend(
|
|
420
|
-
[
|
|
421
|
-
"Review individual quality metrics (complexity, security, maintainability, test coverage, performance)",
|
|
422
|
-
"Address the lowest-scoring areas first for maximum impact",
|
|
423
|
-
"Set specific improvement goals for each quality dimension",
|
|
424
|
-
"Run code quality tools regularly to track progress",
|
|
425
|
-
]
|
|
426
|
-
)
|
|
427
|
-
if language == Language.PYTHON:
|
|
428
|
-
suggestions.extend(
|
|
429
|
-
[
|
|
430
|
-
"Run ruff and mypy to identify code style and type issues",
|
|
431
|
-
"Use pytest with coverage to improve test coverage",
|
|
432
|
-
]
|
|
433
|
-
)
|
|
434
|
-
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
435
|
-
suggestions.extend(
|
|
436
|
-
[
|
|
437
|
-
"Use ESLint and TypeScript compiler to identify issues",
|
|
438
|
-
"Run tests with coverage to improve test coverage",
|
|
439
|
-
]
|
|
440
|
-
)
|
|
441
|
-
|
|
442
|
-
return suggestions
|
|
443
|
-
|
|
444
|
-
def validate_all_scores(
|
|
445
|
-
self,
|
|
446
|
-
scores: dict[str, float],
|
|
447
|
-
language: Language | None = None,
|
|
448
|
-
context: dict[str, Any] | None = None,
|
|
449
|
-
) -> dict[str, ValidationResult]:
|
|
450
|
-
"""
|
|
451
|
-
Validate all scores in a score dictionary.
|
|
452
|
-
|
|
453
|
-
Args:
|
|
454
|
-
scores: Dictionary of category -> score (can have keys like "complexity_score" or "complexity")
|
|
455
|
-
language: Optional language for language-specific validation
|
|
456
|
-
context: Optional context for explanations
|
|
457
|
-
|
|
458
|
-
Returns:
|
|
459
|
-
Dictionary of category -> ValidationResult
|
|
460
|
-
"""
|
|
461
|
-
results = {}
|
|
462
|
-
for category, score in scores.items():
|
|
463
|
-
# Skip non-numeric values (e.g., "metrics" dict, strings, lists)
|
|
464
|
-
# Only validate actual numeric scores
|
|
465
|
-
if not isinstance(score, (int, float)):
|
|
466
|
-
continue
|
|
467
|
-
|
|
468
|
-
# Normalize category name: remove "_score" suffix if present
|
|
469
|
-
# e.g., "complexity_score" -> "complexity", "overall_score" -> "overall"
|
|
470
|
-
normalized_category = category
|
|
471
|
-
if category.endswith("_score"):
|
|
472
|
-
normalized_category = category[:-6] # Remove "_score" suffix
|
|
473
|
-
|
|
474
|
-
category_context = (context or {}).get(category, {}) if context else None
|
|
475
|
-
results[category] = self.validate_score(
|
|
476
|
-
score, normalized_category, language=language, context=category_context
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
return results
|
|
480
|
-
|
|
481
|
-
def calibrate_score(
|
|
482
|
-
self, score: float, category: str, baseline: float | None = None
|
|
483
|
-
) -> float:
|
|
484
|
-
"""
|
|
485
|
-
Calibrate a score against a baseline.
|
|
486
|
-
|
|
487
|
-
Args:
|
|
488
|
-
score: The score to calibrate
|
|
489
|
-
category: Score category
|
|
490
|
-
baseline: Optional baseline score for calibration
|
|
491
|
-
|
|
492
|
-
Returns:
|
|
493
|
-
Calibrated score
|
|
494
|
-
"""
|
|
495
|
-
if baseline is None:
|
|
496
|
-
return score
|
|
497
|
-
|
|
498
|
-
# Simple calibration: adjust score based on baseline
|
|
499
|
-
# If baseline is high, scores should be stricter
|
|
500
|
-
# If baseline is low, scores can be more lenient
|
|
501
|
-
calibration_factor = baseline / 7.0 # Use 7.0 as neutral baseline
|
|
502
|
-
calibrated = score * calibration_factor
|
|
503
|
-
|
|
504
|
-
# Clamp to valid range
|
|
505
|
-
min_score, max_score = self.SCORE_RANGES.get(category, (0.0, 10.0))
|
|
506
|
-
return max(min_score, min(max_score, calibrated))
|
|
507
|
-
|
|
1
|
+
"""
|
|
2
|
+
Score Validator - Score validation, calibration, and explanation
|
|
3
|
+
|
|
4
|
+
Phase 3.3: Score Validation and Explanation
|
|
5
|
+
|
|
6
|
+
Provides:
|
|
7
|
+
- Score range validation (0-10)
|
|
8
|
+
- Score explanations (why score is what it is)
|
|
9
|
+
- Improvement suggestions
|
|
10
|
+
- Calibration utilities
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from ...core.language_detector import Language
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class ValidationResult:
|
|
23
|
+
"""Result of score validation."""
|
|
24
|
+
|
|
25
|
+
valid: bool
|
|
26
|
+
score: float
|
|
27
|
+
category: str
|
|
28
|
+
error: str | None = None
|
|
29
|
+
explanation: str | None = None
|
|
30
|
+
suggestions: list[str] = field(default_factory=list)
|
|
31
|
+
calibrated_score: float | None = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class ScoreExplanation:
|
|
36
|
+
"""Explanation of why a score is what it is."""
|
|
37
|
+
|
|
38
|
+
score: float
|
|
39
|
+
category: str
|
|
40
|
+
breakdown: dict[str, float] = field(default_factory=dict)
|
|
41
|
+
factors: list[str] = field(default_factory=list)
|
|
42
|
+
strengths: list[str] = field(default_factory=list)
|
|
43
|
+
weaknesses: list[str] = field(default_factory=list)
|
|
44
|
+
improvement_suggestions: list[str] = field(default_factory=list)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ScoreValidator:
|
|
48
|
+
"""
|
|
49
|
+
Validates scores and provides explanations and improvement suggestions.
|
|
50
|
+
|
|
51
|
+
Phase 3.3: Score Validation
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
# Valid score ranges by category
|
|
55
|
+
SCORE_RANGES = {
|
|
56
|
+
"complexity": (0.0, 10.0),
|
|
57
|
+
"security": (0.0, 10.0),
|
|
58
|
+
"maintainability": (0.0, 10.0),
|
|
59
|
+
"test_coverage": (0.0, 10.0),
|
|
60
|
+
"performance": (0.0, 10.0),
|
|
61
|
+
"overall": (0.0, 100.0),
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Score thresholds for categorization
|
|
65
|
+
EXCELLENT_THRESHOLD = 8.5
|
|
66
|
+
GOOD_THRESHOLD = 7.0
|
|
67
|
+
ACCEPTABLE_THRESHOLD = 5.0
|
|
68
|
+
POOR_THRESHOLD = 3.0
|
|
69
|
+
|
|
70
|
+
def validate_score(
|
|
71
|
+
self,
|
|
72
|
+
score: float,
|
|
73
|
+
category: str,
|
|
74
|
+
language: Language | None = None,
|
|
75
|
+
context: dict[str, Any] | None = None,
|
|
76
|
+
) -> ValidationResult:
|
|
77
|
+
"""
|
|
78
|
+
Validate a score and provide explanation.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
score: The score to validate
|
|
82
|
+
category: Score category (complexity, security, maintainability, etc.)
|
|
83
|
+
language: Optional language for language-specific validation
|
|
84
|
+
context: Optional context (metrics, other scores, etc.)
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
ValidationResult with validation status, explanation, and suggestions
|
|
88
|
+
"""
|
|
89
|
+
# Type checking: ensure score is numeric
|
|
90
|
+
# Handle case where a dict might be passed instead of a float
|
|
91
|
+
if isinstance(score, dict):
|
|
92
|
+
# Try to extract a numeric score from the dict
|
|
93
|
+
# Common keys that might contain the actual score
|
|
94
|
+
numeric_score = None
|
|
95
|
+
for key in ["score", "value", category, f"{category}_score"]:
|
|
96
|
+
if key in score and isinstance(score[key], (int, float)):
|
|
97
|
+
numeric_score = float(score[key])
|
|
98
|
+
break
|
|
99
|
+
|
|
100
|
+
if numeric_score is None:
|
|
101
|
+
# No numeric value found in dict, return error
|
|
102
|
+
return ValidationResult(
|
|
103
|
+
valid=False,
|
|
104
|
+
score=0.0,
|
|
105
|
+
category=category,
|
|
106
|
+
error=f"Invalid score type: expected float/int, got dict. Dict contents: {score}",
|
|
107
|
+
explanation=f"Score validation failed: received dict instead of numeric value for {category}",
|
|
108
|
+
suggestions=[
|
|
109
|
+
"Ensure score calculation returns numeric values (float/int), not dictionaries",
|
|
110
|
+
"Check score calculation logic to return raw numeric scores",
|
|
111
|
+
],
|
|
112
|
+
)
|
|
113
|
+
score = numeric_score
|
|
114
|
+
elif not isinstance(score, (int, float)):
|
|
115
|
+
# Handle other non-numeric types
|
|
116
|
+
return ValidationResult(
|
|
117
|
+
valid=False,
|
|
118
|
+
score=0.0,
|
|
119
|
+
category=category,
|
|
120
|
+
error=f"Invalid score type: expected float/int, got {type(score).__name__}",
|
|
121
|
+
explanation=f"Score validation failed: received {type(score).__name__} instead of numeric value for {category}",
|
|
122
|
+
suggestions=[
|
|
123
|
+
"Ensure score calculation returns numeric values (float/int)",
|
|
124
|
+
f"Check that score is not a {type(score).__name__}",
|
|
125
|
+
],
|
|
126
|
+
)
|
|
127
|
+
else:
|
|
128
|
+
# Ensure score is a float for consistent handling
|
|
129
|
+
score = float(score)
|
|
130
|
+
|
|
131
|
+
# Get valid range for category
|
|
132
|
+
min_score, max_score = self.SCORE_RANGES.get(
|
|
133
|
+
category, (0.0, 10.0 if category != "overall" else 100.0)
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Validate range
|
|
137
|
+
if score < min_score or score > max_score:
|
|
138
|
+
return ValidationResult(
|
|
139
|
+
valid=False,
|
|
140
|
+
score=score,
|
|
141
|
+
category=category,
|
|
142
|
+
error=f"Score {score} is outside valid range [{min_score}, {max_score}]",
|
|
143
|
+
explanation=f"Invalid score: {score} (expected range: {min_score}-{max_score})",
|
|
144
|
+
suggestions=[
|
|
145
|
+
f"Ensure score calculation returns values in range [{min_score}, {max_score}]",
|
|
146
|
+
"Check for calculation errors or uninitialized values",
|
|
147
|
+
],
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Clamp score to valid range (defensive)
|
|
151
|
+
clamped_score = max(min_score, min(max_score, score))
|
|
152
|
+
|
|
153
|
+
# Generate explanation and suggestions
|
|
154
|
+
explanation_obj = self.explain_score(
|
|
155
|
+
clamped_score, category, language=language, context=context
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Build explanation string from explanation object
|
|
159
|
+
explanation_parts = []
|
|
160
|
+
if explanation_obj.strengths:
|
|
161
|
+
explanation_parts.append(f"Strengths: {', '.join(explanation_obj.strengths)}")
|
|
162
|
+
if explanation_obj.weaknesses:
|
|
163
|
+
explanation_parts.append(f"Areas for improvement: {', '.join(explanation_obj.weaknesses)}")
|
|
164
|
+
if not explanation_parts:
|
|
165
|
+
explanation_parts.append(f"Score: {clamped_score:.1f}/10 ({category})")
|
|
166
|
+
|
|
167
|
+
explanation_str = ". ".join(explanation_parts) if explanation_parts else None
|
|
168
|
+
|
|
169
|
+
return ValidationResult(
|
|
170
|
+
valid=True,
|
|
171
|
+
score=clamped_score,
|
|
172
|
+
category=category,
|
|
173
|
+
explanation=explanation_str,
|
|
174
|
+
suggestions=explanation_obj.improvement_suggestions,
|
|
175
|
+
calibrated_score=clamped_score,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def explain_score(
|
|
179
|
+
self,
|
|
180
|
+
score: float,
|
|
181
|
+
category: str,
|
|
182
|
+
language: Language | None = None,
|
|
183
|
+
context: dict[str, Any] | None = None,
|
|
184
|
+
) -> ScoreExplanation:
|
|
185
|
+
"""
|
|
186
|
+
Explain why a score is what it is.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
score: The score to explain
|
|
190
|
+
category: Score category
|
|
191
|
+
language: Optional language for language-specific explanations
|
|
192
|
+
context: Optional context (metrics, breakdown, etc.)
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
ScoreExplanation with breakdown, factors, and suggestions
|
|
196
|
+
"""
|
|
197
|
+
# Normalize score to 0-10 range if it's overall (0-100)
|
|
198
|
+
normalized_score = score / 10.0 if category == "overall" else score
|
|
199
|
+
|
|
200
|
+
# Determine score category
|
|
201
|
+
if normalized_score >= self.EXCELLENT_THRESHOLD:
|
|
202
|
+
quality_level = "excellent"
|
|
203
|
+
elif normalized_score >= self.GOOD_THRESHOLD:
|
|
204
|
+
quality_level = "good"
|
|
205
|
+
elif normalized_score >= self.ACCEPTABLE_THRESHOLD:
|
|
206
|
+
quality_level = "acceptable"
|
|
207
|
+
elif normalized_score >= self.POOR_THRESHOLD:
|
|
208
|
+
quality_level = "poor"
|
|
209
|
+
else:
|
|
210
|
+
quality_level = "critical"
|
|
211
|
+
|
|
212
|
+
# Extract breakdown from context if available
|
|
213
|
+
breakdown = context.get("breakdown", {}) if context else {}
|
|
214
|
+
factors = context.get("factors", []) if context else []
|
|
215
|
+
|
|
216
|
+
# Generate strengths and weaknesses based on score
|
|
217
|
+
strengths = []
|
|
218
|
+
weaknesses = []
|
|
219
|
+
improvement_suggestions = []
|
|
220
|
+
|
|
221
|
+
if normalized_score >= self.EXCELLENT_THRESHOLD:
|
|
222
|
+
strengths.append(f"{category} is excellent ({score:.1f}/10)")
|
|
223
|
+
strengths.append("Code demonstrates best practices")
|
|
224
|
+
elif normalized_score >= self.GOOD_THRESHOLD:
|
|
225
|
+
strengths.append(f"{category} is good ({score:.1f}/10)")
|
|
226
|
+
improvement_suggestions.append(
|
|
227
|
+
f"Consider minor improvements to reach excellent level (>{self.EXCELLENT_THRESHOLD:.1f})"
|
|
228
|
+
)
|
|
229
|
+
elif normalized_score >= self.ACCEPTABLE_THRESHOLD:
|
|
230
|
+
weaknesses.append(f"{category} is acceptable but could be improved ({score:.1f}/10)")
|
|
231
|
+
improvement_suggestions.extend(
|
|
232
|
+
self._generate_category_suggestions(category, normalized_score, language)
|
|
233
|
+
)
|
|
234
|
+
else:
|
|
235
|
+
weaknesses.append(f"{category} needs significant improvement ({score:.1f}/10)")
|
|
236
|
+
improvement_suggestions.extend(
|
|
237
|
+
self._generate_category_suggestions(category, normalized_score, language)
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
return ScoreExplanation(
|
|
241
|
+
score=score,
|
|
242
|
+
category=category,
|
|
243
|
+
breakdown=breakdown,
|
|
244
|
+
factors=factors,
|
|
245
|
+
strengths=strengths,
|
|
246
|
+
weaknesses=weaknesses,
|
|
247
|
+
improvement_suggestions=improvement_suggestions,
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
def _generate_category_suggestions(
|
|
251
|
+
self, category: str, score: float, language: Language | None = None
|
|
252
|
+
) -> list[str]:
|
|
253
|
+
"""Generate category-specific improvement suggestions."""
|
|
254
|
+
suggestions = []
|
|
255
|
+
|
|
256
|
+
if category == "complexity":
|
|
257
|
+
suggestions.extend(
|
|
258
|
+
[
|
|
259
|
+
"Break down complex functions into smaller, focused functions",
|
|
260
|
+
"Reduce nesting depth (aim for < 4 levels)",
|
|
261
|
+
"Extract complex logic into separate functions or modules",
|
|
262
|
+
"Use early returns to reduce nesting",
|
|
263
|
+
]
|
|
264
|
+
)
|
|
265
|
+
if language == Language.PYTHON:
|
|
266
|
+
suggestions.append("Consider using list comprehensions or generator expressions")
|
|
267
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
268
|
+
suggestions.append("Use array methods (map, filter, reduce) instead of loops")
|
|
269
|
+
elif category == "security":
|
|
270
|
+
suggestions.extend(
|
|
271
|
+
[
|
|
272
|
+
"Review and sanitize all user inputs",
|
|
273
|
+
"Use parameterized queries/prepared statements",
|
|
274
|
+
"Implement proper authentication and authorization",
|
|
275
|
+
"Keep dependencies updated and scan for vulnerabilities",
|
|
276
|
+
]
|
|
277
|
+
)
|
|
278
|
+
if language == Language.PYTHON:
|
|
279
|
+
suggestions.append("Use secrets module for sensitive operations")
|
|
280
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
281
|
+
suggestions.append("Avoid using eval() or innerHTML with user input")
|
|
282
|
+
elif category == "maintainability":
|
|
283
|
+
suggestions.extend(
|
|
284
|
+
[
|
|
285
|
+
"Add comprehensive docstrings/comments",
|
|
286
|
+
"Follow consistent naming conventions",
|
|
287
|
+
"Reduce code duplication (DRY principle)",
|
|
288
|
+
"Improve code organization and structure",
|
|
289
|
+
]
|
|
290
|
+
)
|
|
291
|
+
if language == Language.PYTHON:
|
|
292
|
+
suggestions.append("Use type hints for better code clarity")
|
|
293
|
+
elif language in [Language.TYPESCRIPT, Language.REACT]:
|
|
294
|
+
suggestions.append("Use TypeScript for better type safety")
|
|
295
|
+
elif category == "test_coverage":
|
|
296
|
+
suggestions.extend(
|
|
297
|
+
[
|
|
298
|
+
f"Increase test coverage to at least {self.GOOD_THRESHOLD*10:.0f}%",
|
|
299
|
+
"Add unit tests for critical functions",
|
|
300
|
+
"Include edge cases and error handling in tests",
|
|
301
|
+
"Add integration tests for important workflows",
|
|
302
|
+
]
|
|
303
|
+
)
|
|
304
|
+
elif category == "performance":
|
|
305
|
+
suggestions.extend(
|
|
306
|
+
[
|
|
307
|
+
"Profile code to identify bottlenecks",
|
|
308
|
+
"Optimize hot paths and frequently called functions",
|
|
309
|
+
"Consider caching results of expensive operations",
|
|
310
|
+
"Use appropriate data structures for the use case",
|
|
311
|
+
]
|
|
312
|
+
)
|
|
313
|
+
if language == Language.REACT:
|
|
314
|
+
suggestions.extend(
|
|
315
|
+
[
|
|
316
|
+
"Use React.memo, useMemo, or useCallback to prevent unnecessary re-renders",
|
|
317
|
+
"Implement code splitting for large components",
|
|
318
|
+
]
|
|
319
|
+
)
|
|
320
|
+
elif language == Language.PYTHON:
|
|
321
|
+
suggestions.extend(
|
|
322
|
+
[
|
|
323
|
+
"Use async/await for I/O-bound operations",
|
|
324
|
+
"Consider using functools.lru_cache for expensive computations",
|
|
325
|
+
]
|
|
326
|
+
)
|
|
327
|
+
elif category == "linting":
|
|
328
|
+
suggestions.extend(
|
|
329
|
+
[
|
|
330
|
+
"Run linting tool to identify specific code style issues",
|
|
331
|
+
"Fix code style violations (PEP 8 for Python, ESLint rules for JS/TS)",
|
|
332
|
+
"Address all errors (E) and fatal issues (F) first, then warnings (W)",
|
|
333
|
+
"Review and fix warnings for better code quality",
|
|
334
|
+
]
|
|
335
|
+
)
|
|
336
|
+
if language == Language.PYTHON:
|
|
337
|
+
suggestions.extend(
|
|
338
|
+
[
|
|
339
|
+
"Run 'ruff check' to identify specific linting issues",
|
|
340
|
+
"Run 'ruff check --fix' to auto-fix many issues automatically",
|
|
341
|
+
"Configure ruff in pyproject.toml for project-specific rules",
|
|
342
|
+
"Ensure consistent import ordering and formatting",
|
|
343
|
+
"Fix line length violations (aim for 88-100 characters per line)",
|
|
344
|
+
]
|
|
345
|
+
)
|
|
346
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
347
|
+
suggestions.extend(
|
|
348
|
+
[
|
|
349
|
+
"Run 'eslint' to identify specific linting issues",
|
|
350
|
+
"Run 'eslint --fix' to auto-fix many issues automatically",
|
|
351
|
+
"Configure ESLint rules in .eslintrc or package.json",
|
|
352
|
+
"Ensure consistent code formatting (integrate Prettier if needed)",
|
|
353
|
+
"Fix TypeScript-specific linting issues (strict mode violations)",
|
|
354
|
+
]
|
|
355
|
+
)
|
|
356
|
+
elif category == "type_checking":
|
|
357
|
+
suggestions.extend(
|
|
358
|
+
[
|
|
359
|
+
"Add type annotations to function parameters and return types",
|
|
360
|
+
"Fix type errors reported by type checker",
|
|
361
|
+
"Use type hints consistently throughout the codebase",
|
|
362
|
+
"Enable strict type checking mode for better type safety",
|
|
363
|
+
]
|
|
364
|
+
)
|
|
365
|
+
if language == Language.PYTHON:
|
|
366
|
+
suggestions.extend(
|
|
367
|
+
[
|
|
368
|
+
"Run 'mypy <file>' to see specific type errors",
|
|
369
|
+
"Add type hints using typing module or Python 3.9+ built-in types",
|
|
370
|
+
"Use Optional[T] for nullable types, Union[T, U] for multiple types",
|
|
371
|
+
"Consider using mypy --strict for maximum type safety",
|
|
372
|
+
"Add return type annotations: 'def func() -> int:'",
|
|
373
|
+
"Use TypeVar for generic types, Protocol for structural typing",
|
|
374
|
+
]
|
|
375
|
+
)
|
|
376
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
377
|
+
suggestions.extend(
|
|
378
|
+
[
|
|
379
|
+
"Enable strict mode in tsconfig.json (strict: true)",
|
|
380
|
+
"Add explicit return types to functions",
|
|
381
|
+
"Use proper interface/type definitions instead of 'any'",
|
|
382
|
+
"Fix TypeScript compiler errors systematically",
|
|
383
|
+
"Avoid using 'any' type - use 'unknown' or specific types",
|
|
384
|
+
"Use type guards for runtime type checking",
|
|
385
|
+
]
|
|
386
|
+
)
|
|
387
|
+
elif category == "duplication":
|
|
388
|
+
suggestions.extend(
|
|
389
|
+
[
|
|
390
|
+
"Identify and extract duplicate code into reusable functions",
|
|
391
|
+
"Use helper functions or utility modules for common patterns",
|
|
392
|
+
"Consider refactoring similar code blocks into shared components",
|
|
393
|
+
"Aim for < 3% code duplication across the project",
|
|
394
|
+
]
|
|
395
|
+
)
|
|
396
|
+
if language == Language.PYTHON:
|
|
397
|
+
suggestions.extend(
|
|
398
|
+
[
|
|
399
|
+
"Run 'jscpd' to identify specific duplicate code blocks",
|
|
400
|
+
"Extract common logic into utility functions or classes",
|
|
401
|
+
"Use decorators or context managers for repeated patterns",
|
|
402
|
+
"Create shared utility modules for common functionality",
|
|
403
|
+
"Consider using mixins for shared class behavior",
|
|
404
|
+
]
|
|
405
|
+
)
|
|
406
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT, Language.REACT]:
|
|
407
|
+
suggestions.extend(
|
|
408
|
+
[
|
|
409
|
+
"Extract duplicate code into shared utility functions",
|
|
410
|
+
"Create reusable React components for repeated UI patterns",
|
|
411
|
+
"Use higher-order components (HOCs) or custom hooks for common logic",
|
|
412
|
+
"Create shared utility modules or helper functions",
|
|
413
|
+
"Use composition over duplication for React components",
|
|
414
|
+
]
|
|
415
|
+
)
|
|
416
|
+
elif category == "overall":
|
|
417
|
+
# For overall score, provide general improvement suggestions
|
|
418
|
+
# Focus on the most impactful areas
|
|
419
|
+
suggestions.extend(
|
|
420
|
+
[
|
|
421
|
+
"Review individual quality metrics (complexity, security, maintainability, test coverage, performance)",
|
|
422
|
+
"Address the lowest-scoring areas first for maximum impact",
|
|
423
|
+
"Set specific improvement goals for each quality dimension",
|
|
424
|
+
"Run code quality tools regularly to track progress",
|
|
425
|
+
]
|
|
426
|
+
)
|
|
427
|
+
if language == Language.PYTHON:
|
|
428
|
+
suggestions.extend(
|
|
429
|
+
[
|
|
430
|
+
"Run ruff and mypy to identify code style and type issues",
|
|
431
|
+
"Use pytest with coverage to improve test coverage",
|
|
432
|
+
]
|
|
433
|
+
)
|
|
434
|
+
elif language in [Language.TYPESCRIPT, Language.JAVASCRIPT]:
|
|
435
|
+
suggestions.extend(
|
|
436
|
+
[
|
|
437
|
+
"Use ESLint and TypeScript compiler to identify issues",
|
|
438
|
+
"Run tests with coverage to improve test coverage",
|
|
439
|
+
]
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
return suggestions
|
|
443
|
+
|
|
444
|
+
def validate_all_scores(
|
|
445
|
+
self,
|
|
446
|
+
scores: dict[str, float],
|
|
447
|
+
language: Language | None = None,
|
|
448
|
+
context: dict[str, Any] | None = None,
|
|
449
|
+
) -> dict[str, ValidationResult]:
|
|
450
|
+
"""
|
|
451
|
+
Validate all scores in a score dictionary.
|
|
452
|
+
|
|
453
|
+
Args:
|
|
454
|
+
scores: Dictionary of category -> score (can have keys like "complexity_score" or "complexity")
|
|
455
|
+
language: Optional language for language-specific validation
|
|
456
|
+
context: Optional context for explanations
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
Dictionary of category -> ValidationResult
|
|
460
|
+
"""
|
|
461
|
+
results = {}
|
|
462
|
+
for category, score in scores.items():
|
|
463
|
+
# Skip non-numeric values (e.g., "metrics" dict, strings, lists)
|
|
464
|
+
# Only validate actual numeric scores
|
|
465
|
+
if not isinstance(score, (int, float)):
|
|
466
|
+
continue
|
|
467
|
+
|
|
468
|
+
# Normalize category name: remove "_score" suffix if present
|
|
469
|
+
# e.g., "complexity_score" -> "complexity", "overall_score" -> "overall"
|
|
470
|
+
normalized_category = category
|
|
471
|
+
if category.endswith("_score"):
|
|
472
|
+
normalized_category = category[:-6] # Remove "_score" suffix
|
|
473
|
+
|
|
474
|
+
category_context = (context or {}).get(category, {}) if context else None
|
|
475
|
+
results[category] = self.validate_score(
|
|
476
|
+
score, normalized_category, language=language, context=category_context
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
return results
|
|
480
|
+
|
|
481
|
+
def calibrate_score(
|
|
482
|
+
self, score: float, category: str, baseline: float | None = None
|
|
483
|
+
) -> float:
|
|
484
|
+
"""
|
|
485
|
+
Calibrate a score against a baseline.
|
|
486
|
+
|
|
487
|
+
Args:
|
|
488
|
+
score: The score to calibrate
|
|
489
|
+
category: Score category
|
|
490
|
+
baseline: Optional baseline score for calibration
|
|
491
|
+
|
|
492
|
+
Returns:
|
|
493
|
+
Calibrated score
|
|
494
|
+
"""
|
|
495
|
+
if baseline is None:
|
|
496
|
+
return score
|
|
497
|
+
|
|
498
|
+
# Simple calibration: adjust score based on baseline
|
|
499
|
+
# If baseline is high, scores should be stricter
|
|
500
|
+
# If baseline is low, scores can be more lenient
|
|
501
|
+
calibration_factor = baseline / 7.0 # Use 7.0 as neutral baseline
|
|
502
|
+
calibrated = score * calibration_factor
|
|
503
|
+
|
|
504
|
+
# Clamp to valid range
|
|
505
|
+
min_score, max_score = self.SCORE_RANGES.get(category, (0.0, 10.0))
|
|
506
|
+
return max(min_score, min(max_score, calibrated))
|
|
507
|
+
|