tapps-agents 3.6.0__py3-none-any.whl → 3.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -227
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +324 -0
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +324 -0
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/resources/__init__.py +5 -0
- tapps_agents/resources/claude/__init__.py +1 -0
- tapps_agents/resources/claude/commands/README.md +156 -0
- tapps_agents/resources/claude/commands/__init__.py +1 -0
- tapps_agents/resources/claude/commands/build-fix.md +22 -0
- tapps_agents/resources/claude/commands/build.md +77 -0
- tapps_agents/resources/claude/commands/debug.md +53 -0
- tapps_agents/resources/claude/commands/design.md +68 -0
- tapps_agents/resources/claude/commands/docs.md +53 -0
- tapps_agents/resources/claude/commands/e2e.md +22 -0
- tapps_agents/resources/claude/commands/fix.md +54 -0
- tapps_agents/resources/claude/commands/implement.md +53 -0
- tapps_agents/resources/claude/commands/improve.md +53 -0
- tapps_agents/resources/claude/commands/library-docs.md +64 -0
- tapps_agents/resources/claude/commands/lint.md +52 -0
- tapps_agents/resources/claude/commands/plan.md +65 -0
- tapps_agents/resources/claude/commands/refactor-clean.md +21 -0
- tapps_agents/resources/claude/commands/refactor.md +55 -0
- tapps_agents/resources/claude/commands/review.md +67 -0
- tapps_agents/resources/claude/commands/score.md +60 -0
- tapps_agents/resources/claude/commands/security-review.md +22 -0
- tapps_agents/resources/claude/commands/security-scan.md +54 -0
- tapps_agents/resources/claude/commands/tdd.md +24 -0
- tapps_agents/resources/claude/commands/test-coverage.md +21 -0
- tapps_agents/resources/claude/commands/test.md +54 -0
- tapps_agents/resources/claude/commands/update-codemaps.md +20 -0
- tapps_agents/resources/claude/commands/update-docs.md +21 -0
- tapps_agents/resources/claude/skills/__init__.py +1 -0
- tapps_agents/resources/claude/skills/analyst/SKILL.md +272 -0
- tapps_agents/resources/claude/skills/analyst/__init__.py +1 -0
- tapps_agents/resources/claude/skills/architect/SKILL.md +282 -0
- tapps_agents/resources/claude/skills/architect/__init__.py +1 -0
- tapps_agents/resources/claude/skills/backend-patterns/SKILL.md +30 -0
- tapps_agents/resources/claude/skills/backend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/coding-standards/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/coding-standards/__init__.py +1 -0
- tapps_agents/resources/claude/skills/debugger/SKILL.md +203 -0
- tapps_agents/resources/claude/skills/debugger/__init__.py +1 -0
- tapps_agents/resources/claude/skills/designer/SKILL.md +243 -0
- tapps_agents/resources/claude/skills/designer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/documenter/SKILL.md +252 -0
- tapps_agents/resources/claude/skills/documenter/__init__.py +1 -0
- tapps_agents/resources/claude/skills/enhancer/SKILL.md +307 -0
- tapps_agents/resources/claude/skills/enhancer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/evaluator/SKILL.md +204 -0
- tapps_agents/resources/claude/skills/evaluator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/frontend-patterns/SKILL.md +29 -0
- tapps_agents/resources/claude/skills/frontend-patterns/__init__.py +1 -0
- tapps_agents/resources/claude/skills/implementer/SKILL.md +188 -0
- tapps_agents/resources/claude/skills/implementer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/improver/SKILL.md +218 -0
- tapps_agents/resources/claude/skills/improver/__init__.py +1 -0
- tapps_agents/resources/claude/skills/ops/SKILL.md +281 -0
- tapps_agents/resources/claude/skills/ops/__init__.py +1 -0
- tapps_agents/resources/claude/skills/orchestrator/SKILL.md +390 -0
- tapps_agents/resources/claude/skills/orchestrator/__init__.py +1 -0
- tapps_agents/resources/claude/skills/planner/SKILL.md +254 -0
- tapps_agents/resources/claude/skills/planner/__init__.py +1 -0
- tapps_agents/resources/claude/skills/reviewer/SKILL.md +434 -0
- tapps_agents/resources/claude/skills/reviewer/__init__.py +1 -0
- tapps_agents/resources/claude/skills/security-review/SKILL.md +31 -0
- tapps_agents/resources/claude/skills/security-review/__init__.py +1 -0
- tapps_agents/resources/claude/skills/simple-mode/SKILL.md +695 -0
- tapps_agents/resources/claude/skills/simple-mode/__init__.py +1 -0
- tapps_agents/resources/claude/skills/tester/SKILL.md +219 -0
- tapps_agents/resources/claude/skills/tester/__init__.py +1 -0
- tapps_agents/resources/cursor/.cursorignore +35 -0
- tapps_agents/resources/cursor/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/__init__.py +1 -0
- tapps_agents/resources/cursor/commands/build-fix.md +11 -0
- tapps_agents/resources/cursor/commands/build.md +11 -0
- tapps_agents/resources/cursor/commands/e2e.md +11 -0
- tapps_agents/resources/cursor/commands/fix.md +11 -0
- tapps_agents/resources/cursor/commands/refactor-clean.md +11 -0
- tapps_agents/resources/cursor/commands/review.md +11 -0
- tapps_agents/resources/cursor/commands/security-review.md +11 -0
- tapps_agents/resources/cursor/commands/tdd.md +11 -0
- tapps_agents/resources/cursor/commands/test-coverage.md +11 -0
- tapps_agents/resources/cursor/commands/test.md +11 -0
- tapps_agents/resources/cursor/commands/update-codemaps.md +10 -0
- tapps_agents/resources/cursor/commands/update-docs.md +11 -0
- tapps_agents/resources/cursor/rules/__init__.py +1 -0
- tapps_agents/resources/cursor/rules/agent-capabilities.mdc +687 -0
- tapps_agents/resources/cursor/rules/coding-style.mdc +31 -0
- tapps_agents/resources/cursor/rules/command-reference.mdc +2081 -0
- tapps_agents/resources/cursor/rules/cursor-mode-usage.mdc +125 -0
- tapps_agents/resources/cursor/rules/git-workflow.mdc +29 -0
- tapps_agents/resources/cursor/rules/performance.mdc +29 -0
- tapps_agents/resources/cursor/rules/project-context.mdc +163 -0
- tapps_agents/resources/cursor/rules/project-profiling.mdc +197 -0
- tapps_agents/resources/cursor/rules/quick-reference.mdc +630 -0
- tapps_agents/resources/cursor/rules/security.mdc +32 -0
- tapps_agents/resources/cursor/rules/simple-mode.mdc +500 -0
- tapps_agents/resources/cursor/rules/testing.mdc +31 -0
- tapps_agents/resources/cursor/rules/when-to-use.mdc +156 -0
- tapps_agents/resources/cursor/rules/workflow-presets.mdc +179 -0
- tapps_agents/resources/customizations/__init__.py +1 -0
- tapps_agents/resources/customizations/example-custom.yaml +83 -0
- tapps_agents/resources/hooks/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/README.md +5 -0
- tapps_agents/resources/hooks/templates/__init__.py +1 -0
- tapps_agents/resources/hooks/templates/add-project-context.yaml +8 -0
- tapps_agents/resources/hooks/templates/auto-format-js.yaml +10 -0
- tapps_agents/resources/hooks/templates/auto-format-python.yaml +10 -0
- tapps_agents/resources/hooks/templates/git-commit-check.yaml +7 -0
- tapps_agents/resources/hooks/templates/notify-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/quality-gate.yaml +8 -0
- tapps_agents/resources/hooks/templates/security-scan-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/session-end-log.yaml +7 -0
- tapps_agents/resources/hooks/templates/show-beads-ready.yaml +8 -0
- tapps_agents/resources/hooks/templates/test-on-edit.yaml +10 -0
- tapps_agents/resources/hooks/templates/update-docs-on-complete.yaml +8 -0
- tapps_agents/resources/hooks/templates/user-prompt-log.yaml +7 -0
- tapps_agents/resources/scripts/__init__.py +1 -0
- tapps_agents/resources/scripts/set_bd_path.ps1 +51 -0
- tapps_agents/resources/workflows/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/__init__.py +1 -0
- tapps_agents/resources/workflows/presets/brownfield-analysis.yaml +235 -0
- tapps_agents/resources/workflows/presets/fix.yaml +78 -0
- tapps_agents/resources/workflows/presets/full-sdlc.yaml +122 -0
- tapps_agents/resources/workflows/presets/quality.yaml +82 -0
- tapps_agents/resources/workflows/presets/rapid-dev.yaml +84 -0
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -148
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/METADATA +672 -672
- tapps_agents-3.6.1.dist-info/RECORD +883 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/licenses/LICENSE +22 -22
- tapps_agents-3.6.0.dist-info/RECORD +0 -758
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/WHEEL +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.6.0.dist-info → tapps_agents-3.6.1.dist-info}/top_level.txt +0 -0
|
@@ -1,725 +1,725 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Library Detection Utility - Detect libraries from code, imports, and project files.
|
|
3
|
-
|
|
4
|
-
This module provides comprehensive library detection capabilities for Option 3
|
|
5
|
-
quality uplift enhancements (C1-C3, D1-D2, E2).
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import ast
|
|
9
|
-
import json
|
|
10
|
-
import logging
|
|
11
|
-
import re
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class LibraryDetector:
|
|
19
|
-
"""
|
|
20
|
-
Detect libraries from various sources:
|
|
21
|
-
- Code content (import statements)
|
|
22
|
-
- Project files (package.json, requirements.txt, pyproject.toml)
|
|
23
|
-
- Prompt text (library mentions)
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
def __init__(self, project_root: Path | None = None):
|
|
27
|
-
"""
|
|
28
|
-
Initialize library detector.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
project_root: Optional project root directory
|
|
32
|
-
"""
|
|
33
|
-
self.project_root = project_root or Path.cwd()
|
|
34
|
-
# Detect internal project modules to filter them out
|
|
35
|
-
self._internal_modules = self._detect_internal_modules()
|
|
36
|
-
|
|
37
|
-
def detect_from_code(self, code: str, language: str = "python") -> list[str]:
|
|
38
|
-
"""
|
|
39
|
-
Detect libraries from code content (import statements).
|
|
40
|
-
|
|
41
|
-
Args:
|
|
42
|
-
code: Code content to analyze
|
|
43
|
-
language: Programming language ("python", "typescript", "javascript")
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
List of detected library names
|
|
47
|
-
"""
|
|
48
|
-
libraries = set()
|
|
49
|
-
|
|
50
|
-
if language == "python":
|
|
51
|
-
libraries.update(self._detect_python_imports(code))
|
|
52
|
-
elif language in ("typescript", "javascript"):
|
|
53
|
-
libraries.update(self._detect_js_imports(code))
|
|
54
|
-
else:
|
|
55
|
-
# Try both methods
|
|
56
|
-
libraries.update(self._detect_python_imports(code))
|
|
57
|
-
libraries.update(self._detect_js_imports(code))
|
|
58
|
-
|
|
59
|
-
return sorted(list(libraries))
|
|
60
|
-
|
|
61
|
-
def _detect_python_imports(self, code: str) -> set[str]:
|
|
62
|
-
"""Detect Python imports from code."""
|
|
63
|
-
libraries = set()
|
|
64
|
-
|
|
65
|
-
try:
|
|
66
|
-
tree = ast.parse(code)
|
|
67
|
-
for node in ast.walk(tree):
|
|
68
|
-
if isinstance(node, ast.Import):
|
|
69
|
-
for alias in node.names:
|
|
70
|
-
# Extract top-level package name
|
|
71
|
-
lib_name = alias.name.split(".")[0]
|
|
72
|
-
# Filter out standard library and internal modules
|
|
73
|
-
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
74
|
-
libraries.add(lib_name)
|
|
75
|
-
elif isinstance(node, ast.ImportFrom):
|
|
76
|
-
if node.module:
|
|
77
|
-
# Extract top-level package name
|
|
78
|
-
lib_name = node.module.split(".")[0]
|
|
79
|
-
# Filter out standard library and internal modules
|
|
80
|
-
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
81
|
-
libraries.add(lib_name)
|
|
82
|
-
except SyntaxError:
|
|
83
|
-
# Fallback to regex for invalid syntax
|
|
84
|
-
libraries.update(self._detect_imports_regex(code, "python"))
|
|
85
|
-
|
|
86
|
-
return libraries
|
|
87
|
-
|
|
88
|
-
def _detect_js_imports(self, code: str) -> set[str]:
|
|
89
|
-
"""Detect JavaScript/TypeScript imports from code."""
|
|
90
|
-
libraries = set()
|
|
91
|
-
|
|
92
|
-
# ES6 import patterns
|
|
93
|
-
import_pattern = r"import\s+(?:(?:\*\s+as\s+\w+)|(?:\{[^}]*\})|(?:\w+))\s+from\s+['\"]([^'\"]+)['\"]"
|
|
94
|
-
matches = re.findall(import_pattern, code)
|
|
95
|
-
for match in matches:
|
|
96
|
-
# Extract package name (before /)
|
|
97
|
-
lib_name = match.split("/")[0].replace("@", "")
|
|
98
|
-
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
99
|
-
libraries.add(lib_name)
|
|
100
|
-
|
|
101
|
-
# require() patterns
|
|
102
|
-
require_pattern = r"require\(['\"]([^'\"]+)['\"]\)"
|
|
103
|
-
matches = re.findall(require_pattern, code)
|
|
104
|
-
for match in matches:
|
|
105
|
-
lib_name = match.split("/")[0].replace("@", "")
|
|
106
|
-
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
107
|
-
libraries.add(lib_name)
|
|
108
|
-
|
|
109
|
-
return libraries
|
|
110
|
-
|
|
111
|
-
def _detect_imports_regex(self, code: str, language: str) -> set[str]:
|
|
112
|
-
"""Fallback regex-based import detection."""
|
|
113
|
-
libraries = set()
|
|
114
|
-
|
|
115
|
-
if language == "python":
|
|
116
|
-
# Python import patterns
|
|
117
|
-
patterns = [
|
|
118
|
-
r"^import\s+(\w+)",
|
|
119
|
-
r"^from\s+(\w+)",
|
|
120
|
-
r"import\s+(\w+)",
|
|
121
|
-
r"from\s+(\w+)",
|
|
122
|
-
]
|
|
123
|
-
for pattern in patterns:
|
|
124
|
-
matches = re.findall(pattern, code, re.MULTILINE)
|
|
125
|
-
for match in matches:
|
|
126
|
-
lib_name = match.split(".")[0]
|
|
127
|
-
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
128
|
-
libraries.add(lib_name)
|
|
129
|
-
|
|
130
|
-
return libraries
|
|
131
|
-
|
|
132
|
-
def _is_stdlib(self, lib_name: str) -> bool:
|
|
133
|
-
"""Check if library is Python standard library."""
|
|
134
|
-
# Common standard library modules
|
|
135
|
-
stdlib_modules = {
|
|
136
|
-
"os",
|
|
137
|
-
"sys",
|
|
138
|
-
"json",
|
|
139
|
-
"re",
|
|
140
|
-
"pathlib",
|
|
141
|
-
"typing",
|
|
142
|
-
"collections",
|
|
143
|
-
"itertools",
|
|
144
|
-
"functools",
|
|
145
|
-
"datetime",
|
|
146
|
-
"time",
|
|
147
|
-
"logging",
|
|
148
|
-
"asyncio",
|
|
149
|
-
"threading",
|
|
150
|
-
"multiprocessing",
|
|
151
|
-
"subprocess",
|
|
152
|
-
"urllib",
|
|
153
|
-
"http",
|
|
154
|
-
"email",
|
|
155
|
-
"html",
|
|
156
|
-
"xml",
|
|
157
|
-
"sqlite3",
|
|
158
|
-
"csv",
|
|
159
|
-
"io",
|
|
160
|
-
"pickle",
|
|
161
|
-
"base64",
|
|
162
|
-
"hashlib",
|
|
163
|
-
"secrets",
|
|
164
|
-
"random",
|
|
165
|
-
"math",
|
|
166
|
-
"statistics",
|
|
167
|
-
"decimal",
|
|
168
|
-
"fractions",
|
|
169
|
-
"array",
|
|
170
|
-
"queue",
|
|
171
|
-
"heapq",
|
|
172
|
-
"bisect",
|
|
173
|
-
"copy",
|
|
174
|
-
"gc",
|
|
175
|
-
"weakref",
|
|
176
|
-
"types",
|
|
177
|
-
"inspect",
|
|
178
|
-
"traceback",
|
|
179
|
-
"warnings",
|
|
180
|
-
"contextlib",
|
|
181
|
-
"abc",
|
|
182
|
-
"atexit",
|
|
183
|
-
"argparse",
|
|
184
|
-
"getopt",
|
|
185
|
-
"shutil",
|
|
186
|
-
"tempfile",
|
|
187
|
-
"glob",
|
|
188
|
-
"fnmatch",
|
|
189
|
-
"linecache",
|
|
190
|
-
"shlex",
|
|
191
|
-
"textwrap",
|
|
192
|
-
"unicodedata",
|
|
193
|
-
"stringprep",
|
|
194
|
-
"readline",
|
|
195
|
-
"rlcompleter",
|
|
196
|
-
"struct",
|
|
197
|
-
"codecs",
|
|
198
|
-
"encodings",
|
|
199
|
-
"locale",
|
|
200
|
-
"gettext",
|
|
201
|
-
"platform",
|
|
202
|
-
"errno",
|
|
203
|
-
"ctypes",
|
|
204
|
-
"msilib",
|
|
205
|
-
"winreg",
|
|
206
|
-
"winsound",
|
|
207
|
-
"posix",
|
|
208
|
-
"pwd",
|
|
209
|
-
"spwd",
|
|
210
|
-
"grp",
|
|
211
|
-
"crypt",
|
|
212
|
-
"termios",
|
|
213
|
-
"tty",
|
|
214
|
-
"pty",
|
|
215
|
-
"fcntl",
|
|
216
|
-
"pipes",
|
|
217
|
-
"resource",
|
|
218
|
-
"nis",
|
|
219
|
-
"syslog",
|
|
220
|
-
"optparse",
|
|
221
|
-
"imp",
|
|
222
|
-
"importlib",
|
|
223
|
-
"pkgutil",
|
|
224
|
-
"modulefinder",
|
|
225
|
-
"runpy",
|
|
226
|
-
"parser",
|
|
227
|
-
"ast",
|
|
228
|
-
"symtable",
|
|
229
|
-
"symbol",
|
|
230
|
-
"token",
|
|
231
|
-
"tokenize",
|
|
232
|
-
"keyword",
|
|
233
|
-
"tabnanny",
|
|
234
|
-
"py_compile",
|
|
235
|
-
"compileall",
|
|
236
|
-
"dis",
|
|
237
|
-
"pickletools",
|
|
238
|
-
"formatter",
|
|
239
|
-
"msvcrt",
|
|
240
|
-
"winreg",
|
|
241
|
-
"winsound",
|
|
242
|
-
"posixpath",
|
|
243
|
-
"ntpath",
|
|
244
|
-
"genericpath",
|
|
245
|
-
"nt",
|
|
246
|
-
"posix",
|
|
247
|
-
"pwd",
|
|
248
|
-
"spwd",
|
|
249
|
-
"grp",
|
|
250
|
-
"crypt",
|
|
251
|
-
"termios",
|
|
252
|
-
"tty",
|
|
253
|
-
"pty",
|
|
254
|
-
"fcntl",
|
|
255
|
-
"pipes",
|
|
256
|
-
"resource",
|
|
257
|
-
"nis",
|
|
258
|
-
"syslog",
|
|
259
|
-
"optparse",
|
|
260
|
-
"imp",
|
|
261
|
-
"importlib",
|
|
262
|
-
"pkgutil",
|
|
263
|
-
"modulefinder",
|
|
264
|
-
"runpy",
|
|
265
|
-
"parser",
|
|
266
|
-
"ast",
|
|
267
|
-
"symtable",
|
|
268
|
-
"symbol",
|
|
269
|
-
"token",
|
|
270
|
-
"tokenize",
|
|
271
|
-
"keyword",
|
|
272
|
-
"tabnanny",
|
|
273
|
-
"py_compile",
|
|
274
|
-
"compileall",
|
|
275
|
-
"dis",
|
|
276
|
-
"pickletools",
|
|
277
|
-
"formatter",
|
|
278
|
-
}
|
|
279
|
-
return lib_name.lower() in stdlib_modules
|
|
280
|
-
|
|
281
|
-
def _detect_internal_modules(self) -> set[str]:
|
|
282
|
-
"""
|
|
283
|
-
Detect internal project modules to filter them out from library detection.
|
|
284
|
-
|
|
285
|
-
Returns:
|
|
286
|
-
Set of internal module names (e.g., 'tapps_agents', 'core', 'mcp', etc.)
|
|
287
|
-
"""
|
|
288
|
-
internal_modules = set()
|
|
289
|
-
|
|
290
|
-
# Check for tapps_agents package structure
|
|
291
|
-
tapps_agents_dir = self.project_root / "tapps_agents"
|
|
292
|
-
if tapps_agents_dir.exists():
|
|
293
|
-
# Add top-level package name
|
|
294
|
-
internal_modules.add("tapps_agents")
|
|
295
|
-
|
|
296
|
-
# Add subdirectories that are internal modules
|
|
297
|
-
for item in tapps_agents_dir.iterdir():
|
|
298
|
-
if item.is_dir() and not item.name.startswith("_"):
|
|
299
|
-
internal_modules.add(item.name)
|
|
300
|
-
|
|
301
|
-
# Common internal module patterns
|
|
302
|
-
internal_modules.update({
|
|
303
|
-
"core", "mcp", "security", "uuid", # Common internal modules
|
|
304
|
-
"agents", "context7", "experts", "workflow", "cli", # Framework modules
|
|
305
|
-
})
|
|
306
|
-
|
|
307
|
-
return internal_modules
|
|
308
|
-
|
|
309
|
-
def _is_internal_module(self, lib_name: str) -> bool:
|
|
310
|
-
"""
|
|
311
|
-
Check if library is an internal project module.
|
|
312
|
-
|
|
313
|
-
Args:
|
|
314
|
-
lib_name: Library name to check
|
|
315
|
-
|
|
316
|
-
Returns:
|
|
317
|
-
True if it's an internal module, False otherwise
|
|
318
|
-
"""
|
|
319
|
-
return lib_name.lower() in self._internal_modules
|
|
320
|
-
|
|
321
|
-
def detect_from_project_files(self) -> list[str]:
|
|
322
|
-
"""
|
|
323
|
-
Detect libraries from project dependency files.
|
|
324
|
-
|
|
325
|
-
Returns:
|
|
326
|
-
List of detected library names
|
|
327
|
-
"""
|
|
328
|
-
libraries = set()
|
|
329
|
-
|
|
330
|
-
# Check package.json (Node.js/TypeScript projects)
|
|
331
|
-
package_json = self.project_root / "package.json"
|
|
332
|
-
if package_json.exists():
|
|
333
|
-
try:
|
|
334
|
-
with open(package_json, encoding="utf-8") as f:
|
|
335
|
-
data = json.load(f)
|
|
336
|
-
deps = data.get("dependencies", {})
|
|
337
|
-
dev_deps = data.get("devDependencies", {})
|
|
338
|
-
all_deps = {**deps, **dev_deps}
|
|
339
|
-
for dep_name in all_deps.keys():
|
|
340
|
-
# Normalize names (e.g., @types/react -> react)
|
|
341
|
-
normalized = dep_name.replace("@types/", "").replace("@", "")
|
|
342
|
-
libraries.add(normalized)
|
|
343
|
-
except Exception as e:
|
|
344
|
-
logger.debug(f"Failed to parse package.json: {e}")
|
|
345
|
-
|
|
346
|
-
# Check requirements.txt (Python projects)
|
|
347
|
-
requirements_txt = self.project_root / "requirements.txt"
|
|
348
|
-
if requirements_txt.exists():
|
|
349
|
-
try:
|
|
350
|
-
with open(requirements_txt, encoding="utf-8") as f:
|
|
351
|
-
for line in f:
|
|
352
|
-
line = line.strip()
|
|
353
|
-
if line and not line.startswith("#"):
|
|
354
|
-
# Extract package name (before == or other specifiers)
|
|
355
|
-
pkg_name = (
|
|
356
|
-
line.split("==")[0]
|
|
357
|
-
.split(">=")[0]
|
|
358
|
-
.split("<=")[0]
|
|
359
|
-
.split(">")[0]
|
|
360
|
-
.split("<")[0]
|
|
361
|
-
.strip()
|
|
362
|
-
)
|
|
363
|
-
libraries.add(pkg_name.lower())
|
|
364
|
-
except Exception as e:
|
|
365
|
-
logger.debug(f"Failed to parse requirements.txt: {e}")
|
|
366
|
-
|
|
367
|
-
# Check pyproject.toml (Python projects)
|
|
368
|
-
pyproject_toml = self.project_root / "pyproject.toml"
|
|
369
|
-
if pyproject_toml.exists():
|
|
370
|
-
try:
|
|
371
|
-
content = pyproject_toml.read_text(encoding="utf-8")
|
|
372
|
-
# Simple regex-based extraction (could use tomli for better parsing)
|
|
373
|
-
deps_pattern = r"dependencies\s*=\s*\[(.*?)\]"
|
|
374
|
-
matches = re.findall(deps_pattern, content, re.DOTALL)
|
|
375
|
-
for match in matches:
|
|
376
|
-
# Extract quoted package names
|
|
377
|
-
pkg_pattern = r"['\"]([^'\"]+)['\"]"
|
|
378
|
-
pkgs = re.findall(pkg_pattern, match)
|
|
379
|
-
for pkg in pkgs:
|
|
380
|
-
pkg_name = pkg.split("==")[0].split(">=")[0].split("<=")[0].strip()
|
|
381
|
-
libraries.add(pkg_name.lower())
|
|
382
|
-
except Exception as e:
|
|
383
|
-
logger.debug(f"Failed to parse pyproject.toml: {e}")
|
|
384
|
-
|
|
385
|
-
return sorted(list(libraries))
|
|
386
|
-
|
|
387
|
-
def detect_from_prompt(self, prompt: str) -> list[str]:
|
|
388
|
-
"""
|
|
389
|
-
Detect libraries mentioned in prompt text.
|
|
390
|
-
|
|
391
|
-
Args:
|
|
392
|
-
prompt: Prompt text to analyze
|
|
393
|
-
|
|
394
|
-
Returns:
|
|
395
|
-
List of detected library names
|
|
396
|
-
"""
|
|
397
|
-
libraries = set()
|
|
398
|
-
|
|
399
|
-
# Common library/framework keywords
|
|
400
|
-
library_keywords = [
|
|
401
|
-
"react",
|
|
402
|
-
"vue",
|
|
403
|
-
"angular",
|
|
404
|
-
"fastapi",
|
|
405
|
-
"django",
|
|
406
|
-
"flask",
|
|
407
|
-
"pytest",
|
|
408
|
-
"jest",
|
|
409
|
-
"vitest",
|
|
410
|
-
"typescript",
|
|
411
|
-
"javascript",
|
|
412
|
-
"node",
|
|
413
|
-
"express",
|
|
414
|
-
"nextjs",
|
|
415
|
-
"nuxt",
|
|
416
|
-
"svelte",
|
|
417
|
-
"tailwind",
|
|
418
|
-
"bootstrap",
|
|
419
|
-
"material-ui",
|
|
420
|
-
"antd",
|
|
421
|
-
"sqlalchemy",
|
|
422
|
-
"prisma",
|
|
423
|
-
"mongoose",
|
|
424
|
-
"sequelize",
|
|
425
|
-
"redis",
|
|
426
|
-
"postgresql",
|
|
427
|
-
"mongodb",
|
|
428
|
-
"mysql",
|
|
429
|
-
"sqlite",
|
|
430
|
-
"pandas",
|
|
431
|
-
"numpy",
|
|
432
|
-
"tensorflow",
|
|
433
|
-
"pytorch",
|
|
434
|
-
"scikit-learn",
|
|
435
|
-
"playwright",
|
|
436
|
-
"selenium",
|
|
437
|
-
"cypress",
|
|
438
|
-
"pytest-playwright",
|
|
439
|
-
]
|
|
440
|
-
|
|
441
|
-
prompt_lower = prompt.lower()
|
|
442
|
-
for keyword in library_keywords:
|
|
443
|
-
if keyword in prompt_lower:
|
|
444
|
-
libraries.add(keyword)
|
|
445
|
-
|
|
446
|
-
# Pattern-based detection
|
|
447
|
-
# "using X library" or "with X framework"
|
|
448
|
-
patterns = [
|
|
449
|
-
r"using\s+(\w+)\s+library",
|
|
450
|
-
r"with\s+(\w+)\s+framework",
|
|
451
|
-
r"(\w+)\s+library",
|
|
452
|
-
r"(\w+)\s+framework",
|
|
453
|
-
r"(\w+)\s+package",
|
|
454
|
-
]
|
|
455
|
-
|
|
456
|
-
for pattern in patterns:
|
|
457
|
-
matches = re.findall(pattern, prompt_lower, re.IGNORECASE)
|
|
458
|
-
for match in matches:
|
|
459
|
-
if not self._is_stdlib(match):
|
|
460
|
-
libraries.add(match)
|
|
461
|
-
|
|
462
|
-
return sorted(list(libraries))
|
|
463
|
-
|
|
464
|
-
def detect_from_error(self, error_message: str) -> list[str]:
|
|
465
|
-
"""
|
|
466
|
-
Detect libraries from error messages and stack traces.
|
|
467
|
-
|
|
468
|
-
Examples:
|
|
469
|
-
- "FastAPI HTTPException" → ["fastapi"]
|
|
470
|
-
- "pytest.raises" → ["pytest"]
|
|
471
|
-
- "sqlalchemy.exc.IntegrityError" → ["sqlalchemy"]
|
|
472
|
-
|
|
473
|
-
Args:
|
|
474
|
-
error_message: Error message or stack trace to analyze
|
|
475
|
-
|
|
476
|
-
Returns:
|
|
477
|
-
List of detected library names
|
|
478
|
-
"""
|
|
479
|
-
libraries = set()
|
|
480
|
-
|
|
481
|
-
# Pattern matching for common error formats
|
|
482
|
-
patterns = [
|
|
483
|
-
r"(\w+)\.(HTTPException|ValidationError|NotFound|APIRouter|FastAPI)", # FastAPI, Pydantic
|
|
484
|
-
r"(\w+)\.(raises|fixture|mark)", # pytest
|
|
485
|
-
r"(\w+)\.(exc\.|orm\.)", # SQLAlchemy
|
|
486
|
-
r"from\s+(\w+)\s+import", # Import statements in tracebacks
|
|
487
|
-
r"(\w+)\.(core\.exceptions|db\.)", # Django
|
|
488
|
-
r"(\w+)\.(models\.|admin\.)", # Django models/admin
|
|
489
|
-
]
|
|
490
|
-
|
|
491
|
-
for pattern in patterns:
|
|
492
|
-
matches = re.findall(pattern, error_message, re.IGNORECASE)
|
|
493
|
-
for match in matches:
|
|
494
|
-
lib_name = match[0] if isinstance(match, tuple) else match
|
|
495
|
-
if not self._is_stdlib(lib_name):
|
|
496
|
-
libraries.add(lib_name.lower())
|
|
497
|
-
|
|
498
|
-
# Known library error patterns
|
|
499
|
-
library_errors = {
|
|
500
|
-
"fastapi": ["HTTPException", "APIRouter", "FastAPI", "fastapi"],
|
|
501
|
-
"pytest": ["pytest.raises", "pytest.fixture", "pytest.mark", "pytest"],
|
|
502
|
-
"sqlalchemy": ["sqlalchemy.exc", "sqlalchemy.orm", "sqlalchemy"],
|
|
503
|
-
"django": ["django.core.exceptions", "django.db", "django"],
|
|
504
|
-
"flask": ["flask", "Flask", "flask.Flask"],
|
|
505
|
-
"pydantic": ["pydantic", "ValidationError", "BaseModel"],
|
|
506
|
-
"requests": ["requests", "requests.exceptions"],
|
|
507
|
-
"httpx": ["httpx", "httpx.exceptions"],
|
|
508
|
-
"aiohttp": ["aiohttp", "aiohttp.exceptions"],
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
error_lower = error_message.lower()
|
|
512
|
-
for lib, keywords in library_errors.items():
|
|
513
|
-
if any(keyword.lower() in error_lower for keyword in keywords):
|
|
514
|
-
libraries.add(lib)
|
|
515
|
-
|
|
516
|
-
return sorted(list(libraries))
|
|
517
|
-
|
|
518
|
-
def _normalize_library_name(self, lib_name: str) -> str:
|
|
519
|
-
"""
|
|
520
|
-
Normalize library name for Context7 lookup.
|
|
521
|
-
|
|
522
|
-
Normalizations:
|
|
523
|
-
- Strip submodule paths (e.g., "playwright/test" → "playwright")
|
|
524
|
-
- Remove scoped package prefixes (e.g., "@types/react" → "react")
|
|
525
|
-
- Convert to lowercase
|
|
526
|
-
- Remove version suffixes
|
|
527
|
-
|
|
528
|
-
Args:
|
|
529
|
-
lib_name: Raw library name
|
|
530
|
-
|
|
531
|
-
Returns:
|
|
532
|
-
Normalized library name
|
|
533
|
-
"""
|
|
534
|
-
if not lib_name:
|
|
535
|
-
return ""
|
|
536
|
-
|
|
537
|
-
# Remove scoped package prefixes
|
|
538
|
-
normalized = lib_name.replace("@types/", "").replace("@", "")
|
|
539
|
-
|
|
540
|
-
# Split on path separators and take first part (base package name)
|
|
541
|
-
# Examples: "playwright/test" → "playwright", "numpy/core" → "numpy"
|
|
542
|
-
if "/" in normalized:
|
|
543
|
-
normalized = normalized.split("/")[0]
|
|
544
|
-
elif "." in normalized and not normalized.startswith("."):
|
|
545
|
-
# For Python-style imports like "django.contrib.auth", take first part
|
|
546
|
-
# But preserve names like ".env" (relative imports)
|
|
547
|
-
parts = normalized.split(".")
|
|
548
|
-
if len(parts) > 1 and parts[0]:
|
|
549
|
-
normalized = parts[0]
|
|
550
|
-
|
|
551
|
-
# Remove version suffixes and special characters
|
|
552
|
-
# Examples: "react@18.0.0" → "react", "vue@next" → "vue"
|
|
553
|
-
normalized = re.sub(r'[@~^<=>].*$', '', normalized)
|
|
554
|
-
|
|
555
|
-
# Convert to lowercase
|
|
556
|
-
normalized = normalized.lower().strip()
|
|
557
|
-
|
|
558
|
-
return normalized
|
|
559
|
-
|
|
560
|
-
def _is_valid_library_name(self, lib_name: str) -> bool:
|
|
561
|
-
"""
|
|
562
|
-
Validate if a library name is valid for Context7 lookup.
|
|
563
|
-
|
|
564
|
-
Args:
|
|
565
|
-
lib_name: Library name to validate
|
|
566
|
-
|
|
567
|
-
Returns:
|
|
568
|
-
True if valid, False otherwise
|
|
569
|
-
"""
|
|
570
|
-
if not lib_name or len(lib_name) < 1:
|
|
571
|
-
return False
|
|
572
|
-
|
|
573
|
-
# Filter out standard library modules
|
|
574
|
-
if self._is_stdlib(lib_name):
|
|
575
|
-
return False
|
|
576
|
-
|
|
577
|
-
# Filter out names with invalid characters for package names
|
|
578
|
-
# Allow: alphanumeric, hyphens, underscores
|
|
579
|
-
# Disallow: slashes (should be normalized), dots (submodules), special chars
|
|
580
|
-
if re.search(r'[^a-z0-9_-]', lib_name.lower()):
|
|
581
|
-
# Allow dots only if it's a known scoped package pattern
|
|
582
|
-
if "/" in lib_name or lib_name.count(".") > 1:
|
|
583
|
-
return False
|
|
584
|
-
|
|
585
|
-
# Filter out very short names (likely false positives)
|
|
586
|
-
if len(lib_name) < 2:
|
|
587
|
-
return False
|
|
588
|
-
|
|
589
|
-
# Filter out common false positives (generic directory/structure names)
|
|
590
|
-
#
|
|
591
|
-
# Research findings (verified with Context7 MCP):
|
|
592
|
-
# - Context7 uses partial/fuzzy matching, so generic names match many libraries
|
|
593
|
-
# - Names like "test" match "GoogleTest", "Jest" but not a library literally called "test"
|
|
594
|
-
# - These are typically project structure directories, not installed packages
|
|
595
|
-
# - We filter them when detected from CODE (local dirs), but keep if in project files (real deps)
|
|
596
|
-
#
|
|
597
|
-
# Names we DO filter (verified as directory names, not exact library matches):
|
|
598
|
-
# - "test", "tests", "testing" → matches test frameworks but not "test" itself
|
|
599
|
-
# - "utils", "util" → matches sqlite-utils, etc. but not "utils" itself
|
|
600
|
-
# - "lib", "libs" → matches libSQL, libzip but not "lib" itself
|
|
601
|
-
# - "src", "dist", "build" → standard build directories
|
|
602
|
-
# - "main", "index" → common entry point files
|
|
603
|
-
# - "views", "controllers", "routes", "handlers", "middleware" → MVC structure dirs
|
|
604
|
-
# - "types", "constants", "exceptions", "errors" → common code organization dirs
|
|
605
|
-
#
|
|
606
|
-
# Names we DON'T filter (verified as valid libraries in Context7):
|
|
607
|
-
# - "config", "models", "services" → valid library names (node-config, Foundation Models, etc.)
|
|
608
|
-
# - "settings" → valid (pydantic-settings, typed-settings)
|
|
609
|
-
# - "app", "server", "client", "api", "web" → can be valid libraries (Appwrite, webpack, etc.)
|
|
610
|
-
#
|
|
611
|
-
false_positives = {
|
|
612
|
-
# Testing directories (not libraries)
|
|
613
|
-
"test", "tests", "testing",
|
|
614
|
-
# Utility directories (not the "utils" library itself)
|
|
615
|
-
"utils", "util", "helpers", "helper",
|
|
616
|
-
# Build/structure directories
|
|
617
|
-
"lib", "libs", "src", "dist", "build",
|
|
618
|
-
# Entry point files
|
|
619
|
-
"main", "index",
|
|
620
|
-
# MVC/structure directories
|
|
621
|
-
"views", "view", "controllers", "controller", "routes", "route",
|
|
622
|
-
"handlers", "handler", "middleware", "middlewares",
|
|
623
|
-
# Code organization directories
|
|
624
|
-
"types", "type", "constants", "constant", "exceptions", "exception",
|
|
625
|
-
"errors", "error",
|
|
626
|
-
}
|
|
627
|
-
# Note: We intentionally DON'T filter "config", "models", "services", "settings",
|
|
628
|
-
# "app", "server", "client", "api", "web" because Context7 has valid libraries
|
|
629
|
-
# with these exact names. If detected from local directories, Context7 lookup
|
|
630
|
-
# will fail gracefully (debug log only). Project file detection will catch real deps.
|
|
631
|
-
if lib_name.lower() in false_positives:
|
|
632
|
-
return False
|
|
633
|
-
|
|
634
|
-
return True
|
|
635
|
-
|
|
636
|
-
def detect_all(
|
|
637
|
-
self,
|
|
638
|
-
code: str | None = None,
|
|
639
|
-
prompt: str | None = None,
|
|
640
|
-
error_message: str | None = None,
|
|
641
|
-
language: str = "python",
|
|
642
|
-
) -> list[str]:
|
|
643
|
-
"""
|
|
644
|
-
Detect libraries from all available sources.
|
|
645
|
-
|
|
646
|
-
Automatically normalizes and validates library names before returning.
|
|
647
|
-
|
|
648
|
-
Args:
|
|
649
|
-
code: Optional code content
|
|
650
|
-
prompt: Optional prompt text
|
|
651
|
-
error_message: Optional error message or stack trace
|
|
652
|
-
language: Programming language
|
|
653
|
-
|
|
654
|
-
Returns:
|
|
655
|
-
Combined list of detected library names (deduplicated and normalized)
|
|
656
|
-
"""
|
|
657
|
-
# Priority 1: Project files (most reliable - these are installed dependencies)
|
|
658
|
-
project_libraries = set(self.detect_from_project_files())
|
|
659
|
-
|
|
660
|
-
# Priority 2-4: Other sources (may include local directories)
|
|
661
|
-
other_libraries = set()
|
|
662
|
-
|
|
663
|
-
# From code (may include local directories, so we check against project files)
|
|
664
|
-
if code:
|
|
665
|
-
code_libs = self.detect_from_code(code, language)
|
|
666
|
-
for lib in code_libs:
|
|
667
|
-
# Only include code-detected libraries if they're also in project files
|
|
668
|
-
# This filters out local directory imports like "from config import ..."
|
|
669
|
-
# UNLESS they're also actual dependencies
|
|
670
|
-
normalized = self._normalize_library_name(lib)
|
|
671
|
-
if normalized and normalized in project_libraries:
|
|
672
|
-
other_libraries.add(normalized)
|
|
673
|
-
# But if it's a well-known library, include it anyway
|
|
674
|
-
# (prompt/error detection will handle explicit mentions)
|
|
675
|
-
elif normalized and self._is_well_known_library(normalized):
|
|
676
|
-
other_libraries.add(normalized)
|
|
677
|
-
|
|
678
|
-
# From prompt (explicit mentions - higher confidence)
|
|
679
|
-
if prompt:
|
|
680
|
-
other_libraries.update(self.detect_from_prompt(prompt))
|
|
681
|
-
|
|
682
|
-
# From error messages (explicit mentions - higher confidence)
|
|
683
|
-
if error_message:
|
|
684
|
-
other_libraries.update(self.detect_from_error(error_message))
|
|
685
|
-
|
|
686
|
-
# Combine: project libraries + other sources
|
|
687
|
-
all_libraries = project_libraries | other_libraries
|
|
688
|
-
|
|
689
|
-
# Normalize and validate all detected library names
|
|
690
|
-
normalized_libraries = set()
|
|
691
|
-
for lib in all_libraries:
|
|
692
|
-
normalized = self._normalize_library_name(lib)
|
|
693
|
-
if normalized and self._is_valid_library_name(normalized):
|
|
694
|
-
normalized_libraries.add(normalized)
|
|
695
|
-
|
|
696
|
-
return sorted(list(normalized_libraries))
|
|
697
|
-
|
|
698
|
-
def _is_well_known_library(self, lib_name: str) -> bool:
|
|
699
|
-
"""
|
|
700
|
-
Check if a library name is a well-known library (not a local directory).
|
|
701
|
-
|
|
702
|
-
Args:
|
|
703
|
-
lib_name: Library name to check
|
|
704
|
-
|
|
705
|
-
Returns:
|
|
706
|
-
True if it's a well-known library name
|
|
707
|
-
"""
|
|
708
|
-
well_known = {
|
|
709
|
-
# Python
|
|
710
|
-
"fastapi", "django", "flask", "pydantic", "sqlalchemy", "pytest",
|
|
711
|
-
"requests", "httpx", "aiohttp", "click", "typer", "numpy", "pandas",
|
|
712
|
-
"openai", "anthropic", "yaml", "pyyaml", "pydantic", "marshmallow",
|
|
713
|
-
# JavaScript/TypeScript
|
|
714
|
-
"react", "vue", "angular", "express", "nextjs", "nuxt", "svelte",
|
|
715
|
-
"typescript", "jest", "vitest", "playwright", "cypress", "selenium",
|
|
716
|
-
"axios", "lodash", "moment", "dayjs",
|
|
717
|
-
# Node.js
|
|
718
|
-
"node", "npm", "yarn", "pnpm",
|
|
719
|
-
# Testing
|
|
720
|
-
"playwright", "puppeteer", "selenium", "cypress", "jest", "mocha",
|
|
721
|
-
# Config/Infra - These ARE valid libraries in Context7
|
|
722
|
-
"config", "dotenv", "env",
|
|
723
|
-
}
|
|
724
|
-
return lib_name.lower() in well_known
|
|
725
|
-
|
|
1
|
+
"""
|
|
2
|
+
Library Detection Utility - Detect libraries from code, imports, and project files.
|
|
3
|
+
|
|
4
|
+
This module provides comprehensive library detection capabilities for Option 3
|
|
5
|
+
quality uplift enhancements (C1-C3, D1-D2, E2).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import ast
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
import re
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LibraryDetector:
|
|
19
|
+
"""
|
|
20
|
+
Detect libraries from various sources:
|
|
21
|
+
- Code content (import statements)
|
|
22
|
+
- Project files (package.json, requirements.txt, pyproject.toml)
|
|
23
|
+
- Prompt text (library mentions)
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, project_root: Path | None = None):
|
|
27
|
+
"""
|
|
28
|
+
Initialize library detector.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
project_root: Optional project root directory
|
|
32
|
+
"""
|
|
33
|
+
self.project_root = project_root or Path.cwd()
|
|
34
|
+
# Detect internal project modules to filter them out
|
|
35
|
+
self._internal_modules = self._detect_internal_modules()
|
|
36
|
+
|
|
37
|
+
def detect_from_code(self, code: str, language: str = "python") -> list[str]:
|
|
38
|
+
"""
|
|
39
|
+
Detect libraries from code content (import statements).
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
code: Code content to analyze
|
|
43
|
+
language: Programming language ("python", "typescript", "javascript")
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
List of detected library names
|
|
47
|
+
"""
|
|
48
|
+
libraries = set()
|
|
49
|
+
|
|
50
|
+
if language == "python":
|
|
51
|
+
libraries.update(self._detect_python_imports(code))
|
|
52
|
+
elif language in ("typescript", "javascript"):
|
|
53
|
+
libraries.update(self._detect_js_imports(code))
|
|
54
|
+
else:
|
|
55
|
+
# Try both methods
|
|
56
|
+
libraries.update(self._detect_python_imports(code))
|
|
57
|
+
libraries.update(self._detect_js_imports(code))
|
|
58
|
+
|
|
59
|
+
return sorted(list(libraries))
|
|
60
|
+
|
|
61
|
+
def _detect_python_imports(self, code: str) -> set[str]:
|
|
62
|
+
"""Detect Python imports from code."""
|
|
63
|
+
libraries = set()
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
tree = ast.parse(code)
|
|
67
|
+
for node in ast.walk(tree):
|
|
68
|
+
if isinstance(node, ast.Import):
|
|
69
|
+
for alias in node.names:
|
|
70
|
+
# Extract top-level package name
|
|
71
|
+
lib_name = alias.name.split(".")[0]
|
|
72
|
+
# Filter out standard library and internal modules
|
|
73
|
+
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
74
|
+
libraries.add(lib_name)
|
|
75
|
+
elif isinstance(node, ast.ImportFrom):
|
|
76
|
+
if node.module:
|
|
77
|
+
# Extract top-level package name
|
|
78
|
+
lib_name = node.module.split(".")[0]
|
|
79
|
+
# Filter out standard library and internal modules
|
|
80
|
+
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
81
|
+
libraries.add(lib_name)
|
|
82
|
+
except SyntaxError:
|
|
83
|
+
# Fallback to regex for invalid syntax
|
|
84
|
+
libraries.update(self._detect_imports_regex(code, "python"))
|
|
85
|
+
|
|
86
|
+
return libraries
|
|
87
|
+
|
|
88
|
+
def _detect_js_imports(self, code: str) -> set[str]:
|
|
89
|
+
"""Detect JavaScript/TypeScript imports from code."""
|
|
90
|
+
libraries = set()
|
|
91
|
+
|
|
92
|
+
# ES6 import patterns
|
|
93
|
+
import_pattern = r"import\s+(?:(?:\*\s+as\s+\w+)|(?:\{[^}]*\})|(?:\w+))\s+from\s+['\"]([^'\"]+)['\"]"
|
|
94
|
+
matches = re.findall(import_pattern, code)
|
|
95
|
+
for match in matches:
|
|
96
|
+
# Extract package name (before /)
|
|
97
|
+
lib_name = match.split("/")[0].replace("@", "")
|
|
98
|
+
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
99
|
+
libraries.add(lib_name)
|
|
100
|
+
|
|
101
|
+
# require() patterns
|
|
102
|
+
require_pattern = r"require\(['\"]([^'\"]+)['\"]\)"
|
|
103
|
+
matches = re.findall(require_pattern, code)
|
|
104
|
+
for match in matches:
|
|
105
|
+
lib_name = match.split("/")[0].replace("@", "")
|
|
106
|
+
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
107
|
+
libraries.add(lib_name)
|
|
108
|
+
|
|
109
|
+
return libraries
|
|
110
|
+
|
|
111
|
+
def _detect_imports_regex(self, code: str, language: str) -> set[str]:
|
|
112
|
+
"""Fallback regex-based import detection."""
|
|
113
|
+
libraries = set()
|
|
114
|
+
|
|
115
|
+
if language == "python":
|
|
116
|
+
# Python import patterns
|
|
117
|
+
patterns = [
|
|
118
|
+
r"^import\s+(\w+)",
|
|
119
|
+
r"^from\s+(\w+)",
|
|
120
|
+
r"import\s+(\w+)",
|
|
121
|
+
r"from\s+(\w+)",
|
|
122
|
+
]
|
|
123
|
+
for pattern in patterns:
|
|
124
|
+
matches = re.findall(pattern, code, re.MULTILINE)
|
|
125
|
+
for match in matches:
|
|
126
|
+
lib_name = match.split(".")[0]
|
|
127
|
+
if not self._is_stdlib(lib_name) and not self._is_internal_module(lib_name):
|
|
128
|
+
libraries.add(lib_name)
|
|
129
|
+
|
|
130
|
+
return libraries
|
|
131
|
+
|
|
132
|
+
def _is_stdlib(self, lib_name: str) -> bool:
|
|
133
|
+
"""Check if library is Python standard library."""
|
|
134
|
+
# Common standard library modules
|
|
135
|
+
stdlib_modules = {
|
|
136
|
+
"os",
|
|
137
|
+
"sys",
|
|
138
|
+
"json",
|
|
139
|
+
"re",
|
|
140
|
+
"pathlib",
|
|
141
|
+
"typing",
|
|
142
|
+
"collections",
|
|
143
|
+
"itertools",
|
|
144
|
+
"functools",
|
|
145
|
+
"datetime",
|
|
146
|
+
"time",
|
|
147
|
+
"logging",
|
|
148
|
+
"asyncio",
|
|
149
|
+
"threading",
|
|
150
|
+
"multiprocessing",
|
|
151
|
+
"subprocess",
|
|
152
|
+
"urllib",
|
|
153
|
+
"http",
|
|
154
|
+
"email",
|
|
155
|
+
"html",
|
|
156
|
+
"xml",
|
|
157
|
+
"sqlite3",
|
|
158
|
+
"csv",
|
|
159
|
+
"io",
|
|
160
|
+
"pickle",
|
|
161
|
+
"base64",
|
|
162
|
+
"hashlib",
|
|
163
|
+
"secrets",
|
|
164
|
+
"random",
|
|
165
|
+
"math",
|
|
166
|
+
"statistics",
|
|
167
|
+
"decimal",
|
|
168
|
+
"fractions",
|
|
169
|
+
"array",
|
|
170
|
+
"queue",
|
|
171
|
+
"heapq",
|
|
172
|
+
"bisect",
|
|
173
|
+
"copy",
|
|
174
|
+
"gc",
|
|
175
|
+
"weakref",
|
|
176
|
+
"types",
|
|
177
|
+
"inspect",
|
|
178
|
+
"traceback",
|
|
179
|
+
"warnings",
|
|
180
|
+
"contextlib",
|
|
181
|
+
"abc",
|
|
182
|
+
"atexit",
|
|
183
|
+
"argparse",
|
|
184
|
+
"getopt",
|
|
185
|
+
"shutil",
|
|
186
|
+
"tempfile",
|
|
187
|
+
"glob",
|
|
188
|
+
"fnmatch",
|
|
189
|
+
"linecache",
|
|
190
|
+
"shlex",
|
|
191
|
+
"textwrap",
|
|
192
|
+
"unicodedata",
|
|
193
|
+
"stringprep",
|
|
194
|
+
"readline",
|
|
195
|
+
"rlcompleter",
|
|
196
|
+
"struct",
|
|
197
|
+
"codecs",
|
|
198
|
+
"encodings",
|
|
199
|
+
"locale",
|
|
200
|
+
"gettext",
|
|
201
|
+
"platform",
|
|
202
|
+
"errno",
|
|
203
|
+
"ctypes",
|
|
204
|
+
"msilib",
|
|
205
|
+
"winreg",
|
|
206
|
+
"winsound",
|
|
207
|
+
"posix",
|
|
208
|
+
"pwd",
|
|
209
|
+
"spwd",
|
|
210
|
+
"grp",
|
|
211
|
+
"crypt",
|
|
212
|
+
"termios",
|
|
213
|
+
"tty",
|
|
214
|
+
"pty",
|
|
215
|
+
"fcntl",
|
|
216
|
+
"pipes",
|
|
217
|
+
"resource",
|
|
218
|
+
"nis",
|
|
219
|
+
"syslog",
|
|
220
|
+
"optparse",
|
|
221
|
+
"imp",
|
|
222
|
+
"importlib",
|
|
223
|
+
"pkgutil",
|
|
224
|
+
"modulefinder",
|
|
225
|
+
"runpy",
|
|
226
|
+
"parser",
|
|
227
|
+
"ast",
|
|
228
|
+
"symtable",
|
|
229
|
+
"symbol",
|
|
230
|
+
"token",
|
|
231
|
+
"tokenize",
|
|
232
|
+
"keyword",
|
|
233
|
+
"tabnanny",
|
|
234
|
+
"py_compile",
|
|
235
|
+
"compileall",
|
|
236
|
+
"dis",
|
|
237
|
+
"pickletools",
|
|
238
|
+
"formatter",
|
|
239
|
+
"msvcrt",
|
|
240
|
+
"winreg",
|
|
241
|
+
"winsound",
|
|
242
|
+
"posixpath",
|
|
243
|
+
"ntpath",
|
|
244
|
+
"genericpath",
|
|
245
|
+
"nt",
|
|
246
|
+
"posix",
|
|
247
|
+
"pwd",
|
|
248
|
+
"spwd",
|
|
249
|
+
"grp",
|
|
250
|
+
"crypt",
|
|
251
|
+
"termios",
|
|
252
|
+
"tty",
|
|
253
|
+
"pty",
|
|
254
|
+
"fcntl",
|
|
255
|
+
"pipes",
|
|
256
|
+
"resource",
|
|
257
|
+
"nis",
|
|
258
|
+
"syslog",
|
|
259
|
+
"optparse",
|
|
260
|
+
"imp",
|
|
261
|
+
"importlib",
|
|
262
|
+
"pkgutil",
|
|
263
|
+
"modulefinder",
|
|
264
|
+
"runpy",
|
|
265
|
+
"parser",
|
|
266
|
+
"ast",
|
|
267
|
+
"symtable",
|
|
268
|
+
"symbol",
|
|
269
|
+
"token",
|
|
270
|
+
"tokenize",
|
|
271
|
+
"keyword",
|
|
272
|
+
"tabnanny",
|
|
273
|
+
"py_compile",
|
|
274
|
+
"compileall",
|
|
275
|
+
"dis",
|
|
276
|
+
"pickletools",
|
|
277
|
+
"formatter",
|
|
278
|
+
}
|
|
279
|
+
return lib_name.lower() in stdlib_modules
|
|
280
|
+
|
|
281
|
+
def _detect_internal_modules(self) -> set[str]:
|
|
282
|
+
"""
|
|
283
|
+
Detect internal project modules to filter them out from library detection.
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
Set of internal module names (e.g., 'tapps_agents', 'core', 'mcp', etc.)
|
|
287
|
+
"""
|
|
288
|
+
internal_modules = set()
|
|
289
|
+
|
|
290
|
+
# Check for tapps_agents package structure
|
|
291
|
+
tapps_agents_dir = self.project_root / "tapps_agents"
|
|
292
|
+
if tapps_agents_dir.exists():
|
|
293
|
+
# Add top-level package name
|
|
294
|
+
internal_modules.add("tapps_agents")
|
|
295
|
+
|
|
296
|
+
# Add subdirectories that are internal modules
|
|
297
|
+
for item in tapps_agents_dir.iterdir():
|
|
298
|
+
if item.is_dir() and not item.name.startswith("_"):
|
|
299
|
+
internal_modules.add(item.name)
|
|
300
|
+
|
|
301
|
+
# Common internal module patterns
|
|
302
|
+
internal_modules.update({
|
|
303
|
+
"core", "mcp", "security", "uuid", # Common internal modules
|
|
304
|
+
"agents", "context7", "experts", "workflow", "cli", # Framework modules
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
return internal_modules
|
|
308
|
+
|
|
309
|
+
def _is_internal_module(self, lib_name: str) -> bool:
|
|
310
|
+
"""
|
|
311
|
+
Check if library is an internal project module.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
lib_name: Library name to check
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
True if it's an internal module, False otherwise
|
|
318
|
+
"""
|
|
319
|
+
return lib_name.lower() in self._internal_modules
|
|
320
|
+
|
|
321
|
+
def detect_from_project_files(self) -> list[str]:
|
|
322
|
+
"""
|
|
323
|
+
Detect libraries from project dependency files.
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
List of detected library names
|
|
327
|
+
"""
|
|
328
|
+
libraries = set()
|
|
329
|
+
|
|
330
|
+
# Check package.json (Node.js/TypeScript projects)
|
|
331
|
+
package_json = self.project_root / "package.json"
|
|
332
|
+
if package_json.exists():
|
|
333
|
+
try:
|
|
334
|
+
with open(package_json, encoding="utf-8") as f:
|
|
335
|
+
data = json.load(f)
|
|
336
|
+
deps = data.get("dependencies", {})
|
|
337
|
+
dev_deps = data.get("devDependencies", {})
|
|
338
|
+
all_deps = {**deps, **dev_deps}
|
|
339
|
+
for dep_name in all_deps.keys():
|
|
340
|
+
# Normalize names (e.g., @types/react -> react)
|
|
341
|
+
normalized = dep_name.replace("@types/", "").replace("@", "")
|
|
342
|
+
libraries.add(normalized)
|
|
343
|
+
except Exception as e:
|
|
344
|
+
logger.debug(f"Failed to parse package.json: {e}")
|
|
345
|
+
|
|
346
|
+
# Check requirements.txt (Python projects)
|
|
347
|
+
requirements_txt = self.project_root / "requirements.txt"
|
|
348
|
+
if requirements_txt.exists():
|
|
349
|
+
try:
|
|
350
|
+
with open(requirements_txt, encoding="utf-8") as f:
|
|
351
|
+
for line in f:
|
|
352
|
+
line = line.strip()
|
|
353
|
+
if line and not line.startswith("#"):
|
|
354
|
+
# Extract package name (before == or other specifiers)
|
|
355
|
+
pkg_name = (
|
|
356
|
+
line.split("==")[0]
|
|
357
|
+
.split(">=")[0]
|
|
358
|
+
.split("<=")[0]
|
|
359
|
+
.split(">")[0]
|
|
360
|
+
.split("<")[0]
|
|
361
|
+
.strip()
|
|
362
|
+
)
|
|
363
|
+
libraries.add(pkg_name.lower())
|
|
364
|
+
except Exception as e:
|
|
365
|
+
logger.debug(f"Failed to parse requirements.txt: {e}")
|
|
366
|
+
|
|
367
|
+
# Check pyproject.toml (Python projects)
|
|
368
|
+
pyproject_toml = self.project_root / "pyproject.toml"
|
|
369
|
+
if pyproject_toml.exists():
|
|
370
|
+
try:
|
|
371
|
+
content = pyproject_toml.read_text(encoding="utf-8")
|
|
372
|
+
# Simple regex-based extraction (could use tomli for better parsing)
|
|
373
|
+
deps_pattern = r"dependencies\s*=\s*\[(.*?)\]"
|
|
374
|
+
matches = re.findall(deps_pattern, content, re.DOTALL)
|
|
375
|
+
for match in matches:
|
|
376
|
+
# Extract quoted package names
|
|
377
|
+
pkg_pattern = r"['\"]([^'\"]+)['\"]"
|
|
378
|
+
pkgs = re.findall(pkg_pattern, match)
|
|
379
|
+
for pkg in pkgs:
|
|
380
|
+
pkg_name = pkg.split("==")[0].split(">=")[0].split("<=")[0].strip()
|
|
381
|
+
libraries.add(pkg_name.lower())
|
|
382
|
+
except Exception as e:
|
|
383
|
+
logger.debug(f"Failed to parse pyproject.toml: {e}")
|
|
384
|
+
|
|
385
|
+
return sorted(list(libraries))
|
|
386
|
+
|
|
387
|
+
def detect_from_prompt(self, prompt: str) -> list[str]:
|
|
388
|
+
"""
|
|
389
|
+
Detect libraries mentioned in prompt text.
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
prompt: Prompt text to analyze
|
|
393
|
+
|
|
394
|
+
Returns:
|
|
395
|
+
List of detected library names
|
|
396
|
+
"""
|
|
397
|
+
libraries = set()
|
|
398
|
+
|
|
399
|
+
# Common library/framework keywords
|
|
400
|
+
library_keywords = [
|
|
401
|
+
"react",
|
|
402
|
+
"vue",
|
|
403
|
+
"angular",
|
|
404
|
+
"fastapi",
|
|
405
|
+
"django",
|
|
406
|
+
"flask",
|
|
407
|
+
"pytest",
|
|
408
|
+
"jest",
|
|
409
|
+
"vitest",
|
|
410
|
+
"typescript",
|
|
411
|
+
"javascript",
|
|
412
|
+
"node",
|
|
413
|
+
"express",
|
|
414
|
+
"nextjs",
|
|
415
|
+
"nuxt",
|
|
416
|
+
"svelte",
|
|
417
|
+
"tailwind",
|
|
418
|
+
"bootstrap",
|
|
419
|
+
"material-ui",
|
|
420
|
+
"antd",
|
|
421
|
+
"sqlalchemy",
|
|
422
|
+
"prisma",
|
|
423
|
+
"mongoose",
|
|
424
|
+
"sequelize",
|
|
425
|
+
"redis",
|
|
426
|
+
"postgresql",
|
|
427
|
+
"mongodb",
|
|
428
|
+
"mysql",
|
|
429
|
+
"sqlite",
|
|
430
|
+
"pandas",
|
|
431
|
+
"numpy",
|
|
432
|
+
"tensorflow",
|
|
433
|
+
"pytorch",
|
|
434
|
+
"scikit-learn",
|
|
435
|
+
"playwright",
|
|
436
|
+
"selenium",
|
|
437
|
+
"cypress",
|
|
438
|
+
"pytest-playwright",
|
|
439
|
+
]
|
|
440
|
+
|
|
441
|
+
prompt_lower = prompt.lower()
|
|
442
|
+
for keyword in library_keywords:
|
|
443
|
+
if keyword in prompt_lower:
|
|
444
|
+
libraries.add(keyword)
|
|
445
|
+
|
|
446
|
+
# Pattern-based detection
|
|
447
|
+
# "using X library" or "with X framework"
|
|
448
|
+
patterns = [
|
|
449
|
+
r"using\s+(\w+)\s+library",
|
|
450
|
+
r"with\s+(\w+)\s+framework",
|
|
451
|
+
r"(\w+)\s+library",
|
|
452
|
+
r"(\w+)\s+framework",
|
|
453
|
+
r"(\w+)\s+package",
|
|
454
|
+
]
|
|
455
|
+
|
|
456
|
+
for pattern in patterns:
|
|
457
|
+
matches = re.findall(pattern, prompt_lower, re.IGNORECASE)
|
|
458
|
+
for match in matches:
|
|
459
|
+
if not self._is_stdlib(match):
|
|
460
|
+
libraries.add(match)
|
|
461
|
+
|
|
462
|
+
return sorted(list(libraries))
|
|
463
|
+
|
|
464
|
+
def detect_from_error(self, error_message: str) -> list[str]:
|
|
465
|
+
"""
|
|
466
|
+
Detect libraries from error messages and stack traces.
|
|
467
|
+
|
|
468
|
+
Examples:
|
|
469
|
+
- "FastAPI HTTPException" → ["fastapi"]
|
|
470
|
+
- "pytest.raises" → ["pytest"]
|
|
471
|
+
- "sqlalchemy.exc.IntegrityError" → ["sqlalchemy"]
|
|
472
|
+
|
|
473
|
+
Args:
|
|
474
|
+
error_message: Error message or stack trace to analyze
|
|
475
|
+
|
|
476
|
+
Returns:
|
|
477
|
+
List of detected library names
|
|
478
|
+
"""
|
|
479
|
+
libraries = set()
|
|
480
|
+
|
|
481
|
+
# Pattern matching for common error formats
|
|
482
|
+
patterns = [
|
|
483
|
+
r"(\w+)\.(HTTPException|ValidationError|NotFound|APIRouter|FastAPI)", # FastAPI, Pydantic
|
|
484
|
+
r"(\w+)\.(raises|fixture|mark)", # pytest
|
|
485
|
+
r"(\w+)\.(exc\.|orm\.)", # SQLAlchemy
|
|
486
|
+
r"from\s+(\w+)\s+import", # Import statements in tracebacks
|
|
487
|
+
r"(\w+)\.(core\.exceptions|db\.)", # Django
|
|
488
|
+
r"(\w+)\.(models\.|admin\.)", # Django models/admin
|
|
489
|
+
]
|
|
490
|
+
|
|
491
|
+
for pattern in patterns:
|
|
492
|
+
matches = re.findall(pattern, error_message, re.IGNORECASE)
|
|
493
|
+
for match in matches:
|
|
494
|
+
lib_name = match[0] if isinstance(match, tuple) else match
|
|
495
|
+
if not self._is_stdlib(lib_name):
|
|
496
|
+
libraries.add(lib_name.lower())
|
|
497
|
+
|
|
498
|
+
# Known library error patterns
|
|
499
|
+
library_errors = {
|
|
500
|
+
"fastapi": ["HTTPException", "APIRouter", "FastAPI", "fastapi"],
|
|
501
|
+
"pytest": ["pytest.raises", "pytest.fixture", "pytest.mark", "pytest"],
|
|
502
|
+
"sqlalchemy": ["sqlalchemy.exc", "sqlalchemy.orm", "sqlalchemy"],
|
|
503
|
+
"django": ["django.core.exceptions", "django.db", "django"],
|
|
504
|
+
"flask": ["flask", "Flask", "flask.Flask"],
|
|
505
|
+
"pydantic": ["pydantic", "ValidationError", "BaseModel"],
|
|
506
|
+
"requests": ["requests", "requests.exceptions"],
|
|
507
|
+
"httpx": ["httpx", "httpx.exceptions"],
|
|
508
|
+
"aiohttp": ["aiohttp", "aiohttp.exceptions"],
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
error_lower = error_message.lower()
|
|
512
|
+
for lib, keywords in library_errors.items():
|
|
513
|
+
if any(keyword.lower() in error_lower for keyword in keywords):
|
|
514
|
+
libraries.add(lib)
|
|
515
|
+
|
|
516
|
+
return sorted(list(libraries))
|
|
517
|
+
|
|
518
|
+
def _normalize_library_name(self, lib_name: str) -> str:
|
|
519
|
+
"""
|
|
520
|
+
Normalize library name for Context7 lookup.
|
|
521
|
+
|
|
522
|
+
Normalizations:
|
|
523
|
+
- Strip submodule paths (e.g., "playwright/test" → "playwright")
|
|
524
|
+
- Remove scoped package prefixes (e.g., "@types/react" → "react")
|
|
525
|
+
- Convert to lowercase
|
|
526
|
+
- Remove version suffixes
|
|
527
|
+
|
|
528
|
+
Args:
|
|
529
|
+
lib_name: Raw library name
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
Normalized library name
|
|
533
|
+
"""
|
|
534
|
+
if not lib_name:
|
|
535
|
+
return ""
|
|
536
|
+
|
|
537
|
+
# Remove scoped package prefixes
|
|
538
|
+
normalized = lib_name.replace("@types/", "").replace("@", "")
|
|
539
|
+
|
|
540
|
+
# Split on path separators and take first part (base package name)
|
|
541
|
+
# Examples: "playwright/test" → "playwright", "numpy/core" → "numpy"
|
|
542
|
+
if "/" in normalized:
|
|
543
|
+
normalized = normalized.split("/")[0]
|
|
544
|
+
elif "." in normalized and not normalized.startswith("."):
|
|
545
|
+
# For Python-style imports like "django.contrib.auth", take first part
|
|
546
|
+
# But preserve names like ".env" (relative imports)
|
|
547
|
+
parts = normalized.split(".")
|
|
548
|
+
if len(parts) > 1 and parts[0]:
|
|
549
|
+
normalized = parts[0]
|
|
550
|
+
|
|
551
|
+
# Remove version suffixes and special characters
|
|
552
|
+
# Examples: "react@18.0.0" → "react", "vue@next" → "vue"
|
|
553
|
+
normalized = re.sub(r'[@~^<=>].*$', '', normalized)
|
|
554
|
+
|
|
555
|
+
# Convert to lowercase
|
|
556
|
+
normalized = normalized.lower().strip()
|
|
557
|
+
|
|
558
|
+
return normalized
|
|
559
|
+
|
|
560
|
+
def _is_valid_library_name(self, lib_name: str) -> bool:
|
|
561
|
+
"""
|
|
562
|
+
Validate if a library name is valid for Context7 lookup.
|
|
563
|
+
|
|
564
|
+
Args:
|
|
565
|
+
lib_name: Library name to validate
|
|
566
|
+
|
|
567
|
+
Returns:
|
|
568
|
+
True if valid, False otherwise
|
|
569
|
+
"""
|
|
570
|
+
if not lib_name or len(lib_name) < 1:
|
|
571
|
+
return False
|
|
572
|
+
|
|
573
|
+
# Filter out standard library modules
|
|
574
|
+
if self._is_stdlib(lib_name):
|
|
575
|
+
return False
|
|
576
|
+
|
|
577
|
+
# Filter out names with invalid characters for package names
|
|
578
|
+
# Allow: alphanumeric, hyphens, underscores
|
|
579
|
+
# Disallow: slashes (should be normalized), dots (submodules), special chars
|
|
580
|
+
if re.search(r'[^a-z0-9_-]', lib_name.lower()):
|
|
581
|
+
# Allow dots only if it's a known scoped package pattern
|
|
582
|
+
if "/" in lib_name or lib_name.count(".") > 1:
|
|
583
|
+
return False
|
|
584
|
+
|
|
585
|
+
# Filter out very short names (likely false positives)
|
|
586
|
+
if len(lib_name) < 2:
|
|
587
|
+
return False
|
|
588
|
+
|
|
589
|
+
# Filter out common false positives (generic directory/structure names)
|
|
590
|
+
#
|
|
591
|
+
# Research findings (verified with Context7 MCP):
|
|
592
|
+
# - Context7 uses partial/fuzzy matching, so generic names match many libraries
|
|
593
|
+
# - Names like "test" match "GoogleTest", "Jest" but not a library literally called "test"
|
|
594
|
+
# - These are typically project structure directories, not installed packages
|
|
595
|
+
# - We filter them when detected from CODE (local dirs), but keep if in project files (real deps)
|
|
596
|
+
#
|
|
597
|
+
# Names we DO filter (verified as directory names, not exact library matches):
|
|
598
|
+
# - "test", "tests", "testing" → matches test frameworks but not "test" itself
|
|
599
|
+
# - "utils", "util" → matches sqlite-utils, etc. but not "utils" itself
|
|
600
|
+
# - "lib", "libs" → matches libSQL, libzip but not "lib" itself
|
|
601
|
+
# - "src", "dist", "build" → standard build directories
|
|
602
|
+
# - "main", "index" → common entry point files
|
|
603
|
+
# - "views", "controllers", "routes", "handlers", "middleware" → MVC structure dirs
|
|
604
|
+
# - "types", "constants", "exceptions", "errors" → common code organization dirs
|
|
605
|
+
#
|
|
606
|
+
# Names we DON'T filter (verified as valid libraries in Context7):
|
|
607
|
+
# - "config", "models", "services" → valid library names (node-config, Foundation Models, etc.)
|
|
608
|
+
# - "settings" → valid (pydantic-settings, typed-settings)
|
|
609
|
+
# - "app", "server", "client", "api", "web" → can be valid libraries (Appwrite, webpack, etc.)
|
|
610
|
+
#
|
|
611
|
+
false_positives = {
|
|
612
|
+
# Testing directories (not libraries)
|
|
613
|
+
"test", "tests", "testing",
|
|
614
|
+
# Utility directories (not the "utils" library itself)
|
|
615
|
+
"utils", "util", "helpers", "helper",
|
|
616
|
+
# Build/structure directories
|
|
617
|
+
"lib", "libs", "src", "dist", "build",
|
|
618
|
+
# Entry point files
|
|
619
|
+
"main", "index",
|
|
620
|
+
# MVC/structure directories
|
|
621
|
+
"views", "view", "controllers", "controller", "routes", "route",
|
|
622
|
+
"handlers", "handler", "middleware", "middlewares",
|
|
623
|
+
# Code organization directories
|
|
624
|
+
"types", "type", "constants", "constant", "exceptions", "exception",
|
|
625
|
+
"errors", "error",
|
|
626
|
+
}
|
|
627
|
+
# Note: We intentionally DON'T filter "config", "models", "services", "settings",
|
|
628
|
+
# "app", "server", "client", "api", "web" because Context7 has valid libraries
|
|
629
|
+
# with these exact names. If detected from local directories, Context7 lookup
|
|
630
|
+
# will fail gracefully (debug log only). Project file detection will catch real deps.
|
|
631
|
+
if lib_name.lower() in false_positives:
|
|
632
|
+
return False
|
|
633
|
+
|
|
634
|
+
return True
|
|
635
|
+
|
|
636
|
+
def detect_all(
|
|
637
|
+
self,
|
|
638
|
+
code: str | None = None,
|
|
639
|
+
prompt: str | None = None,
|
|
640
|
+
error_message: str | None = None,
|
|
641
|
+
language: str = "python",
|
|
642
|
+
) -> list[str]:
|
|
643
|
+
"""
|
|
644
|
+
Detect libraries from all available sources.
|
|
645
|
+
|
|
646
|
+
Automatically normalizes and validates library names before returning.
|
|
647
|
+
|
|
648
|
+
Args:
|
|
649
|
+
code: Optional code content
|
|
650
|
+
prompt: Optional prompt text
|
|
651
|
+
error_message: Optional error message or stack trace
|
|
652
|
+
language: Programming language
|
|
653
|
+
|
|
654
|
+
Returns:
|
|
655
|
+
Combined list of detected library names (deduplicated and normalized)
|
|
656
|
+
"""
|
|
657
|
+
# Priority 1: Project files (most reliable - these are installed dependencies)
|
|
658
|
+
project_libraries = set(self.detect_from_project_files())
|
|
659
|
+
|
|
660
|
+
# Priority 2-4: Other sources (may include local directories)
|
|
661
|
+
other_libraries = set()
|
|
662
|
+
|
|
663
|
+
# From code (may include local directories, so we check against project files)
|
|
664
|
+
if code:
|
|
665
|
+
code_libs = self.detect_from_code(code, language)
|
|
666
|
+
for lib in code_libs:
|
|
667
|
+
# Only include code-detected libraries if they're also in project files
|
|
668
|
+
# This filters out local directory imports like "from config import ..."
|
|
669
|
+
# UNLESS they're also actual dependencies
|
|
670
|
+
normalized = self._normalize_library_name(lib)
|
|
671
|
+
if normalized and normalized in project_libraries:
|
|
672
|
+
other_libraries.add(normalized)
|
|
673
|
+
# But if it's a well-known library, include it anyway
|
|
674
|
+
# (prompt/error detection will handle explicit mentions)
|
|
675
|
+
elif normalized and self._is_well_known_library(normalized):
|
|
676
|
+
other_libraries.add(normalized)
|
|
677
|
+
|
|
678
|
+
# From prompt (explicit mentions - higher confidence)
|
|
679
|
+
if prompt:
|
|
680
|
+
other_libraries.update(self.detect_from_prompt(prompt))
|
|
681
|
+
|
|
682
|
+
# From error messages (explicit mentions - higher confidence)
|
|
683
|
+
if error_message:
|
|
684
|
+
other_libraries.update(self.detect_from_error(error_message))
|
|
685
|
+
|
|
686
|
+
# Combine: project libraries + other sources
|
|
687
|
+
all_libraries = project_libraries | other_libraries
|
|
688
|
+
|
|
689
|
+
# Normalize and validate all detected library names
|
|
690
|
+
normalized_libraries = set()
|
|
691
|
+
for lib in all_libraries:
|
|
692
|
+
normalized = self._normalize_library_name(lib)
|
|
693
|
+
if normalized and self._is_valid_library_name(normalized):
|
|
694
|
+
normalized_libraries.add(normalized)
|
|
695
|
+
|
|
696
|
+
return sorted(list(normalized_libraries))
|
|
697
|
+
|
|
698
|
+
def _is_well_known_library(self, lib_name: str) -> bool:
|
|
699
|
+
"""
|
|
700
|
+
Check if a library name is a well-known library (not a local directory).
|
|
701
|
+
|
|
702
|
+
Args:
|
|
703
|
+
lib_name: Library name to check
|
|
704
|
+
|
|
705
|
+
Returns:
|
|
706
|
+
True if it's a well-known library name
|
|
707
|
+
"""
|
|
708
|
+
well_known = {
|
|
709
|
+
# Python
|
|
710
|
+
"fastapi", "django", "flask", "pydantic", "sqlalchemy", "pytest",
|
|
711
|
+
"requests", "httpx", "aiohttp", "click", "typer", "numpy", "pandas",
|
|
712
|
+
"openai", "anthropic", "yaml", "pyyaml", "pydantic", "marshmallow",
|
|
713
|
+
# JavaScript/TypeScript
|
|
714
|
+
"react", "vue", "angular", "express", "nextjs", "nuxt", "svelte",
|
|
715
|
+
"typescript", "jest", "vitest", "playwright", "cypress", "selenium",
|
|
716
|
+
"axios", "lodash", "moment", "dayjs",
|
|
717
|
+
# Node.js
|
|
718
|
+
"node", "npm", "yarn", "pnpm",
|
|
719
|
+
# Testing
|
|
720
|
+
"playwright", "puppeteer", "selenium", "cypress", "jest", "mocha",
|
|
721
|
+
# Config/Infra - These ARE valid libraries in Context7
|
|
722
|
+
"config", "dotenv", "env",
|
|
723
|
+
}
|
|
724
|
+
return lib_name.lower() in well_known
|
|
725
|
+
|