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,369 +1,369 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Fuzzy Matching for Context7 KB cache lookups.
|
|
3
|
-
|
|
4
|
-
Provides fuzzy matching capabilities to handle variations in library/topic queries,
|
|
5
|
-
improving cache hit rates when exact matches aren't available.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from dataclasses import dataclass
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
fuzz: Any | None = None
|
|
12
|
-
process: Any | None = None
|
|
13
|
-
|
|
14
|
-
try:
|
|
15
|
-
from rapidfuzz import fuzz as _rf_fuzz
|
|
16
|
-
from rapidfuzz import process as _rf_process
|
|
17
|
-
|
|
18
|
-
fuzz = _rf_fuzz
|
|
19
|
-
process = _rf_process
|
|
20
|
-
RAPIDFUZZ_AVAILABLE = True
|
|
21
|
-
except ImportError:
|
|
22
|
-
try:
|
|
23
|
-
from fuzzywuzzy import fuzz as _fw_fuzz
|
|
24
|
-
from fuzzywuzzy import process as _fw_process
|
|
25
|
-
|
|
26
|
-
fuzz = _fw_fuzz
|
|
27
|
-
process = _fw_process
|
|
28
|
-
RAPIDFUZZ_AVAILABLE = False
|
|
29
|
-
except ImportError:
|
|
30
|
-
# Fallback to simple string similarity
|
|
31
|
-
RAPIDFUZZ_AVAILABLE = False
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@dataclass
|
|
35
|
-
class FuzzyMatch:
|
|
36
|
-
"""Result of a fuzzy match operation."""
|
|
37
|
-
|
|
38
|
-
library: str
|
|
39
|
-
topic: str
|
|
40
|
-
score: float
|
|
41
|
-
original_query: str
|
|
42
|
-
match_type: str # "library", "topic", "both"
|
|
43
|
-
|
|
44
|
-
def to_dict(self) -> dict[str, Any]:
|
|
45
|
-
"""Convert to dictionary."""
|
|
46
|
-
return {
|
|
47
|
-
"library": self.library,
|
|
48
|
-
"topic": self.topic,
|
|
49
|
-
"score": self.score,
|
|
50
|
-
"original_query": self.original_query,
|
|
51
|
-
"match_type": self.match_type,
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class FuzzyMatcher:
|
|
56
|
-
"""Fuzzy matching for Context7 KB cache entries."""
|
|
57
|
-
|
|
58
|
-
def __init__(self, threshold: float = 0.7):
|
|
59
|
-
"""
|
|
60
|
-
Initialize fuzzy matcher.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
threshold: Minimum similarity score (0.0-1.0) to consider a match
|
|
64
|
-
"""
|
|
65
|
-
self.threshold = threshold
|
|
66
|
-
self.use_rapidfuzz = RAPIDFUZZ_AVAILABLE
|
|
67
|
-
|
|
68
|
-
def _simple_similarity(self, s1: str, s2: str) -> float:
|
|
69
|
-
"""
|
|
70
|
-
Simple string similarity using longest common subsequence.
|
|
71
|
-
|
|
72
|
-
Args:
|
|
73
|
-
s1: First string
|
|
74
|
-
s2: Second string
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
Similarity score between 0.0 and 1.0
|
|
78
|
-
"""
|
|
79
|
-
if not s1 or not s2:
|
|
80
|
-
return 0.0
|
|
81
|
-
|
|
82
|
-
s1_lower = s1.lower()
|
|
83
|
-
s2_lower = s2.lower()
|
|
84
|
-
|
|
85
|
-
if s1_lower == s2_lower:
|
|
86
|
-
return 1.0
|
|
87
|
-
|
|
88
|
-
# Calculate longest common subsequence
|
|
89
|
-
def lcs_length(a: str, b: str) -> int:
|
|
90
|
-
m, n = len(a), len(b)
|
|
91
|
-
dp = [[0] * (n + 1) for _ in range(m + 1)]
|
|
92
|
-
|
|
93
|
-
for i in range(1, m + 1):
|
|
94
|
-
for j in range(1, n + 1):
|
|
95
|
-
if a[i - 1] == b[j - 1]:
|
|
96
|
-
dp[i][j] = dp[i - 1][j - 1] + 1
|
|
97
|
-
else:
|
|
98
|
-
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
|
|
99
|
-
|
|
100
|
-
return dp[m][n]
|
|
101
|
-
|
|
102
|
-
lcs = lcs_length(s1_lower, s2_lower)
|
|
103
|
-
max_len = max(len(s1_lower), len(s2_lower))
|
|
104
|
-
|
|
105
|
-
return lcs / max_len if max_len > 0 else 0.0
|
|
106
|
-
|
|
107
|
-
def _calculate_similarity(self, s1: str, s2: str) -> float:
|
|
108
|
-
"""
|
|
109
|
-
Calculate similarity between two strings.
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
s1: First string
|
|
113
|
-
s2: Second string
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
Similarity score between 0.0 and 1.0
|
|
117
|
-
"""
|
|
118
|
-
fuzz_impl = fuzz
|
|
119
|
-
if self.use_rapidfuzz and fuzz_impl is not None:
|
|
120
|
-
# Use rapidfuzz (faster, better algorithms)
|
|
121
|
-
return fuzz_impl.ratio(s1.lower(), s2.lower()) / 100.0
|
|
122
|
-
elif fuzz_impl is not None:
|
|
123
|
-
# Use fuzzywuzzy
|
|
124
|
-
return fuzz_impl.ratio(s1.lower(), s2.lower()) / 100.0
|
|
125
|
-
else:
|
|
126
|
-
# Fallback to simple similarity
|
|
127
|
-
return self._simple_similarity(s1, s2)
|
|
128
|
-
|
|
129
|
-
def find_matching_library(
|
|
130
|
-
self, query: str, available_libraries: list[str], max_results: int = 5
|
|
131
|
-
) -> list[FuzzyMatch]:
|
|
132
|
-
"""
|
|
133
|
-
Find libraries that match the query using fuzzy matching.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
query: Library name to search for
|
|
137
|
-
available_libraries: List of available library names
|
|
138
|
-
max_results: Maximum number of results to return
|
|
139
|
-
|
|
140
|
-
Returns:
|
|
141
|
-
List of FuzzyMatch objects, sorted by score (highest first)
|
|
142
|
-
"""
|
|
143
|
-
if not query or not available_libraries:
|
|
144
|
-
return []
|
|
145
|
-
|
|
146
|
-
matches = []
|
|
147
|
-
|
|
148
|
-
for library in available_libraries:
|
|
149
|
-
score = self._calculate_similarity(query, library)
|
|
150
|
-
|
|
151
|
-
if score >= self.threshold:
|
|
152
|
-
matches.append(
|
|
153
|
-
FuzzyMatch(
|
|
154
|
-
library=library,
|
|
155
|
-
topic="", # No topic match in library-only search
|
|
156
|
-
score=score,
|
|
157
|
-
original_query=query,
|
|
158
|
-
match_type="library",
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# Sort by score (descending) and return top N
|
|
163
|
-
matches.sort(key=lambda x: x.score, reverse=True)
|
|
164
|
-
return matches[:max_results]
|
|
165
|
-
|
|
166
|
-
def find_matching_topic(
|
|
167
|
-
self,
|
|
168
|
-
query: str,
|
|
169
|
-
library: str,
|
|
170
|
-
available_topics: list[str],
|
|
171
|
-
max_results: int = 5,
|
|
172
|
-
) -> list[FuzzyMatch]:
|
|
173
|
-
"""
|
|
174
|
-
Find topics that match the query using fuzzy matching.
|
|
175
|
-
|
|
176
|
-
Args:
|
|
177
|
-
query: Topic name to search for
|
|
178
|
-
library: Library name (for context)
|
|
179
|
-
available_topics: List of available topic names for the library
|
|
180
|
-
max_results: Maximum number of results to return
|
|
181
|
-
|
|
182
|
-
Returns:
|
|
183
|
-
List of FuzzyMatch objects, sorted by score (highest first)
|
|
184
|
-
"""
|
|
185
|
-
if not query or not available_topics:
|
|
186
|
-
return []
|
|
187
|
-
|
|
188
|
-
matches = []
|
|
189
|
-
|
|
190
|
-
for topic in available_topics:
|
|
191
|
-
score = self._calculate_similarity(query, topic)
|
|
192
|
-
|
|
193
|
-
if score >= self.threshold:
|
|
194
|
-
matches.append(
|
|
195
|
-
FuzzyMatch(
|
|
196
|
-
library=library,
|
|
197
|
-
topic=topic,
|
|
198
|
-
score=score,
|
|
199
|
-
original_query=query,
|
|
200
|
-
match_type="topic",
|
|
201
|
-
)
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
# Sort by score (descending) and return top N
|
|
205
|
-
matches.sort(key=lambda x: x.score, reverse=True)
|
|
206
|
-
return matches[:max_results]
|
|
207
|
-
|
|
208
|
-
def find_matching_entry(
|
|
209
|
-
self,
|
|
210
|
-
library_query: str,
|
|
211
|
-
topic_query: str,
|
|
212
|
-
available_entries: list[tuple[str, str]], # List of (library, topic) tuples
|
|
213
|
-
max_results: int = 5,
|
|
214
|
-
) -> list[FuzzyMatch]:
|
|
215
|
-
"""
|
|
216
|
-
Find library/topic entries that match both queries using fuzzy matching.
|
|
217
|
-
|
|
218
|
-
Args:
|
|
219
|
-
library_query: Library name to search for
|
|
220
|
-
topic_query: Topic name to search for
|
|
221
|
-
available_entries: List of (library, topic) tuples
|
|
222
|
-
max_results: Maximum number of results to return
|
|
223
|
-
|
|
224
|
-
Returns:
|
|
225
|
-
List of FuzzyMatch objects, sorted by combined score (highest first)
|
|
226
|
-
"""
|
|
227
|
-
if not library_query or not topic_query or not available_entries:
|
|
228
|
-
return []
|
|
229
|
-
|
|
230
|
-
matches = []
|
|
231
|
-
|
|
232
|
-
for library, topic in available_entries:
|
|
233
|
-
lib_score = self._calculate_similarity(library_query, library)
|
|
234
|
-
topic_score = self._calculate_similarity(topic_query, topic)
|
|
235
|
-
|
|
236
|
-
# Combined score (weighted average: 60% library, 40% topic)
|
|
237
|
-
combined_score = (lib_score * 0.6) + (topic_score * 0.4)
|
|
238
|
-
|
|
239
|
-
if combined_score >= self.threshold:
|
|
240
|
-
match_type = "both"
|
|
241
|
-
if lib_score >= self.threshold and topic_score < self.threshold:
|
|
242
|
-
match_type = "library"
|
|
243
|
-
elif topic_score >= self.threshold and lib_score < self.threshold:
|
|
244
|
-
match_type = "topic"
|
|
245
|
-
|
|
246
|
-
matches.append(
|
|
247
|
-
FuzzyMatch(
|
|
248
|
-
library=library,
|
|
249
|
-
topic=topic,
|
|
250
|
-
score=combined_score,
|
|
251
|
-
original_query=f"{library_query}/{topic_query}",
|
|
252
|
-
match_type=match_type,
|
|
253
|
-
)
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
# Sort by score (descending) and return top N
|
|
257
|
-
matches.sort(key=lambda x: x.score, reverse=True)
|
|
258
|
-
return matches[:max_results]
|
|
259
|
-
|
|
260
|
-
def is_match(self, query: str, candidate: str) -> bool:
|
|
261
|
-
"""
|
|
262
|
-
Check if a candidate string matches the query above the threshold.
|
|
263
|
-
|
|
264
|
-
Args:
|
|
265
|
-
query: Query string
|
|
266
|
-
candidate: Candidate string to check
|
|
267
|
-
|
|
268
|
-
Returns:
|
|
269
|
-
True if similarity score >= threshold
|
|
270
|
-
"""
|
|
271
|
-
score = self._calculate_similarity(query, candidate)
|
|
272
|
-
return score >= self.threshold
|
|
273
|
-
|
|
274
|
-
def get_best_match(
|
|
275
|
-
self, query: str, candidates: list[str]
|
|
276
|
-
) -> tuple[str, float] | None:
|
|
277
|
-
"""
|
|
278
|
-
Get the best matching candidate for a query.
|
|
279
|
-
|
|
280
|
-
Args:
|
|
281
|
-
query: Query string
|
|
282
|
-
candidates: List of candidate strings
|
|
283
|
-
|
|
284
|
-
Returns:
|
|
285
|
-
Tuple of (best_match, score) or None if no match above threshold
|
|
286
|
-
"""
|
|
287
|
-
if not query or not candidates:
|
|
288
|
-
return None
|
|
289
|
-
|
|
290
|
-
best_match = None
|
|
291
|
-
best_score = 0.0
|
|
292
|
-
|
|
293
|
-
for candidate in candidates:
|
|
294
|
-
score = self._calculate_similarity(query, candidate)
|
|
295
|
-
if score > best_score:
|
|
296
|
-
best_score = score
|
|
297
|
-
best_match = candidate
|
|
298
|
-
|
|
299
|
-
if best_score >= self.threshold and best_match is not None:
|
|
300
|
-
return (best_match, best_score)
|
|
301
|
-
|
|
302
|
-
return None
|
|
303
|
-
|
|
304
|
-
# ---------------------------------------------------------------------
|
|
305
|
-
# Compatibility helpers (contract stability)
|
|
306
|
-
#
|
|
307
|
-
# Older callers (and some CLI flows) expect a single entry-point method
|
|
308
|
-
# named `find_best_match` that can accept a cache index object. Keep this
|
|
309
|
-
# as a thin wrapper around the more explicit `find_matching_*` methods.
|
|
310
|
-
# ---------------------------------------------------------------------
|
|
311
|
-
|
|
312
|
-
def find_best_match(
|
|
313
|
-
self,
|
|
314
|
-
query: str,
|
|
315
|
-
topic: str | None,
|
|
316
|
-
cache_index: Any,
|
|
317
|
-
max_results: int = 5,
|
|
318
|
-
) -> list[FuzzyMatch]:
|
|
319
|
-
"""
|
|
320
|
-
Find best matches for a query across a cache index.
|
|
321
|
-
|
|
322
|
-
Args:
|
|
323
|
-
query: Query string (library/topic search term)
|
|
324
|
-
topic: Optional topic; when provided we prefer matching entries
|
|
325
|
-
cache_index: Cache index object with `.libraries` mapping
|
|
326
|
-
max_results: Maximum results to return
|
|
327
|
-
|
|
328
|
-
Returns:
|
|
329
|
-
List of FuzzyMatch results sorted by score desc.
|
|
330
|
-
"""
|
|
331
|
-
libraries_map = getattr(cache_index, "libraries", {}) or {}
|
|
332
|
-
library_names = list(libraries_map.keys())
|
|
333
|
-
|
|
334
|
-
matches: list[FuzzyMatch] = []
|
|
335
|
-
|
|
336
|
-
# If a topic is provided, treat this as a (library/topic) entry match.
|
|
337
|
-
if topic:
|
|
338
|
-
available_entries: list[tuple[str, str]] = []
|
|
339
|
-
for lib_name, lib_data in libraries_map.items():
|
|
340
|
-
topics = (lib_data or {}).get("topics", {}) or {}
|
|
341
|
-
for topic_name in topics.keys():
|
|
342
|
-
available_entries.append((lib_name, topic_name))
|
|
343
|
-
return self.find_matching_entry(
|
|
344
|
-
library_query=query,
|
|
345
|
-
topic_query=topic,
|
|
346
|
-
available_entries=available_entries,
|
|
347
|
-
max_results=max_results,
|
|
348
|
-
)
|
|
349
|
-
|
|
350
|
-
# Otherwise, search both library names and topic names.
|
|
351
|
-
matches.extend(self.find_matching_library(query, library_names, max_results))
|
|
352
|
-
|
|
353
|
-
for lib_name, lib_data in libraries_map.items():
|
|
354
|
-
topics = (lib_data or {}).get("topics", {}) or {}
|
|
355
|
-
topic_names = list(topics.keys())
|
|
356
|
-
matches.extend(
|
|
357
|
-
self.find_matching_topic(query, lib_name, topic_names, max_results)
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
# Deduplicate by (library, topic, match_type) keeping best score.
|
|
361
|
-
best: dict[tuple[str, str, str], FuzzyMatch] = {}
|
|
362
|
-
for m in matches:
|
|
363
|
-
key = (m.library, m.topic, m.match_type)
|
|
364
|
-
existing = best.get(key)
|
|
365
|
-
if existing is None or m.score > existing.score:
|
|
366
|
-
best[key] = m
|
|
367
|
-
|
|
368
|
-
out = sorted(best.values(), key=lambda x: x.score, reverse=True)
|
|
369
|
-
return out[:max_results]
|
|
1
|
+
"""
|
|
2
|
+
Fuzzy Matching for Context7 KB cache lookups.
|
|
3
|
+
|
|
4
|
+
Provides fuzzy matching capabilities to handle variations in library/topic queries,
|
|
5
|
+
improving cache hit rates when exact matches aren't available.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
fuzz: Any | None = None
|
|
12
|
+
process: Any | None = None
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from rapidfuzz import fuzz as _rf_fuzz
|
|
16
|
+
from rapidfuzz import process as _rf_process
|
|
17
|
+
|
|
18
|
+
fuzz = _rf_fuzz
|
|
19
|
+
process = _rf_process
|
|
20
|
+
RAPIDFUZZ_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
try:
|
|
23
|
+
from fuzzywuzzy import fuzz as _fw_fuzz
|
|
24
|
+
from fuzzywuzzy import process as _fw_process
|
|
25
|
+
|
|
26
|
+
fuzz = _fw_fuzz
|
|
27
|
+
process = _fw_process
|
|
28
|
+
RAPIDFUZZ_AVAILABLE = False
|
|
29
|
+
except ImportError:
|
|
30
|
+
# Fallback to simple string similarity
|
|
31
|
+
RAPIDFUZZ_AVAILABLE = False
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class FuzzyMatch:
|
|
36
|
+
"""Result of a fuzzy match operation."""
|
|
37
|
+
|
|
38
|
+
library: str
|
|
39
|
+
topic: str
|
|
40
|
+
score: float
|
|
41
|
+
original_query: str
|
|
42
|
+
match_type: str # "library", "topic", "both"
|
|
43
|
+
|
|
44
|
+
def to_dict(self) -> dict[str, Any]:
|
|
45
|
+
"""Convert to dictionary."""
|
|
46
|
+
return {
|
|
47
|
+
"library": self.library,
|
|
48
|
+
"topic": self.topic,
|
|
49
|
+
"score": self.score,
|
|
50
|
+
"original_query": self.original_query,
|
|
51
|
+
"match_type": self.match_type,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class FuzzyMatcher:
|
|
56
|
+
"""Fuzzy matching for Context7 KB cache entries."""
|
|
57
|
+
|
|
58
|
+
def __init__(self, threshold: float = 0.7):
|
|
59
|
+
"""
|
|
60
|
+
Initialize fuzzy matcher.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
threshold: Minimum similarity score (0.0-1.0) to consider a match
|
|
64
|
+
"""
|
|
65
|
+
self.threshold = threshold
|
|
66
|
+
self.use_rapidfuzz = RAPIDFUZZ_AVAILABLE
|
|
67
|
+
|
|
68
|
+
def _simple_similarity(self, s1: str, s2: str) -> float:
|
|
69
|
+
"""
|
|
70
|
+
Simple string similarity using longest common subsequence.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
s1: First string
|
|
74
|
+
s2: Second string
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Similarity score between 0.0 and 1.0
|
|
78
|
+
"""
|
|
79
|
+
if not s1 or not s2:
|
|
80
|
+
return 0.0
|
|
81
|
+
|
|
82
|
+
s1_lower = s1.lower()
|
|
83
|
+
s2_lower = s2.lower()
|
|
84
|
+
|
|
85
|
+
if s1_lower == s2_lower:
|
|
86
|
+
return 1.0
|
|
87
|
+
|
|
88
|
+
# Calculate longest common subsequence
|
|
89
|
+
def lcs_length(a: str, b: str) -> int:
|
|
90
|
+
m, n = len(a), len(b)
|
|
91
|
+
dp = [[0] * (n + 1) for _ in range(m + 1)]
|
|
92
|
+
|
|
93
|
+
for i in range(1, m + 1):
|
|
94
|
+
for j in range(1, n + 1):
|
|
95
|
+
if a[i - 1] == b[j - 1]:
|
|
96
|
+
dp[i][j] = dp[i - 1][j - 1] + 1
|
|
97
|
+
else:
|
|
98
|
+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
|
|
99
|
+
|
|
100
|
+
return dp[m][n]
|
|
101
|
+
|
|
102
|
+
lcs = lcs_length(s1_lower, s2_lower)
|
|
103
|
+
max_len = max(len(s1_lower), len(s2_lower))
|
|
104
|
+
|
|
105
|
+
return lcs / max_len if max_len > 0 else 0.0
|
|
106
|
+
|
|
107
|
+
def _calculate_similarity(self, s1: str, s2: str) -> float:
|
|
108
|
+
"""
|
|
109
|
+
Calculate similarity between two strings.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
s1: First string
|
|
113
|
+
s2: Second string
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Similarity score between 0.0 and 1.0
|
|
117
|
+
"""
|
|
118
|
+
fuzz_impl = fuzz
|
|
119
|
+
if self.use_rapidfuzz and fuzz_impl is not None:
|
|
120
|
+
# Use rapidfuzz (faster, better algorithms)
|
|
121
|
+
return fuzz_impl.ratio(s1.lower(), s2.lower()) / 100.0
|
|
122
|
+
elif fuzz_impl is not None:
|
|
123
|
+
# Use fuzzywuzzy
|
|
124
|
+
return fuzz_impl.ratio(s1.lower(), s2.lower()) / 100.0
|
|
125
|
+
else:
|
|
126
|
+
# Fallback to simple similarity
|
|
127
|
+
return self._simple_similarity(s1, s2)
|
|
128
|
+
|
|
129
|
+
def find_matching_library(
|
|
130
|
+
self, query: str, available_libraries: list[str], max_results: int = 5
|
|
131
|
+
) -> list[FuzzyMatch]:
|
|
132
|
+
"""
|
|
133
|
+
Find libraries that match the query using fuzzy matching.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
query: Library name to search for
|
|
137
|
+
available_libraries: List of available library names
|
|
138
|
+
max_results: Maximum number of results to return
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
List of FuzzyMatch objects, sorted by score (highest first)
|
|
142
|
+
"""
|
|
143
|
+
if not query or not available_libraries:
|
|
144
|
+
return []
|
|
145
|
+
|
|
146
|
+
matches = []
|
|
147
|
+
|
|
148
|
+
for library in available_libraries:
|
|
149
|
+
score = self._calculate_similarity(query, library)
|
|
150
|
+
|
|
151
|
+
if score >= self.threshold:
|
|
152
|
+
matches.append(
|
|
153
|
+
FuzzyMatch(
|
|
154
|
+
library=library,
|
|
155
|
+
topic="", # No topic match in library-only search
|
|
156
|
+
score=score,
|
|
157
|
+
original_query=query,
|
|
158
|
+
match_type="library",
|
|
159
|
+
)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# Sort by score (descending) and return top N
|
|
163
|
+
matches.sort(key=lambda x: x.score, reverse=True)
|
|
164
|
+
return matches[:max_results]
|
|
165
|
+
|
|
166
|
+
def find_matching_topic(
|
|
167
|
+
self,
|
|
168
|
+
query: str,
|
|
169
|
+
library: str,
|
|
170
|
+
available_topics: list[str],
|
|
171
|
+
max_results: int = 5,
|
|
172
|
+
) -> list[FuzzyMatch]:
|
|
173
|
+
"""
|
|
174
|
+
Find topics that match the query using fuzzy matching.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
query: Topic name to search for
|
|
178
|
+
library: Library name (for context)
|
|
179
|
+
available_topics: List of available topic names for the library
|
|
180
|
+
max_results: Maximum number of results to return
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
List of FuzzyMatch objects, sorted by score (highest first)
|
|
184
|
+
"""
|
|
185
|
+
if not query or not available_topics:
|
|
186
|
+
return []
|
|
187
|
+
|
|
188
|
+
matches = []
|
|
189
|
+
|
|
190
|
+
for topic in available_topics:
|
|
191
|
+
score = self._calculate_similarity(query, topic)
|
|
192
|
+
|
|
193
|
+
if score >= self.threshold:
|
|
194
|
+
matches.append(
|
|
195
|
+
FuzzyMatch(
|
|
196
|
+
library=library,
|
|
197
|
+
topic=topic,
|
|
198
|
+
score=score,
|
|
199
|
+
original_query=query,
|
|
200
|
+
match_type="topic",
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# Sort by score (descending) and return top N
|
|
205
|
+
matches.sort(key=lambda x: x.score, reverse=True)
|
|
206
|
+
return matches[:max_results]
|
|
207
|
+
|
|
208
|
+
def find_matching_entry(
|
|
209
|
+
self,
|
|
210
|
+
library_query: str,
|
|
211
|
+
topic_query: str,
|
|
212
|
+
available_entries: list[tuple[str, str]], # List of (library, topic) tuples
|
|
213
|
+
max_results: int = 5,
|
|
214
|
+
) -> list[FuzzyMatch]:
|
|
215
|
+
"""
|
|
216
|
+
Find library/topic entries that match both queries using fuzzy matching.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
library_query: Library name to search for
|
|
220
|
+
topic_query: Topic name to search for
|
|
221
|
+
available_entries: List of (library, topic) tuples
|
|
222
|
+
max_results: Maximum number of results to return
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
List of FuzzyMatch objects, sorted by combined score (highest first)
|
|
226
|
+
"""
|
|
227
|
+
if not library_query or not topic_query or not available_entries:
|
|
228
|
+
return []
|
|
229
|
+
|
|
230
|
+
matches = []
|
|
231
|
+
|
|
232
|
+
for library, topic in available_entries:
|
|
233
|
+
lib_score = self._calculate_similarity(library_query, library)
|
|
234
|
+
topic_score = self._calculate_similarity(topic_query, topic)
|
|
235
|
+
|
|
236
|
+
# Combined score (weighted average: 60% library, 40% topic)
|
|
237
|
+
combined_score = (lib_score * 0.6) + (topic_score * 0.4)
|
|
238
|
+
|
|
239
|
+
if combined_score >= self.threshold:
|
|
240
|
+
match_type = "both"
|
|
241
|
+
if lib_score >= self.threshold and topic_score < self.threshold:
|
|
242
|
+
match_type = "library"
|
|
243
|
+
elif topic_score >= self.threshold and lib_score < self.threshold:
|
|
244
|
+
match_type = "topic"
|
|
245
|
+
|
|
246
|
+
matches.append(
|
|
247
|
+
FuzzyMatch(
|
|
248
|
+
library=library,
|
|
249
|
+
topic=topic,
|
|
250
|
+
score=combined_score,
|
|
251
|
+
original_query=f"{library_query}/{topic_query}",
|
|
252
|
+
match_type=match_type,
|
|
253
|
+
)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
# Sort by score (descending) and return top N
|
|
257
|
+
matches.sort(key=lambda x: x.score, reverse=True)
|
|
258
|
+
return matches[:max_results]
|
|
259
|
+
|
|
260
|
+
def is_match(self, query: str, candidate: str) -> bool:
|
|
261
|
+
"""
|
|
262
|
+
Check if a candidate string matches the query above the threshold.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
query: Query string
|
|
266
|
+
candidate: Candidate string to check
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
True if similarity score >= threshold
|
|
270
|
+
"""
|
|
271
|
+
score = self._calculate_similarity(query, candidate)
|
|
272
|
+
return score >= self.threshold
|
|
273
|
+
|
|
274
|
+
def get_best_match(
|
|
275
|
+
self, query: str, candidates: list[str]
|
|
276
|
+
) -> tuple[str, float] | None:
|
|
277
|
+
"""
|
|
278
|
+
Get the best matching candidate for a query.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
query: Query string
|
|
282
|
+
candidates: List of candidate strings
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
Tuple of (best_match, score) or None if no match above threshold
|
|
286
|
+
"""
|
|
287
|
+
if not query or not candidates:
|
|
288
|
+
return None
|
|
289
|
+
|
|
290
|
+
best_match = None
|
|
291
|
+
best_score = 0.0
|
|
292
|
+
|
|
293
|
+
for candidate in candidates:
|
|
294
|
+
score = self._calculate_similarity(query, candidate)
|
|
295
|
+
if score > best_score:
|
|
296
|
+
best_score = score
|
|
297
|
+
best_match = candidate
|
|
298
|
+
|
|
299
|
+
if best_score >= self.threshold and best_match is not None:
|
|
300
|
+
return (best_match, best_score)
|
|
301
|
+
|
|
302
|
+
return None
|
|
303
|
+
|
|
304
|
+
# ---------------------------------------------------------------------
|
|
305
|
+
# Compatibility helpers (contract stability)
|
|
306
|
+
#
|
|
307
|
+
# Older callers (and some CLI flows) expect a single entry-point method
|
|
308
|
+
# named `find_best_match` that can accept a cache index object. Keep this
|
|
309
|
+
# as a thin wrapper around the more explicit `find_matching_*` methods.
|
|
310
|
+
# ---------------------------------------------------------------------
|
|
311
|
+
|
|
312
|
+
def find_best_match(
|
|
313
|
+
self,
|
|
314
|
+
query: str,
|
|
315
|
+
topic: str | None,
|
|
316
|
+
cache_index: Any,
|
|
317
|
+
max_results: int = 5,
|
|
318
|
+
) -> list[FuzzyMatch]:
|
|
319
|
+
"""
|
|
320
|
+
Find best matches for a query across a cache index.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
query: Query string (library/topic search term)
|
|
324
|
+
topic: Optional topic; when provided we prefer matching entries
|
|
325
|
+
cache_index: Cache index object with `.libraries` mapping
|
|
326
|
+
max_results: Maximum results to return
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
List of FuzzyMatch results sorted by score desc.
|
|
330
|
+
"""
|
|
331
|
+
libraries_map = getattr(cache_index, "libraries", {}) or {}
|
|
332
|
+
library_names = list(libraries_map.keys())
|
|
333
|
+
|
|
334
|
+
matches: list[FuzzyMatch] = []
|
|
335
|
+
|
|
336
|
+
# If a topic is provided, treat this as a (library/topic) entry match.
|
|
337
|
+
if topic:
|
|
338
|
+
available_entries: list[tuple[str, str]] = []
|
|
339
|
+
for lib_name, lib_data in libraries_map.items():
|
|
340
|
+
topics = (lib_data or {}).get("topics", {}) or {}
|
|
341
|
+
for topic_name in topics.keys():
|
|
342
|
+
available_entries.append((lib_name, topic_name))
|
|
343
|
+
return self.find_matching_entry(
|
|
344
|
+
library_query=query,
|
|
345
|
+
topic_query=topic,
|
|
346
|
+
available_entries=available_entries,
|
|
347
|
+
max_results=max_results,
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
# Otherwise, search both library names and topic names.
|
|
351
|
+
matches.extend(self.find_matching_library(query, library_names, max_results))
|
|
352
|
+
|
|
353
|
+
for lib_name, lib_data in libraries_map.items():
|
|
354
|
+
topics = (lib_data or {}).get("topics", {}) or {}
|
|
355
|
+
topic_names = list(topics.keys())
|
|
356
|
+
matches.extend(
|
|
357
|
+
self.find_matching_topic(query, lib_name, topic_names, max_results)
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# Deduplicate by (library, topic, match_type) keeping best score.
|
|
361
|
+
best: dict[tuple[str, str, str], FuzzyMatch] = {}
|
|
362
|
+
for m in matches:
|
|
363
|
+
key = (m.library, m.topic, m.match_type)
|
|
364
|
+
existing = best.get(key)
|
|
365
|
+
if existing is None or m.score > existing.score:
|
|
366
|
+
best[key] = m
|
|
367
|
+
|
|
368
|
+
out = sorted(best.values(), key=lambda x: x.score, reverse=True)
|
|
369
|
+
return out[:max_results]
|