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,536 +1,536 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Base Expert Agent Class
|
|
3
|
-
|
|
4
|
-
Industry Experts are business domain authorities (NOT technical specialists).
|
|
5
|
-
They provide domain knowledge through consultation, RAG, and weighted decisions.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import TYPE_CHECKING, Any
|
|
13
|
-
|
|
14
|
-
from ..core.agent_base import BaseAgent
|
|
15
|
-
from ..core.config import ProjectConfig
|
|
16
|
-
from ..core.instructions import GenericInstruction
|
|
17
|
-
from .domain_utils import sanitize_domain_for_path
|
|
18
|
-
from .simple_rag import SimpleKnowledgeBase
|
|
19
|
-
from .vector_rag import VectorKnowledgeBase
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
|
-
if TYPE_CHECKING:
|
|
24
|
-
from ..core.project_profile import ProjectProfile
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class BaseExpert(BaseAgent):
|
|
28
|
-
"""
|
|
29
|
-
Base class for Industry Expert agents.
|
|
30
|
-
|
|
31
|
-
Characteristics:
|
|
32
|
-
- Business domain authority (not technical)
|
|
33
|
-
- Read-only permissions (advisory role)
|
|
34
|
-
- Weighted decision-making (51% primary)
|
|
35
|
-
- RAG + Fine-tuning support
|
|
36
|
-
- Consultation interface
|
|
37
|
-
|
|
38
|
-
Permissions: Read, Grep, Glob (no Write, Edit, Bash)
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
def __init__(
|
|
42
|
-
self,
|
|
43
|
-
expert_id: str,
|
|
44
|
-
expert_name: str,
|
|
45
|
-
primary_domain: str,
|
|
46
|
-
confidence_matrix: dict[str, float] | None = None,
|
|
47
|
-
config: ProjectConfig | None = None,
|
|
48
|
-
rag_enabled: bool = False,
|
|
49
|
-
fine_tuned: bool = False,
|
|
50
|
-
):
|
|
51
|
-
"""
|
|
52
|
-
Initialize an Industry Expert agent.
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
expert_id: Unique identifier (e.g., "expert-home-automation")
|
|
56
|
-
expert_name: Human-readable name
|
|
57
|
-
primary_domain: Domain where this expert has 51% authority
|
|
58
|
-
confidence_matrix: Confidence weights per domain {domain: weight}
|
|
59
|
-
config: Project configuration
|
|
60
|
-
rag_enabled: Whether RAG is enabled for this expert
|
|
61
|
-
fine_tuned: Whether this expert uses fine-tuned models
|
|
62
|
-
"""
|
|
63
|
-
super().__init__(agent_id=expert_id, agent_name=expert_name, config=config)
|
|
64
|
-
|
|
65
|
-
self.expert_id = expert_id
|
|
66
|
-
self.primary_domain = primary_domain
|
|
67
|
-
self.confidence_matrix = confidence_matrix or {}
|
|
68
|
-
self.rag_enabled = rag_enabled
|
|
69
|
-
self.fine_tuned = fine_tuned
|
|
70
|
-
self.project_root: Path | None = None
|
|
71
|
-
|
|
72
|
-
# Built-in expert flags (set by ExpertRegistry)
|
|
73
|
-
self._is_builtin: bool = False
|
|
74
|
-
self._builtin_knowledge_path: Path | None = None
|
|
75
|
-
|
|
76
|
-
# RAG components (to be initialized if enabled)
|
|
77
|
-
self.rag_interface: Any | None = None
|
|
78
|
-
self.knowledge_base: SimpleKnowledgeBase | VectorKnowledgeBase | None = None
|
|
79
|
-
|
|
80
|
-
# Fine-tuning components (to be initialized if enabled)
|
|
81
|
-
self.adapter = None
|
|
82
|
-
|
|
83
|
-
async def activate(self, project_root: Path | None = None):
|
|
84
|
-
"""Activate the expert agent following BMAD activation pattern."""
|
|
85
|
-
await super().activate(project_root)
|
|
86
|
-
self.project_root = project_root or Path.cwd()
|
|
87
|
-
|
|
88
|
-
# Initialize RAG if enabled
|
|
89
|
-
if self.rag_enabled:
|
|
90
|
-
await self._initialize_rag()
|
|
91
|
-
|
|
92
|
-
# Initialize fine-tuning adapter if enabled
|
|
93
|
-
if self.fine_tuned:
|
|
94
|
-
await self._initialize_adapter()
|
|
95
|
-
|
|
96
|
-
self.greet()
|
|
97
|
-
await self.run("help")
|
|
98
|
-
|
|
99
|
-
async def _initialize_rag(self):
|
|
100
|
-
"""
|
|
101
|
-
Initialize RAG interface and knowledge base.
|
|
102
|
-
|
|
103
|
-
For built-in experts, checks built-in knowledge path first.
|
|
104
|
-
For customer experts, checks project knowledge path.
|
|
105
|
-
|
|
106
|
-
Uses VectorKnowledgeBase (FAISS) when available, falls back to SimpleKnowledgeBase.
|
|
107
|
-
"""
|
|
108
|
-
knowledge_dirs: list[Path] = []
|
|
109
|
-
|
|
110
|
-
if self._is_builtin and self._builtin_knowledge_path:
|
|
111
|
-
# Built-in expert: check built-in knowledge first
|
|
112
|
-
sanitized_domain = sanitize_domain_for_path(self.primary_domain)
|
|
113
|
-
builtin_domain_dir = self._builtin_knowledge_path / sanitized_domain
|
|
114
|
-
if builtin_domain_dir.exists():
|
|
115
|
-
knowledge_dirs.append(builtin_domain_dir)
|
|
116
|
-
# Also check general built-in knowledge
|
|
117
|
-
if self._builtin_knowledge_path.exists():
|
|
118
|
-
knowledge_dirs.append(self._builtin_knowledge_path)
|
|
119
|
-
|
|
120
|
-
# Customer knowledge (project-specific)
|
|
121
|
-
if self.project_root:
|
|
122
|
-
sanitized_domain = sanitize_domain_for_path(self.primary_domain)
|
|
123
|
-
customer_domain_dir = (
|
|
124
|
-
self.project_root / ".tapps-agents" / "knowledge" / sanitized_domain
|
|
125
|
-
)
|
|
126
|
-
if customer_domain_dir.exists():
|
|
127
|
-
knowledge_dirs.append(customer_domain_dir)
|
|
128
|
-
# General customer knowledge
|
|
129
|
-
customer_general = self.project_root / ".tapps-agents" / "knowledge"
|
|
130
|
-
if customer_general.exists() and customer_general not in knowledge_dirs:
|
|
131
|
-
knowledge_dirs.append(customer_general)
|
|
132
|
-
|
|
133
|
-
# Initialize knowledge base with vector backend if available
|
|
134
|
-
if knowledge_dirs:
|
|
135
|
-
primary_dir = knowledge_dirs[0]
|
|
136
|
-
|
|
137
|
-
# Initialize freshness tracking for knowledge files
|
|
138
|
-
try:
|
|
139
|
-
from .knowledge_freshness import get_freshness_tracker
|
|
140
|
-
|
|
141
|
-
freshness_tracker = get_freshness_tracker()
|
|
142
|
-
# Scan and update metadata for knowledge files
|
|
143
|
-
freshness_tracker.scan_and_update(primary_dir)
|
|
144
|
-
except Exception:
|
|
145
|
-
# Silently fail if freshness tracking fails (non-critical)
|
|
146
|
-
pass
|
|
147
|
-
|
|
148
|
-
# Try to use VectorKnowledgeBase (FAISS-based)
|
|
149
|
-
try:
|
|
150
|
-
from ..core.config import get_expert_config
|
|
151
|
-
|
|
152
|
-
get_expert_config()
|
|
153
|
-
self.knowledge_base = VectorKnowledgeBase(
|
|
154
|
-
knowledge_dir=primary_dir,
|
|
155
|
-
domain=self.primary_domain,
|
|
156
|
-
chunk_size=768, # Increased for better context retention
|
|
157
|
-
overlap=100, # Better continuity between chunks
|
|
158
|
-
embedding_model="all-MiniLM-L6-v2",
|
|
159
|
-
similarity_threshold=0.65, # Lowered for better recall
|
|
160
|
-
)
|
|
161
|
-
self.rag_interface = self.knowledge_base
|
|
162
|
-
|
|
163
|
-
# Log backend selection
|
|
164
|
-
backend_type = self.knowledge_base.get_backend_type()
|
|
165
|
-
if backend_type == "vector":
|
|
166
|
-
import logging
|
|
167
|
-
|
|
168
|
-
logger = logging.getLogger(__name__)
|
|
169
|
-
logger.info(
|
|
170
|
-
f"Expert {self.expert_id}: Using VectorKnowledgeBase (FAISS) for RAG"
|
|
171
|
-
)
|
|
172
|
-
else:
|
|
173
|
-
import logging
|
|
174
|
-
|
|
175
|
-
logger = logging.getLogger(__name__)
|
|
176
|
-
logger.info(
|
|
177
|
-
f"Expert {self.expert_id}: Using SimpleKnowledgeBase fallback for RAG"
|
|
178
|
-
)
|
|
179
|
-
except Exception as e:
|
|
180
|
-
# Fallback to SimpleKnowledgeBase
|
|
181
|
-
import logging
|
|
182
|
-
|
|
183
|
-
logger = logging.getLogger(__name__)
|
|
184
|
-
logger.debug(
|
|
185
|
-
f"Failed to initialize VectorKnowledgeBase for {self.expert_id}: {e}. "
|
|
186
|
-
"Falling back to SimpleKnowledgeBase."
|
|
187
|
-
)
|
|
188
|
-
self.knowledge_base = SimpleKnowledgeBase(
|
|
189
|
-
primary_dir, domain=self.primary_domain
|
|
190
|
-
)
|
|
191
|
-
self.rag_interface = self.knowledge_base
|
|
192
|
-
else:
|
|
193
|
-
# No knowledge base available
|
|
194
|
-
self.knowledge_base = None
|
|
195
|
-
self.rag_interface = None
|
|
196
|
-
|
|
197
|
-
async def _initialize_adapter(self):
|
|
198
|
-
"""Initialize fine-tuning adapter (LoRA)."""
|
|
199
|
-
# Placeholder for adapter initialization
|
|
200
|
-
# Will be implemented when fine-tuning support is added
|
|
201
|
-
pass
|
|
202
|
-
|
|
203
|
-
def greet(self):
|
|
204
|
-
"""Greet user with expert role and domain."""
|
|
205
|
-
pass # Experts don't write to stdout directly
|
|
206
|
-
|
|
207
|
-
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
208
|
-
"""
|
|
209
|
-
Execute expert command.
|
|
210
|
-
|
|
211
|
-
Common commands:
|
|
212
|
-
- *consult {query}: Answer domain question
|
|
213
|
-
- *validate {artifact}: Validate domain correctness
|
|
214
|
-
- *provide-context {topic}: Provide domain context
|
|
215
|
-
- *help: Show available commands
|
|
216
|
-
"""
|
|
217
|
-
command = command.lstrip("*")
|
|
218
|
-
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
219
|
-
|
|
220
|
-
if hasattr(self, handler_name):
|
|
221
|
-
handler = getattr(self, handler_name)
|
|
222
|
-
return await handler(**kwargs)
|
|
223
|
-
else:
|
|
224
|
-
return {
|
|
225
|
-
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async def _handle_consult(
|
|
229
|
-
self, query: str, domain: str | None = None, **kwargs: Any
|
|
230
|
-
) -> dict[str, Any]:
|
|
231
|
-
"""
|
|
232
|
-
Consult the expert on a domain question.
|
|
233
|
-
|
|
234
|
-
This is the primary consultation interface for workflow agents.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
query: The question or request for domain knowledge
|
|
238
|
-
domain: Optional domain context (defaults to primary_domain)
|
|
239
|
-
|
|
240
|
-
Returns:
|
|
241
|
-
Consultation response with answer, confidence, and sources
|
|
242
|
-
"""
|
|
243
|
-
domain = domain or self.primary_domain
|
|
244
|
-
confidence = self.confidence_matrix.get(domain, 0.0)
|
|
245
|
-
|
|
246
|
-
# Build context from domain knowledge
|
|
247
|
-
context = await self._build_domain_context(query, domain)
|
|
248
|
-
|
|
249
|
-
# Get project profile if available (from kwargs)
|
|
250
|
-
project_profile = kwargs.get("project_profile")
|
|
251
|
-
|
|
252
|
-
# Query using LLM with domain context
|
|
253
|
-
prompt = await self._build_consultation_prompt(
|
|
254
|
-
query, context, domain, project_profile=project_profile
|
|
255
|
-
)
|
|
256
|
-
response = await self._query_llm(prompt)
|
|
257
|
-
|
|
258
|
-
return {
|
|
259
|
-
"answer": response,
|
|
260
|
-
"confidence": confidence,
|
|
261
|
-
"domain": domain,
|
|
262
|
-
"sources": await self._get_sources(query, domain),
|
|
263
|
-
"expert_id": self.expert_id,
|
|
264
|
-
"expert_name": self.agent_name,
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
async def _handle_validate(
|
|
268
|
-
self, artifact: str, artifact_type: str = "code", **kwargs: Any
|
|
269
|
-
) -> dict[str, Any]:
|
|
270
|
-
"""
|
|
271
|
-
Validate an artifact (code, design, etc.) for domain correctness.
|
|
272
|
-
|
|
273
|
-
Args:
|
|
274
|
-
artifact: The artifact to validate (code string, design doc, etc.)
|
|
275
|
-
artifact_type: Type of artifact (code, design, api, etc.)
|
|
276
|
-
|
|
277
|
-
Returns:
|
|
278
|
-
Validation result with feedback and correctness score
|
|
279
|
-
"""
|
|
280
|
-
domain = kwargs.get("domain", self.primary_domain)
|
|
281
|
-
confidence = self.confidence_matrix.get(domain, 0.0)
|
|
282
|
-
|
|
283
|
-
# Build validation context
|
|
284
|
-
context = await self._build_validation_context(artifact, artifact_type, domain)
|
|
285
|
-
|
|
286
|
-
# Query for validation
|
|
287
|
-
prompt = await self._build_validation_prompt(
|
|
288
|
-
artifact, artifact_type, context, domain
|
|
289
|
-
)
|
|
290
|
-
validation = await self._query_llm(prompt)
|
|
291
|
-
|
|
292
|
-
return {
|
|
293
|
-
"valid": True, # Will be parsed from LLM response
|
|
294
|
-
"feedback": validation,
|
|
295
|
-
"confidence": confidence,
|
|
296
|
-
"domain": domain,
|
|
297
|
-
"expert_id": self.expert_id,
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
async def _handle_provide_context(
|
|
301
|
-
self, topic: str, **kwargs: Any
|
|
302
|
-
) -> dict[str, Any]:
|
|
303
|
-
"""
|
|
304
|
-
Provide domain context on a specific topic.
|
|
305
|
-
|
|
306
|
-
Args:
|
|
307
|
-
topic: The topic to provide context for
|
|
308
|
-
|
|
309
|
-
Returns:
|
|
310
|
-
Context information with relevant domain knowledge
|
|
311
|
-
"""
|
|
312
|
-
domain = kwargs.get("domain", self.primary_domain)
|
|
313
|
-
context = await self._build_domain_context(topic, domain)
|
|
314
|
-
|
|
315
|
-
return {
|
|
316
|
-
"context": context,
|
|
317
|
-
"topic": topic,
|
|
318
|
-
"domain": domain,
|
|
319
|
-
"expert_id": self.expert_id,
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
async def _handle_help(self) -> dict[str, Any]:
|
|
323
|
-
"""Show available expert commands."""
|
|
324
|
-
help_message = {
|
|
325
|
-
"*consult {query} [domain]": "Answer a domain-specific question",
|
|
326
|
-
"*validate {artifact} [artifact_type]": "Validate an artifact for domain correctness",
|
|
327
|
-
"*provide-context {topic} [domain]": "Provide domain context on a topic",
|
|
328
|
-
"*help": "Show this help message",
|
|
329
|
-
}
|
|
330
|
-
return {"content": help_message}
|
|
331
|
-
|
|
332
|
-
# Default implementations using simple RAG
|
|
333
|
-
|
|
334
|
-
async def _build_domain_context(self, query: str, domain: str) -> str:
|
|
335
|
-
"""
|
|
336
|
-
Build domain-specific context for a query.
|
|
337
|
-
|
|
338
|
-
Uses simple file-based RAG if enabled, otherwise returns empty context.
|
|
339
|
-
Tracks metrics for performance monitoring.
|
|
340
|
-
"""
|
|
341
|
-
if self.rag_enabled and self.knowledge_base:
|
|
342
|
-
from ..core.config import get_expert_config
|
|
343
|
-
from .rag_metrics import get_rag_metrics_tracker, RAGQueryTimer
|
|
344
|
-
|
|
345
|
-
expert_config = get_expert_config()
|
|
346
|
-
|
|
347
|
-
# Track RAG query metrics
|
|
348
|
-
try:
|
|
349
|
-
tracker = get_rag_metrics_tracker()
|
|
350
|
-
backend_type = "simple"
|
|
351
|
-
if hasattr(self.knowledge_base, "get_backend_type"):
|
|
352
|
-
backend_type = self.knowledge_base.get_backend_type() or "simple"
|
|
353
|
-
|
|
354
|
-
with RAGQueryTimer(tracker) as timer:
|
|
355
|
-
# Perform search to get metrics
|
|
356
|
-
chunks = self.knowledge_base.search(query, max_results=expert_config.rag_max_results)
|
|
357
|
-
|
|
358
|
-
# Calculate similarity metrics
|
|
359
|
-
max_similarity = max((c.score for c in chunks), default=0.0) if chunks else 0.0
|
|
360
|
-
avg_similarity = sum(c.score for c in chunks) / len(chunks) if chunks else 0.0
|
|
361
|
-
|
|
362
|
-
# Record metrics
|
|
363
|
-
timer.set_params(
|
|
364
|
-
query=query,
|
|
365
|
-
expert_id=self.expert_id,
|
|
366
|
-
domain=domain,
|
|
367
|
-
num_results=len(chunks),
|
|
368
|
-
max_similarity=max_similarity,
|
|
369
|
-
avg_similarity=avg_similarity,
|
|
370
|
-
backend_type=backend_type,
|
|
371
|
-
cache_hit=False, # TODO: Add cache hit detection
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
# Get context
|
|
375
|
-
context = self.knowledge_base.get_context(
|
|
376
|
-
query, max_length=expert_config.rag_max_length
|
|
377
|
-
)
|
|
378
|
-
except Exception:
|
|
379
|
-
# If metrics tracking fails, continue without it (non-critical)
|
|
380
|
-
context = self.knowledge_base.get_context(
|
|
381
|
-
query, max_length=expert_config.rag_max_length
|
|
382
|
-
)
|
|
383
|
-
|
|
384
|
-
return context
|
|
385
|
-
return f"Domain: {domain}. No additional context available."
|
|
386
|
-
|
|
387
|
-
async def _get_sources(self, query: str, domain: str) -> list[str]:
|
|
388
|
-
"""
|
|
389
|
-
Get knowledge sources for a query.
|
|
390
|
-
|
|
391
|
-
Returns file paths from knowledge base if RAG is enabled.
|
|
392
|
-
"""
|
|
393
|
-
if self.rag_enabled and self.knowledge_base:
|
|
394
|
-
from ..core.config import get_expert_config
|
|
395
|
-
|
|
396
|
-
expert_config = get_expert_config()
|
|
397
|
-
return self.knowledge_base.get_sources(
|
|
398
|
-
query, max_results=expert_config.rag_max_results
|
|
399
|
-
)
|
|
400
|
-
return []
|
|
401
|
-
|
|
402
|
-
async def _build_consultation_prompt(
|
|
403
|
-
self,
|
|
404
|
-
query: str,
|
|
405
|
-
context: str,
|
|
406
|
-
domain: str,
|
|
407
|
-
project_profile: ProjectProfile | None = None,
|
|
408
|
-
) -> str:
|
|
409
|
-
"""
|
|
410
|
-
Build LLM prompt for consultation.
|
|
411
|
-
|
|
412
|
-
Args:
|
|
413
|
-
query: The question to ask
|
|
414
|
-
context: Domain context from RAG
|
|
415
|
-
domain: Domain name
|
|
416
|
-
project_profile: Optional project profile for context-aware advice
|
|
417
|
-
"""
|
|
418
|
-
prompt = f"""You are a {domain} domain expert.
|
|
419
|
-
|
|
420
|
-
Domain Context:
|
|
421
|
-
{context}
|
|
422
|
-
"""
|
|
423
|
-
|
|
424
|
-
# Add project profile context if available and high confidence
|
|
425
|
-
if project_profile:
|
|
426
|
-
profile_context = self._format_profile_context(project_profile)
|
|
427
|
-
if profile_context:
|
|
428
|
-
prompt += f"\nProject Context:\n{profile_context}\n"
|
|
429
|
-
|
|
430
|
-
prompt += f"""
|
|
431
|
-
Question: {query}
|
|
432
|
-
|
|
433
|
-
Provide a clear, accurate answer based on your domain expertise. Tailor your advice to the project's characteristics if relevant. Cite sources if applicable.
|
|
434
|
-
Answer:"""
|
|
435
|
-
|
|
436
|
-
return prompt
|
|
437
|
-
|
|
438
|
-
def _format_profile_context(self, profile: ProjectProfile) -> str:
|
|
439
|
-
"""
|
|
440
|
-
Format project profile as context string for LLM.
|
|
441
|
-
|
|
442
|
-
Only includes high-confidence profile values (from config).
|
|
443
|
-
|
|
444
|
-
Args:
|
|
445
|
-
profile: ProjectProfile instance
|
|
446
|
-
|
|
447
|
-
Returns:
|
|
448
|
-
Formatted context string or empty string if no high-confidence values
|
|
449
|
-
"""
|
|
450
|
-
from ..core.config import get_expert_config
|
|
451
|
-
|
|
452
|
-
expert_config = get_expert_config()
|
|
453
|
-
profile_threshold = expert_config.profile_confidence_threshold
|
|
454
|
-
|
|
455
|
-
context_parts = []
|
|
456
|
-
|
|
457
|
-
# Deployment type
|
|
458
|
-
if (
|
|
459
|
-
profile.deployment_type
|
|
460
|
-
and profile.deployment_type_confidence >= profile_threshold
|
|
461
|
-
):
|
|
462
|
-
context_parts.append(
|
|
463
|
-
f"- Deployment: {profile.deployment_type} "
|
|
464
|
-
f"(confidence: {profile.deployment_type_confidence:.1%})"
|
|
465
|
-
)
|
|
466
|
-
|
|
467
|
-
# Security level
|
|
468
|
-
if (
|
|
469
|
-
profile.security_level
|
|
470
|
-
and profile.security_level_confidence >= profile_threshold
|
|
471
|
-
):
|
|
472
|
-
context_parts.append(
|
|
473
|
-
f"- Security Level: {profile.security_level} "
|
|
474
|
-
f"(confidence: {profile.security_level_confidence:.1%})"
|
|
475
|
-
)
|
|
476
|
-
|
|
477
|
-
# Compliance requirements
|
|
478
|
-
high_confidence_compliance = [
|
|
479
|
-
req
|
|
480
|
-
for req in profile.compliance_requirements
|
|
481
|
-
if req.confidence >= profile_threshold
|
|
482
|
-
]
|
|
483
|
-
if high_confidence_compliance:
|
|
484
|
-
compliance_names = ", ".join(req.name for req in high_confidence_compliance)
|
|
485
|
-
context_parts.append(f"- Compliance Requirements: {compliance_names}")
|
|
486
|
-
|
|
487
|
-
# Tenancy (if detected)
|
|
488
|
-
if profile.tenancy and profile.tenancy_confidence >= profile_threshold:
|
|
489
|
-
context_parts.append(
|
|
490
|
-
f"- Tenancy: {profile.tenancy} "
|
|
491
|
-
f"(confidence: {profile.tenancy_confidence:.1%})"
|
|
492
|
-
)
|
|
493
|
-
|
|
494
|
-
# User scale (if detected)
|
|
495
|
-
if profile.user_scale and profile.user_scale_confidence >= profile_threshold:
|
|
496
|
-
context_parts.append(
|
|
497
|
-
f"- User Scale: {profile.user_scale} "
|
|
498
|
-
f"(confidence: {profile.user_scale_confidence:.1%})"
|
|
499
|
-
)
|
|
500
|
-
|
|
501
|
-
return "\n".join(context_parts) if context_parts else ""
|
|
502
|
-
|
|
503
|
-
async def _build_validation_prompt(
|
|
504
|
-
self, artifact: str, artifact_type: str, context: str, domain: str
|
|
505
|
-
) -> str:
|
|
506
|
-
"""Build LLM prompt for validation."""
|
|
507
|
-
return f"""You are a {domain} domain expert validating a {artifact_type}.
|
|
508
|
-
|
|
509
|
-
Domain Context:
|
|
510
|
-
{context}
|
|
511
|
-
|
|
512
|
-
{artifact_type.capitalize()} to validate:
|
|
513
|
-
{artifact}
|
|
514
|
-
|
|
515
|
-
Validate this artifact for domain correctness. Provide:
|
|
516
|
-
1. Is it correct? (yes/no)
|
|
517
|
-
2. Feedback and suggestions
|
|
518
|
-
3. Domain-specific issues found
|
|
519
|
-
|
|
520
|
-
Validation:"""
|
|
521
|
-
|
|
522
|
-
async def _build_validation_context(
|
|
523
|
-
self, artifact: str, artifact_type: str, domain: str
|
|
524
|
-
) -> str:
|
|
525
|
-
"""Build context for validation."""
|
|
526
|
-
return await self._build_domain_context(f"{artifact_type} validation", domain)
|
|
527
|
-
|
|
528
|
-
async def _query_llm(self, prompt: str) -> GenericInstruction:
|
|
529
|
-
"""Prepare instruction for Cursor Skills (experts don't call LLMs directly)."""
|
|
530
|
-
# Experts prepare instructions for Cursor Skills execution
|
|
531
|
-
return GenericInstruction(
|
|
532
|
-
agent_name="expert",
|
|
533
|
-
command="consult",
|
|
534
|
-
prompt=prompt,
|
|
535
|
-
parameters={"expert_id": self.expert_id, "domain": self.primary_domain},
|
|
536
|
-
)
|
|
1
|
+
"""
|
|
2
|
+
Base Expert Agent Class
|
|
3
|
+
|
|
4
|
+
Industry Experts are business domain authorities (NOT technical specialists).
|
|
5
|
+
They provide domain knowledge through consultation, RAG, and weighted decisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
from ..core.agent_base import BaseAgent
|
|
15
|
+
from ..core.config import ProjectConfig
|
|
16
|
+
from ..core.instructions import GenericInstruction
|
|
17
|
+
from .domain_utils import sanitize_domain_for_path
|
|
18
|
+
from .simple_rag import SimpleKnowledgeBase
|
|
19
|
+
from .vector_rag import VectorKnowledgeBase
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from ..core.project_profile import ProjectProfile
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class BaseExpert(BaseAgent):
|
|
28
|
+
"""
|
|
29
|
+
Base class for Industry Expert agents.
|
|
30
|
+
|
|
31
|
+
Characteristics:
|
|
32
|
+
- Business domain authority (not technical)
|
|
33
|
+
- Read-only permissions (advisory role)
|
|
34
|
+
- Weighted decision-making (51% primary)
|
|
35
|
+
- RAG + Fine-tuning support
|
|
36
|
+
- Consultation interface
|
|
37
|
+
|
|
38
|
+
Permissions: Read, Grep, Glob (no Write, Edit, Bash)
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
expert_id: str,
|
|
44
|
+
expert_name: str,
|
|
45
|
+
primary_domain: str,
|
|
46
|
+
confidence_matrix: dict[str, float] | None = None,
|
|
47
|
+
config: ProjectConfig | None = None,
|
|
48
|
+
rag_enabled: bool = False,
|
|
49
|
+
fine_tuned: bool = False,
|
|
50
|
+
):
|
|
51
|
+
"""
|
|
52
|
+
Initialize an Industry Expert agent.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
expert_id: Unique identifier (e.g., "expert-home-automation")
|
|
56
|
+
expert_name: Human-readable name
|
|
57
|
+
primary_domain: Domain where this expert has 51% authority
|
|
58
|
+
confidence_matrix: Confidence weights per domain {domain: weight}
|
|
59
|
+
config: Project configuration
|
|
60
|
+
rag_enabled: Whether RAG is enabled for this expert
|
|
61
|
+
fine_tuned: Whether this expert uses fine-tuned models
|
|
62
|
+
"""
|
|
63
|
+
super().__init__(agent_id=expert_id, agent_name=expert_name, config=config)
|
|
64
|
+
|
|
65
|
+
self.expert_id = expert_id
|
|
66
|
+
self.primary_domain = primary_domain
|
|
67
|
+
self.confidence_matrix = confidence_matrix or {}
|
|
68
|
+
self.rag_enabled = rag_enabled
|
|
69
|
+
self.fine_tuned = fine_tuned
|
|
70
|
+
self.project_root: Path | None = None
|
|
71
|
+
|
|
72
|
+
# Built-in expert flags (set by ExpertRegistry)
|
|
73
|
+
self._is_builtin: bool = False
|
|
74
|
+
self._builtin_knowledge_path: Path | None = None
|
|
75
|
+
|
|
76
|
+
# RAG components (to be initialized if enabled)
|
|
77
|
+
self.rag_interface: Any | None = None
|
|
78
|
+
self.knowledge_base: SimpleKnowledgeBase | VectorKnowledgeBase | None = None
|
|
79
|
+
|
|
80
|
+
# Fine-tuning components (to be initialized if enabled)
|
|
81
|
+
self.adapter = None
|
|
82
|
+
|
|
83
|
+
async def activate(self, project_root: Path | None = None):
|
|
84
|
+
"""Activate the expert agent following BMAD activation pattern."""
|
|
85
|
+
await super().activate(project_root)
|
|
86
|
+
self.project_root = project_root or Path.cwd()
|
|
87
|
+
|
|
88
|
+
# Initialize RAG if enabled
|
|
89
|
+
if self.rag_enabled:
|
|
90
|
+
await self._initialize_rag()
|
|
91
|
+
|
|
92
|
+
# Initialize fine-tuning adapter if enabled
|
|
93
|
+
if self.fine_tuned:
|
|
94
|
+
await self._initialize_adapter()
|
|
95
|
+
|
|
96
|
+
self.greet()
|
|
97
|
+
await self.run("help")
|
|
98
|
+
|
|
99
|
+
async def _initialize_rag(self):
|
|
100
|
+
"""
|
|
101
|
+
Initialize RAG interface and knowledge base.
|
|
102
|
+
|
|
103
|
+
For built-in experts, checks built-in knowledge path first.
|
|
104
|
+
For customer experts, checks project knowledge path.
|
|
105
|
+
|
|
106
|
+
Uses VectorKnowledgeBase (FAISS) when available, falls back to SimpleKnowledgeBase.
|
|
107
|
+
"""
|
|
108
|
+
knowledge_dirs: list[Path] = []
|
|
109
|
+
|
|
110
|
+
if self._is_builtin and self._builtin_knowledge_path:
|
|
111
|
+
# Built-in expert: check built-in knowledge first
|
|
112
|
+
sanitized_domain = sanitize_domain_for_path(self.primary_domain)
|
|
113
|
+
builtin_domain_dir = self._builtin_knowledge_path / sanitized_domain
|
|
114
|
+
if builtin_domain_dir.exists():
|
|
115
|
+
knowledge_dirs.append(builtin_domain_dir)
|
|
116
|
+
# Also check general built-in knowledge
|
|
117
|
+
if self._builtin_knowledge_path.exists():
|
|
118
|
+
knowledge_dirs.append(self._builtin_knowledge_path)
|
|
119
|
+
|
|
120
|
+
# Customer knowledge (project-specific)
|
|
121
|
+
if self.project_root:
|
|
122
|
+
sanitized_domain = sanitize_domain_for_path(self.primary_domain)
|
|
123
|
+
customer_domain_dir = (
|
|
124
|
+
self.project_root / ".tapps-agents" / "knowledge" / sanitized_domain
|
|
125
|
+
)
|
|
126
|
+
if customer_domain_dir.exists():
|
|
127
|
+
knowledge_dirs.append(customer_domain_dir)
|
|
128
|
+
# General customer knowledge
|
|
129
|
+
customer_general = self.project_root / ".tapps-agents" / "knowledge"
|
|
130
|
+
if customer_general.exists() and customer_general not in knowledge_dirs:
|
|
131
|
+
knowledge_dirs.append(customer_general)
|
|
132
|
+
|
|
133
|
+
# Initialize knowledge base with vector backend if available
|
|
134
|
+
if knowledge_dirs:
|
|
135
|
+
primary_dir = knowledge_dirs[0]
|
|
136
|
+
|
|
137
|
+
# Initialize freshness tracking for knowledge files
|
|
138
|
+
try:
|
|
139
|
+
from .knowledge_freshness import get_freshness_tracker
|
|
140
|
+
|
|
141
|
+
freshness_tracker = get_freshness_tracker()
|
|
142
|
+
# Scan and update metadata for knowledge files
|
|
143
|
+
freshness_tracker.scan_and_update(primary_dir)
|
|
144
|
+
except Exception:
|
|
145
|
+
# Silently fail if freshness tracking fails (non-critical)
|
|
146
|
+
pass
|
|
147
|
+
|
|
148
|
+
# Try to use VectorKnowledgeBase (FAISS-based)
|
|
149
|
+
try:
|
|
150
|
+
from ..core.config import get_expert_config
|
|
151
|
+
|
|
152
|
+
get_expert_config()
|
|
153
|
+
self.knowledge_base = VectorKnowledgeBase(
|
|
154
|
+
knowledge_dir=primary_dir,
|
|
155
|
+
domain=self.primary_domain,
|
|
156
|
+
chunk_size=768, # Increased for better context retention
|
|
157
|
+
overlap=100, # Better continuity between chunks
|
|
158
|
+
embedding_model="all-MiniLM-L6-v2",
|
|
159
|
+
similarity_threshold=0.65, # Lowered for better recall
|
|
160
|
+
)
|
|
161
|
+
self.rag_interface = self.knowledge_base
|
|
162
|
+
|
|
163
|
+
# Log backend selection
|
|
164
|
+
backend_type = self.knowledge_base.get_backend_type()
|
|
165
|
+
if backend_type == "vector":
|
|
166
|
+
import logging
|
|
167
|
+
|
|
168
|
+
logger = logging.getLogger(__name__)
|
|
169
|
+
logger.info(
|
|
170
|
+
f"Expert {self.expert_id}: Using VectorKnowledgeBase (FAISS) for RAG"
|
|
171
|
+
)
|
|
172
|
+
else:
|
|
173
|
+
import logging
|
|
174
|
+
|
|
175
|
+
logger = logging.getLogger(__name__)
|
|
176
|
+
logger.info(
|
|
177
|
+
f"Expert {self.expert_id}: Using SimpleKnowledgeBase fallback for RAG"
|
|
178
|
+
)
|
|
179
|
+
except Exception as e:
|
|
180
|
+
# Fallback to SimpleKnowledgeBase
|
|
181
|
+
import logging
|
|
182
|
+
|
|
183
|
+
logger = logging.getLogger(__name__)
|
|
184
|
+
logger.debug(
|
|
185
|
+
f"Failed to initialize VectorKnowledgeBase for {self.expert_id}: {e}. "
|
|
186
|
+
"Falling back to SimpleKnowledgeBase."
|
|
187
|
+
)
|
|
188
|
+
self.knowledge_base = SimpleKnowledgeBase(
|
|
189
|
+
primary_dir, domain=self.primary_domain
|
|
190
|
+
)
|
|
191
|
+
self.rag_interface = self.knowledge_base
|
|
192
|
+
else:
|
|
193
|
+
# No knowledge base available
|
|
194
|
+
self.knowledge_base = None
|
|
195
|
+
self.rag_interface = None
|
|
196
|
+
|
|
197
|
+
async def _initialize_adapter(self):
|
|
198
|
+
"""Initialize fine-tuning adapter (LoRA)."""
|
|
199
|
+
# Placeholder for adapter initialization
|
|
200
|
+
# Will be implemented when fine-tuning support is added
|
|
201
|
+
pass
|
|
202
|
+
|
|
203
|
+
def greet(self):
|
|
204
|
+
"""Greet user with expert role and domain."""
|
|
205
|
+
pass # Experts don't write to stdout directly
|
|
206
|
+
|
|
207
|
+
async def run(self, command: str, **kwargs: Any) -> dict[str, Any]:
|
|
208
|
+
"""
|
|
209
|
+
Execute expert command.
|
|
210
|
+
|
|
211
|
+
Common commands:
|
|
212
|
+
- *consult {query}: Answer domain question
|
|
213
|
+
- *validate {artifact}: Validate domain correctness
|
|
214
|
+
- *provide-context {topic}: Provide domain context
|
|
215
|
+
- *help: Show available commands
|
|
216
|
+
"""
|
|
217
|
+
command = command.lstrip("*")
|
|
218
|
+
handler_name = f"_handle_{command.replace('-', '_')}"
|
|
219
|
+
|
|
220
|
+
if hasattr(self, handler_name):
|
|
221
|
+
handler = getattr(self, handler_name)
|
|
222
|
+
return await handler(**kwargs)
|
|
223
|
+
else:
|
|
224
|
+
return {
|
|
225
|
+
"error": f"Unknown command: {command}. Use '*help' to see available commands."
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async def _handle_consult(
|
|
229
|
+
self, query: str, domain: str | None = None, **kwargs: Any
|
|
230
|
+
) -> dict[str, Any]:
|
|
231
|
+
"""
|
|
232
|
+
Consult the expert on a domain question.
|
|
233
|
+
|
|
234
|
+
This is the primary consultation interface for workflow agents.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
query: The question or request for domain knowledge
|
|
238
|
+
domain: Optional domain context (defaults to primary_domain)
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
Consultation response with answer, confidence, and sources
|
|
242
|
+
"""
|
|
243
|
+
domain = domain or self.primary_domain
|
|
244
|
+
confidence = self.confidence_matrix.get(domain, 0.0)
|
|
245
|
+
|
|
246
|
+
# Build context from domain knowledge
|
|
247
|
+
context = await self._build_domain_context(query, domain)
|
|
248
|
+
|
|
249
|
+
# Get project profile if available (from kwargs)
|
|
250
|
+
project_profile = kwargs.get("project_profile")
|
|
251
|
+
|
|
252
|
+
# Query using LLM with domain context
|
|
253
|
+
prompt = await self._build_consultation_prompt(
|
|
254
|
+
query, context, domain, project_profile=project_profile
|
|
255
|
+
)
|
|
256
|
+
response = await self._query_llm(prompt)
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
"answer": response,
|
|
260
|
+
"confidence": confidence,
|
|
261
|
+
"domain": domain,
|
|
262
|
+
"sources": await self._get_sources(query, domain),
|
|
263
|
+
"expert_id": self.expert_id,
|
|
264
|
+
"expert_name": self.agent_name,
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async def _handle_validate(
|
|
268
|
+
self, artifact: str, artifact_type: str = "code", **kwargs: Any
|
|
269
|
+
) -> dict[str, Any]:
|
|
270
|
+
"""
|
|
271
|
+
Validate an artifact (code, design, etc.) for domain correctness.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
artifact: The artifact to validate (code string, design doc, etc.)
|
|
275
|
+
artifact_type: Type of artifact (code, design, api, etc.)
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
Validation result with feedback and correctness score
|
|
279
|
+
"""
|
|
280
|
+
domain = kwargs.get("domain", self.primary_domain)
|
|
281
|
+
confidence = self.confidence_matrix.get(domain, 0.0)
|
|
282
|
+
|
|
283
|
+
# Build validation context
|
|
284
|
+
context = await self._build_validation_context(artifact, artifact_type, domain)
|
|
285
|
+
|
|
286
|
+
# Query for validation
|
|
287
|
+
prompt = await self._build_validation_prompt(
|
|
288
|
+
artifact, artifact_type, context, domain
|
|
289
|
+
)
|
|
290
|
+
validation = await self._query_llm(prompt)
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
"valid": True, # Will be parsed from LLM response
|
|
294
|
+
"feedback": validation,
|
|
295
|
+
"confidence": confidence,
|
|
296
|
+
"domain": domain,
|
|
297
|
+
"expert_id": self.expert_id,
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async def _handle_provide_context(
|
|
301
|
+
self, topic: str, **kwargs: Any
|
|
302
|
+
) -> dict[str, Any]:
|
|
303
|
+
"""
|
|
304
|
+
Provide domain context on a specific topic.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
topic: The topic to provide context for
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
Context information with relevant domain knowledge
|
|
311
|
+
"""
|
|
312
|
+
domain = kwargs.get("domain", self.primary_domain)
|
|
313
|
+
context = await self._build_domain_context(topic, domain)
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
"context": context,
|
|
317
|
+
"topic": topic,
|
|
318
|
+
"domain": domain,
|
|
319
|
+
"expert_id": self.expert_id,
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async def _handle_help(self) -> dict[str, Any]:
|
|
323
|
+
"""Show available expert commands."""
|
|
324
|
+
help_message = {
|
|
325
|
+
"*consult {query} [domain]": "Answer a domain-specific question",
|
|
326
|
+
"*validate {artifact} [artifact_type]": "Validate an artifact for domain correctness",
|
|
327
|
+
"*provide-context {topic} [domain]": "Provide domain context on a topic",
|
|
328
|
+
"*help": "Show this help message",
|
|
329
|
+
}
|
|
330
|
+
return {"content": help_message}
|
|
331
|
+
|
|
332
|
+
# Default implementations using simple RAG
|
|
333
|
+
|
|
334
|
+
async def _build_domain_context(self, query: str, domain: str) -> str:
|
|
335
|
+
"""
|
|
336
|
+
Build domain-specific context for a query.
|
|
337
|
+
|
|
338
|
+
Uses simple file-based RAG if enabled, otherwise returns empty context.
|
|
339
|
+
Tracks metrics for performance monitoring.
|
|
340
|
+
"""
|
|
341
|
+
if self.rag_enabled and self.knowledge_base:
|
|
342
|
+
from ..core.config import get_expert_config
|
|
343
|
+
from .rag_metrics import get_rag_metrics_tracker, RAGQueryTimer
|
|
344
|
+
|
|
345
|
+
expert_config = get_expert_config()
|
|
346
|
+
|
|
347
|
+
# Track RAG query metrics
|
|
348
|
+
try:
|
|
349
|
+
tracker = get_rag_metrics_tracker()
|
|
350
|
+
backend_type = "simple"
|
|
351
|
+
if hasattr(self.knowledge_base, "get_backend_type"):
|
|
352
|
+
backend_type = self.knowledge_base.get_backend_type() or "simple"
|
|
353
|
+
|
|
354
|
+
with RAGQueryTimer(tracker) as timer:
|
|
355
|
+
# Perform search to get metrics
|
|
356
|
+
chunks = self.knowledge_base.search(query, max_results=expert_config.rag_max_results)
|
|
357
|
+
|
|
358
|
+
# Calculate similarity metrics
|
|
359
|
+
max_similarity = max((c.score for c in chunks), default=0.0) if chunks else 0.0
|
|
360
|
+
avg_similarity = sum(c.score for c in chunks) / len(chunks) if chunks else 0.0
|
|
361
|
+
|
|
362
|
+
# Record metrics
|
|
363
|
+
timer.set_params(
|
|
364
|
+
query=query,
|
|
365
|
+
expert_id=self.expert_id,
|
|
366
|
+
domain=domain,
|
|
367
|
+
num_results=len(chunks),
|
|
368
|
+
max_similarity=max_similarity,
|
|
369
|
+
avg_similarity=avg_similarity,
|
|
370
|
+
backend_type=backend_type,
|
|
371
|
+
cache_hit=False, # TODO: Add cache hit detection
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# Get context
|
|
375
|
+
context = self.knowledge_base.get_context(
|
|
376
|
+
query, max_length=expert_config.rag_max_length
|
|
377
|
+
)
|
|
378
|
+
except Exception:
|
|
379
|
+
# If metrics tracking fails, continue without it (non-critical)
|
|
380
|
+
context = self.knowledge_base.get_context(
|
|
381
|
+
query, max_length=expert_config.rag_max_length
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
return context
|
|
385
|
+
return f"Domain: {domain}. No additional context available."
|
|
386
|
+
|
|
387
|
+
async def _get_sources(self, query: str, domain: str) -> list[str]:
|
|
388
|
+
"""
|
|
389
|
+
Get knowledge sources for a query.
|
|
390
|
+
|
|
391
|
+
Returns file paths from knowledge base if RAG is enabled.
|
|
392
|
+
"""
|
|
393
|
+
if self.rag_enabled and self.knowledge_base:
|
|
394
|
+
from ..core.config import get_expert_config
|
|
395
|
+
|
|
396
|
+
expert_config = get_expert_config()
|
|
397
|
+
return self.knowledge_base.get_sources(
|
|
398
|
+
query, max_results=expert_config.rag_max_results
|
|
399
|
+
)
|
|
400
|
+
return []
|
|
401
|
+
|
|
402
|
+
async def _build_consultation_prompt(
|
|
403
|
+
self,
|
|
404
|
+
query: str,
|
|
405
|
+
context: str,
|
|
406
|
+
domain: str,
|
|
407
|
+
project_profile: ProjectProfile | None = None,
|
|
408
|
+
) -> str:
|
|
409
|
+
"""
|
|
410
|
+
Build LLM prompt for consultation.
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
query: The question to ask
|
|
414
|
+
context: Domain context from RAG
|
|
415
|
+
domain: Domain name
|
|
416
|
+
project_profile: Optional project profile for context-aware advice
|
|
417
|
+
"""
|
|
418
|
+
prompt = f"""You are a {domain} domain expert.
|
|
419
|
+
|
|
420
|
+
Domain Context:
|
|
421
|
+
{context}
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
# Add project profile context if available and high confidence
|
|
425
|
+
if project_profile:
|
|
426
|
+
profile_context = self._format_profile_context(project_profile)
|
|
427
|
+
if profile_context:
|
|
428
|
+
prompt += f"\nProject Context:\n{profile_context}\n"
|
|
429
|
+
|
|
430
|
+
prompt += f"""
|
|
431
|
+
Question: {query}
|
|
432
|
+
|
|
433
|
+
Provide a clear, accurate answer based on your domain expertise. Tailor your advice to the project's characteristics if relevant. Cite sources if applicable.
|
|
434
|
+
Answer:"""
|
|
435
|
+
|
|
436
|
+
return prompt
|
|
437
|
+
|
|
438
|
+
def _format_profile_context(self, profile: ProjectProfile) -> str:
|
|
439
|
+
"""
|
|
440
|
+
Format project profile as context string for LLM.
|
|
441
|
+
|
|
442
|
+
Only includes high-confidence profile values (from config).
|
|
443
|
+
|
|
444
|
+
Args:
|
|
445
|
+
profile: ProjectProfile instance
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
Formatted context string or empty string if no high-confidence values
|
|
449
|
+
"""
|
|
450
|
+
from ..core.config import get_expert_config
|
|
451
|
+
|
|
452
|
+
expert_config = get_expert_config()
|
|
453
|
+
profile_threshold = expert_config.profile_confidence_threshold
|
|
454
|
+
|
|
455
|
+
context_parts = []
|
|
456
|
+
|
|
457
|
+
# Deployment type
|
|
458
|
+
if (
|
|
459
|
+
profile.deployment_type
|
|
460
|
+
and profile.deployment_type_confidence >= profile_threshold
|
|
461
|
+
):
|
|
462
|
+
context_parts.append(
|
|
463
|
+
f"- Deployment: {profile.deployment_type} "
|
|
464
|
+
f"(confidence: {profile.deployment_type_confidence:.1%})"
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
# Security level
|
|
468
|
+
if (
|
|
469
|
+
profile.security_level
|
|
470
|
+
and profile.security_level_confidence >= profile_threshold
|
|
471
|
+
):
|
|
472
|
+
context_parts.append(
|
|
473
|
+
f"- Security Level: {profile.security_level} "
|
|
474
|
+
f"(confidence: {profile.security_level_confidence:.1%})"
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
# Compliance requirements
|
|
478
|
+
high_confidence_compliance = [
|
|
479
|
+
req
|
|
480
|
+
for req in profile.compliance_requirements
|
|
481
|
+
if req.confidence >= profile_threshold
|
|
482
|
+
]
|
|
483
|
+
if high_confidence_compliance:
|
|
484
|
+
compliance_names = ", ".join(req.name for req in high_confidence_compliance)
|
|
485
|
+
context_parts.append(f"- Compliance Requirements: {compliance_names}")
|
|
486
|
+
|
|
487
|
+
# Tenancy (if detected)
|
|
488
|
+
if profile.tenancy and profile.tenancy_confidence >= profile_threshold:
|
|
489
|
+
context_parts.append(
|
|
490
|
+
f"- Tenancy: {profile.tenancy} "
|
|
491
|
+
f"(confidence: {profile.tenancy_confidence:.1%})"
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
# User scale (if detected)
|
|
495
|
+
if profile.user_scale and profile.user_scale_confidence >= profile_threshold:
|
|
496
|
+
context_parts.append(
|
|
497
|
+
f"- User Scale: {profile.user_scale} "
|
|
498
|
+
f"(confidence: {profile.user_scale_confidence:.1%})"
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
return "\n".join(context_parts) if context_parts else ""
|
|
502
|
+
|
|
503
|
+
async def _build_validation_prompt(
|
|
504
|
+
self, artifact: str, artifact_type: str, context: str, domain: str
|
|
505
|
+
) -> str:
|
|
506
|
+
"""Build LLM prompt for validation."""
|
|
507
|
+
return f"""You are a {domain} domain expert validating a {artifact_type}.
|
|
508
|
+
|
|
509
|
+
Domain Context:
|
|
510
|
+
{context}
|
|
511
|
+
|
|
512
|
+
{artifact_type.capitalize()} to validate:
|
|
513
|
+
{artifact}
|
|
514
|
+
|
|
515
|
+
Validate this artifact for domain correctness. Provide:
|
|
516
|
+
1. Is it correct? (yes/no)
|
|
517
|
+
2. Feedback and suggestions
|
|
518
|
+
3. Domain-specific issues found
|
|
519
|
+
|
|
520
|
+
Validation:"""
|
|
521
|
+
|
|
522
|
+
async def _build_validation_context(
|
|
523
|
+
self, artifact: str, artifact_type: str, domain: str
|
|
524
|
+
) -> str:
|
|
525
|
+
"""Build context for validation."""
|
|
526
|
+
return await self._build_domain_context(f"{artifact_type} validation", domain)
|
|
527
|
+
|
|
528
|
+
async def _query_llm(self, prompt: str) -> GenericInstruction:
|
|
529
|
+
"""Prepare instruction for Cursor Skills (experts don't call LLMs directly)."""
|
|
530
|
+
# Experts prepare instructions for Cursor Skills execution
|
|
531
|
+
return GenericInstruction(
|
|
532
|
+
agent_name="expert",
|
|
533
|
+
command="consult",
|
|
534
|
+
prompt=prompt,
|
|
535
|
+
parameters={"expert_id": self.expert_id, "domain": self.primary_domain},
|
|
536
|
+
)
|