tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,488 +1,488 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Intelligent Cache Pre-warming - Predictive cache population based on project dependencies.
|
|
3
|
-
|
|
4
|
-
2025 Architecture Pattern:
|
|
5
|
-
- Detect project dependencies from requirements.txt, pyproject.toml, package.json
|
|
6
|
-
- Prioritize by usage frequency and relevance
|
|
7
|
-
- Background pre-warming (non-blocking)
|
|
8
|
-
- Adaptive learning from usage patterns
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
from __future__ import annotations
|
|
12
|
-
|
|
13
|
-
import asyncio
|
|
14
|
-
import logging
|
|
15
|
-
import re
|
|
16
|
-
from dataclasses import dataclass, field
|
|
17
|
-
from datetime import UTC, datetime
|
|
18
|
-
from pathlib import Path
|
|
19
|
-
from typing import TYPE_CHECKING, Any
|
|
20
|
-
|
|
21
|
-
if TYPE_CHECKING:
|
|
22
|
-
from .agent_integration import Context7AgentHelper
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@dataclass
|
|
28
|
-
class DependencyInfo:
|
|
29
|
-
"""Information about a detected dependency."""
|
|
30
|
-
|
|
31
|
-
name: str
|
|
32
|
-
version: str | None = None
|
|
33
|
-
source: str = "unknown" # "requirements.txt", "pyproject.toml", "package.json"
|
|
34
|
-
is_dev_dependency: bool = False
|
|
35
|
-
priority: int = 5 # 1 = highest, 10 = lowest
|
|
36
|
-
|
|
37
|
-
def __hash__(self):
|
|
38
|
-
return hash(self.name.lower())
|
|
39
|
-
|
|
40
|
-
def __eq__(self, other):
|
|
41
|
-
if isinstance(other, DependencyInfo):
|
|
42
|
-
return self.name.lower() == other.name.lower()
|
|
43
|
-
return False
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@dataclass
|
|
47
|
-
class PrewarmResult:
|
|
48
|
-
"""Result of cache pre-warming operation."""
|
|
49
|
-
|
|
50
|
-
total_libraries: int = 0
|
|
51
|
-
successful: int = 0
|
|
52
|
-
failed: int = 0
|
|
53
|
-
skipped: int = 0 # Already cached
|
|
54
|
-
duration_seconds: float = 0.0
|
|
55
|
-
libraries: dict[str, str] = field(default_factory=dict) # name -> status
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class DependencyDetector:
|
|
59
|
-
"""
|
|
60
|
-
Detects project dependencies from various package managers.
|
|
61
|
-
|
|
62
|
-
Supports:
|
|
63
|
-
- Python: requirements.txt, pyproject.toml, setup.py, Pipfile
|
|
64
|
-
- JavaScript/Node: package.json
|
|
65
|
-
- Multiple languages in monorepos
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
# Built-in expert libraries that Context7 likely has docs for
|
|
69
|
-
EXPERT_LIBRARIES = {
|
|
70
|
-
# Python
|
|
71
|
-
"fastapi", "django", "flask", "pydantic", "sqlalchemy", "pytest",
|
|
72
|
-
"requests", "httpx", "aiohttp", "click", "typer", "numpy", "pandas",
|
|
73
|
-
"openai", "anthropic", "langchain", "celery", "redis", "dramatiq",
|
|
74
|
-
"alembic", "asyncpg", "psycopg2", "boto3", "pillow", "jinja2",
|
|
75
|
-
"marshmallow", "attrs", "structlog", "loguru", "rich", "typer",
|
|
76
|
-
"playwright", "selenium", "beautifulsoup4", "scrapy", "lxml",
|
|
77
|
-
# JavaScript/TypeScript
|
|
78
|
-
"react", "vue", "angular", "svelte", "nextjs", "nuxt", "express",
|
|
79
|
-
"nest", "fastify", "koa", "axios", "fetch", "lodash", "moment",
|
|
80
|
-
"dayjs", "date-fns", "zod", "yup", "joi", "jest", "vitest",
|
|
81
|
-
"mocha", "chai", "cypress", "playwright", "puppeteer", "webpack",
|
|
82
|
-
"vite", "rollup", "esbuild", "tailwindcss", "styled-components",
|
|
83
|
-
"emotion", "prisma", "typeorm", "sequelize", "mongoose", "graphql",
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
# Priority mapping (lower = higher priority)
|
|
87
|
-
PRIORITY_MAP = {
|
|
88
|
-
"fastapi": 1, "django": 1, "flask": 1, "react": 1, "vue": 1,
|
|
89
|
-
"pydantic": 2, "sqlalchemy": 2, "pytest": 2, "express": 2,
|
|
90
|
-
"requests": 3, "httpx": 3, "axios": 3, "jest": 3,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
def __init__(self, project_root: Path):
|
|
94
|
-
"""Initialize dependency detector."""
|
|
95
|
-
self.project_root = project_root
|
|
96
|
-
|
|
97
|
-
def detect_all(self) -> list[DependencyInfo]:
|
|
98
|
-
"""
|
|
99
|
-
Detect all dependencies from project files.
|
|
100
|
-
|
|
101
|
-
Returns:
|
|
102
|
-
List of DependencyInfo sorted by priority
|
|
103
|
-
"""
|
|
104
|
-
dependencies: set[DependencyInfo] = set()
|
|
105
|
-
|
|
106
|
-
# Python dependencies
|
|
107
|
-
dependencies.update(self._detect_requirements_txt())
|
|
108
|
-
dependencies.update(self._detect_pyproject_toml())
|
|
109
|
-
dependencies.update(self._detect_pipfile())
|
|
110
|
-
|
|
111
|
-
# JavaScript dependencies
|
|
112
|
-
dependencies.update(self._detect_package_json())
|
|
113
|
-
|
|
114
|
-
# Sort by priority
|
|
115
|
-
return sorted(dependencies, key=lambda d: d.priority)
|
|
116
|
-
|
|
117
|
-
def _detect_requirements_txt(self) -> set[DependencyInfo]:
|
|
118
|
-
"""Detect dependencies from requirements.txt files."""
|
|
119
|
-
dependencies: set[DependencyInfo] = set()
|
|
120
|
-
|
|
121
|
-
# Check multiple possible locations
|
|
122
|
-
req_files = [
|
|
123
|
-
self.project_root / "requirements.txt",
|
|
124
|
-
self.project_root / "requirements" / "base.txt",
|
|
125
|
-
self.project_root / "requirements" / "prod.txt",
|
|
126
|
-
self.project_root / "requirements" / "dev.txt",
|
|
127
|
-
]
|
|
128
|
-
|
|
129
|
-
for req_file in req_files:
|
|
130
|
-
if req_file.exists():
|
|
131
|
-
try:
|
|
132
|
-
content = req_file.read_text(encoding="utf-8")
|
|
133
|
-
is_dev = "dev" in req_file.name
|
|
134
|
-
|
|
135
|
-
for line in content.splitlines():
|
|
136
|
-
line = line.strip()
|
|
137
|
-
if not line or line.startswith("#") or line.startswith("-"):
|
|
138
|
-
continue
|
|
139
|
-
|
|
140
|
-
# Parse package name (before ==, >=, etc.)
|
|
141
|
-
match = re.match(r"^([a-zA-Z0-9_-]+)", line)
|
|
142
|
-
if match:
|
|
143
|
-
name = match.group(1).lower()
|
|
144
|
-
version_match = re.search(r"[=<>!]+(.+)", line)
|
|
145
|
-
version = version_match.group(1) if version_match else None
|
|
146
|
-
|
|
147
|
-
# Only include if it's an expert library
|
|
148
|
-
if name in self.EXPERT_LIBRARIES:
|
|
149
|
-
dependencies.add(DependencyInfo(
|
|
150
|
-
name=name,
|
|
151
|
-
version=version,
|
|
152
|
-
source=str(req_file.name),
|
|
153
|
-
is_dev_dependency=is_dev,
|
|
154
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
155
|
-
))
|
|
156
|
-
except Exception as e:
|
|
157
|
-
logger.debug(f"Failed to parse {req_file}: {e}")
|
|
158
|
-
|
|
159
|
-
return dependencies
|
|
160
|
-
|
|
161
|
-
def _detect_pyproject_toml(self) -> set[DependencyInfo]:
|
|
162
|
-
"""Detect dependencies from pyproject.toml."""
|
|
163
|
-
dependencies: set[DependencyInfo] = set()
|
|
164
|
-
pyproject_file = self.project_root / "pyproject.toml"
|
|
165
|
-
|
|
166
|
-
if not pyproject_file.exists():
|
|
167
|
-
return dependencies
|
|
168
|
-
|
|
169
|
-
try:
|
|
170
|
-
import tomllib
|
|
171
|
-
content = pyproject_file.read_text(encoding="utf-8")
|
|
172
|
-
data = tomllib.loads(content)
|
|
173
|
-
|
|
174
|
-
# Poetry dependencies
|
|
175
|
-
if "tool" in data and "poetry" in data["tool"]:
|
|
176
|
-
poetry = data["tool"]["poetry"]
|
|
177
|
-
|
|
178
|
-
# Main dependencies
|
|
179
|
-
for dep in poetry.get("dependencies", {}).keys():
|
|
180
|
-
name = dep.lower()
|
|
181
|
-
if name in self.EXPERT_LIBRARIES:
|
|
182
|
-
dependencies.add(DependencyInfo(
|
|
183
|
-
name=name,
|
|
184
|
-
source="pyproject.toml (poetry)",
|
|
185
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
186
|
-
))
|
|
187
|
-
|
|
188
|
-
# Dev dependencies
|
|
189
|
-
for dep in poetry.get("group", {}).get("dev", {}).get("dependencies", {}).keys():
|
|
190
|
-
name = dep.lower()
|
|
191
|
-
if name in self.EXPERT_LIBRARIES:
|
|
192
|
-
dependencies.add(DependencyInfo(
|
|
193
|
-
name=name,
|
|
194
|
-
source="pyproject.toml (poetry)",
|
|
195
|
-
is_dev_dependency=True,
|
|
196
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
197
|
-
))
|
|
198
|
-
|
|
199
|
-
# PEP 621 dependencies
|
|
200
|
-
if "project" in data:
|
|
201
|
-
project = data["project"]
|
|
202
|
-
|
|
203
|
-
for dep in project.get("dependencies", []):
|
|
204
|
-
# Parse package name
|
|
205
|
-
match = re.match(r"^([a-zA-Z0-9_-]+)", dep)
|
|
206
|
-
if match:
|
|
207
|
-
name = match.group(1).lower()
|
|
208
|
-
if name in self.EXPERT_LIBRARIES:
|
|
209
|
-
dependencies.add(DependencyInfo(
|
|
210
|
-
name=name,
|
|
211
|
-
source="pyproject.toml (PEP 621)",
|
|
212
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
213
|
-
))
|
|
214
|
-
|
|
215
|
-
# Optional/dev dependencies
|
|
216
|
-
for dep_list in project.get("optional-dependencies", {}).values():
|
|
217
|
-
for dep in dep_list:
|
|
218
|
-
match = re.match(r"^([a-zA-Z0-9_-]+)", dep)
|
|
219
|
-
if match:
|
|
220
|
-
name = match.group(1).lower()
|
|
221
|
-
if name in self.EXPERT_LIBRARIES:
|
|
222
|
-
dependencies.add(DependencyInfo(
|
|
223
|
-
name=name,
|
|
224
|
-
source="pyproject.toml (PEP 621)",
|
|
225
|
-
is_dev_dependency=True,
|
|
226
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
227
|
-
))
|
|
228
|
-
|
|
229
|
-
except Exception as e:
|
|
230
|
-
logger.debug(f"Failed to parse pyproject.toml: {e}")
|
|
231
|
-
|
|
232
|
-
return dependencies
|
|
233
|
-
|
|
234
|
-
def _detect_pipfile(self) -> set[DependencyInfo]:
|
|
235
|
-
"""Detect dependencies from Pipfile."""
|
|
236
|
-
dependencies: set[DependencyInfo] = set()
|
|
237
|
-
pipfile = self.project_root / "Pipfile"
|
|
238
|
-
|
|
239
|
-
if not pipfile.exists():
|
|
240
|
-
return dependencies
|
|
241
|
-
|
|
242
|
-
try:
|
|
243
|
-
import tomllib
|
|
244
|
-
content = pipfile.read_text(encoding="utf-8")
|
|
245
|
-
data = tomllib.loads(content)
|
|
246
|
-
|
|
247
|
-
for dep in data.get("packages", {}).keys():
|
|
248
|
-
name = dep.lower()
|
|
249
|
-
if name in self.EXPERT_LIBRARIES:
|
|
250
|
-
dependencies.add(DependencyInfo(
|
|
251
|
-
name=name,
|
|
252
|
-
source="Pipfile",
|
|
253
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
254
|
-
))
|
|
255
|
-
|
|
256
|
-
for dep in data.get("dev-packages", {}).keys():
|
|
257
|
-
name = dep.lower()
|
|
258
|
-
if name in self.EXPERT_LIBRARIES:
|
|
259
|
-
dependencies.add(DependencyInfo(
|
|
260
|
-
name=name,
|
|
261
|
-
source="Pipfile",
|
|
262
|
-
is_dev_dependency=True,
|
|
263
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
264
|
-
))
|
|
265
|
-
|
|
266
|
-
except Exception as e:
|
|
267
|
-
logger.debug(f"Failed to parse Pipfile: {e}")
|
|
268
|
-
|
|
269
|
-
return dependencies
|
|
270
|
-
|
|
271
|
-
def _detect_package_json(self) -> set[DependencyInfo]:
|
|
272
|
-
"""Detect dependencies from package.json."""
|
|
273
|
-
dependencies: set[DependencyInfo] = set()
|
|
274
|
-
package_json = self.project_root / "package.json"
|
|
275
|
-
|
|
276
|
-
if not package_json.exists():
|
|
277
|
-
return dependencies
|
|
278
|
-
|
|
279
|
-
try:
|
|
280
|
-
import json
|
|
281
|
-
content = package_json.read_text(encoding="utf-8")
|
|
282
|
-
data = json.loads(content)
|
|
283
|
-
|
|
284
|
-
for dep in data.get("dependencies", {}).keys():
|
|
285
|
-
name = dep.lower().lstrip("@").replace("/", "-")
|
|
286
|
-
if name in self.EXPERT_LIBRARIES:
|
|
287
|
-
dependencies.add(DependencyInfo(
|
|
288
|
-
name=name,
|
|
289
|
-
source="package.json",
|
|
290
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
291
|
-
))
|
|
292
|
-
|
|
293
|
-
for dep in data.get("devDependencies", {}).keys():
|
|
294
|
-
name = dep.lower().lstrip("@").replace("/", "-")
|
|
295
|
-
if name in self.EXPERT_LIBRARIES:
|
|
296
|
-
dependencies.add(DependencyInfo(
|
|
297
|
-
name=name,
|
|
298
|
-
source="package.json",
|
|
299
|
-
is_dev_dependency=True,
|
|
300
|
-
priority=self.PRIORITY_MAP.get(name, 5),
|
|
301
|
-
))
|
|
302
|
-
|
|
303
|
-
except Exception as e:
|
|
304
|
-
logger.debug(f"Failed to parse package.json: {e}")
|
|
305
|
-
|
|
306
|
-
return dependencies
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
class CachePrewarmer:
|
|
310
|
-
"""
|
|
311
|
-
Intelligent cache pre-warmer for Context7 documentation.
|
|
312
|
-
|
|
313
|
-
Features:
|
|
314
|
-
- Detects project dependencies automatically
|
|
315
|
-
- Prioritizes by usage frequency
|
|
316
|
-
- Background pre-warming (non-blocking)
|
|
317
|
-
- Respects rate limits and circuit breaker
|
|
318
|
-
"""
|
|
319
|
-
|
|
320
|
-
def __init__(
|
|
321
|
-
self,
|
|
322
|
-
context7_helper: Context7AgentHelper,
|
|
323
|
-
project_root: Path | None = None,
|
|
324
|
-
max_concurrent: int = 3,
|
|
325
|
-
per_library_timeout: float = 10.0,
|
|
326
|
-
):
|
|
327
|
-
"""
|
|
328
|
-
Initialize cache pre-warmer.
|
|
329
|
-
|
|
330
|
-
Args:
|
|
331
|
-
context7_helper: Context7AgentHelper instance
|
|
332
|
-
project_root: Project root path
|
|
333
|
-
max_concurrent: Maximum concurrent pre-warm operations
|
|
334
|
-
per_library_timeout: Timeout per library in seconds
|
|
335
|
-
"""
|
|
336
|
-
self.helper = context7_helper
|
|
337
|
-
self.project_root = project_root or context7_helper.project_root
|
|
338
|
-
self.max_concurrent = max_concurrent
|
|
339
|
-
self.per_library_timeout = per_library_timeout
|
|
340
|
-
self.detector = DependencyDetector(self.project_root)
|
|
341
|
-
|
|
342
|
-
async def prewarm(
|
|
343
|
-
self,
|
|
344
|
-
max_libraries: int = 20,
|
|
345
|
-
skip_cached: bool = True,
|
|
346
|
-
priority_filter: int | None = None,
|
|
347
|
-
) -> PrewarmResult:
|
|
348
|
-
"""
|
|
349
|
-
Pre-warm cache with project dependencies.
|
|
350
|
-
|
|
351
|
-
Args:
|
|
352
|
-
max_libraries: Maximum number of libraries to pre-warm
|
|
353
|
-
skip_cached: Skip libraries that are already cached
|
|
354
|
-
priority_filter: Only pre-warm libraries with priority <= this value
|
|
355
|
-
|
|
356
|
-
Returns:
|
|
357
|
-
PrewarmResult with statistics
|
|
358
|
-
"""
|
|
359
|
-
start_time = datetime.now(UTC)
|
|
360
|
-
result = PrewarmResult()
|
|
361
|
-
|
|
362
|
-
# Detect dependencies
|
|
363
|
-
dependencies = self.detector.detect_all()
|
|
364
|
-
|
|
365
|
-
# Filter by priority
|
|
366
|
-
if priority_filter is not None:
|
|
367
|
-
dependencies = [d for d in dependencies if d.priority <= priority_filter]
|
|
368
|
-
|
|
369
|
-
# Limit to max_libraries
|
|
370
|
-
dependencies = dependencies[:max_libraries]
|
|
371
|
-
result.total_libraries = len(dependencies)
|
|
372
|
-
|
|
373
|
-
if not dependencies:
|
|
374
|
-
logger.info("No libraries detected for pre-warming")
|
|
375
|
-
return result
|
|
376
|
-
|
|
377
|
-
logger.info(f"Pre-warming cache with {len(dependencies)} libraries")
|
|
378
|
-
|
|
379
|
-
# Pre-warm in parallel with bounded concurrency
|
|
380
|
-
semaphore = asyncio.Semaphore(self.max_concurrent)
|
|
381
|
-
|
|
382
|
-
async def prewarm_one(dep: DependencyInfo) -> tuple[str, str]:
|
|
383
|
-
"""Pre-warm single library."""
|
|
384
|
-
async with semaphore:
|
|
385
|
-
# Check if already cached
|
|
386
|
-
if skip_cached and self.helper.is_library_cached(dep.name):
|
|
387
|
-
return (dep.name, "skipped")
|
|
388
|
-
|
|
389
|
-
try:
|
|
390
|
-
doc = await asyncio.wait_for(
|
|
391
|
-
self.helper.get_documentation(dep.name, topic="overview"),
|
|
392
|
-
timeout=self.per_library_timeout,
|
|
393
|
-
)
|
|
394
|
-
if doc:
|
|
395
|
-
return (dep.name, "success")
|
|
396
|
-
else:
|
|
397
|
-
return (dep.name, "not_found")
|
|
398
|
-
except asyncio.TimeoutError:
|
|
399
|
-
return (dep.name, "timeout")
|
|
400
|
-
except Exception as e:
|
|
401
|
-
logger.debug(f"Pre-warm failed for {dep.name}: {e}")
|
|
402
|
-
return (dep.name, "error")
|
|
403
|
-
|
|
404
|
-
# Execute all pre-warms
|
|
405
|
-
tasks = [prewarm_one(dep) for dep in dependencies]
|
|
406
|
-
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
407
|
-
|
|
408
|
-
# Aggregate results
|
|
409
|
-
for item in results:
|
|
410
|
-
if isinstance(item, Exception):
|
|
411
|
-
result.failed += 1
|
|
412
|
-
result.libraries["unknown"] = f"error: {item}"
|
|
413
|
-
elif isinstance(item, tuple):
|
|
414
|
-
name, status = item
|
|
415
|
-
result.libraries[name] = status
|
|
416
|
-
if status == "success":
|
|
417
|
-
result.successful += 1
|
|
418
|
-
elif status == "skipped":
|
|
419
|
-
result.skipped += 1
|
|
420
|
-
else:
|
|
421
|
-
result.failed += 1
|
|
422
|
-
|
|
423
|
-
result.duration_seconds = (datetime.now(UTC) - start_time).total_seconds()
|
|
424
|
-
|
|
425
|
-
logger.info(
|
|
426
|
-
f"Pre-warm completed: {result.successful} success, "
|
|
427
|
-
f"{result.skipped} skipped, {result.failed} failed "
|
|
428
|
-
f"({result.duration_seconds:.1f}s)"
|
|
429
|
-
)
|
|
430
|
-
|
|
431
|
-
return result
|
|
432
|
-
|
|
433
|
-
async def prewarm_background(
|
|
434
|
-
self,
|
|
435
|
-
max_libraries: int = 10,
|
|
436
|
-
delay_seconds: float = 1.0,
|
|
437
|
-
) -> asyncio.Task:
|
|
438
|
-
"""
|
|
439
|
-
Start background pre-warming (non-blocking).
|
|
440
|
-
|
|
441
|
-
Args:
|
|
442
|
-
max_libraries: Maximum libraries to pre-warm
|
|
443
|
-
delay_seconds: Initial delay before starting
|
|
444
|
-
|
|
445
|
-
Returns:
|
|
446
|
-
asyncio.Task that can be cancelled
|
|
447
|
-
"""
|
|
448
|
-
async def _background_prewarm():
|
|
449
|
-
await asyncio.sleep(delay_seconds)
|
|
450
|
-
await self.prewarm(max_libraries=max_libraries, skip_cached=True)
|
|
451
|
-
|
|
452
|
-
return asyncio.create_task(_background_prewarm())
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
async def prewarm_on_init(
|
|
456
|
-
context7_helper: Context7AgentHelper,
|
|
457
|
-
project_root: Path | None = None,
|
|
458
|
-
max_libraries: int = 10,
|
|
459
|
-
) -> PrewarmResult | None:
|
|
460
|
-
"""
|
|
461
|
-
Pre-warm cache during initialization (convenience function).
|
|
462
|
-
|
|
463
|
-
This is called during `tapps-agents init` to populate cache with
|
|
464
|
-
project dependencies.
|
|
465
|
-
|
|
466
|
-
Args:
|
|
467
|
-
context7_helper: Context7AgentHelper instance
|
|
468
|
-
project_root: Project root path
|
|
469
|
-
max_libraries: Maximum libraries to pre-warm
|
|
470
|
-
|
|
471
|
-
Returns:
|
|
472
|
-
PrewarmResult or None if Context7 is disabled
|
|
473
|
-
"""
|
|
474
|
-
if not context7_helper.enabled:
|
|
475
|
-
return None
|
|
476
|
-
|
|
477
|
-
prewarmer = CachePrewarmer(
|
|
478
|
-
context7_helper=context7_helper,
|
|
479
|
-
project_root=project_root,
|
|
480
|
-
max_concurrent=3,
|
|
481
|
-
per_library_timeout=10.0,
|
|
482
|
-
)
|
|
483
|
-
|
|
484
|
-
return await prewarmer.prewarm(
|
|
485
|
-
max_libraries=max_libraries,
|
|
486
|
-
skip_cached=True,
|
|
487
|
-
priority_filter=5, # Only high-priority libraries
|
|
488
|
-
)
|
|
1
|
+
"""
|
|
2
|
+
Intelligent Cache Pre-warming - Predictive cache population based on project dependencies.
|
|
3
|
+
|
|
4
|
+
2025 Architecture Pattern:
|
|
5
|
+
- Detect project dependencies from requirements.txt, pyproject.toml, package.json
|
|
6
|
+
- Prioritize by usage frequency and relevance
|
|
7
|
+
- Background pre-warming (non-blocking)
|
|
8
|
+
- Adaptive learning from usage patterns
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import logging
|
|
15
|
+
import re
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
from datetime import UTC, datetime
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import TYPE_CHECKING, Any
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from .agent_integration import Context7AgentHelper
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class DependencyInfo:
|
|
29
|
+
"""Information about a detected dependency."""
|
|
30
|
+
|
|
31
|
+
name: str
|
|
32
|
+
version: str | None = None
|
|
33
|
+
source: str = "unknown" # "requirements.txt", "pyproject.toml", "package.json"
|
|
34
|
+
is_dev_dependency: bool = False
|
|
35
|
+
priority: int = 5 # 1 = highest, 10 = lowest
|
|
36
|
+
|
|
37
|
+
def __hash__(self):
|
|
38
|
+
return hash(self.name.lower())
|
|
39
|
+
|
|
40
|
+
def __eq__(self, other):
|
|
41
|
+
if isinstance(other, DependencyInfo):
|
|
42
|
+
return self.name.lower() == other.name.lower()
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class PrewarmResult:
|
|
48
|
+
"""Result of cache pre-warming operation."""
|
|
49
|
+
|
|
50
|
+
total_libraries: int = 0
|
|
51
|
+
successful: int = 0
|
|
52
|
+
failed: int = 0
|
|
53
|
+
skipped: int = 0 # Already cached
|
|
54
|
+
duration_seconds: float = 0.0
|
|
55
|
+
libraries: dict[str, str] = field(default_factory=dict) # name -> status
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DependencyDetector:
|
|
59
|
+
"""
|
|
60
|
+
Detects project dependencies from various package managers.
|
|
61
|
+
|
|
62
|
+
Supports:
|
|
63
|
+
- Python: requirements.txt, pyproject.toml, setup.py, Pipfile
|
|
64
|
+
- JavaScript/Node: package.json
|
|
65
|
+
- Multiple languages in monorepos
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Built-in expert libraries that Context7 likely has docs for
|
|
69
|
+
EXPERT_LIBRARIES = {
|
|
70
|
+
# Python
|
|
71
|
+
"fastapi", "django", "flask", "pydantic", "sqlalchemy", "pytest",
|
|
72
|
+
"requests", "httpx", "aiohttp", "click", "typer", "numpy", "pandas",
|
|
73
|
+
"openai", "anthropic", "langchain", "celery", "redis", "dramatiq",
|
|
74
|
+
"alembic", "asyncpg", "psycopg2", "boto3", "pillow", "jinja2",
|
|
75
|
+
"marshmallow", "attrs", "structlog", "loguru", "rich", "typer",
|
|
76
|
+
"playwright", "selenium", "beautifulsoup4", "scrapy", "lxml",
|
|
77
|
+
# JavaScript/TypeScript
|
|
78
|
+
"react", "vue", "angular", "svelte", "nextjs", "nuxt", "express",
|
|
79
|
+
"nest", "fastify", "koa", "axios", "fetch", "lodash", "moment",
|
|
80
|
+
"dayjs", "date-fns", "zod", "yup", "joi", "jest", "vitest",
|
|
81
|
+
"mocha", "chai", "cypress", "playwright", "puppeteer", "webpack",
|
|
82
|
+
"vite", "rollup", "esbuild", "tailwindcss", "styled-components",
|
|
83
|
+
"emotion", "prisma", "typeorm", "sequelize", "mongoose", "graphql",
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Priority mapping (lower = higher priority)
|
|
87
|
+
PRIORITY_MAP = {
|
|
88
|
+
"fastapi": 1, "django": 1, "flask": 1, "react": 1, "vue": 1,
|
|
89
|
+
"pydantic": 2, "sqlalchemy": 2, "pytest": 2, "express": 2,
|
|
90
|
+
"requests": 3, "httpx": 3, "axios": 3, "jest": 3,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def __init__(self, project_root: Path):
|
|
94
|
+
"""Initialize dependency detector."""
|
|
95
|
+
self.project_root = project_root
|
|
96
|
+
|
|
97
|
+
def detect_all(self) -> list[DependencyInfo]:
|
|
98
|
+
"""
|
|
99
|
+
Detect all dependencies from project files.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
List of DependencyInfo sorted by priority
|
|
103
|
+
"""
|
|
104
|
+
dependencies: set[DependencyInfo] = set()
|
|
105
|
+
|
|
106
|
+
# Python dependencies
|
|
107
|
+
dependencies.update(self._detect_requirements_txt())
|
|
108
|
+
dependencies.update(self._detect_pyproject_toml())
|
|
109
|
+
dependencies.update(self._detect_pipfile())
|
|
110
|
+
|
|
111
|
+
# JavaScript dependencies
|
|
112
|
+
dependencies.update(self._detect_package_json())
|
|
113
|
+
|
|
114
|
+
# Sort by priority
|
|
115
|
+
return sorted(dependencies, key=lambda d: d.priority)
|
|
116
|
+
|
|
117
|
+
def _detect_requirements_txt(self) -> set[DependencyInfo]:
|
|
118
|
+
"""Detect dependencies from requirements.txt files."""
|
|
119
|
+
dependencies: set[DependencyInfo] = set()
|
|
120
|
+
|
|
121
|
+
# Check multiple possible locations
|
|
122
|
+
req_files = [
|
|
123
|
+
self.project_root / "requirements.txt",
|
|
124
|
+
self.project_root / "requirements" / "base.txt",
|
|
125
|
+
self.project_root / "requirements" / "prod.txt",
|
|
126
|
+
self.project_root / "requirements" / "dev.txt",
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
for req_file in req_files:
|
|
130
|
+
if req_file.exists():
|
|
131
|
+
try:
|
|
132
|
+
content = req_file.read_text(encoding="utf-8")
|
|
133
|
+
is_dev = "dev" in req_file.name
|
|
134
|
+
|
|
135
|
+
for line in content.splitlines():
|
|
136
|
+
line = line.strip()
|
|
137
|
+
if not line or line.startswith("#") or line.startswith("-"):
|
|
138
|
+
continue
|
|
139
|
+
|
|
140
|
+
# Parse package name (before ==, >=, etc.)
|
|
141
|
+
match = re.match(r"^([a-zA-Z0-9_-]+)", line)
|
|
142
|
+
if match:
|
|
143
|
+
name = match.group(1).lower()
|
|
144
|
+
version_match = re.search(r"[=<>!]+(.+)", line)
|
|
145
|
+
version = version_match.group(1) if version_match else None
|
|
146
|
+
|
|
147
|
+
# Only include if it's an expert library
|
|
148
|
+
if name in self.EXPERT_LIBRARIES:
|
|
149
|
+
dependencies.add(DependencyInfo(
|
|
150
|
+
name=name,
|
|
151
|
+
version=version,
|
|
152
|
+
source=str(req_file.name),
|
|
153
|
+
is_dev_dependency=is_dev,
|
|
154
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
155
|
+
))
|
|
156
|
+
except Exception as e:
|
|
157
|
+
logger.debug(f"Failed to parse {req_file}: {e}")
|
|
158
|
+
|
|
159
|
+
return dependencies
|
|
160
|
+
|
|
161
|
+
def _detect_pyproject_toml(self) -> set[DependencyInfo]:
|
|
162
|
+
"""Detect dependencies from pyproject.toml."""
|
|
163
|
+
dependencies: set[DependencyInfo] = set()
|
|
164
|
+
pyproject_file = self.project_root / "pyproject.toml"
|
|
165
|
+
|
|
166
|
+
if not pyproject_file.exists():
|
|
167
|
+
return dependencies
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
import tomllib
|
|
171
|
+
content = pyproject_file.read_text(encoding="utf-8")
|
|
172
|
+
data = tomllib.loads(content)
|
|
173
|
+
|
|
174
|
+
# Poetry dependencies
|
|
175
|
+
if "tool" in data and "poetry" in data["tool"]:
|
|
176
|
+
poetry = data["tool"]["poetry"]
|
|
177
|
+
|
|
178
|
+
# Main dependencies
|
|
179
|
+
for dep in poetry.get("dependencies", {}).keys():
|
|
180
|
+
name = dep.lower()
|
|
181
|
+
if name in self.EXPERT_LIBRARIES:
|
|
182
|
+
dependencies.add(DependencyInfo(
|
|
183
|
+
name=name,
|
|
184
|
+
source="pyproject.toml (poetry)",
|
|
185
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
186
|
+
))
|
|
187
|
+
|
|
188
|
+
# Dev dependencies
|
|
189
|
+
for dep in poetry.get("group", {}).get("dev", {}).get("dependencies", {}).keys():
|
|
190
|
+
name = dep.lower()
|
|
191
|
+
if name in self.EXPERT_LIBRARIES:
|
|
192
|
+
dependencies.add(DependencyInfo(
|
|
193
|
+
name=name,
|
|
194
|
+
source="pyproject.toml (poetry)",
|
|
195
|
+
is_dev_dependency=True,
|
|
196
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
197
|
+
))
|
|
198
|
+
|
|
199
|
+
# PEP 621 dependencies
|
|
200
|
+
if "project" in data:
|
|
201
|
+
project = data["project"]
|
|
202
|
+
|
|
203
|
+
for dep in project.get("dependencies", []):
|
|
204
|
+
# Parse package name
|
|
205
|
+
match = re.match(r"^([a-zA-Z0-9_-]+)", dep)
|
|
206
|
+
if match:
|
|
207
|
+
name = match.group(1).lower()
|
|
208
|
+
if name in self.EXPERT_LIBRARIES:
|
|
209
|
+
dependencies.add(DependencyInfo(
|
|
210
|
+
name=name,
|
|
211
|
+
source="pyproject.toml (PEP 621)",
|
|
212
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
213
|
+
))
|
|
214
|
+
|
|
215
|
+
# Optional/dev dependencies
|
|
216
|
+
for dep_list in project.get("optional-dependencies", {}).values():
|
|
217
|
+
for dep in dep_list:
|
|
218
|
+
match = re.match(r"^([a-zA-Z0-9_-]+)", dep)
|
|
219
|
+
if match:
|
|
220
|
+
name = match.group(1).lower()
|
|
221
|
+
if name in self.EXPERT_LIBRARIES:
|
|
222
|
+
dependencies.add(DependencyInfo(
|
|
223
|
+
name=name,
|
|
224
|
+
source="pyproject.toml (PEP 621)",
|
|
225
|
+
is_dev_dependency=True,
|
|
226
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
227
|
+
))
|
|
228
|
+
|
|
229
|
+
except Exception as e:
|
|
230
|
+
logger.debug(f"Failed to parse pyproject.toml: {e}")
|
|
231
|
+
|
|
232
|
+
return dependencies
|
|
233
|
+
|
|
234
|
+
def _detect_pipfile(self) -> set[DependencyInfo]:
|
|
235
|
+
"""Detect dependencies from Pipfile."""
|
|
236
|
+
dependencies: set[DependencyInfo] = set()
|
|
237
|
+
pipfile = self.project_root / "Pipfile"
|
|
238
|
+
|
|
239
|
+
if not pipfile.exists():
|
|
240
|
+
return dependencies
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
import tomllib
|
|
244
|
+
content = pipfile.read_text(encoding="utf-8")
|
|
245
|
+
data = tomllib.loads(content)
|
|
246
|
+
|
|
247
|
+
for dep in data.get("packages", {}).keys():
|
|
248
|
+
name = dep.lower()
|
|
249
|
+
if name in self.EXPERT_LIBRARIES:
|
|
250
|
+
dependencies.add(DependencyInfo(
|
|
251
|
+
name=name,
|
|
252
|
+
source="Pipfile",
|
|
253
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
254
|
+
))
|
|
255
|
+
|
|
256
|
+
for dep in data.get("dev-packages", {}).keys():
|
|
257
|
+
name = dep.lower()
|
|
258
|
+
if name in self.EXPERT_LIBRARIES:
|
|
259
|
+
dependencies.add(DependencyInfo(
|
|
260
|
+
name=name,
|
|
261
|
+
source="Pipfile",
|
|
262
|
+
is_dev_dependency=True,
|
|
263
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
264
|
+
))
|
|
265
|
+
|
|
266
|
+
except Exception as e:
|
|
267
|
+
logger.debug(f"Failed to parse Pipfile: {e}")
|
|
268
|
+
|
|
269
|
+
return dependencies
|
|
270
|
+
|
|
271
|
+
def _detect_package_json(self) -> set[DependencyInfo]:
|
|
272
|
+
"""Detect dependencies from package.json."""
|
|
273
|
+
dependencies: set[DependencyInfo] = set()
|
|
274
|
+
package_json = self.project_root / "package.json"
|
|
275
|
+
|
|
276
|
+
if not package_json.exists():
|
|
277
|
+
return dependencies
|
|
278
|
+
|
|
279
|
+
try:
|
|
280
|
+
import json
|
|
281
|
+
content = package_json.read_text(encoding="utf-8")
|
|
282
|
+
data = json.loads(content)
|
|
283
|
+
|
|
284
|
+
for dep in data.get("dependencies", {}).keys():
|
|
285
|
+
name = dep.lower().lstrip("@").replace("/", "-")
|
|
286
|
+
if name in self.EXPERT_LIBRARIES:
|
|
287
|
+
dependencies.add(DependencyInfo(
|
|
288
|
+
name=name,
|
|
289
|
+
source="package.json",
|
|
290
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
291
|
+
))
|
|
292
|
+
|
|
293
|
+
for dep in data.get("devDependencies", {}).keys():
|
|
294
|
+
name = dep.lower().lstrip("@").replace("/", "-")
|
|
295
|
+
if name in self.EXPERT_LIBRARIES:
|
|
296
|
+
dependencies.add(DependencyInfo(
|
|
297
|
+
name=name,
|
|
298
|
+
source="package.json",
|
|
299
|
+
is_dev_dependency=True,
|
|
300
|
+
priority=self.PRIORITY_MAP.get(name, 5),
|
|
301
|
+
))
|
|
302
|
+
|
|
303
|
+
except Exception as e:
|
|
304
|
+
logger.debug(f"Failed to parse package.json: {e}")
|
|
305
|
+
|
|
306
|
+
return dependencies
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
class CachePrewarmer:
|
|
310
|
+
"""
|
|
311
|
+
Intelligent cache pre-warmer for Context7 documentation.
|
|
312
|
+
|
|
313
|
+
Features:
|
|
314
|
+
- Detects project dependencies automatically
|
|
315
|
+
- Prioritizes by usage frequency
|
|
316
|
+
- Background pre-warming (non-blocking)
|
|
317
|
+
- Respects rate limits and circuit breaker
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
def __init__(
|
|
321
|
+
self,
|
|
322
|
+
context7_helper: Context7AgentHelper,
|
|
323
|
+
project_root: Path | None = None,
|
|
324
|
+
max_concurrent: int = 3,
|
|
325
|
+
per_library_timeout: float = 10.0,
|
|
326
|
+
):
|
|
327
|
+
"""
|
|
328
|
+
Initialize cache pre-warmer.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
context7_helper: Context7AgentHelper instance
|
|
332
|
+
project_root: Project root path
|
|
333
|
+
max_concurrent: Maximum concurrent pre-warm operations
|
|
334
|
+
per_library_timeout: Timeout per library in seconds
|
|
335
|
+
"""
|
|
336
|
+
self.helper = context7_helper
|
|
337
|
+
self.project_root = project_root or context7_helper.project_root
|
|
338
|
+
self.max_concurrent = max_concurrent
|
|
339
|
+
self.per_library_timeout = per_library_timeout
|
|
340
|
+
self.detector = DependencyDetector(self.project_root)
|
|
341
|
+
|
|
342
|
+
async def prewarm(
|
|
343
|
+
self,
|
|
344
|
+
max_libraries: int = 20,
|
|
345
|
+
skip_cached: bool = True,
|
|
346
|
+
priority_filter: int | None = None,
|
|
347
|
+
) -> PrewarmResult:
|
|
348
|
+
"""
|
|
349
|
+
Pre-warm cache with project dependencies.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
max_libraries: Maximum number of libraries to pre-warm
|
|
353
|
+
skip_cached: Skip libraries that are already cached
|
|
354
|
+
priority_filter: Only pre-warm libraries with priority <= this value
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
PrewarmResult with statistics
|
|
358
|
+
"""
|
|
359
|
+
start_time = datetime.now(UTC)
|
|
360
|
+
result = PrewarmResult()
|
|
361
|
+
|
|
362
|
+
# Detect dependencies
|
|
363
|
+
dependencies = self.detector.detect_all()
|
|
364
|
+
|
|
365
|
+
# Filter by priority
|
|
366
|
+
if priority_filter is not None:
|
|
367
|
+
dependencies = [d for d in dependencies if d.priority <= priority_filter]
|
|
368
|
+
|
|
369
|
+
# Limit to max_libraries
|
|
370
|
+
dependencies = dependencies[:max_libraries]
|
|
371
|
+
result.total_libraries = len(dependencies)
|
|
372
|
+
|
|
373
|
+
if not dependencies:
|
|
374
|
+
logger.info("No libraries detected for pre-warming")
|
|
375
|
+
return result
|
|
376
|
+
|
|
377
|
+
logger.info(f"Pre-warming cache with {len(dependencies)} libraries")
|
|
378
|
+
|
|
379
|
+
# Pre-warm in parallel with bounded concurrency
|
|
380
|
+
semaphore = asyncio.Semaphore(self.max_concurrent)
|
|
381
|
+
|
|
382
|
+
async def prewarm_one(dep: DependencyInfo) -> tuple[str, str]:
|
|
383
|
+
"""Pre-warm single library."""
|
|
384
|
+
async with semaphore:
|
|
385
|
+
# Check if already cached
|
|
386
|
+
if skip_cached and self.helper.is_library_cached(dep.name):
|
|
387
|
+
return (dep.name, "skipped")
|
|
388
|
+
|
|
389
|
+
try:
|
|
390
|
+
doc = await asyncio.wait_for(
|
|
391
|
+
self.helper.get_documentation(dep.name, topic="overview"),
|
|
392
|
+
timeout=self.per_library_timeout,
|
|
393
|
+
)
|
|
394
|
+
if doc:
|
|
395
|
+
return (dep.name, "success")
|
|
396
|
+
else:
|
|
397
|
+
return (dep.name, "not_found")
|
|
398
|
+
except asyncio.TimeoutError:
|
|
399
|
+
return (dep.name, "timeout")
|
|
400
|
+
except Exception as e:
|
|
401
|
+
logger.debug(f"Pre-warm failed for {dep.name}: {e}")
|
|
402
|
+
return (dep.name, "error")
|
|
403
|
+
|
|
404
|
+
# Execute all pre-warms
|
|
405
|
+
tasks = [prewarm_one(dep) for dep in dependencies]
|
|
406
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
407
|
+
|
|
408
|
+
# Aggregate results
|
|
409
|
+
for item in results:
|
|
410
|
+
if isinstance(item, Exception):
|
|
411
|
+
result.failed += 1
|
|
412
|
+
result.libraries["unknown"] = f"error: {item}"
|
|
413
|
+
elif isinstance(item, tuple):
|
|
414
|
+
name, status = item
|
|
415
|
+
result.libraries[name] = status
|
|
416
|
+
if status == "success":
|
|
417
|
+
result.successful += 1
|
|
418
|
+
elif status == "skipped":
|
|
419
|
+
result.skipped += 1
|
|
420
|
+
else:
|
|
421
|
+
result.failed += 1
|
|
422
|
+
|
|
423
|
+
result.duration_seconds = (datetime.now(UTC) - start_time).total_seconds()
|
|
424
|
+
|
|
425
|
+
logger.info(
|
|
426
|
+
f"Pre-warm completed: {result.successful} success, "
|
|
427
|
+
f"{result.skipped} skipped, {result.failed} failed "
|
|
428
|
+
f"({result.duration_seconds:.1f}s)"
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
return result
|
|
432
|
+
|
|
433
|
+
async def prewarm_background(
|
|
434
|
+
self,
|
|
435
|
+
max_libraries: int = 10,
|
|
436
|
+
delay_seconds: float = 1.0,
|
|
437
|
+
) -> asyncio.Task:
|
|
438
|
+
"""
|
|
439
|
+
Start background pre-warming (non-blocking).
|
|
440
|
+
|
|
441
|
+
Args:
|
|
442
|
+
max_libraries: Maximum libraries to pre-warm
|
|
443
|
+
delay_seconds: Initial delay before starting
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
asyncio.Task that can be cancelled
|
|
447
|
+
"""
|
|
448
|
+
async def _background_prewarm():
|
|
449
|
+
await asyncio.sleep(delay_seconds)
|
|
450
|
+
await self.prewarm(max_libraries=max_libraries, skip_cached=True)
|
|
451
|
+
|
|
452
|
+
return asyncio.create_task(_background_prewarm())
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
async def prewarm_on_init(
|
|
456
|
+
context7_helper: Context7AgentHelper,
|
|
457
|
+
project_root: Path | None = None,
|
|
458
|
+
max_libraries: int = 10,
|
|
459
|
+
) -> PrewarmResult | None:
|
|
460
|
+
"""
|
|
461
|
+
Pre-warm cache during initialization (convenience function).
|
|
462
|
+
|
|
463
|
+
This is called during `tapps-agents init` to populate cache with
|
|
464
|
+
project dependencies.
|
|
465
|
+
|
|
466
|
+
Args:
|
|
467
|
+
context7_helper: Context7AgentHelper instance
|
|
468
|
+
project_root: Project root path
|
|
469
|
+
max_libraries: Maximum libraries to pre-warm
|
|
470
|
+
|
|
471
|
+
Returns:
|
|
472
|
+
PrewarmResult or None if Context7 is disabled
|
|
473
|
+
"""
|
|
474
|
+
if not context7_helper.enabled:
|
|
475
|
+
return None
|
|
476
|
+
|
|
477
|
+
prewarmer = CachePrewarmer(
|
|
478
|
+
context7_helper=context7_helper,
|
|
479
|
+
project_root=project_root,
|
|
480
|
+
max_concurrent=3,
|
|
481
|
+
per_library_timeout=10.0,
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
return await prewarmer.prewarm(
|
|
485
|
+
max_libraries=max_libraries,
|
|
486
|
+
skip_cached=True,
|
|
487
|
+
priority_filter=5, # Only high-priority libraries
|
|
488
|
+
)
|