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,424 +1,424 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Cross-References System - Topic-based cross-referencing for Context7 KB.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
from dataclasses import dataclass, field
|
|
8
|
-
from datetime import UTC, datetime
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
import yaml
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@dataclass
|
|
15
|
-
class CrossReference:
|
|
16
|
-
"""Represents a cross-reference between topics."""
|
|
17
|
-
|
|
18
|
-
source_library: str
|
|
19
|
-
source_topic: str
|
|
20
|
-
target_library: str
|
|
21
|
-
target_topic: str
|
|
22
|
-
relationship_type: str = "related" # "related", "depends_on", "similar", "part_of"
|
|
23
|
-
confidence: float = 1.0
|
|
24
|
-
created_at: str = field(default_factory=lambda: datetime.now(UTC).isoformat() + "Z")
|
|
25
|
-
|
|
26
|
-
def to_dict(self) -> dict:
|
|
27
|
-
"""Convert to dictionary for YAML serialization."""
|
|
28
|
-
return {
|
|
29
|
-
"source_library": self.source_library,
|
|
30
|
-
"source_topic": self.source_topic,
|
|
31
|
-
"target_library": self.target_library,
|
|
32
|
-
"target_topic": self.target_topic,
|
|
33
|
-
"relationship_type": self.relationship_type,
|
|
34
|
-
"confidence": self.confidence,
|
|
35
|
-
"created_at": self.created_at,
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@classmethod
|
|
39
|
-
def from_dict(cls, data: dict) -> CrossReference:
|
|
40
|
-
"""Create from dictionary."""
|
|
41
|
-
if not isinstance(data, dict):
|
|
42
|
-
# Handle case where data is not a dict
|
|
43
|
-
raise ValueError(f"Expected dict, got {type(data)}: {data}")
|
|
44
|
-
return cls(**data)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@dataclass
|
|
48
|
-
class TopicIndex:
|
|
49
|
-
"""Index of libraries/topics for a specific topic."""
|
|
50
|
-
|
|
51
|
-
topic: str
|
|
52
|
-
libraries: dict[str, list[str]] = field(default_factory=dict) # library -> [topics]
|
|
53
|
-
relationships: list[CrossReference] = field(default_factory=list)
|
|
54
|
-
last_updated: str = field(
|
|
55
|
-
default_factory=lambda: datetime.now(UTC).isoformat() + "Z"
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
def to_dict(self) -> dict:
|
|
59
|
-
"""Convert to dictionary for YAML serialization."""
|
|
60
|
-
return {
|
|
61
|
-
"topic": self.topic,
|
|
62
|
-
"libraries": self.libraries,
|
|
63
|
-
"relationships": [ref.to_dict() for ref in self.relationships],
|
|
64
|
-
"last_updated": self.last_updated,
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
@classmethod
|
|
68
|
-
def from_dict(cls, data: dict) -> TopicIndex:
|
|
69
|
-
"""Create from dictionary."""
|
|
70
|
-
relationships = []
|
|
71
|
-
for r in data.get("relationships", []):
|
|
72
|
-
if isinstance(r, dict):
|
|
73
|
-
try:
|
|
74
|
-
relationships.append(CrossReference.from_dict(r))
|
|
75
|
-
except (ValueError, TypeError):
|
|
76
|
-
# Skip invalid entries
|
|
77
|
-
continue
|
|
78
|
-
return cls(
|
|
79
|
-
topic=data["topic"],
|
|
80
|
-
libraries=data.get("libraries", {}),
|
|
81
|
-
relationships=relationships,
|
|
82
|
-
last_updated=data.get("last_updated", datetime.now(UTC).isoformat() + "Z"),
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
class CrossReferenceManager:
|
|
87
|
-
"""
|
|
88
|
-
Manages cross-references between topics across libraries.
|
|
89
|
-
"""
|
|
90
|
-
|
|
91
|
-
def __init__(self, cache_structure):
|
|
92
|
-
"""
|
|
93
|
-
Initialize CrossReferenceManager.
|
|
94
|
-
|
|
95
|
-
Args:
|
|
96
|
-
cache_structure: CacheStructure instance
|
|
97
|
-
"""
|
|
98
|
-
self.cache_structure = cache_structure
|
|
99
|
-
self.cross_refs_file = cache_structure.cache_root / "cross-references.yaml"
|
|
100
|
-
self.topic_index_dir = cache_structure.cache_root / "topics"
|
|
101
|
-
self.topic_index_dir.mkdir(exist_ok=True)
|
|
102
|
-
|
|
103
|
-
# In-memory cache of cross-references
|
|
104
|
-
self._cross_refs: dict[str, list[CrossReference]] = (
|
|
105
|
-
{}
|
|
106
|
-
) # "library/topic" -> [refs]
|
|
107
|
-
self._topic_indices: dict[str, TopicIndex] = {}
|
|
108
|
-
|
|
109
|
-
self._load_cross_references()
|
|
110
|
-
|
|
111
|
-
def _load_cross_references(self):
|
|
112
|
-
"""Load cross-references from file."""
|
|
113
|
-
if not self.cross_refs_file.exists():
|
|
114
|
-
return
|
|
115
|
-
|
|
116
|
-
try:
|
|
117
|
-
with open(self.cross_refs_file, encoding="utf-8") as f:
|
|
118
|
-
data = yaml.safe_load(f)
|
|
119
|
-
|
|
120
|
-
if data:
|
|
121
|
-
for key, refs_data in data.items():
|
|
122
|
-
if not isinstance(refs_data, list):
|
|
123
|
-
continue
|
|
124
|
-
self._cross_refs[key] = []
|
|
125
|
-
for ref_data in refs_data:
|
|
126
|
-
if isinstance(ref_data, dict):
|
|
127
|
-
try:
|
|
128
|
-
self._cross_refs[key].append(
|
|
129
|
-
CrossReference.from_dict(ref_data)
|
|
130
|
-
)
|
|
131
|
-
except (ValueError, TypeError):
|
|
132
|
-
# Skip invalid entries
|
|
133
|
-
continue
|
|
134
|
-
except (OSError, yaml.YAMLError):
|
|
135
|
-
# Start with empty cross-references on error
|
|
136
|
-
self._cross_refs = {}
|
|
137
|
-
|
|
138
|
-
def _save_cross_references(self):
|
|
139
|
-
"""Save cross-references to file."""
|
|
140
|
-
data = {
|
|
141
|
-
key: [ref.to_dict() for ref in refs]
|
|
142
|
-
for key, refs in self._cross_refs.items()
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
with open(self.cross_refs_file, "w", encoding="utf-8") as f:
|
|
146
|
-
yaml.dump(data, f, default_flow_style=False, sort_keys=True)
|
|
147
|
-
|
|
148
|
-
def _load_topic_index(self, topic: str) -> TopicIndex | None:
|
|
149
|
-
"""Load topic index from file."""
|
|
150
|
-
topic_dir = self.topic_index_dir / topic
|
|
151
|
-
index_file = topic_dir / "index.yaml"
|
|
152
|
-
|
|
153
|
-
if not index_file.exists():
|
|
154
|
-
return None
|
|
155
|
-
|
|
156
|
-
try:
|
|
157
|
-
with open(index_file, encoding="utf-8") as f:
|
|
158
|
-
data = yaml.safe_load(f)
|
|
159
|
-
return TopicIndex.from_dict(data) if data else None
|
|
160
|
-
except (OSError, yaml.YAMLError):
|
|
161
|
-
return None
|
|
162
|
-
|
|
163
|
-
def _save_topic_index(self, topic_index: TopicIndex):
|
|
164
|
-
"""Save topic index to file."""
|
|
165
|
-
topic_dir = self.topic_index_dir / topic_index.topic
|
|
166
|
-
topic_dir.mkdir(exist_ok=True)
|
|
167
|
-
|
|
168
|
-
index_file = topic_dir / "index.yaml"
|
|
169
|
-
with open(index_file, "w", encoding="utf-8") as f:
|
|
170
|
-
yaml.dump(
|
|
171
|
-
topic_index.to_dict(), f, default_flow_style=False, sort_keys=False
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
def add_cross_reference(
|
|
175
|
-
self,
|
|
176
|
-
source_library: str,
|
|
177
|
-
source_topic: str,
|
|
178
|
-
target_library: str,
|
|
179
|
-
target_topic: str,
|
|
180
|
-
relationship_type: str = "related",
|
|
181
|
-
confidence: float = 1.0,
|
|
182
|
-
):
|
|
183
|
-
"""
|
|
184
|
-
Add a cross-reference between two topics.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
source_library: Source library name
|
|
188
|
-
source_topic: Source topic name
|
|
189
|
-
target_library: Target library name
|
|
190
|
-
target_topic: Target topic name
|
|
191
|
-
relationship_type: Type of relationship ("related", "depends_on", "similar", "part_of")
|
|
192
|
-
confidence: Confidence score (0.0-1.0)
|
|
193
|
-
"""
|
|
194
|
-
key = f"{source_library}/{source_topic}"
|
|
195
|
-
|
|
196
|
-
# Check if reference already exists
|
|
197
|
-
if key not in self._cross_refs:
|
|
198
|
-
self._cross_refs[key] = []
|
|
199
|
-
|
|
200
|
-
# Check for duplicate
|
|
201
|
-
existing = next(
|
|
202
|
-
(
|
|
203
|
-
ref
|
|
204
|
-
for ref in self._cross_refs[key]
|
|
205
|
-
if ref.target_library == target_library
|
|
206
|
-
and ref.target_topic == target_topic
|
|
207
|
-
),
|
|
208
|
-
None,
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
if existing:
|
|
212
|
-
# Update existing reference
|
|
213
|
-
existing.relationship_type = relationship_type
|
|
214
|
-
existing.confidence = confidence
|
|
215
|
-
else:
|
|
216
|
-
# Add new reference
|
|
217
|
-
ref = CrossReference(
|
|
218
|
-
source_library=source_library,
|
|
219
|
-
source_topic=source_topic,
|
|
220
|
-
target_library=target_library,
|
|
221
|
-
target_topic=target_topic,
|
|
222
|
-
relationship_type=relationship_type,
|
|
223
|
-
confidence=confidence,
|
|
224
|
-
)
|
|
225
|
-
self._cross_refs[key].append(ref)
|
|
226
|
-
|
|
227
|
-
# Update topic indices
|
|
228
|
-
self._update_topic_index(source_topic, source_library, source_topic)
|
|
229
|
-
self._update_topic_index(target_topic, target_library, target_topic)
|
|
230
|
-
|
|
231
|
-
# Save to file
|
|
232
|
-
self._save_cross_references()
|
|
233
|
-
|
|
234
|
-
def _update_topic_index(self, topic: str, library: str, topic_name: str):
|
|
235
|
-
"""Update topic index with library/topic information."""
|
|
236
|
-
topic_index = self._topic_indices.get(topic)
|
|
237
|
-
if topic_index is None:
|
|
238
|
-
topic_index = self._load_topic_index(topic) or TopicIndex(topic=topic)
|
|
239
|
-
self._topic_indices[topic] = topic_index
|
|
240
|
-
|
|
241
|
-
if library not in topic_index.libraries:
|
|
242
|
-
topic_index.libraries[library] = []
|
|
243
|
-
|
|
244
|
-
if topic_name not in topic_index.libraries[library]:
|
|
245
|
-
topic_index.libraries[library].append(topic_name)
|
|
246
|
-
|
|
247
|
-
topic_index.last_updated = datetime.now(UTC).isoformat() + "Z"
|
|
248
|
-
self._save_topic_index(topic_index)
|
|
249
|
-
|
|
250
|
-
def get_cross_references(
|
|
251
|
-
self, library: str, topic: str, relationship_type: str | None = None
|
|
252
|
-
) -> list[CrossReference]:
|
|
253
|
-
"""
|
|
254
|
-
Get cross-references for a specific library/topic.
|
|
255
|
-
|
|
256
|
-
Args:
|
|
257
|
-
library: Library name
|
|
258
|
-
topic: Topic name
|
|
259
|
-
relationship_type: Optional filter by relationship type
|
|
260
|
-
|
|
261
|
-
Returns:
|
|
262
|
-
List of CrossReference objects
|
|
263
|
-
"""
|
|
264
|
-
key = f"{library}/{topic}"
|
|
265
|
-
refs = self._cross_refs.get(key, [])
|
|
266
|
-
|
|
267
|
-
if relationship_type:
|
|
268
|
-
refs = [ref for ref in refs if ref.relationship_type == relationship_type]
|
|
269
|
-
|
|
270
|
-
# Sort by confidence (descending)
|
|
271
|
-
refs.sort(key=lambda r: r.confidence, reverse=True)
|
|
272
|
-
return refs
|
|
273
|
-
|
|
274
|
-
def get_related_topics(self, topic: str) -> list[dict[str, Any]]:
|
|
275
|
-
"""
|
|
276
|
-
Get all related topics across libraries for a given topic name.
|
|
277
|
-
|
|
278
|
-
Args:
|
|
279
|
-
topic: Topic name to search for
|
|
280
|
-
|
|
281
|
-
Returns:
|
|
282
|
-
List of dictionaries with library, topic, and relationship info
|
|
283
|
-
"""
|
|
284
|
-
topic_index = self._topic_indices.get(topic)
|
|
285
|
-
if topic_index is None:
|
|
286
|
-
topic_index = self._load_topic_index(topic)
|
|
287
|
-
if topic_index:
|
|
288
|
-
self._topic_indices[topic] = topic_index
|
|
289
|
-
|
|
290
|
-
if not topic_index:
|
|
291
|
-
return []
|
|
292
|
-
|
|
293
|
-
results: list[dict[str, Any]] = []
|
|
294
|
-
for ref in topic_index.relationships:
|
|
295
|
-
results.append(
|
|
296
|
-
{
|
|
297
|
-
"library": ref.target_library,
|
|
298
|
-
"topic": ref.target_topic,
|
|
299
|
-
"relationship": ref.relationship_type,
|
|
300
|
-
"confidence": ref.confidence,
|
|
301
|
-
}
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
return results
|
|
305
|
-
|
|
306
|
-
def find_similar_topics(
|
|
307
|
-
self, library: str, topic: str, min_confidence: float = 0.7
|
|
308
|
-
) -> list[CrossReference]:
|
|
309
|
-
"""
|
|
310
|
-
Find similar topics across libraries.
|
|
311
|
-
|
|
312
|
-
Args:
|
|
313
|
-
library: Library name
|
|
314
|
-
topic: Topic name
|
|
315
|
-
min_confidence: Minimum confidence threshold
|
|
316
|
-
|
|
317
|
-
Returns:
|
|
318
|
-
List of CrossReference objects with "similar" relationship
|
|
319
|
-
"""
|
|
320
|
-
refs = self.get_cross_references(library, topic, relationship_type="similar")
|
|
321
|
-
return [ref for ref in refs if ref.confidence >= min_confidence]
|
|
322
|
-
|
|
323
|
-
def auto_discover_cross_references(self, library: str, topic: str, content: str):
|
|
324
|
-
"""
|
|
325
|
-
Automatically discover cross-references from content.
|
|
326
|
-
|
|
327
|
-
This is a basic implementation - can be enhanced with NLP or keyword matching.
|
|
328
|
-
|
|
329
|
-
Args:
|
|
330
|
-
library: Library name
|
|
331
|
-
topic: Topic name
|
|
332
|
-
content: Content text to analyze
|
|
333
|
-
"""
|
|
334
|
-
# Basic keyword-based discovery
|
|
335
|
-
# Look for common patterns like "see also", "related to", "similar to"
|
|
336
|
-
|
|
337
|
-
content_lower = content.lower()
|
|
338
|
-
|
|
339
|
-
# Check for mentions of other libraries/topics in the content
|
|
340
|
-
# This is a placeholder - in production, you'd use more sophisticated NLP
|
|
341
|
-
|
|
342
|
-
# Example: Look for patterns like "React Router" or "similar to Vue Router"
|
|
343
|
-
if "similar to" in content_lower or "see also" in content_lower:
|
|
344
|
-
# Would need more sophisticated parsing to extract actual references
|
|
345
|
-
pass
|
|
346
|
-
|
|
347
|
-
def get_topic_index(self, topic: str) -> TopicIndex | None:
|
|
348
|
-
"""
|
|
349
|
-
Get topic index for a specific topic.
|
|
350
|
-
|
|
351
|
-
Args:
|
|
352
|
-
topic: Topic name
|
|
353
|
-
|
|
354
|
-
Returns:
|
|
355
|
-
TopicIndex or None if not found
|
|
356
|
-
"""
|
|
357
|
-
if topic in self._topic_indices:
|
|
358
|
-
return self._topic_indices[topic]
|
|
359
|
-
|
|
360
|
-
topic_index = self._load_topic_index(topic)
|
|
361
|
-
if topic_index:
|
|
362
|
-
self._topic_indices[topic] = topic_index
|
|
363
|
-
|
|
364
|
-
return topic_index
|
|
365
|
-
|
|
366
|
-
def remove_cross_reference(
|
|
367
|
-
self,
|
|
368
|
-
source_library: str,
|
|
369
|
-
source_topic: str,
|
|
370
|
-
target_library: str,
|
|
371
|
-
target_topic: str,
|
|
372
|
-
) -> bool:
|
|
373
|
-
"""
|
|
374
|
-
Remove a cross-reference.
|
|
375
|
-
|
|
376
|
-
Args:
|
|
377
|
-
source_library: Source library name
|
|
378
|
-
source_topic: Source topic name
|
|
379
|
-
target_library: Target library name
|
|
380
|
-
target_topic: Target topic name
|
|
381
|
-
|
|
382
|
-
Returns:
|
|
383
|
-
True if removed, False if not found
|
|
384
|
-
"""
|
|
385
|
-
key = f"{source_library}/{source_topic}"
|
|
386
|
-
|
|
387
|
-
if key not in self._cross_refs:
|
|
388
|
-
return False
|
|
389
|
-
|
|
390
|
-
refs = self._cross_refs[key]
|
|
391
|
-
original_len = len(refs)
|
|
392
|
-
|
|
393
|
-
self._cross_refs[key] = [
|
|
394
|
-
ref
|
|
395
|
-
for ref in refs
|
|
396
|
-
if not (
|
|
397
|
-
ref.target_library == target_library
|
|
398
|
-
and ref.target_topic == target_topic
|
|
399
|
-
)
|
|
400
|
-
]
|
|
401
|
-
|
|
402
|
-
if len(self._cross_refs[key]) == 0:
|
|
403
|
-
del self._cross_refs[key]
|
|
404
|
-
|
|
405
|
-
removed = len(self._cross_refs[key]) < original_len
|
|
406
|
-
|
|
407
|
-
if removed:
|
|
408
|
-
self._save_cross_references()
|
|
409
|
-
|
|
410
|
-
return removed
|
|
411
|
-
|
|
412
|
-
def get_all_cross_references(self) -> dict[str, list[CrossReference]]:
|
|
413
|
-
"""Get all cross-references."""
|
|
414
|
-
return self._cross_refs.copy()
|
|
415
|
-
|
|
416
|
-
def clear_cross_references(self):
|
|
417
|
-
"""Clear all cross-references (use with caution)."""
|
|
418
|
-
self._cross_refs = {}
|
|
419
|
-
if self.cross_refs_file.exists():
|
|
420
|
-
self.cross_refs_file.unlink()
|
|
421
|
-
|
|
422
|
-
# Clear topic indices
|
|
423
|
-
for topic_index_file in self.topic_index_dir.rglob("index.yaml"):
|
|
424
|
-
topic_index_file.unlink()
|
|
1
|
+
"""
|
|
2
|
+
Cross-References System - Topic-based cross-referencing for Context7 KB.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from datetime import UTC, datetime
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CrossReference:
|
|
16
|
+
"""Represents a cross-reference between topics."""
|
|
17
|
+
|
|
18
|
+
source_library: str
|
|
19
|
+
source_topic: str
|
|
20
|
+
target_library: str
|
|
21
|
+
target_topic: str
|
|
22
|
+
relationship_type: str = "related" # "related", "depends_on", "similar", "part_of"
|
|
23
|
+
confidence: float = 1.0
|
|
24
|
+
created_at: str = field(default_factory=lambda: datetime.now(UTC).isoformat() + "Z")
|
|
25
|
+
|
|
26
|
+
def to_dict(self) -> dict:
|
|
27
|
+
"""Convert to dictionary for YAML serialization."""
|
|
28
|
+
return {
|
|
29
|
+
"source_library": self.source_library,
|
|
30
|
+
"source_topic": self.source_topic,
|
|
31
|
+
"target_library": self.target_library,
|
|
32
|
+
"target_topic": self.target_topic,
|
|
33
|
+
"relationship_type": self.relationship_type,
|
|
34
|
+
"confidence": self.confidence,
|
|
35
|
+
"created_at": self.created_at,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def from_dict(cls, data: dict) -> CrossReference:
|
|
40
|
+
"""Create from dictionary."""
|
|
41
|
+
if not isinstance(data, dict):
|
|
42
|
+
# Handle case where data is not a dict
|
|
43
|
+
raise ValueError(f"Expected dict, got {type(data)}: {data}")
|
|
44
|
+
return cls(**data)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
class TopicIndex:
|
|
49
|
+
"""Index of libraries/topics for a specific topic."""
|
|
50
|
+
|
|
51
|
+
topic: str
|
|
52
|
+
libraries: dict[str, list[str]] = field(default_factory=dict) # library -> [topics]
|
|
53
|
+
relationships: list[CrossReference] = field(default_factory=list)
|
|
54
|
+
last_updated: str = field(
|
|
55
|
+
default_factory=lambda: datetime.now(UTC).isoformat() + "Z"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def to_dict(self) -> dict:
|
|
59
|
+
"""Convert to dictionary for YAML serialization."""
|
|
60
|
+
return {
|
|
61
|
+
"topic": self.topic,
|
|
62
|
+
"libraries": self.libraries,
|
|
63
|
+
"relationships": [ref.to_dict() for ref in self.relationships],
|
|
64
|
+
"last_updated": self.last_updated,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_dict(cls, data: dict) -> TopicIndex:
|
|
69
|
+
"""Create from dictionary."""
|
|
70
|
+
relationships = []
|
|
71
|
+
for r in data.get("relationships", []):
|
|
72
|
+
if isinstance(r, dict):
|
|
73
|
+
try:
|
|
74
|
+
relationships.append(CrossReference.from_dict(r))
|
|
75
|
+
except (ValueError, TypeError):
|
|
76
|
+
# Skip invalid entries
|
|
77
|
+
continue
|
|
78
|
+
return cls(
|
|
79
|
+
topic=data["topic"],
|
|
80
|
+
libraries=data.get("libraries", {}),
|
|
81
|
+
relationships=relationships,
|
|
82
|
+
last_updated=data.get("last_updated", datetime.now(UTC).isoformat() + "Z"),
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class CrossReferenceManager:
|
|
87
|
+
"""
|
|
88
|
+
Manages cross-references between topics across libraries.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
def __init__(self, cache_structure):
|
|
92
|
+
"""
|
|
93
|
+
Initialize CrossReferenceManager.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
cache_structure: CacheStructure instance
|
|
97
|
+
"""
|
|
98
|
+
self.cache_structure = cache_structure
|
|
99
|
+
self.cross_refs_file = cache_structure.cache_root / "cross-references.yaml"
|
|
100
|
+
self.topic_index_dir = cache_structure.cache_root / "topics"
|
|
101
|
+
self.topic_index_dir.mkdir(exist_ok=True)
|
|
102
|
+
|
|
103
|
+
# In-memory cache of cross-references
|
|
104
|
+
self._cross_refs: dict[str, list[CrossReference]] = (
|
|
105
|
+
{}
|
|
106
|
+
) # "library/topic" -> [refs]
|
|
107
|
+
self._topic_indices: dict[str, TopicIndex] = {}
|
|
108
|
+
|
|
109
|
+
self._load_cross_references()
|
|
110
|
+
|
|
111
|
+
def _load_cross_references(self):
|
|
112
|
+
"""Load cross-references from file."""
|
|
113
|
+
if not self.cross_refs_file.exists():
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
with open(self.cross_refs_file, encoding="utf-8") as f:
|
|
118
|
+
data = yaml.safe_load(f)
|
|
119
|
+
|
|
120
|
+
if data:
|
|
121
|
+
for key, refs_data in data.items():
|
|
122
|
+
if not isinstance(refs_data, list):
|
|
123
|
+
continue
|
|
124
|
+
self._cross_refs[key] = []
|
|
125
|
+
for ref_data in refs_data:
|
|
126
|
+
if isinstance(ref_data, dict):
|
|
127
|
+
try:
|
|
128
|
+
self._cross_refs[key].append(
|
|
129
|
+
CrossReference.from_dict(ref_data)
|
|
130
|
+
)
|
|
131
|
+
except (ValueError, TypeError):
|
|
132
|
+
# Skip invalid entries
|
|
133
|
+
continue
|
|
134
|
+
except (OSError, yaml.YAMLError):
|
|
135
|
+
# Start with empty cross-references on error
|
|
136
|
+
self._cross_refs = {}
|
|
137
|
+
|
|
138
|
+
def _save_cross_references(self):
|
|
139
|
+
"""Save cross-references to file."""
|
|
140
|
+
data = {
|
|
141
|
+
key: [ref.to_dict() for ref in refs]
|
|
142
|
+
for key, refs in self._cross_refs.items()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
with open(self.cross_refs_file, "w", encoding="utf-8") as f:
|
|
146
|
+
yaml.dump(data, f, default_flow_style=False, sort_keys=True)
|
|
147
|
+
|
|
148
|
+
def _load_topic_index(self, topic: str) -> TopicIndex | None:
|
|
149
|
+
"""Load topic index from file."""
|
|
150
|
+
topic_dir = self.topic_index_dir / topic
|
|
151
|
+
index_file = topic_dir / "index.yaml"
|
|
152
|
+
|
|
153
|
+
if not index_file.exists():
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
with open(index_file, encoding="utf-8") as f:
|
|
158
|
+
data = yaml.safe_load(f)
|
|
159
|
+
return TopicIndex.from_dict(data) if data else None
|
|
160
|
+
except (OSError, yaml.YAMLError):
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
def _save_topic_index(self, topic_index: TopicIndex):
|
|
164
|
+
"""Save topic index to file."""
|
|
165
|
+
topic_dir = self.topic_index_dir / topic_index.topic
|
|
166
|
+
topic_dir.mkdir(exist_ok=True)
|
|
167
|
+
|
|
168
|
+
index_file = topic_dir / "index.yaml"
|
|
169
|
+
with open(index_file, "w", encoding="utf-8") as f:
|
|
170
|
+
yaml.dump(
|
|
171
|
+
topic_index.to_dict(), f, default_flow_style=False, sort_keys=False
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
def add_cross_reference(
|
|
175
|
+
self,
|
|
176
|
+
source_library: str,
|
|
177
|
+
source_topic: str,
|
|
178
|
+
target_library: str,
|
|
179
|
+
target_topic: str,
|
|
180
|
+
relationship_type: str = "related",
|
|
181
|
+
confidence: float = 1.0,
|
|
182
|
+
):
|
|
183
|
+
"""
|
|
184
|
+
Add a cross-reference between two topics.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
source_library: Source library name
|
|
188
|
+
source_topic: Source topic name
|
|
189
|
+
target_library: Target library name
|
|
190
|
+
target_topic: Target topic name
|
|
191
|
+
relationship_type: Type of relationship ("related", "depends_on", "similar", "part_of")
|
|
192
|
+
confidence: Confidence score (0.0-1.0)
|
|
193
|
+
"""
|
|
194
|
+
key = f"{source_library}/{source_topic}"
|
|
195
|
+
|
|
196
|
+
# Check if reference already exists
|
|
197
|
+
if key not in self._cross_refs:
|
|
198
|
+
self._cross_refs[key] = []
|
|
199
|
+
|
|
200
|
+
# Check for duplicate
|
|
201
|
+
existing = next(
|
|
202
|
+
(
|
|
203
|
+
ref
|
|
204
|
+
for ref in self._cross_refs[key]
|
|
205
|
+
if ref.target_library == target_library
|
|
206
|
+
and ref.target_topic == target_topic
|
|
207
|
+
),
|
|
208
|
+
None,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
if existing:
|
|
212
|
+
# Update existing reference
|
|
213
|
+
existing.relationship_type = relationship_type
|
|
214
|
+
existing.confidence = confidence
|
|
215
|
+
else:
|
|
216
|
+
# Add new reference
|
|
217
|
+
ref = CrossReference(
|
|
218
|
+
source_library=source_library,
|
|
219
|
+
source_topic=source_topic,
|
|
220
|
+
target_library=target_library,
|
|
221
|
+
target_topic=target_topic,
|
|
222
|
+
relationship_type=relationship_type,
|
|
223
|
+
confidence=confidence,
|
|
224
|
+
)
|
|
225
|
+
self._cross_refs[key].append(ref)
|
|
226
|
+
|
|
227
|
+
# Update topic indices
|
|
228
|
+
self._update_topic_index(source_topic, source_library, source_topic)
|
|
229
|
+
self._update_topic_index(target_topic, target_library, target_topic)
|
|
230
|
+
|
|
231
|
+
# Save to file
|
|
232
|
+
self._save_cross_references()
|
|
233
|
+
|
|
234
|
+
def _update_topic_index(self, topic: str, library: str, topic_name: str):
|
|
235
|
+
"""Update topic index with library/topic information."""
|
|
236
|
+
topic_index = self._topic_indices.get(topic)
|
|
237
|
+
if topic_index is None:
|
|
238
|
+
topic_index = self._load_topic_index(topic) or TopicIndex(topic=topic)
|
|
239
|
+
self._topic_indices[topic] = topic_index
|
|
240
|
+
|
|
241
|
+
if library not in topic_index.libraries:
|
|
242
|
+
topic_index.libraries[library] = []
|
|
243
|
+
|
|
244
|
+
if topic_name not in topic_index.libraries[library]:
|
|
245
|
+
topic_index.libraries[library].append(topic_name)
|
|
246
|
+
|
|
247
|
+
topic_index.last_updated = datetime.now(UTC).isoformat() + "Z"
|
|
248
|
+
self._save_topic_index(topic_index)
|
|
249
|
+
|
|
250
|
+
def get_cross_references(
|
|
251
|
+
self, library: str, topic: str, relationship_type: str | None = None
|
|
252
|
+
) -> list[CrossReference]:
|
|
253
|
+
"""
|
|
254
|
+
Get cross-references for a specific library/topic.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
library: Library name
|
|
258
|
+
topic: Topic name
|
|
259
|
+
relationship_type: Optional filter by relationship type
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
List of CrossReference objects
|
|
263
|
+
"""
|
|
264
|
+
key = f"{library}/{topic}"
|
|
265
|
+
refs = self._cross_refs.get(key, [])
|
|
266
|
+
|
|
267
|
+
if relationship_type:
|
|
268
|
+
refs = [ref for ref in refs if ref.relationship_type == relationship_type]
|
|
269
|
+
|
|
270
|
+
# Sort by confidence (descending)
|
|
271
|
+
refs.sort(key=lambda r: r.confidence, reverse=True)
|
|
272
|
+
return refs
|
|
273
|
+
|
|
274
|
+
def get_related_topics(self, topic: str) -> list[dict[str, Any]]:
|
|
275
|
+
"""
|
|
276
|
+
Get all related topics across libraries for a given topic name.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
topic: Topic name to search for
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
List of dictionaries with library, topic, and relationship info
|
|
283
|
+
"""
|
|
284
|
+
topic_index = self._topic_indices.get(topic)
|
|
285
|
+
if topic_index is None:
|
|
286
|
+
topic_index = self._load_topic_index(topic)
|
|
287
|
+
if topic_index:
|
|
288
|
+
self._topic_indices[topic] = topic_index
|
|
289
|
+
|
|
290
|
+
if not topic_index:
|
|
291
|
+
return []
|
|
292
|
+
|
|
293
|
+
results: list[dict[str, Any]] = []
|
|
294
|
+
for ref in topic_index.relationships:
|
|
295
|
+
results.append(
|
|
296
|
+
{
|
|
297
|
+
"library": ref.target_library,
|
|
298
|
+
"topic": ref.target_topic,
|
|
299
|
+
"relationship": ref.relationship_type,
|
|
300
|
+
"confidence": ref.confidence,
|
|
301
|
+
}
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
return results
|
|
305
|
+
|
|
306
|
+
def find_similar_topics(
|
|
307
|
+
self, library: str, topic: str, min_confidence: float = 0.7
|
|
308
|
+
) -> list[CrossReference]:
|
|
309
|
+
"""
|
|
310
|
+
Find similar topics across libraries.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
library: Library name
|
|
314
|
+
topic: Topic name
|
|
315
|
+
min_confidence: Minimum confidence threshold
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
List of CrossReference objects with "similar" relationship
|
|
319
|
+
"""
|
|
320
|
+
refs = self.get_cross_references(library, topic, relationship_type="similar")
|
|
321
|
+
return [ref for ref in refs if ref.confidence >= min_confidence]
|
|
322
|
+
|
|
323
|
+
def auto_discover_cross_references(self, library: str, topic: str, content: str):
|
|
324
|
+
"""
|
|
325
|
+
Automatically discover cross-references from content.
|
|
326
|
+
|
|
327
|
+
This is a basic implementation - can be enhanced with NLP or keyword matching.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
library: Library name
|
|
331
|
+
topic: Topic name
|
|
332
|
+
content: Content text to analyze
|
|
333
|
+
"""
|
|
334
|
+
# Basic keyword-based discovery
|
|
335
|
+
# Look for common patterns like "see also", "related to", "similar to"
|
|
336
|
+
|
|
337
|
+
content_lower = content.lower()
|
|
338
|
+
|
|
339
|
+
# Check for mentions of other libraries/topics in the content
|
|
340
|
+
# This is a placeholder - in production, you'd use more sophisticated NLP
|
|
341
|
+
|
|
342
|
+
# Example: Look for patterns like "React Router" or "similar to Vue Router"
|
|
343
|
+
if "similar to" in content_lower or "see also" in content_lower:
|
|
344
|
+
# Would need more sophisticated parsing to extract actual references
|
|
345
|
+
pass
|
|
346
|
+
|
|
347
|
+
def get_topic_index(self, topic: str) -> TopicIndex | None:
|
|
348
|
+
"""
|
|
349
|
+
Get topic index for a specific topic.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
topic: Topic name
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
TopicIndex or None if not found
|
|
356
|
+
"""
|
|
357
|
+
if topic in self._topic_indices:
|
|
358
|
+
return self._topic_indices[topic]
|
|
359
|
+
|
|
360
|
+
topic_index = self._load_topic_index(topic)
|
|
361
|
+
if topic_index:
|
|
362
|
+
self._topic_indices[topic] = topic_index
|
|
363
|
+
|
|
364
|
+
return topic_index
|
|
365
|
+
|
|
366
|
+
def remove_cross_reference(
|
|
367
|
+
self,
|
|
368
|
+
source_library: str,
|
|
369
|
+
source_topic: str,
|
|
370
|
+
target_library: str,
|
|
371
|
+
target_topic: str,
|
|
372
|
+
) -> bool:
|
|
373
|
+
"""
|
|
374
|
+
Remove a cross-reference.
|
|
375
|
+
|
|
376
|
+
Args:
|
|
377
|
+
source_library: Source library name
|
|
378
|
+
source_topic: Source topic name
|
|
379
|
+
target_library: Target library name
|
|
380
|
+
target_topic: Target topic name
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
True if removed, False if not found
|
|
384
|
+
"""
|
|
385
|
+
key = f"{source_library}/{source_topic}"
|
|
386
|
+
|
|
387
|
+
if key not in self._cross_refs:
|
|
388
|
+
return False
|
|
389
|
+
|
|
390
|
+
refs = self._cross_refs[key]
|
|
391
|
+
original_len = len(refs)
|
|
392
|
+
|
|
393
|
+
self._cross_refs[key] = [
|
|
394
|
+
ref
|
|
395
|
+
for ref in refs
|
|
396
|
+
if not (
|
|
397
|
+
ref.target_library == target_library
|
|
398
|
+
and ref.target_topic == target_topic
|
|
399
|
+
)
|
|
400
|
+
]
|
|
401
|
+
|
|
402
|
+
if len(self._cross_refs[key]) == 0:
|
|
403
|
+
del self._cross_refs[key]
|
|
404
|
+
|
|
405
|
+
removed = len(self._cross_refs[key]) < original_len
|
|
406
|
+
|
|
407
|
+
if removed:
|
|
408
|
+
self._save_cross_references()
|
|
409
|
+
|
|
410
|
+
return removed
|
|
411
|
+
|
|
412
|
+
def get_all_cross_references(self) -> dict[str, list[CrossReference]]:
|
|
413
|
+
"""Get all cross-references."""
|
|
414
|
+
return self._cross_refs.copy()
|
|
415
|
+
|
|
416
|
+
def clear_cross_references(self):
|
|
417
|
+
"""Clear all cross-references (use with caution)."""
|
|
418
|
+
self._cross_refs = {}
|
|
419
|
+
if self.cross_refs_file.exists():
|
|
420
|
+
self.cross_refs_file.unlink()
|
|
421
|
+
|
|
422
|
+
# Clear topic indices
|
|
423
|
+
for topic_index_file in self.topic_index_dir.rglob("index.yaml"):
|
|
424
|
+
topic_index_file.unlink()
|