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,369 +1,369 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Quality Gates Module.
|
|
3
|
-
|
|
4
|
-
Story 6.4: Quality Gates & Review Integration
|
|
5
|
-
Phase 2.2: Enhanced with coverage analysis integration
|
|
6
|
-
|
|
7
|
-
- Implement quality thresholds (8.0+ overall, 8.5+ security)
|
|
8
|
-
- Add quality gates to workflows
|
|
9
|
-
- Integrate scores into Review Agent decisions
|
|
10
|
-
- Create quality reports
|
|
11
|
-
- Async coverage measurement using CoverageAnalyzer
|
|
12
|
-
- Pluggable gate system integration
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
from __future__ import annotations
|
|
16
|
-
|
|
17
|
-
from dataclasses import dataclass
|
|
18
|
-
from pathlib import Path
|
|
19
|
-
from typing import Any
|
|
20
|
-
|
|
21
|
-
from .gates.registry import GateRegistry, get_gate_registry
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@dataclass
|
|
25
|
-
class QualityThresholds:
|
|
26
|
-
"""Quality score thresholds for gates."""
|
|
27
|
-
|
|
28
|
-
overall_min: float = 8.0
|
|
29
|
-
security_min: float = 8.5
|
|
30
|
-
maintainability_min: float = 7.0
|
|
31
|
-
complexity_max: float = 5.0 # Lower is better, so this is a max
|
|
32
|
-
test_coverage_min: float = 80.0
|
|
33
|
-
performance_min: float = 7.0
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def from_dict(cls, data: dict[str, Any]) -> "QualityThresholds":
|
|
37
|
-
"""Create from dictionary."""
|
|
38
|
-
return cls(
|
|
39
|
-
overall_min=data.get("overall_min", 8.0),
|
|
40
|
-
security_min=data.get("security_min", 8.5),
|
|
41
|
-
maintainability_min=data.get("maintainability_min", 7.0),
|
|
42
|
-
complexity_max=data.get("complexity_max", 5.0),
|
|
43
|
-
test_coverage_min=data.get("test_coverage_min", 80.0),
|
|
44
|
-
performance_min=data.get("performance_min", 7.0),
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@dataclass
|
|
49
|
-
class QualityGateResult:
|
|
50
|
-
"""Result of quality gate evaluation."""
|
|
51
|
-
|
|
52
|
-
passed: bool
|
|
53
|
-
overall_passed: bool
|
|
54
|
-
security_passed: bool
|
|
55
|
-
maintainability_passed: bool
|
|
56
|
-
complexity_passed: bool
|
|
57
|
-
test_coverage_passed: bool
|
|
58
|
-
performance_passed: bool
|
|
59
|
-
failures: list[str]
|
|
60
|
-
warnings: list[str]
|
|
61
|
-
scores: dict[str, float]
|
|
62
|
-
thresholds: QualityThresholds
|
|
63
|
-
|
|
64
|
-
def to_dict(self) -> dict[str, Any]:
|
|
65
|
-
"""Convert to dictionary."""
|
|
66
|
-
return {
|
|
67
|
-
"passed": self.passed,
|
|
68
|
-
"overall_passed": self.overall_passed,
|
|
69
|
-
"security_passed": self.security_passed,
|
|
70
|
-
"maintainability_passed": self.maintainability_passed,
|
|
71
|
-
"complexity_passed": self.complexity_passed,
|
|
72
|
-
"test_coverage_passed": self.test_coverage_passed,
|
|
73
|
-
"performance_passed": self.performance_passed,
|
|
74
|
-
"failures": self.failures,
|
|
75
|
-
"warnings": self.warnings,
|
|
76
|
-
"scores": self.scores,
|
|
77
|
-
"thresholds": {
|
|
78
|
-
"overall_min": self.thresholds.overall_min,
|
|
79
|
-
"security_min": self.thresholds.security_min,
|
|
80
|
-
"maintainability_min": self.thresholds.maintainability_min,
|
|
81
|
-
"complexity_max": self.thresholds.complexity_max,
|
|
82
|
-
"test_coverage_min": self.thresholds.test_coverage_min,
|
|
83
|
-
"performance_min": self.thresholds.performance_min,
|
|
84
|
-
},
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class QualityGate:
|
|
89
|
-
"""
|
|
90
|
-
Evaluate quality gates against scoring thresholds.
|
|
91
|
-
|
|
92
|
-
Story 6.4: Quality Gates & Review Integration
|
|
93
|
-
|
|
94
|
-
Now supports pluggable gates integration for composite gate evaluation.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
def __init__(
|
|
98
|
-
self,
|
|
99
|
-
thresholds: QualityThresholds | None = None,
|
|
100
|
-
gate_registry: GateRegistry | None = None,
|
|
101
|
-
):
|
|
102
|
-
"""
|
|
103
|
-
Initialize quality gate.
|
|
104
|
-
|
|
105
|
-
Args:
|
|
106
|
-
thresholds: Quality thresholds (default: standard thresholds)
|
|
107
|
-
gate_registry: Optional gate registry for pluggable gates
|
|
108
|
-
"""
|
|
109
|
-
self.thresholds = thresholds or QualityThresholds()
|
|
110
|
-
self.gate_registry = gate_registry or get_gate_registry()
|
|
111
|
-
|
|
112
|
-
def evaluate(
|
|
113
|
-
self,
|
|
114
|
-
scores: dict[str, float],
|
|
115
|
-
thresholds: QualityThresholds | None = None,
|
|
116
|
-
) -> QualityGateResult:
|
|
117
|
-
"""
|
|
118
|
-
Evaluate quality scores against thresholds.
|
|
119
|
-
|
|
120
|
-
Args:
|
|
121
|
-
scores: Dictionary with quality scores
|
|
122
|
-
thresholds: Optional thresholds to use (overrides instance thresholds)
|
|
123
|
-
|
|
124
|
-
Returns:
|
|
125
|
-
QualityGateResult with evaluation results
|
|
126
|
-
"""
|
|
127
|
-
if thresholds is None:
|
|
128
|
-
thresholds = self.thresholds
|
|
129
|
-
|
|
130
|
-
# Lazy import to avoid circular dependency
|
|
131
|
-
from ..agents.reviewer.score_constants import ScoreNormalizer, extract_scores_normalized
|
|
132
|
-
|
|
133
|
-
# Normalize all scores to consistent scales using score constants
|
|
134
|
-
normalized_scores = extract_scores_normalized(scores)
|
|
135
|
-
|
|
136
|
-
normalizer = ScoreNormalizer()
|
|
137
|
-
|
|
138
|
-
# Extract normalized scores (individual metrics are 0-10, overall is 0-100)
|
|
139
|
-
# Convert overall score to 0-10 scale for threshold comparison (thresholds are 0-10)
|
|
140
|
-
overall_score = normalizer.normalize_overall_score(
|
|
141
|
-
normalized_scores["overall_score"], from_scale_100=True
|
|
142
|
-
)
|
|
143
|
-
security_score = normalized_scores["security_score"]
|
|
144
|
-
maintainability_score = normalized_scores["maintainability_score"]
|
|
145
|
-
complexity_score = normalized_scores["complexity_score"] # Lower is better
|
|
146
|
-
test_coverage_score = normalized_scores["test_coverage_score"]
|
|
147
|
-
performance_score = normalized_scores["performance_score"]
|
|
148
|
-
|
|
149
|
-
# Evaluate each threshold
|
|
150
|
-
overall_passed = overall_score >= thresholds.overall_min
|
|
151
|
-
security_passed = security_score >= thresholds.security_min
|
|
152
|
-
maintainability_passed = maintainability_score >= thresholds.maintainability_min
|
|
153
|
-
complexity_passed = complexity_score <= thresholds.complexity_max
|
|
154
|
-
# Test coverage: convert from 0-10 scale to percentage (0-100) for threshold comparison
|
|
155
|
-
test_coverage_pct = normalizer.test_coverage_to_percentage(test_coverage_score)
|
|
156
|
-
test_coverage_passed = test_coverage_pct >= thresholds.test_coverage_min
|
|
157
|
-
performance_passed = performance_score >= thresholds.performance_min
|
|
158
|
-
|
|
159
|
-
# Collect failures and warnings
|
|
160
|
-
failures: list[str] = []
|
|
161
|
-
warnings: list[str] = []
|
|
162
|
-
|
|
163
|
-
if not overall_passed:
|
|
164
|
-
failures.append(
|
|
165
|
-
f"Overall score {overall_score:.2f} below threshold {thresholds.overall_min}"
|
|
166
|
-
)
|
|
167
|
-
if not security_passed:
|
|
168
|
-
failures.append(
|
|
169
|
-
f"Security score {security_score:.2f} below threshold {thresholds.security_min}"
|
|
170
|
-
)
|
|
171
|
-
if not maintainability_passed:
|
|
172
|
-
warnings.append(
|
|
173
|
-
f"Maintainability score {maintainability_score:.2f} below threshold {thresholds.maintainability_min}"
|
|
174
|
-
)
|
|
175
|
-
if not complexity_passed:
|
|
176
|
-
warnings.append(
|
|
177
|
-
f"Complexity score {complexity_score:.2f} above threshold {thresholds.complexity_max}"
|
|
178
|
-
)
|
|
179
|
-
if not test_coverage_passed:
|
|
180
|
-
warnings.append(
|
|
181
|
-
f"Test coverage {test_coverage_pct:.2f}% below threshold {thresholds.test_coverage_min}%"
|
|
182
|
-
)
|
|
183
|
-
if not performance_passed:
|
|
184
|
-
warnings.append(
|
|
185
|
-
f"Performance score {performance_score:.2f} below threshold {thresholds.performance_min}"
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
# Gate passes if all critical metrics pass (overall and security)
|
|
189
|
-
passed = overall_passed and security_passed
|
|
190
|
-
|
|
191
|
-
return QualityGateResult(
|
|
192
|
-
passed=passed,
|
|
193
|
-
overall_passed=overall_passed,
|
|
194
|
-
security_passed=security_passed,
|
|
195
|
-
maintainability_passed=maintainability_passed,
|
|
196
|
-
complexity_passed=complexity_passed,
|
|
197
|
-
test_coverage_passed=test_coverage_passed,
|
|
198
|
-
performance_passed=performance_passed,
|
|
199
|
-
failures=failures,
|
|
200
|
-
warnings=warnings,
|
|
201
|
-
scores={
|
|
202
|
-
"overall_score": overall_score,
|
|
203
|
-
"security_score": security_score,
|
|
204
|
-
"maintainability_score": maintainability_score,
|
|
205
|
-
"complexity_score": complexity_score,
|
|
206
|
-
"test_coverage_score": test_coverage_score,
|
|
207
|
-
"performance_score": performance_score,
|
|
208
|
-
},
|
|
209
|
-
thresholds=thresholds,
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
def evaluate_from_review_result(
|
|
213
|
-
self, review_result: dict[str, Any], thresholds: QualityThresholds | None = None
|
|
214
|
-
) -> QualityGateResult:
|
|
215
|
-
"""
|
|
216
|
-
Evaluate quality gate from Reviewer Agent result.
|
|
217
|
-
|
|
218
|
-
Args:
|
|
219
|
-
review_result: Result dictionary from Reviewer Agent
|
|
220
|
-
thresholds: Optional thresholds to use
|
|
221
|
-
|
|
222
|
-
Returns:
|
|
223
|
-
QualityGateResult with evaluation results
|
|
224
|
-
"""
|
|
225
|
-
# Extract scores from review result
|
|
226
|
-
scores = review_result.get("scores", {})
|
|
227
|
-
if not scores:
|
|
228
|
-
# Try to extract from nested structure
|
|
229
|
-
scoring = review_result.get("scoring", {})
|
|
230
|
-
if scoring:
|
|
231
|
-
scores = scoring.get("scores", {})
|
|
232
|
-
|
|
233
|
-
return self.evaluate(scores, thresholds)
|
|
234
|
-
|
|
235
|
-
async def check_coverage(
|
|
236
|
-
self,
|
|
237
|
-
file_path: Path,
|
|
238
|
-
language: Any,
|
|
239
|
-
threshold: float = 0.8,
|
|
240
|
-
test_file_path: Path | None = None,
|
|
241
|
-
project_root: Path | None = None,
|
|
242
|
-
) -> QualityGateResult:
|
|
243
|
-
"""
|
|
244
|
-
Check test coverage for a file and evaluate against threshold.
|
|
245
|
-
|
|
246
|
-
Phase 2.2: Coverage Analysis Integration
|
|
247
|
-
|
|
248
|
-
Note: This method uses CoverageAnalyzer which runs tool operations (subprocess commands).
|
|
249
|
-
Tool operations work in both Cursor and headless modes. This is Cursor-first compatible.
|
|
250
|
-
|
|
251
|
-
Args:
|
|
252
|
-
file_path: Path to the source file
|
|
253
|
-
language: Detected language (from LanguageDetector)
|
|
254
|
-
threshold: Minimum coverage threshold (0.0-1.0)
|
|
255
|
-
test_file_path: Optional path to test file
|
|
256
|
-
project_root: Optional project root directory
|
|
257
|
-
|
|
258
|
-
Returns:
|
|
259
|
-
QualityGateResult with coverage evaluation results
|
|
260
|
-
"""
|
|
261
|
-
from ...agents.tester.coverage_analyzer import CoverageAnalyzer
|
|
262
|
-
from ...core.language_detector import Language
|
|
263
|
-
|
|
264
|
-
# Ensure language is Language enum
|
|
265
|
-
if not isinstance(language, Language):
|
|
266
|
-
# Try to convert if it's a string
|
|
267
|
-
try:
|
|
268
|
-
language = Language(language)
|
|
269
|
-
except (ValueError, TypeError):
|
|
270
|
-
language = Language.UNKNOWN
|
|
271
|
-
|
|
272
|
-
# Measure coverage using CoverageAnalyzer
|
|
273
|
-
# CoverageAnalyzer runs tool operations (pytest, jest, etc.) which work in both modes
|
|
274
|
-
# This is Cursor-first compatible as it doesn't require LLM operations
|
|
275
|
-
analyzer = CoverageAnalyzer()
|
|
276
|
-
coverage_result = await analyzer.measure_coverage(
|
|
277
|
-
file_path=file_path,
|
|
278
|
-
language=language,
|
|
279
|
-
test_file_path=test_file_path,
|
|
280
|
-
project_root=project_root,
|
|
281
|
-
)
|
|
282
|
-
|
|
283
|
-
# Convert coverage percentage (0-100) to 0-1 scale
|
|
284
|
-
coverage_pct = coverage_result.coverage_percentage / 100.0
|
|
285
|
-
coverage_passed = coverage_pct >= threshold
|
|
286
|
-
|
|
287
|
-
# Lazy import to avoid circular dependency
|
|
288
|
-
from ..agents.reviewer.score_constants import ScoreNormalizer
|
|
289
|
-
|
|
290
|
-
# Create scores dict for evaluation using normalized scales
|
|
291
|
-
# Test coverage: percentage (0-100) to 0-10 scale
|
|
292
|
-
normalizer = ScoreNormalizer()
|
|
293
|
-
test_coverage_0_10 = normalizer.normalize_test_coverage(
|
|
294
|
-
coverage_result.coverage_percentage, from_percentage=True
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
scores: dict[str, float] = {
|
|
298
|
-
"test_coverage_score": test_coverage_0_10, # 0-10 scale
|
|
299
|
-
"overall_score": 100.0 if coverage_passed else 50.0, # 0-100 scale
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
# Evaluate using existing evaluate method
|
|
303
|
-
thresholds = QualityThresholds(test_coverage_min=threshold * 100.0)
|
|
304
|
-
result = self.evaluate(scores, thresholds)
|
|
305
|
-
|
|
306
|
-
# Enhance result with coverage-specific information
|
|
307
|
-
if coverage_result.error:
|
|
308
|
-
result.failures.append(f"Coverage measurement error: {coverage_result.error}")
|
|
309
|
-
result.passed = False
|
|
310
|
-
|
|
311
|
-
# Add coverage details to scores
|
|
312
|
-
result.scores.update(
|
|
313
|
-
{
|
|
314
|
-
"coverage_percentage": coverage_result.coverage_percentage,
|
|
315
|
-
"coverage_lines_covered": coverage_result.lines_covered,
|
|
316
|
-
"coverage_lines_total": coverage_result.lines_total,
|
|
317
|
-
"coverage_framework": coverage_result.framework,
|
|
318
|
-
}
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
return result
|
|
322
|
-
|
|
323
|
-
def evaluate_composite(
|
|
324
|
-
self,
|
|
325
|
-
scores: dict[str, float] | None = None,
|
|
326
|
-
context: dict[str, Any] | None = None,
|
|
327
|
-
pluggable_gates: list[str] | None = None,
|
|
328
|
-
) -> dict[str, Any]:
|
|
329
|
-
"""
|
|
330
|
-
Evaluate composite gates (quality + pluggable gates).
|
|
331
|
-
|
|
332
|
-
Args:
|
|
333
|
-
scores: Quality scores dictionary
|
|
334
|
-
context: Additional context for pluggable gates
|
|
335
|
-
pluggable_gates: List of pluggable gate names to evaluate
|
|
336
|
-
|
|
337
|
-
Returns:
|
|
338
|
-
Composite gate evaluation result
|
|
339
|
-
"""
|
|
340
|
-
results: dict[str, Any] = {
|
|
341
|
-
"quality_gate": None,
|
|
342
|
-
"pluggable_gates": {},
|
|
343
|
-
"all_passed": True,
|
|
344
|
-
"failures": [],
|
|
345
|
-
"warnings": [],
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
# Evaluate quality gate if scores provided
|
|
349
|
-
if scores:
|
|
350
|
-
quality_result = self.evaluate(scores)
|
|
351
|
-
results["quality_gate"] = quality_result.to_dict()
|
|
352
|
-
if not quality_result.passed:
|
|
353
|
-
results["all_passed"] = False
|
|
354
|
-
results["failures"].append({
|
|
355
|
-
"gate": "quality",
|
|
356
|
-
"message": quality_result.failures[0] if quality_result.failures else "Quality gate failed",
|
|
357
|
-
})
|
|
358
|
-
|
|
359
|
-
# Evaluate pluggable gates if specified
|
|
360
|
-
if pluggable_gates and context:
|
|
361
|
-
pluggable_results = self.gate_registry.evaluate_gates(pluggable_gates, context)
|
|
362
|
-
results["pluggable_gates"] = pluggable_results
|
|
363
|
-
|
|
364
|
-
if not pluggable_results.get("all_passed", True):
|
|
365
|
-
results["all_passed"] = False
|
|
366
|
-
results["failures"].extend(pluggable_results.get("failures", []))
|
|
367
|
-
results["warnings"].extend(pluggable_results.get("warnings", []))
|
|
368
|
-
|
|
369
|
-
return results
|
|
1
|
+
"""
|
|
2
|
+
Quality Gates Module.
|
|
3
|
+
|
|
4
|
+
Story 6.4: Quality Gates & Review Integration
|
|
5
|
+
Phase 2.2: Enhanced with coverage analysis integration
|
|
6
|
+
|
|
7
|
+
- Implement quality thresholds (8.0+ overall, 8.5+ security)
|
|
8
|
+
- Add quality gates to workflows
|
|
9
|
+
- Integrate scores into Review Agent decisions
|
|
10
|
+
- Create quality reports
|
|
11
|
+
- Async coverage measurement using CoverageAnalyzer
|
|
12
|
+
- Pluggable gate system integration
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
21
|
+
from .gates.registry import GateRegistry, get_gate_registry
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class QualityThresholds:
|
|
26
|
+
"""Quality score thresholds for gates."""
|
|
27
|
+
|
|
28
|
+
overall_min: float = 8.0
|
|
29
|
+
security_min: float = 8.5
|
|
30
|
+
maintainability_min: float = 7.0
|
|
31
|
+
complexity_max: float = 5.0 # Lower is better, so this is a max
|
|
32
|
+
test_coverage_min: float = 80.0
|
|
33
|
+
performance_min: float = 7.0
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def from_dict(cls, data: dict[str, Any]) -> "QualityThresholds":
|
|
37
|
+
"""Create from dictionary."""
|
|
38
|
+
return cls(
|
|
39
|
+
overall_min=data.get("overall_min", 8.0),
|
|
40
|
+
security_min=data.get("security_min", 8.5),
|
|
41
|
+
maintainability_min=data.get("maintainability_min", 7.0),
|
|
42
|
+
complexity_max=data.get("complexity_max", 5.0),
|
|
43
|
+
test_coverage_min=data.get("test_coverage_min", 80.0),
|
|
44
|
+
performance_min=data.get("performance_min", 7.0),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class QualityGateResult:
|
|
50
|
+
"""Result of quality gate evaluation."""
|
|
51
|
+
|
|
52
|
+
passed: bool
|
|
53
|
+
overall_passed: bool
|
|
54
|
+
security_passed: bool
|
|
55
|
+
maintainability_passed: bool
|
|
56
|
+
complexity_passed: bool
|
|
57
|
+
test_coverage_passed: bool
|
|
58
|
+
performance_passed: bool
|
|
59
|
+
failures: list[str]
|
|
60
|
+
warnings: list[str]
|
|
61
|
+
scores: dict[str, float]
|
|
62
|
+
thresholds: QualityThresholds
|
|
63
|
+
|
|
64
|
+
def to_dict(self) -> dict[str, Any]:
|
|
65
|
+
"""Convert to dictionary."""
|
|
66
|
+
return {
|
|
67
|
+
"passed": self.passed,
|
|
68
|
+
"overall_passed": self.overall_passed,
|
|
69
|
+
"security_passed": self.security_passed,
|
|
70
|
+
"maintainability_passed": self.maintainability_passed,
|
|
71
|
+
"complexity_passed": self.complexity_passed,
|
|
72
|
+
"test_coverage_passed": self.test_coverage_passed,
|
|
73
|
+
"performance_passed": self.performance_passed,
|
|
74
|
+
"failures": self.failures,
|
|
75
|
+
"warnings": self.warnings,
|
|
76
|
+
"scores": self.scores,
|
|
77
|
+
"thresholds": {
|
|
78
|
+
"overall_min": self.thresholds.overall_min,
|
|
79
|
+
"security_min": self.thresholds.security_min,
|
|
80
|
+
"maintainability_min": self.thresholds.maintainability_min,
|
|
81
|
+
"complexity_max": self.thresholds.complexity_max,
|
|
82
|
+
"test_coverage_min": self.thresholds.test_coverage_min,
|
|
83
|
+
"performance_min": self.thresholds.performance_min,
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class QualityGate:
|
|
89
|
+
"""
|
|
90
|
+
Evaluate quality gates against scoring thresholds.
|
|
91
|
+
|
|
92
|
+
Story 6.4: Quality Gates & Review Integration
|
|
93
|
+
|
|
94
|
+
Now supports pluggable gates integration for composite gate evaluation.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(
|
|
98
|
+
self,
|
|
99
|
+
thresholds: QualityThresholds | None = None,
|
|
100
|
+
gate_registry: GateRegistry | None = None,
|
|
101
|
+
):
|
|
102
|
+
"""
|
|
103
|
+
Initialize quality gate.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
thresholds: Quality thresholds (default: standard thresholds)
|
|
107
|
+
gate_registry: Optional gate registry for pluggable gates
|
|
108
|
+
"""
|
|
109
|
+
self.thresholds = thresholds or QualityThresholds()
|
|
110
|
+
self.gate_registry = gate_registry or get_gate_registry()
|
|
111
|
+
|
|
112
|
+
def evaluate(
|
|
113
|
+
self,
|
|
114
|
+
scores: dict[str, float],
|
|
115
|
+
thresholds: QualityThresholds | None = None,
|
|
116
|
+
) -> QualityGateResult:
|
|
117
|
+
"""
|
|
118
|
+
Evaluate quality scores against thresholds.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
scores: Dictionary with quality scores
|
|
122
|
+
thresholds: Optional thresholds to use (overrides instance thresholds)
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
QualityGateResult with evaluation results
|
|
126
|
+
"""
|
|
127
|
+
if thresholds is None:
|
|
128
|
+
thresholds = self.thresholds
|
|
129
|
+
|
|
130
|
+
# Lazy import to avoid circular dependency
|
|
131
|
+
from ..agents.reviewer.score_constants import ScoreNormalizer, extract_scores_normalized
|
|
132
|
+
|
|
133
|
+
# Normalize all scores to consistent scales using score constants
|
|
134
|
+
normalized_scores = extract_scores_normalized(scores)
|
|
135
|
+
|
|
136
|
+
normalizer = ScoreNormalizer()
|
|
137
|
+
|
|
138
|
+
# Extract normalized scores (individual metrics are 0-10, overall is 0-100)
|
|
139
|
+
# Convert overall score to 0-10 scale for threshold comparison (thresholds are 0-10)
|
|
140
|
+
overall_score = normalizer.normalize_overall_score(
|
|
141
|
+
normalized_scores["overall_score"], from_scale_100=True
|
|
142
|
+
)
|
|
143
|
+
security_score = normalized_scores["security_score"]
|
|
144
|
+
maintainability_score = normalized_scores["maintainability_score"]
|
|
145
|
+
complexity_score = normalized_scores["complexity_score"] # Lower is better
|
|
146
|
+
test_coverage_score = normalized_scores["test_coverage_score"]
|
|
147
|
+
performance_score = normalized_scores["performance_score"]
|
|
148
|
+
|
|
149
|
+
# Evaluate each threshold
|
|
150
|
+
overall_passed = overall_score >= thresholds.overall_min
|
|
151
|
+
security_passed = security_score >= thresholds.security_min
|
|
152
|
+
maintainability_passed = maintainability_score >= thresholds.maintainability_min
|
|
153
|
+
complexity_passed = complexity_score <= thresholds.complexity_max
|
|
154
|
+
# Test coverage: convert from 0-10 scale to percentage (0-100) for threshold comparison
|
|
155
|
+
test_coverage_pct = normalizer.test_coverage_to_percentage(test_coverage_score)
|
|
156
|
+
test_coverage_passed = test_coverage_pct >= thresholds.test_coverage_min
|
|
157
|
+
performance_passed = performance_score >= thresholds.performance_min
|
|
158
|
+
|
|
159
|
+
# Collect failures and warnings
|
|
160
|
+
failures: list[str] = []
|
|
161
|
+
warnings: list[str] = []
|
|
162
|
+
|
|
163
|
+
if not overall_passed:
|
|
164
|
+
failures.append(
|
|
165
|
+
f"Overall score {overall_score:.2f} below threshold {thresholds.overall_min}"
|
|
166
|
+
)
|
|
167
|
+
if not security_passed:
|
|
168
|
+
failures.append(
|
|
169
|
+
f"Security score {security_score:.2f} below threshold {thresholds.security_min}"
|
|
170
|
+
)
|
|
171
|
+
if not maintainability_passed:
|
|
172
|
+
warnings.append(
|
|
173
|
+
f"Maintainability score {maintainability_score:.2f} below threshold {thresholds.maintainability_min}"
|
|
174
|
+
)
|
|
175
|
+
if not complexity_passed:
|
|
176
|
+
warnings.append(
|
|
177
|
+
f"Complexity score {complexity_score:.2f} above threshold {thresholds.complexity_max}"
|
|
178
|
+
)
|
|
179
|
+
if not test_coverage_passed:
|
|
180
|
+
warnings.append(
|
|
181
|
+
f"Test coverage {test_coverage_pct:.2f}% below threshold {thresholds.test_coverage_min}%"
|
|
182
|
+
)
|
|
183
|
+
if not performance_passed:
|
|
184
|
+
warnings.append(
|
|
185
|
+
f"Performance score {performance_score:.2f} below threshold {thresholds.performance_min}"
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Gate passes if all critical metrics pass (overall and security)
|
|
189
|
+
passed = overall_passed and security_passed
|
|
190
|
+
|
|
191
|
+
return QualityGateResult(
|
|
192
|
+
passed=passed,
|
|
193
|
+
overall_passed=overall_passed,
|
|
194
|
+
security_passed=security_passed,
|
|
195
|
+
maintainability_passed=maintainability_passed,
|
|
196
|
+
complexity_passed=complexity_passed,
|
|
197
|
+
test_coverage_passed=test_coverage_passed,
|
|
198
|
+
performance_passed=performance_passed,
|
|
199
|
+
failures=failures,
|
|
200
|
+
warnings=warnings,
|
|
201
|
+
scores={
|
|
202
|
+
"overall_score": overall_score,
|
|
203
|
+
"security_score": security_score,
|
|
204
|
+
"maintainability_score": maintainability_score,
|
|
205
|
+
"complexity_score": complexity_score,
|
|
206
|
+
"test_coverage_score": test_coverage_score,
|
|
207
|
+
"performance_score": performance_score,
|
|
208
|
+
},
|
|
209
|
+
thresholds=thresholds,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
def evaluate_from_review_result(
|
|
213
|
+
self, review_result: dict[str, Any], thresholds: QualityThresholds | None = None
|
|
214
|
+
) -> QualityGateResult:
|
|
215
|
+
"""
|
|
216
|
+
Evaluate quality gate from Reviewer Agent result.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
review_result: Result dictionary from Reviewer Agent
|
|
220
|
+
thresholds: Optional thresholds to use
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
QualityGateResult with evaluation results
|
|
224
|
+
"""
|
|
225
|
+
# Extract scores from review result
|
|
226
|
+
scores = review_result.get("scores", {})
|
|
227
|
+
if not scores:
|
|
228
|
+
# Try to extract from nested structure
|
|
229
|
+
scoring = review_result.get("scoring", {})
|
|
230
|
+
if scoring:
|
|
231
|
+
scores = scoring.get("scores", {})
|
|
232
|
+
|
|
233
|
+
return self.evaluate(scores, thresholds)
|
|
234
|
+
|
|
235
|
+
async def check_coverage(
|
|
236
|
+
self,
|
|
237
|
+
file_path: Path,
|
|
238
|
+
language: Any,
|
|
239
|
+
threshold: float = 0.8,
|
|
240
|
+
test_file_path: Path | None = None,
|
|
241
|
+
project_root: Path | None = None,
|
|
242
|
+
) -> QualityGateResult:
|
|
243
|
+
"""
|
|
244
|
+
Check test coverage for a file and evaluate against threshold.
|
|
245
|
+
|
|
246
|
+
Phase 2.2: Coverage Analysis Integration
|
|
247
|
+
|
|
248
|
+
Note: This method uses CoverageAnalyzer which runs tool operations (subprocess commands).
|
|
249
|
+
Tool operations work in both Cursor and headless modes. This is Cursor-first compatible.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
file_path: Path to the source file
|
|
253
|
+
language: Detected language (from LanguageDetector)
|
|
254
|
+
threshold: Minimum coverage threshold (0.0-1.0)
|
|
255
|
+
test_file_path: Optional path to test file
|
|
256
|
+
project_root: Optional project root directory
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
QualityGateResult with coverage evaluation results
|
|
260
|
+
"""
|
|
261
|
+
from ...agents.tester.coverage_analyzer import CoverageAnalyzer
|
|
262
|
+
from ...core.language_detector import Language
|
|
263
|
+
|
|
264
|
+
# Ensure language is Language enum
|
|
265
|
+
if not isinstance(language, Language):
|
|
266
|
+
# Try to convert if it's a string
|
|
267
|
+
try:
|
|
268
|
+
language = Language(language)
|
|
269
|
+
except (ValueError, TypeError):
|
|
270
|
+
language = Language.UNKNOWN
|
|
271
|
+
|
|
272
|
+
# Measure coverage using CoverageAnalyzer
|
|
273
|
+
# CoverageAnalyzer runs tool operations (pytest, jest, etc.) which work in both modes
|
|
274
|
+
# This is Cursor-first compatible as it doesn't require LLM operations
|
|
275
|
+
analyzer = CoverageAnalyzer()
|
|
276
|
+
coverage_result = await analyzer.measure_coverage(
|
|
277
|
+
file_path=file_path,
|
|
278
|
+
language=language,
|
|
279
|
+
test_file_path=test_file_path,
|
|
280
|
+
project_root=project_root,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Convert coverage percentage (0-100) to 0-1 scale
|
|
284
|
+
coverage_pct = coverage_result.coverage_percentage / 100.0
|
|
285
|
+
coverage_passed = coverage_pct >= threshold
|
|
286
|
+
|
|
287
|
+
# Lazy import to avoid circular dependency
|
|
288
|
+
from ..agents.reviewer.score_constants import ScoreNormalizer
|
|
289
|
+
|
|
290
|
+
# Create scores dict for evaluation using normalized scales
|
|
291
|
+
# Test coverage: percentage (0-100) to 0-10 scale
|
|
292
|
+
normalizer = ScoreNormalizer()
|
|
293
|
+
test_coverage_0_10 = normalizer.normalize_test_coverage(
|
|
294
|
+
coverage_result.coverage_percentage, from_percentage=True
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
scores: dict[str, float] = {
|
|
298
|
+
"test_coverage_score": test_coverage_0_10, # 0-10 scale
|
|
299
|
+
"overall_score": 100.0 if coverage_passed else 50.0, # 0-100 scale
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
# Evaluate using existing evaluate method
|
|
303
|
+
thresholds = QualityThresholds(test_coverage_min=threshold * 100.0)
|
|
304
|
+
result = self.evaluate(scores, thresholds)
|
|
305
|
+
|
|
306
|
+
# Enhance result with coverage-specific information
|
|
307
|
+
if coverage_result.error:
|
|
308
|
+
result.failures.append(f"Coverage measurement error: {coverage_result.error}")
|
|
309
|
+
result.passed = False
|
|
310
|
+
|
|
311
|
+
# Add coverage details to scores
|
|
312
|
+
result.scores.update(
|
|
313
|
+
{
|
|
314
|
+
"coverage_percentage": coverage_result.coverage_percentage,
|
|
315
|
+
"coverage_lines_covered": coverage_result.lines_covered,
|
|
316
|
+
"coverage_lines_total": coverage_result.lines_total,
|
|
317
|
+
"coverage_framework": coverage_result.framework,
|
|
318
|
+
}
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
return result
|
|
322
|
+
|
|
323
|
+
def evaluate_composite(
|
|
324
|
+
self,
|
|
325
|
+
scores: dict[str, float] | None = None,
|
|
326
|
+
context: dict[str, Any] | None = None,
|
|
327
|
+
pluggable_gates: list[str] | None = None,
|
|
328
|
+
) -> dict[str, Any]:
|
|
329
|
+
"""
|
|
330
|
+
Evaluate composite gates (quality + pluggable gates).
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
scores: Quality scores dictionary
|
|
334
|
+
context: Additional context for pluggable gates
|
|
335
|
+
pluggable_gates: List of pluggable gate names to evaluate
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
Composite gate evaluation result
|
|
339
|
+
"""
|
|
340
|
+
results: dict[str, Any] = {
|
|
341
|
+
"quality_gate": None,
|
|
342
|
+
"pluggable_gates": {},
|
|
343
|
+
"all_passed": True,
|
|
344
|
+
"failures": [],
|
|
345
|
+
"warnings": [],
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
# Evaluate quality gate if scores provided
|
|
349
|
+
if scores:
|
|
350
|
+
quality_result = self.evaluate(scores)
|
|
351
|
+
results["quality_gate"] = quality_result.to_dict()
|
|
352
|
+
if not quality_result.passed:
|
|
353
|
+
results["all_passed"] = False
|
|
354
|
+
results["failures"].append({
|
|
355
|
+
"gate": "quality",
|
|
356
|
+
"message": quality_result.failures[0] if quality_result.failures else "Quality gate failed",
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
# Evaluate pluggable gates if specified
|
|
360
|
+
if pluggable_gates and context:
|
|
361
|
+
pluggable_results = self.gate_registry.evaluate_gates(pluggable_gates, context)
|
|
362
|
+
results["pluggable_gates"] = pluggable_results
|
|
363
|
+
|
|
364
|
+
if not pluggable_results.get("all_passed", True):
|
|
365
|
+
results["all_passed"] = False
|
|
366
|
+
results["failures"].extend(pluggable_results.get("failures", []))
|
|
367
|
+
results["warnings"].extend(pluggable_results.get("warnings", []))
|
|
368
|
+
|
|
369
|
+
return results
|