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,387 +1,387 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Coverage Analysis Integration
|
|
3
|
-
|
|
4
|
-
Analyzes coverage.json files to identify gaps and generate targeted tests.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import json
|
|
8
|
-
import logging
|
|
9
|
-
from dataclasses import dataclass, field
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class CoverageGap:
|
|
18
|
-
"""Represents a coverage gap in the codebase."""
|
|
19
|
-
|
|
20
|
-
file_path: str
|
|
21
|
-
line_number: int | None = None
|
|
22
|
-
function_name: str | None = None
|
|
23
|
-
class_name: str | None = None
|
|
24
|
-
branch: bool = False
|
|
25
|
-
priority: int = 5 # 1-10, 10 is highest priority
|
|
26
|
-
gap_type: str = "line" # line, branch, function, class
|
|
27
|
-
context: str | None = None # Surrounding code context
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@dataclass
|
|
31
|
-
class CoverageReport:
|
|
32
|
-
"""Coverage report with gap analysis."""
|
|
33
|
-
|
|
34
|
-
total_lines: int = 0
|
|
35
|
-
covered_lines: int = 0
|
|
36
|
-
total_branches: int = 0
|
|
37
|
-
covered_branches: int = 0
|
|
38
|
-
total_functions: int = 0
|
|
39
|
-
covered_functions: int = 0
|
|
40
|
-
coverage_percentage: float = 0.0
|
|
41
|
-
branch_coverage_percentage: float = 0.0
|
|
42
|
-
function_coverage_percentage: float = 0.0
|
|
43
|
-
gaps: list[CoverageGap] = field(default_factory=list)
|
|
44
|
-
files: dict[str, dict[str, Any]] = field(default_factory=dict)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class CoverageAnalyzer:
|
|
48
|
-
"""
|
|
49
|
-
Analyzes coverage.json files to identify gaps and prioritize test generation.
|
|
50
|
-
|
|
51
|
-
Supports coverage.py JSON format.
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
def __init__(self, project_root: Path | None = None):
|
|
55
|
-
"""
|
|
56
|
-
Initialize coverage analyzer.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
project_root: Root directory of the project
|
|
60
|
-
"""
|
|
61
|
-
self.project_root = project_root or Path.cwd()
|
|
62
|
-
|
|
63
|
-
def analyze_coverage(
|
|
64
|
-
self, coverage_file: Path | str, target_coverage: float = 80.0
|
|
65
|
-
) -> CoverageReport:
|
|
66
|
-
"""
|
|
67
|
-
Analyze coverage.json file and identify gaps.
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
coverage_file: Path to coverage.json file
|
|
71
|
-
target_coverage: Target coverage percentage (default: 80%)
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
CoverageReport with gaps identified and prioritized
|
|
75
|
-
"""
|
|
76
|
-
coverage_path = Path(coverage_file)
|
|
77
|
-
if not coverage_path.is_absolute():
|
|
78
|
-
coverage_path = self.project_root / coverage_path
|
|
79
|
-
|
|
80
|
-
if not coverage_path.exists():
|
|
81
|
-
raise FileNotFoundError(f"Coverage file not found: {coverage_path}")
|
|
82
|
-
|
|
83
|
-
# Parse coverage.json (coverage.py format)
|
|
84
|
-
with coverage_path.open(encoding="utf-8") as f:
|
|
85
|
-
coverage_data = json.load(f)
|
|
86
|
-
|
|
87
|
-
report = CoverageReport()
|
|
88
|
-
|
|
89
|
-
# Extract coverage data
|
|
90
|
-
files = coverage_data.get("files", {})
|
|
91
|
-
report.files = files
|
|
92
|
-
|
|
93
|
-
# Calculate totals
|
|
94
|
-
total_lines = 0
|
|
95
|
-
covered_lines = 0
|
|
96
|
-
total_branches = 0
|
|
97
|
-
covered_branches = 0
|
|
98
|
-
total_functions = 0
|
|
99
|
-
covered_functions = 0
|
|
100
|
-
|
|
101
|
-
gaps: list[CoverageGap] = []
|
|
102
|
-
|
|
103
|
-
for file_path, file_data in files.items():
|
|
104
|
-
# Normalize file path
|
|
105
|
-
if not Path(file_path).is_absolute():
|
|
106
|
-
file_path = str(self.project_root / file_path)
|
|
107
|
-
|
|
108
|
-
# Extract line coverage
|
|
109
|
-
executed_lines = file_data.get("executed_lines", [])
|
|
110
|
-
missing_lines = file_data.get("missing_lines", [])
|
|
111
|
-
excluded_lines = file_data.get("excluded_lines", [])
|
|
112
|
-
|
|
113
|
-
total_file_lines = len(executed_lines) + len(missing_lines)
|
|
114
|
-
covered_file_lines = len(executed_lines)
|
|
115
|
-
|
|
116
|
-
total_lines += total_file_lines
|
|
117
|
-
covered_lines += covered_file_lines
|
|
118
|
-
|
|
119
|
-
# Extract branch coverage
|
|
120
|
-
summary = file_data.get("summary", {})
|
|
121
|
-
branch_data = file_data.get("branches", {})
|
|
122
|
-
if branch_data:
|
|
123
|
-
total_file_branches = summary.get("num_branches", 0)
|
|
124
|
-
covered_file_branches = summary.get("covered_branches", 0)
|
|
125
|
-
total_branches += total_file_branches
|
|
126
|
-
covered_branches += covered_file_branches
|
|
127
|
-
|
|
128
|
-
# Identify uncovered branches
|
|
129
|
-
for branch_id, branch_info in branch_data.items():
|
|
130
|
-
if not branch_info.get("covered", False):
|
|
131
|
-
gaps.append(
|
|
132
|
-
CoverageGap(
|
|
133
|
-
file_path=file_path,
|
|
134
|
-
branch=True,
|
|
135
|
-
priority=self._calculate_priority(
|
|
136
|
-
file_path, branch=True
|
|
137
|
-
),
|
|
138
|
-
gap_type="branch",
|
|
139
|
-
context=branch_info.get("context"),
|
|
140
|
-
)
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
# Extract function coverage
|
|
144
|
-
functions = file_data.get("functions", {})
|
|
145
|
-
if functions:
|
|
146
|
-
for func_name, func_info in functions.items():
|
|
147
|
-
total_functions += 1
|
|
148
|
-
if func_info.get("executed", False):
|
|
149
|
-
covered_functions += 1
|
|
150
|
-
else:
|
|
151
|
-
# Uncovered function
|
|
152
|
-
gaps.append(
|
|
153
|
-
CoverageGap(
|
|
154
|
-
file_path=file_path,
|
|
155
|
-
function_name=func_name,
|
|
156
|
-
priority=self._calculate_priority(
|
|
157
|
-
file_path, function_name=func_name
|
|
158
|
-
),
|
|
159
|
-
gap_type="function",
|
|
160
|
-
context=func_info.get("context"),
|
|
161
|
-
)
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
# Identify uncovered lines
|
|
165
|
-
for line_num in missing_lines:
|
|
166
|
-
# Get context if available
|
|
167
|
-
context = None
|
|
168
|
-
if "line_contexts" in file_data:
|
|
169
|
-
context = file_data["line_contexts"].get(str(line_num))
|
|
170
|
-
|
|
171
|
-
gaps.append(
|
|
172
|
-
CoverageGap(
|
|
173
|
-
file_path=file_path,
|
|
174
|
-
line_number=line_num,
|
|
175
|
-
priority=self._calculate_priority(file_path, line_num=line_num),
|
|
176
|
-
gap_type="line",
|
|
177
|
-
context=context,
|
|
178
|
-
)
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
# Calculate percentages
|
|
182
|
-
report.total_lines = total_lines
|
|
183
|
-
report.covered_lines = covered_lines
|
|
184
|
-
report.total_branches = total_branches
|
|
185
|
-
report.covered_branches = covered_branches
|
|
186
|
-
report.total_functions = total_functions
|
|
187
|
-
report.covered_functions = covered_functions
|
|
188
|
-
|
|
189
|
-
if total_lines > 0:
|
|
190
|
-
report.coverage_percentage = (covered_lines / total_lines) * 100.0
|
|
191
|
-
if total_branches > 0:
|
|
192
|
-
report.branch_coverage_percentage = (
|
|
193
|
-
covered_branches / total_branches
|
|
194
|
-
) * 100.0
|
|
195
|
-
if total_functions > 0:
|
|
196
|
-
report.function_coverage_percentage = (
|
|
197
|
-
covered_functions / total_functions
|
|
198
|
-
) * 100.0
|
|
199
|
-
|
|
200
|
-
# Prioritize gaps
|
|
201
|
-
report.gaps = self.prioritize_gaps(gaps, target_coverage)
|
|
202
|
-
|
|
203
|
-
logger.info(
|
|
204
|
-
f"Coverage analysis complete: {report.coverage_percentage:.1f}% "
|
|
205
|
-
f"({covered_lines}/{total_lines} lines, {len(gaps)} gaps identified)"
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
return report
|
|
209
|
-
|
|
210
|
-
def identify_gaps(
|
|
211
|
-
self, report: CoverageReport, target: float = 80.0
|
|
212
|
-
) -> list[CoverageGap]:
|
|
213
|
-
"""
|
|
214
|
-
Identify gaps that need to be addressed to reach target coverage.
|
|
215
|
-
|
|
216
|
-
Args:
|
|
217
|
-
report: Coverage report
|
|
218
|
-
target: Target coverage percentage
|
|
219
|
-
|
|
220
|
-
Returns:
|
|
221
|
-
List of gaps prioritized by importance
|
|
222
|
-
"""
|
|
223
|
-
if report.coverage_percentage >= target:
|
|
224
|
-
return []
|
|
225
|
-
|
|
226
|
-
# Filter gaps that would help reach target
|
|
227
|
-
target_lines = int((target / 100.0) * report.total_lines)
|
|
228
|
-
needed_lines = target_lines - report.covered_lines
|
|
229
|
-
|
|
230
|
-
# Prioritize gaps
|
|
231
|
-
prioritized = self.prioritize_gaps(report.gaps, target)
|
|
232
|
-
|
|
233
|
-
# Return gaps that would help reach target
|
|
234
|
-
result: list[CoverageGap] = []
|
|
235
|
-
lines_to_cover = needed_lines
|
|
236
|
-
|
|
237
|
-
for gap in prioritized:
|
|
238
|
-
if gap.gap_type == "line" and gap.line_number:
|
|
239
|
-
result.append(gap)
|
|
240
|
-
lines_to_cover -= 1
|
|
241
|
-
if lines_to_cover <= 0:
|
|
242
|
-
break
|
|
243
|
-
elif gap.gap_type == "function":
|
|
244
|
-
# Functions typically cover multiple lines
|
|
245
|
-
result.append(gap)
|
|
246
|
-
lines_to_cover -= 5 # Estimate
|
|
247
|
-
if lines_to_cover <= 0:
|
|
248
|
-
break
|
|
249
|
-
|
|
250
|
-
return result
|
|
251
|
-
|
|
252
|
-
def prioritize_gaps(
|
|
253
|
-
self, gaps: list[CoverageGap], target_coverage: float = 80.0
|
|
254
|
-
) -> list[CoverageGap]:
|
|
255
|
-
"""
|
|
256
|
-
Prioritize coverage gaps for test generation.
|
|
257
|
-
|
|
258
|
-
Priority factors:
|
|
259
|
-
- Critical paths (error handling, edge cases)
|
|
260
|
-
- High-traffic code (frequently called functions)
|
|
261
|
-
- Public APIs (functions/classes used by other modules)
|
|
262
|
-
- Test files (should have high coverage)
|
|
263
|
-
|
|
264
|
-
Args:
|
|
265
|
-
gaps: List of coverage gaps
|
|
266
|
-
target_coverage: Target coverage percentage
|
|
267
|
-
|
|
268
|
-
Returns:
|
|
269
|
-
Prioritized list of gaps (highest priority first)
|
|
270
|
-
"""
|
|
271
|
-
# Score each gap
|
|
272
|
-
scored_gaps = []
|
|
273
|
-
for gap in gaps:
|
|
274
|
-
score = gap.priority
|
|
275
|
-
|
|
276
|
-
# Boost priority for error handling
|
|
277
|
-
if gap.context:
|
|
278
|
-
context_lower = gap.context.lower()
|
|
279
|
-
if any(
|
|
280
|
-
keyword in context_lower
|
|
281
|
-
for keyword in ["error", "exception", "raise", "except"]
|
|
282
|
-
):
|
|
283
|
-
score += 3
|
|
284
|
-
|
|
285
|
-
# Boost priority for public APIs
|
|
286
|
-
if gap.function_name and not gap.function_name.startswith("_"):
|
|
287
|
-
score += 2
|
|
288
|
-
|
|
289
|
-
# Boost priority for test files
|
|
290
|
-
if "test" in gap.file_path.lower():
|
|
291
|
-
score += 5
|
|
292
|
-
|
|
293
|
-
# Boost priority for critical modules
|
|
294
|
-
critical_modules = ["auth", "security", "payment", "database", "api"]
|
|
295
|
-
if any(module in gap.file_path.lower() for module in critical_modules):
|
|
296
|
-
score += 2
|
|
297
|
-
|
|
298
|
-
scored_gaps.append((score, gap))
|
|
299
|
-
|
|
300
|
-
# Sort by score (highest first)
|
|
301
|
-
scored_gaps.sort(key=lambda x: x[0], reverse=True)
|
|
302
|
-
|
|
303
|
-
# Update priorities and return
|
|
304
|
-
result = []
|
|
305
|
-
for score, gap in scored_gaps:
|
|
306
|
-
gap.priority = min(score, 10) # Cap at 10
|
|
307
|
-
result.append(gap)
|
|
308
|
-
|
|
309
|
-
return result
|
|
310
|
-
|
|
311
|
-
def _calculate_priority(
|
|
312
|
-
self,
|
|
313
|
-
file_path: str,
|
|
314
|
-
line_num: int | None = None,
|
|
315
|
-
function_name: str | None = None,
|
|
316
|
-
branch: bool = False,
|
|
317
|
-
) -> int:
|
|
318
|
-
"""
|
|
319
|
-
Calculate priority for a coverage gap.
|
|
320
|
-
|
|
321
|
-
Args:
|
|
322
|
-
file_path: Path to file
|
|
323
|
-
line_num: Line number (if applicable)
|
|
324
|
-
function_name: Function name (if applicable)
|
|
325
|
-
branch: Whether this is a branch gap
|
|
326
|
-
|
|
327
|
-
Returns:
|
|
328
|
-
Priority score (1-10)
|
|
329
|
-
"""
|
|
330
|
-
priority = 5 # Default
|
|
331
|
-
|
|
332
|
-
# Higher priority for source files (not tests)
|
|
333
|
-
if "test" not in file_path.lower():
|
|
334
|
-
priority += 1
|
|
335
|
-
|
|
336
|
-
# Higher priority for main modules
|
|
337
|
-
if "main" in file_path.lower() or "__init__" in file_path:
|
|
338
|
-
priority += 1
|
|
339
|
-
|
|
340
|
-
# Higher priority for public functions
|
|
341
|
-
if function_name and not function_name.startswith("_"):
|
|
342
|
-
priority += 1
|
|
343
|
-
|
|
344
|
-
# Higher priority for branches (edge cases)
|
|
345
|
-
if branch:
|
|
346
|
-
priority += 1
|
|
347
|
-
|
|
348
|
-
return min(priority, 10)
|
|
349
|
-
|
|
350
|
-
async def measure_coverage(
|
|
351
|
-
self,
|
|
352
|
-
file_path: Path,
|
|
353
|
-
language: Any,
|
|
354
|
-
test_file_path: Path | None = None,
|
|
355
|
-
project_root: Path | None = None,
|
|
356
|
-
) -> CoverageReport:
|
|
357
|
-
"""
|
|
358
|
-
Measure test coverage for a file using language-specific tools.
|
|
359
|
-
|
|
360
|
-
This method runs tests and measures coverage, then analyzes the results.
|
|
361
|
-
Currently a stub implementation - looks for existing coverage.json file.
|
|
362
|
-
|
|
363
|
-
Args:
|
|
364
|
-
file_path: Path to the source file
|
|
365
|
-
language: Language object (from LanguageDetector)
|
|
366
|
-
test_file_path: Optional path to test file
|
|
367
|
-
project_root: Optional project root directory
|
|
368
|
-
|
|
369
|
-
Returns:
|
|
370
|
-
CoverageReport with coverage percentage and metrics
|
|
371
|
-
"""
|
|
372
|
-
# Update project_root if provided
|
|
373
|
-
if project_root:
|
|
374
|
-
self.project_root = Path(project_root)
|
|
375
|
-
|
|
376
|
-
# Look for coverage.json in project root
|
|
377
|
-
coverage_file = self.project_root / "coverage.json"
|
|
378
|
-
|
|
379
|
-
if coverage_file.exists():
|
|
380
|
-
# Analyze existing coverage file
|
|
381
|
-
return self.analyze_coverage(coverage_file)
|
|
382
|
-
else:
|
|
383
|
-
# Return empty report if no coverage file exists
|
|
384
|
-
# This is a stub - in a full implementation, this would run tests
|
|
385
|
-
# and generate coverage data
|
|
386
|
-
logger.warning(f"No coverage file found at {coverage_file}, returning empty report")
|
|
1
|
+
"""
|
|
2
|
+
Coverage Analysis Integration
|
|
3
|
+
|
|
4
|
+
Analyzes coverage.json files to identify gaps and generate targeted tests.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class CoverageGap:
|
|
18
|
+
"""Represents a coverage gap in the codebase."""
|
|
19
|
+
|
|
20
|
+
file_path: str
|
|
21
|
+
line_number: int | None = None
|
|
22
|
+
function_name: str | None = None
|
|
23
|
+
class_name: str | None = None
|
|
24
|
+
branch: bool = False
|
|
25
|
+
priority: int = 5 # 1-10, 10 is highest priority
|
|
26
|
+
gap_type: str = "line" # line, branch, function, class
|
|
27
|
+
context: str | None = None # Surrounding code context
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class CoverageReport:
|
|
32
|
+
"""Coverage report with gap analysis."""
|
|
33
|
+
|
|
34
|
+
total_lines: int = 0
|
|
35
|
+
covered_lines: int = 0
|
|
36
|
+
total_branches: int = 0
|
|
37
|
+
covered_branches: int = 0
|
|
38
|
+
total_functions: int = 0
|
|
39
|
+
covered_functions: int = 0
|
|
40
|
+
coverage_percentage: float = 0.0
|
|
41
|
+
branch_coverage_percentage: float = 0.0
|
|
42
|
+
function_coverage_percentage: float = 0.0
|
|
43
|
+
gaps: list[CoverageGap] = field(default_factory=list)
|
|
44
|
+
files: dict[str, dict[str, Any]] = field(default_factory=dict)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class CoverageAnalyzer:
|
|
48
|
+
"""
|
|
49
|
+
Analyzes coverage.json files to identify gaps and prioritize test generation.
|
|
50
|
+
|
|
51
|
+
Supports coverage.py JSON format.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(self, project_root: Path | None = None):
|
|
55
|
+
"""
|
|
56
|
+
Initialize coverage analyzer.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
project_root: Root directory of the project
|
|
60
|
+
"""
|
|
61
|
+
self.project_root = project_root or Path.cwd()
|
|
62
|
+
|
|
63
|
+
def analyze_coverage(
|
|
64
|
+
self, coverage_file: Path | str, target_coverage: float = 80.0
|
|
65
|
+
) -> CoverageReport:
|
|
66
|
+
"""
|
|
67
|
+
Analyze coverage.json file and identify gaps.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
coverage_file: Path to coverage.json file
|
|
71
|
+
target_coverage: Target coverage percentage (default: 80%)
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
CoverageReport with gaps identified and prioritized
|
|
75
|
+
"""
|
|
76
|
+
coverage_path = Path(coverage_file)
|
|
77
|
+
if not coverage_path.is_absolute():
|
|
78
|
+
coverage_path = self.project_root / coverage_path
|
|
79
|
+
|
|
80
|
+
if not coverage_path.exists():
|
|
81
|
+
raise FileNotFoundError(f"Coverage file not found: {coverage_path}")
|
|
82
|
+
|
|
83
|
+
# Parse coverage.json (coverage.py format)
|
|
84
|
+
with coverage_path.open(encoding="utf-8") as f:
|
|
85
|
+
coverage_data = json.load(f)
|
|
86
|
+
|
|
87
|
+
report = CoverageReport()
|
|
88
|
+
|
|
89
|
+
# Extract coverage data
|
|
90
|
+
files = coverage_data.get("files", {})
|
|
91
|
+
report.files = files
|
|
92
|
+
|
|
93
|
+
# Calculate totals
|
|
94
|
+
total_lines = 0
|
|
95
|
+
covered_lines = 0
|
|
96
|
+
total_branches = 0
|
|
97
|
+
covered_branches = 0
|
|
98
|
+
total_functions = 0
|
|
99
|
+
covered_functions = 0
|
|
100
|
+
|
|
101
|
+
gaps: list[CoverageGap] = []
|
|
102
|
+
|
|
103
|
+
for file_path, file_data in files.items():
|
|
104
|
+
# Normalize file path
|
|
105
|
+
if not Path(file_path).is_absolute():
|
|
106
|
+
file_path = str(self.project_root / file_path)
|
|
107
|
+
|
|
108
|
+
# Extract line coverage
|
|
109
|
+
executed_lines = file_data.get("executed_lines", [])
|
|
110
|
+
missing_lines = file_data.get("missing_lines", [])
|
|
111
|
+
excluded_lines = file_data.get("excluded_lines", [])
|
|
112
|
+
|
|
113
|
+
total_file_lines = len(executed_lines) + len(missing_lines)
|
|
114
|
+
covered_file_lines = len(executed_lines)
|
|
115
|
+
|
|
116
|
+
total_lines += total_file_lines
|
|
117
|
+
covered_lines += covered_file_lines
|
|
118
|
+
|
|
119
|
+
# Extract branch coverage
|
|
120
|
+
summary = file_data.get("summary", {})
|
|
121
|
+
branch_data = file_data.get("branches", {})
|
|
122
|
+
if branch_data:
|
|
123
|
+
total_file_branches = summary.get("num_branches", 0)
|
|
124
|
+
covered_file_branches = summary.get("covered_branches", 0)
|
|
125
|
+
total_branches += total_file_branches
|
|
126
|
+
covered_branches += covered_file_branches
|
|
127
|
+
|
|
128
|
+
# Identify uncovered branches
|
|
129
|
+
for branch_id, branch_info in branch_data.items():
|
|
130
|
+
if not branch_info.get("covered", False):
|
|
131
|
+
gaps.append(
|
|
132
|
+
CoverageGap(
|
|
133
|
+
file_path=file_path,
|
|
134
|
+
branch=True,
|
|
135
|
+
priority=self._calculate_priority(
|
|
136
|
+
file_path, branch=True
|
|
137
|
+
),
|
|
138
|
+
gap_type="branch",
|
|
139
|
+
context=branch_info.get("context"),
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# Extract function coverage
|
|
144
|
+
functions = file_data.get("functions", {})
|
|
145
|
+
if functions:
|
|
146
|
+
for func_name, func_info in functions.items():
|
|
147
|
+
total_functions += 1
|
|
148
|
+
if func_info.get("executed", False):
|
|
149
|
+
covered_functions += 1
|
|
150
|
+
else:
|
|
151
|
+
# Uncovered function
|
|
152
|
+
gaps.append(
|
|
153
|
+
CoverageGap(
|
|
154
|
+
file_path=file_path,
|
|
155
|
+
function_name=func_name,
|
|
156
|
+
priority=self._calculate_priority(
|
|
157
|
+
file_path, function_name=func_name
|
|
158
|
+
),
|
|
159
|
+
gap_type="function",
|
|
160
|
+
context=func_info.get("context"),
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# Identify uncovered lines
|
|
165
|
+
for line_num in missing_lines:
|
|
166
|
+
# Get context if available
|
|
167
|
+
context = None
|
|
168
|
+
if "line_contexts" in file_data:
|
|
169
|
+
context = file_data["line_contexts"].get(str(line_num))
|
|
170
|
+
|
|
171
|
+
gaps.append(
|
|
172
|
+
CoverageGap(
|
|
173
|
+
file_path=file_path,
|
|
174
|
+
line_number=line_num,
|
|
175
|
+
priority=self._calculate_priority(file_path, line_num=line_num),
|
|
176
|
+
gap_type="line",
|
|
177
|
+
context=context,
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
# Calculate percentages
|
|
182
|
+
report.total_lines = total_lines
|
|
183
|
+
report.covered_lines = covered_lines
|
|
184
|
+
report.total_branches = total_branches
|
|
185
|
+
report.covered_branches = covered_branches
|
|
186
|
+
report.total_functions = total_functions
|
|
187
|
+
report.covered_functions = covered_functions
|
|
188
|
+
|
|
189
|
+
if total_lines > 0:
|
|
190
|
+
report.coverage_percentage = (covered_lines / total_lines) * 100.0
|
|
191
|
+
if total_branches > 0:
|
|
192
|
+
report.branch_coverage_percentage = (
|
|
193
|
+
covered_branches / total_branches
|
|
194
|
+
) * 100.0
|
|
195
|
+
if total_functions > 0:
|
|
196
|
+
report.function_coverage_percentage = (
|
|
197
|
+
covered_functions / total_functions
|
|
198
|
+
) * 100.0
|
|
199
|
+
|
|
200
|
+
# Prioritize gaps
|
|
201
|
+
report.gaps = self.prioritize_gaps(gaps, target_coverage)
|
|
202
|
+
|
|
203
|
+
logger.info(
|
|
204
|
+
f"Coverage analysis complete: {report.coverage_percentage:.1f}% "
|
|
205
|
+
f"({covered_lines}/{total_lines} lines, {len(gaps)} gaps identified)"
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
return report
|
|
209
|
+
|
|
210
|
+
def identify_gaps(
|
|
211
|
+
self, report: CoverageReport, target: float = 80.0
|
|
212
|
+
) -> list[CoverageGap]:
|
|
213
|
+
"""
|
|
214
|
+
Identify gaps that need to be addressed to reach target coverage.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
report: Coverage report
|
|
218
|
+
target: Target coverage percentage
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
List of gaps prioritized by importance
|
|
222
|
+
"""
|
|
223
|
+
if report.coverage_percentage >= target:
|
|
224
|
+
return []
|
|
225
|
+
|
|
226
|
+
# Filter gaps that would help reach target
|
|
227
|
+
target_lines = int((target / 100.0) * report.total_lines)
|
|
228
|
+
needed_lines = target_lines - report.covered_lines
|
|
229
|
+
|
|
230
|
+
# Prioritize gaps
|
|
231
|
+
prioritized = self.prioritize_gaps(report.gaps, target)
|
|
232
|
+
|
|
233
|
+
# Return gaps that would help reach target
|
|
234
|
+
result: list[CoverageGap] = []
|
|
235
|
+
lines_to_cover = needed_lines
|
|
236
|
+
|
|
237
|
+
for gap in prioritized:
|
|
238
|
+
if gap.gap_type == "line" and gap.line_number:
|
|
239
|
+
result.append(gap)
|
|
240
|
+
lines_to_cover -= 1
|
|
241
|
+
if lines_to_cover <= 0:
|
|
242
|
+
break
|
|
243
|
+
elif gap.gap_type == "function":
|
|
244
|
+
# Functions typically cover multiple lines
|
|
245
|
+
result.append(gap)
|
|
246
|
+
lines_to_cover -= 5 # Estimate
|
|
247
|
+
if lines_to_cover <= 0:
|
|
248
|
+
break
|
|
249
|
+
|
|
250
|
+
return result
|
|
251
|
+
|
|
252
|
+
def prioritize_gaps(
|
|
253
|
+
self, gaps: list[CoverageGap], target_coverage: float = 80.0
|
|
254
|
+
) -> list[CoverageGap]:
|
|
255
|
+
"""
|
|
256
|
+
Prioritize coverage gaps for test generation.
|
|
257
|
+
|
|
258
|
+
Priority factors:
|
|
259
|
+
- Critical paths (error handling, edge cases)
|
|
260
|
+
- High-traffic code (frequently called functions)
|
|
261
|
+
- Public APIs (functions/classes used by other modules)
|
|
262
|
+
- Test files (should have high coverage)
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
gaps: List of coverage gaps
|
|
266
|
+
target_coverage: Target coverage percentage
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
Prioritized list of gaps (highest priority first)
|
|
270
|
+
"""
|
|
271
|
+
# Score each gap
|
|
272
|
+
scored_gaps = []
|
|
273
|
+
for gap in gaps:
|
|
274
|
+
score = gap.priority
|
|
275
|
+
|
|
276
|
+
# Boost priority for error handling
|
|
277
|
+
if gap.context:
|
|
278
|
+
context_lower = gap.context.lower()
|
|
279
|
+
if any(
|
|
280
|
+
keyword in context_lower
|
|
281
|
+
for keyword in ["error", "exception", "raise", "except"]
|
|
282
|
+
):
|
|
283
|
+
score += 3
|
|
284
|
+
|
|
285
|
+
# Boost priority for public APIs
|
|
286
|
+
if gap.function_name and not gap.function_name.startswith("_"):
|
|
287
|
+
score += 2
|
|
288
|
+
|
|
289
|
+
# Boost priority for test files
|
|
290
|
+
if "test" in gap.file_path.lower():
|
|
291
|
+
score += 5
|
|
292
|
+
|
|
293
|
+
# Boost priority for critical modules
|
|
294
|
+
critical_modules = ["auth", "security", "payment", "database", "api"]
|
|
295
|
+
if any(module in gap.file_path.lower() for module in critical_modules):
|
|
296
|
+
score += 2
|
|
297
|
+
|
|
298
|
+
scored_gaps.append((score, gap))
|
|
299
|
+
|
|
300
|
+
# Sort by score (highest first)
|
|
301
|
+
scored_gaps.sort(key=lambda x: x[0], reverse=True)
|
|
302
|
+
|
|
303
|
+
# Update priorities and return
|
|
304
|
+
result = []
|
|
305
|
+
for score, gap in scored_gaps:
|
|
306
|
+
gap.priority = min(score, 10) # Cap at 10
|
|
307
|
+
result.append(gap)
|
|
308
|
+
|
|
309
|
+
return result
|
|
310
|
+
|
|
311
|
+
def _calculate_priority(
|
|
312
|
+
self,
|
|
313
|
+
file_path: str,
|
|
314
|
+
line_num: int | None = None,
|
|
315
|
+
function_name: str | None = None,
|
|
316
|
+
branch: bool = False,
|
|
317
|
+
) -> int:
|
|
318
|
+
"""
|
|
319
|
+
Calculate priority for a coverage gap.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
file_path: Path to file
|
|
323
|
+
line_num: Line number (if applicable)
|
|
324
|
+
function_name: Function name (if applicable)
|
|
325
|
+
branch: Whether this is a branch gap
|
|
326
|
+
|
|
327
|
+
Returns:
|
|
328
|
+
Priority score (1-10)
|
|
329
|
+
"""
|
|
330
|
+
priority = 5 # Default
|
|
331
|
+
|
|
332
|
+
# Higher priority for source files (not tests)
|
|
333
|
+
if "test" not in file_path.lower():
|
|
334
|
+
priority += 1
|
|
335
|
+
|
|
336
|
+
# Higher priority for main modules
|
|
337
|
+
if "main" in file_path.lower() or "__init__" in file_path:
|
|
338
|
+
priority += 1
|
|
339
|
+
|
|
340
|
+
# Higher priority for public functions
|
|
341
|
+
if function_name and not function_name.startswith("_"):
|
|
342
|
+
priority += 1
|
|
343
|
+
|
|
344
|
+
# Higher priority for branches (edge cases)
|
|
345
|
+
if branch:
|
|
346
|
+
priority += 1
|
|
347
|
+
|
|
348
|
+
return min(priority, 10)
|
|
349
|
+
|
|
350
|
+
async def measure_coverage(
|
|
351
|
+
self,
|
|
352
|
+
file_path: Path,
|
|
353
|
+
language: Any,
|
|
354
|
+
test_file_path: Path | None = None,
|
|
355
|
+
project_root: Path | None = None,
|
|
356
|
+
) -> CoverageReport:
|
|
357
|
+
"""
|
|
358
|
+
Measure test coverage for a file using language-specific tools.
|
|
359
|
+
|
|
360
|
+
This method runs tests and measures coverage, then analyzes the results.
|
|
361
|
+
Currently a stub implementation - looks for existing coverage.json file.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
file_path: Path to the source file
|
|
365
|
+
language: Language object (from LanguageDetector)
|
|
366
|
+
test_file_path: Optional path to test file
|
|
367
|
+
project_root: Optional project root directory
|
|
368
|
+
|
|
369
|
+
Returns:
|
|
370
|
+
CoverageReport with coverage percentage and metrics
|
|
371
|
+
"""
|
|
372
|
+
# Update project_root if provided
|
|
373
|
+
if project_root:
|
|
374
|
+
self.project_root = Path(project_root)
|
|
375
|
+
|
|
376
|
+
# Look for coverage.json in project root
|
|
377
|
+
coverage_file = self.project_root / "coverage.json"
|
|
378
|
+
|
|
379
|
+
if coverage_file.exists():
|
|
380
|
+
# Analyze existing coverage file
|
|
381
|
+
return self.analyze_coverage(coverage_file)
|
|
382
|
+
else:
|
|
383
|
+
# Return empty report if no coverage file exists
|
|
384
|
+
# This is a stub - in a full implementation, this would run tests
|
|
385
|
+
# and generate coverage data
|
|
386
|
+
logger.warning(f"No coverage file found at {coverage_file}, returning empty report")
|
|
387
387
|
return CoverageReport()
|