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
tapps_agents/core/agent_base.py
CHANGED
|
@@ -1,648 +1,648 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Base Agent Class - Common functionality for all agents
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
# @ai-prime-directive: This file implements the core agent base class for all workflow agents.
|
|
6
|
-
# All agents must inherit from BaseAgent and follow the instruction-based architecture.
|
|
7
|
-
# See ADR-001 for architectural rationale. Do not modify the activation or instruction
|
|
8
|
-
# preparation patterns without updating all agent implementations.
|
|
9
|
-
|
|
10
|
-
# @ai-constraints:
|
|
11
|
-
# - Must maintain backward compatibility with existing agent implementations
|
|
12
|
-
# - Do not modify the instruction execution model without updating all agents
|
|
13
|
-
# - Performance: Agent activation must complete in <500ms
|
|
14
|
-
# - All agents must implement the instruction preparation pattern per ADR-001
|
|
15
|
-
|
|
16
|
-
# @note[2025-01-15]: Instruction-based architecture per ADR-001.
|
|
17
|
-
# Agents prepare instruction objects instead of calling LLMs directly.
|
|
18
|
-
# See docs/architecture/decisions/ADR-001-instruction-based-architecture.md
|
|
19
|
-
|
|
20
|
-
from __future__ import annotations
|
|
21
|
-
|
|
22
|
-
from abc import ABC, abstractmethod
|
|
23
|
-
from pathlib import Path
|
|
24
|
-
from typing import Any
|
|
25
|
-
|
|
26
|
-
from .config import ProjectConfig, load_config
|
|
27
|
-
from .error_envelope import ErrorEnvelope
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class BaseAgent(ABC):
|
|
31
|
-
"""
|
|
32
|
-
Base class for all agents.
|
|
33
|
-
|
|
34
|
-
Provides common functionality:
|
|
35
|
-
- Activation instructions
|
|
36
|
-
- Command discovery
|
|
37
|
-
- Configuration loading
|
|
38
|
-
- Help system
|
|
39
|
-
|
|
40
|
-
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
41
|
-
All agents MUST maintain 100% accuracy:
|
|
42
|
-
- NEVER make up, invent, or fabricate information
|
|
43
|
-
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
44
|
-
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
45
|
-
- Distinguish between code paths executing and actual functionality working
|
|
46
|
-
- Admit uncertainty explicitly when you cannot verify
|
|
47
|
-
- Check actual return values, not just that functions were called
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
def __init__(
|
|
51
|
-
self, agent_id: str, agent_name: str, config: ProjectConfig | None = None
|
|
52
|
-
):
|
|
53
|
-
"""
|
|
54
|
-
Initialize a base agent instance.
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
agent_id: Unique identifier for the agent (e.g., "reviewer", "planner")
|
|
58
|
-
agent_name: Human-readable name for the agent (e.g., "Code Reviewer")
|
|
59
|
-
config: Optional project configuration. If None, will be loaded during activation.
|
|
60
|
-
|
|
61
|
-
Note:
|
|
62
|
-
Most agent attributes are initialized to None and populated during the
|
|
63
|
-
activate() method. This allows for lazy initialization and proper error handling.
|
|
64
|
-
"""
|
|
65
|
-
self.agent_id = agent_id
|
|
66
|
-
self.agent_name = agent_name
|
|
67
|
-
self.config = config # ProjectConfig instance
|
|
68
|
-
self.domain_config: str | None = None
|
|
69
|
-
self.customizations: Any | None = None
|
|
70
|
-
self.role_file: Any | None = None # Agent role file data
|
|
71
|
-
self.context_manager: Any | None = None
|
|
72
|
-
self.mcp_gateway: Any | None = None
|
|
73
|
-
self._unified_cache: Any | None = None # Optional unified cache instance
|
|
74
|
-
self._project_root: Path | None = None # Cached project root
|
|
75
|
-
self._cached_commands: list[dict[str, str]] | None = None # Cached command list
|
|
76
|
-
|
|
77
|
-
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
78
|
-
"""
|
|
79
|
-
Follow activation instructions sequence.
|
|
80
|
-
|
|
81
|
-
This method initializes the agent by loading all necessary configuration
|
|
82
|
-
and context. It follows the BMAD-METHOD pattern for agent activation.
|
|
83
|
-
|
|
84
|
-
BMAD-METHOD pattern:
|
|
85
|
-
1. Read agent definition
|
|
86
|
-
2. Load project config
|
|
87
|
-
3. Load domain config
|
|
88
|
-
4. Load role file (optional)
|
|
89
|
-
5. Load customizations
|
|
90
|
-
6. Greet user
|
|
91
|
-
7. Run *help
|
|
92
|
-
8. Wait for commands
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
project_root: Optional project root path. If None, will be detected
|
|
96
|
-
automatically from the current working directory or config.
|
|
97
|
-
offline_mode: If True, skip network-dependent initialization
|
|
98
|
-
(expert support, Context7 helpers, MCP gateway). Defaults to False.
|
|
99
|
-
|
|
100
|
-
Raises:
|
|
101
|
-
FileNotFoundError: If required configuration files are missing
|
|
102
|
-
ValueError: If configuration is invalid
|
|
103
|
-
"""
|
|
104
|
-
if project_root is None:
|
|
105
|
-
project_root = Path.cwd()
|
|
106
|
-
|
|
107
|
-
# Store project root for path validation
|
|
108
|
-
self._project_root = project_root
|
|
109
|
-
|
|
110
|
-
# Step 3: Load project configuration (offline operation)
|
|
111
|
-
# If config not already loaded, load it now
|
|
112
|
-
if self.config is None:
|
|
113
|
-
try:
|
|
114
|
-
self.config = load_config(
|
|
115
|
-
project_root / ".tapps-agents" / "config.yaml"
|
|
116
|
-
)
|
|
117
|
-
except (ValueError, FileNotFoundError):
|
|
118
|
-
# Use defaults if config file is invalid or missing
|
|
119
|
-
self.config = load_config() # Returns defaults
|
|
120
|
-
|
|
121
|
-
# Step 4: Load domain configuration (offline operation)
|
|
122
|
-
domains_path = project_root / ".tapps-agents" / "domains.md"
|
|
123
|
-
if domains_path.exists():
|
|
124
|
-
try:
|
|
125
|
-
self.domain_config = domains_path.read_text(encoding="utf-8")
|
|
126
|
-
except OSError:
|
|
127
|
-
self.domain_config = None
|
|
128
|
-
|
|
129
|
-
# Step 5: Load role file (if available) (offline operation)
|
|
130
|
-
from .role_loader import load_role_file
|
|
131
|
-
|
|
132
|
-
self.role_file = load_role_file(self.agent_id, project_root)
|
|
133
|
-
|
|
134
|
-
# Step 5b: Load user role template (if available) (offline operation)
|
|
135
|
-
from .role_template_loader import get_role_from_config
|
|
136
|
-
|
|
137
|
-
user_role_id = get_role_from_config(project_root)
|
|
138
|
-
self.user_role_template = None
|
|
139
|
-
if user_role_id:
|
|
140
|
-
from .role_template_loader import load_role_template
|
|
141
|
-
self.user_role_template = load_role_template(user_role_id, project_root)
|
|
142
|
-
|
|
143
|
-
# Step 6: Load customizations (offline operation)
|
|
144
|
-
# Customizations can override role file and role template
|
|
145
|
-
from .customization_loader import load_customization
|
|
146
|
-
|
|
147
|
-
self.customizations = load_customization(self.agent_id, project_root)
|
|
148
|
-
|
|
149
|
-
# Network-dependent initialization is deferred to agent subclasses
|
|
150
|
-
# or mixins (e.g., ExpertSupportMixin) when offline_mode=False
|
|
151
|
-
# They should check offline_mode before making network calls
|
|
152
|
-
|
|
153
|
-
def get_commands(self) -> list[dict[str, str]]:
|
|
154
|
-
"""
|
|
155
|
-
Return list of available commands for this agent.
|
|
156
|
-
|
|
157
|
-
Results are cached after first call to improve performance. Subclasses
|
|
158
|
-
should override _compute_commands() to provide agent-specific commands.
|
|
159
|
-
|
|
160
|
-
Returns:
|
|
161
|
-
List of command dictionaries, each containing:
|
|
162
|
-
- command (str): Command identifier (e.g., "*review", "*help")
|
|
163
|
-
- description (str): Human-readable command description
|
|
164
|
-
|
|
165
|
-
Format:
|
|
166
|
-
[
|
|
167
|
-
{"command": "*review", "description": "Review code file"},
|
|
168
|
-
{"command": "*score", "description": "Calculate scores only"},
|
|
169
|
-
...
|
|
170
|
-
]
|
|
171
|
-
|
|
172
|
-
Note:
|
|
173
|
-
This method caches results after the first call. If commands need
|
|
174
|
-
to be recomputed, clear the cache by setting self._cached_commands = None.
|
|
175
|
-
"""
|
|
176
|
-
if self._cached_commands is None:
|
|
177
|
-
self._cached_commands = self._compute_commands()
|
|
178
|
-
return self._cached_commands
|
|
179
|
-
|
|
180
|
-
def _compute_commands(self) -> list[dict[str, str]]:
|
|
181
|
-
"""
|
|
182
|
-
Compute the list of available commands for this agent.
|
|
183
|
-
|
|
184
|
-
This is the internal method that subclasses should override to provide
|
|
185
|
-
their command list. The base implementation returns just the help command.
|
|
186
|
-
|
|
187
|
-
Returns:
|
|
188
|
-
List of command dictionaries. See get_commands() for format details.
|
|
189
|
-
"""
|
|
190
|
-
return [
|
|
191
|
-
{"command": "*help", "description": "Show available commands"},
|
|
192
|
-
]
|
|
193
|
-
|
|
194
|
-
def format_help(self) -> str:
|
|
195
|
-
"""
|
|
196
|
-
Format help output with numbered command list.
|
|
197
|
-
|
|
198
|
-
BMAD-METHOD pattern: Show numbered list for easy selection.
|
|
199
|
-
|
|
200
|
-
Returns:
|
|
201
|
-
Formatted help text as a string, with commands numbered and
|
|
202
|
-
formatted for easy reading.
|
|
203
|
-
|
|
204
|
-
Note:
|
|
205
|
-
Uses cached command list from get_commands() for optimal performance.
|
|
206
|
-
"""
|
|
207
|
-
commands = self.get_commands()
|
|
208
|
-
|
|
209
|
-
lines = [
|
|
210
|
-
f"{self.agent_name} - Available Commands",
|
|
211
|
-
"=" * 50,
|
|
212
|
-
"",
|
|
213
|
-
"Type the command number or command name:",
|
|
214
|
-
"",
|
|
215
|
-
]
|
|
216
|
-
|
|
217
|
-
# Optimize string building with list comprehension
|
|
218
|
-
lines.extend(
|
|
219
|
-
f"{i}. {cmd['command']:<20} - {cmd['description']}"
|
|
220
|
-
for i, cmd in enumerate(commands, 1)
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
lines.extend(
|
|
224
|
-
[
|
|
225
|
-
"",
|
|
226
|
-
"Examples:",
|
|
227
|
-
f" Type '1' or '{commands[0]['command']}' to get help" if commands else " Use *help to see available commands",
|
|
228
|
-
"",
|
|
229
|
-
]
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
return "\n".join(lines)
|
|
233
|
-
|
|
234
|
-
@abstractmethod
|
|
235
|
-
async def run(self, command: str, **kwargs) -> dict[str, Any]:
|
|
236
|
-
"""Execute agent command"""
|
|
237
|
-
pass
|
|
238
|
-
|
|
239
|
-
def format_result(
|
|
240
|
-
self,
|
|
241
|
-
result: dict[str, Any],
|
|
242
|
-
command: str,
|
|
243
|
-
output_format: str = "text",
|
|
244
|
-
output_file: str | Path | None = None,
|
|
245
|
-
) -> str | Path:
|
|
246
|
-
"""
|
|
247
|
-
Format agent result in specified format and optionally save to file.
|
|
248
|
-
|
|
249
|
-
Args:
|
|
250
|
-
result: Agent result dictionary
|
|
251
|
-
command: Command that was executed
|
|
252
|
-
output_format: Desired output format (json, text, markdown, yaml)
|
|
253
|
-
output_file: Optional path to save output file
|
|
254
|
-
|
|
255
|
-
Returns:
|
|
256
|
-
Formatted output string, or Path if output_file was provided
|
|
257
|
-
"""
|
|
258
|
-
from .output_formatter import OutputFormatter
|
|
259
|
-
|
|
260
|
-
formatted = OutputFormatter.format_output(
|
|
261
|
-
result=result,
|
|
262
|
-
agent_name=self.agent_name,
|
|
263
|
-
command=command,
|
|
264
|
-
output_format=output_format,
|
|
265
|
-
)
|
|
266
|
-
|
|
267
|
-
if output_file:
|
|
268
|
-
return OutputFormatter.save_output(
|
|
269
|
-
result=result,
|
|
270
|
-
agent_name=self.agent_name,
|
|
271
|
-
command=command,
|
|
272
|
-
output_file=output_file,
|
|
273
|
-
output_format=output_format,
|
|
274
|
-
)
|
|
275
|
-
|
|
276
|
-
return formatted
|
|
277
|
-
|
|
278
|
-
def wrap_instruction_result(
|
|
279
|
-
self,
|
|
280
|
-
instruction: Any,
|
|
281
|
-
auto_execute: bool = False,
|
|
282
|
-
include_directive: bool = True,
|
|
283
|
-
) -> dict[str, Any]:
|
|
284
|
-
"""
|
|
285
|
-
Wrap instruction object in result with execution directive.
|
|
286
|
-
|
|
287
|
-
Args:
|
|
288
|
-
instruction: Instruction object (CodeGenerationInstruction, etc.)
|
|
289
|
-
auto_execute: If True, include auto-execution flag
|
|
290
|
-
include_directive: If True, include _cursor_execution_directive
|
|
291
|
-
|
|
292
|
-
Returns:
|
|
293
|
-
Result dictionary with instruction and execution directive
|
|
294
|
-
"""
|
|
295
|
-
result = {
|
|
296
|
-
"success": True,
|
|
297
|
-
"type": "instruction",
|
|
298
|
-
"instruction": instruction.to_dict(),
|
|
299
|
-
"description": instruction.get_description(),
|
|
300
|
-
"skill_command": instruction.to_skill_command(),
|
|
301
|
-
"cli_command": instruction.to_cli_command(),
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if include_directive:
|
|
305
|
-
directive = instruction.to_execution_directive()
|
|
306
|
-
if auto_execute:
|
|
307
|
-
directive["_cursor_execution_directive"]["auto_execute"] = True
|
|
308
|
-
result.update(directive)
|
|
309
|
-
|
|
310
|
-
return result
|
|
311
|
-
|
|
312
|
-
def parse_command(self, user_input: str) -> tuple[str, dict[str, str]]:
|
|
313
|
-
"""
|
|
314
|
-
Parse user input to extract command and arguments.
|
|
315
|
-
|
|
316
|
-
Supports:
|
|
317
|
-
- "*review file.py" -> ("review", {"file": "file.py"})
|
|
318
|
-
- "1" -> (command from numbered list)
|
|
319
|
-
- "review file.py" -> ("review", {"file": "file.py"})
|
|
320
|
-
"""
|
|
321
|
-
user_input = user_input.strip()
|
|
322
|
-
|
|
323
|
-
# Handle empty input
|
|
324
|
-
if not user_input:
|
|
325
|
-
return "", {}
|
|
326
|
-
|
|
327
|
-
# Handle numbered command
|
|
328
|
-
if user_input.isdigit():
|
|
329
|
-
commands = self.get_commands()
|
|
330
|
-
idx = int(user_input) - 1
|
|
331
|
-
if 0 <= idx < len(commands):
|
|
332
|
-
command_str = commands[idx]["command"]
|
|
333
|
-
# Remove * prefix for processing
|
|
334
|
-
return command_str.lstrip("*"), {}
|
|
335
|
-
|
|
336
|
-
# Handle star-prefixed command
|
|
337
|
-
if user_input.startswith("*"):
|
|
338
|
-
parts = user_input[1:].split(maxsplit=1)
|
|
339
|
-
if not parts or not parts[0]:
|
|
340
|
-
return "", {}
|
|
341
|
-
command = parts[0]
|
|
342
|
-
args_str = parts[1] if len(parts) > 1 else ""
|
|
343
|
-
else:
|
|
344
|
-
parts = user_input.split(maxsplit=1)
|
|
345
|
-
if not parts or not parts[0]:
|
|
346
|
-
return "", {}
|
|
347
|
-
command = parts[0]
|
|
348
|
-
args_str = parts[1] if len(parts) > 1 else ""
|
|
349
|
-
|
|
350
|
-
# Parse arguments (simple space-separated for now)
|
|
351
|
-
args = {}
|
|
352
|
-
if args_str:
|
|
353
|
-
# For commands that take file arguments
|
|
354
|
-
file_commands = ["review", "score", "plan", "implement", "test"]
|
|
355
|
-
if command in file_commands:
|
|
356
|
-
args["file"] = args_str.strip()
|
|
357
|
-
# Could also handle other argument patterns here
|
|
358
|
-
|
|
359
|
-
return command, args
|
|
360
|
-
|
|
361
|
-
def get_context(
|
|
362
|
-
self, file_path: Path, tier: Any | None = None, include_related: bool = False
|
|
363
|
-
) -> dict[str, Any]:
|
|
364
|
-
"""
|
|
365
|
-
Get tiered context for a file.
|
|
366
|
-
|
|
367
|
-
Args:
|
|
368
|
-
file_path: Path to the file
|
|
369
|
-
tier: Context tier level (default: TIER1)
|
|
370
|
-
include_related: Whether to include related files
|
|
371
|
-
|
|
372
|
-
Returns:
|
|
373
|
-
Dictionary with tiered context
|
|
374
|
-
"""
|
|
375
|
-
from .context_manager import ContextManager
|
|
376
|
-
from .tiered_context import ContextTier
|
|
377
|
-
|
|
378
|
-
if tier is None:
|
|
379
|
-
tier = ContextTier.TIER1
|
|
380
|
-
|
|
381
|
-
if self.context_manager is None:
|
|
382
|
-
self.context_manager = ContextManager()
|
|
383
|
-
|
|
384
|
-
return self.context_manager.get_context(file_path, tier, include_related)
|
|
385
|
-
|
|
386
|
-
def get_context_text(
|
|
387
|
-
self, file_path: Path, tier: Any | None = None, format: str = "text"
|
|
388
|
-
) -> str:
|
|
389
|
-
"""
|
|
390
|
-
Get tiered context as formatted text.
|
|
391
|
-
|
|
392
|
-
Args:
|
|
393
|
-
file_path: Path to the file
|
|
394
|
-
tier: Context tier level
|
|
395
|
-
format: Output format (text/markdown/json)
|
|
396
|
-
|
|
397
|
-
Returns:
|
|
398
|
-
Formatted context string
|
|
399
|
-
"""
|
|
400
|
-
from .context_manager import ContextManager
|
|
401
|
-
from .tiered_context import ContextTier
|
|
402
|
-
|
|
403
|
-
if tier is None:
|
|
404
|
-
tier = ContextTier.TIER1
|
|
405
|
-
|
|
406
|
-
if self.context_manager is None:
|
|
407
|
-
self.context_manager = ContextManager()
|
|
408
|
-
|
|
409
|
-
return self.context_manager.get_context_text(file_path, tier, format)
|
|
410
|
-
|
|
411
|
-
def call_tool(self, tool_name: str, **kwargs) -> dict[str, Any]:
|
|
412
|
-
"""
|
|
413
|
-
Call a tool through the MCP Gateway.
|
|
414
|
-
|
|
415
|
-
Args:
|
|
416
|
-
tool_name: Name of the tool to call
|
|
417
|
-
**kwargs: Tool arguments
|
|
418
|
-
|
|
419
|
-
Returns:
|
|
420
|
-
Tool result dictionary
|
|
421
|
-
"""
|
|
422
|
-
if self.mcp_gateway is None:
|
|
423
|
-
from tapps_agents.mcp import (
|
|
424
|
-
AnalysisMCPServer,
|
|
425
|
-
FilesystemMCPServer,
|
|
426
|
-
GitMCPServer,
|
|
427
|
-
MCPGateway,
|
|
428
|
-
)
|
|
429
|
-
|
|
430
|
-
self.mcp_gateway = MCPGateway()
|
|
431
|
-
# Register default servers
|
|
432
|
-
FilesystemMCPServer(self.mcp_gateway.registry)
|
|
433
|
-
GitMCPServer(self.mcp_gateway.registry)
|
|
434
|
-
AnalysisMCPServer(self.mcp_gateway.registry)
|
|
435
|
-
|
|
436
|
-
return self.mcp_gateway.call_tool(tool_name, **kwargs)
|
|
437
|
-
|
|
438
|
-
def _validate_path(
|
|
439
|
-
self, file_path: Path, max_file_size: int = 10 * 1024 * 1024
|
|
440
|
-
) -> None:
|
|
441
|
-
"""
|
|
442
|
-
Validate file path for security and size using centralized path validator.
|
|
443
|
-
|
|
444
|
-
This method uses root-based validation to ensure paths are within
|
|
445
|
-
allowed boundaries (project root and .tapps-agents/).
|
|
446
|
-
|
|
447
|
-
Args:
|
|
448
|
-
file_path: Path to validate
|
|
449
|
-
max_file_size: Maximum file size in bytes (default: 10MB)
|
|
450
|
-
|
|
451
|
-
Raises:
|
|
452
|
-
ValueError: If path validation fails (renamed from PathValidationError for backward compatibility)
|
|
453
|
-
FileNotFoundError: If file doesn't exist
|
|
454
|
-
"""
|
|
455
|
-
from .path_validator import PathValidationError, PathValidator
|
|
456
|
-
|
|
457
|
-
# Use cached project root or let validator auto-detect
|
|
458
|
-
project_root = self._project_root
|
|
459
|
-
|
|
460
|
-
# Create validator with project root
|
|
461
|
-
validator = PathValidator(project_root)
|
|
462
|
-
|
|
463
|
-
try:
|
|
464
|
-
# Validate path (will raise PathValidationError or FileNotFoundError)
|
|
465
|
-
validator.validate_read_path(file_path, max_file_size=max_file_size)
|
|
466
|
-
except PathValidationError as e:
|
|
467
|
-
# Convert to ValueError for backward compatibility
|
|
468
|
-
raise ValueError(str(e)) from e
|
|
469
|
-
|
|
470
|
-
def get_unified_cache(self):
|
|
471
|
-
"""
|
|
472
|
-
Get or create unified cache instance (optional enhancement).
|
|
473
|
-
|
|
474
|
-
This provides access to the unified cache interface which includes:
|
|
475
|
-
- Tiered Context Cache
|
|
476
|
-
- Context7 KB Cache
|
|
477
|
-
- RAG Knowledge Base
|
|
478
|
-
|
|
479
|
-
Returns:
|
|
480
|
-
UnifiedCache instance (lazy initialization)
|
|
481
|
-
|
|
482
|
-
Note: This is an optional enhancement. Existing code using
|
|
483
|
-
context_manager continues to work unchanged. The unified cache
|
|
484
|
-
will use the existing context_manager if available, or create
|
|
485
|
-
a new one if not.
|
|
486
|
-
"""
|
|
487
|
-
if self._unified_cache is None:
|
|
488
|
-
from .cache_router import CacheType
|
|
489
|
-
from .unified_cache import create_unified_cache
|
|
490
|
-
|
|
491
|
-
# Use existing context_manager if available for backward compatibility
|
|
492
|
-
self._unified_cache = create_unified_cache(
|
|
493
|
-
context_manager=self.context_manager
|
|
494
|
-
)
|
|
495
|
-
# If we didn't have a context_manager, use the one from unified cache
|
|
496
|
-
if self.context_manager is None:
|
|
497
|
-
# Access the context_manager from the TieredContextAdapter
|
|
498
|
-
tiered_adapter = self._unified_cache.router.get_adapter(
|
|
499
|
-
CacheType.TIERED_CONTEXT
|
|
500
|
-
)
|
|
501
|
-
if tiered_adapter:
|
|
502
|
-
self.context_manager = tiered_adapter.context_manager
|
|
503
|
-
|
|
504
|
-
return self._unified_cache
|
|
505
|
-
|
|
506
|
-
async def close(self) -> None:
|
|
507
|
-
"""
|
|
508
|
-
Cleanup resources. Override in subclasses if needed.
|
|
509
|
-
|
|
510
|
-
This default implementation provides a no-op cleanup. Subclasses should
|
|
511
|
-
override this method to clean up specific resources like:
|
|
512
|
-
- Database connections
|
|
513
|
-
- File handles
|
|
514
|
-
- Network connections
|
|
515
|
-
- Cache instances
|
|
516
|
-
- Background tasks
|
|
517
|
-
|
|
518
|
-
Examples:
|
|
519
|
-
async def close(self) -> None:
|
|
520
|
-
await super().close() # Call parent cleanup
|
|
521
|
-
if self.dependency_analyzer:
|
|
522
|
-
await self.dependency_analyzer.close()
|
|
523
|
-
if self.cache:
|
|
524
|
-
self.cache.clear()
|
|
525
|
-
"""
|
|
526
|
-
# Default implementation - override in subclasses for specific cleanup
|
|
527
|
-
pass
|
|
528
|
-
|
|
529
|
-
def handle_optional_dependency_error(
|
|
530
|
-
self,
|
|
531
|
-
error: Exception,
|
|
532
|
-
dependency_name: str,
|
|
533
|
-
workflow_id: str | None = None,
|
|
534
|
-
step_id: str | None = None,
|
|
535
|
-
) -> dict[str, Any]:
|
|
536
|
-
"""
|
|
537
|
-
Handle errors from optional dependencies gracefully.
|
|
538
|
-
|
|
539
|
-
This method creates a structured error result that indicates
|
|
540
|
-
the dependency is optional and the operation can continue without it.
|
|
541
|
-
|
|
542
|
-
Args:
|
|
543
|
-
error: Exception that occurred
|
|
544
|
-
dependency_name: Name of the optional dependency (e.g., "Context7")
|
|
545
|
-
workflow_id: Optional workflow ID for correlation
|
|
546
|
-
step_id: Optional step ID for correlation
|
|
547
|
-
|
|
548
|
-
Returns:
|
|
549
|
-
Error result dictionary with recoverable=True
|
|
550
|
-
"""
|
|
551
|
-
from .exceptions import Context7UnavailableError
|
|
552
|
-
|
|
553
|
-
# Create a user-friendly message
|
|
554
|
-
if isinstance(error, Context7UnavailableError):
|
|
555
|
-
message = f"{dependency_name} is not available: {str(error)}"
|
|
556
|
-
else:
|
|
557
|
-
message = f"{dependency_name} operation failed: {str(error)}"
|
|
558
|
-
|
|
559
|
-
envelope = ErrorEnvelope(
|
|
560
|
-
code=f"{dependency_name.lower()}_unavailable",
|
|
561
|
-
message=message,
|
|
562
|
-
category="external_dependency",
|
|
563
|
-
workflow_id=workflow_id,
|
|
564
|
-
step_id=step_id,
|
|
565
|
-
agent=self.agent_id,
|
|
566
|
-
recoverable=True,
|
|
567
|
-
)
|
|
568
|
-
|
|
569
|
-
result = envelope.to_dict()
|
|
570
|
-
result["success"] = False
|
|
571
|
-
result["optional_dependency"] = True
|
|
572
|
-
return result
|
|
573
|
-
|
|
574
|
-
async def _auto_fetch_context7_docs(
|
|
575
|
-
self,
|
|
576
|
-
code: str | None = None,
|
|
577
|
-
prompt: str | None = None,
|
|
578
|
-
error_message: str | None = None,
|
|
579
|
-
language: str = "python",
|
|
580
|
-
) -> dict[str, dict[str, Any]]:
|
|
581
|
-
"""
|
|
582
|
-
Automatically detect libraries and fetch Context7 documentation.
|
|
583
|
-
Called before any agent operation that might benefit from library docs.
|
|
584
|
-
|
|
585
|
-
This is a universal hook that all agents can use to automatically
|
|
586
|
-
fetch Context7 documentation without manual intervention.
|
|
587
|
-
|
|
588
|
-
Args:
|
|
589
|
-
code: Optional code content to analyze
|
|
590
|
-
prompt: Optional prompt text to analyze
|
|
591
|
-
error_message: Optional error message or stack trace
|
|
592
|
-
language: Programming language (default: "python")
|
|
593
|
-
|
|
594
|
-
Returns:
|
|
595
|
-
Dictionary mapping library names to their documentation dictionaries,
|
|
596
|
-
or empty dict if Context7 is disabled or no libraries detected.
|
|
597
|
-
Format: {library_name: {content: str, source: str, ...}, ...}
|
|
598
|
-
"""
|
|
599
|
-
# Get Context7 helper if available
|
|
600
|
-
context7_helper = getattr(self, "context7", None)
|
|
601
|
-
if not context7_helper:
|
|
602
|
-
# Try to get it via the helper function
|
|
603
|
-
from ..context7.agent_integration import get_context7_helper
|
|
604
|
-
context7_helper = get_context7_helper(self, self.config, self._project_root)
|
|
605
|
-
if context7_helper:
|
|
606
|
-
# Cache it for future use
|
|
607
|
-
self.context7 = context7_helper
|
|
608
|
-
|
|
609
|
-
if not context7_helper or not context7_helper.enabled:
|
|
610
|
-
return {}
|
|
611
|
-
|
|
612
|
-
# Detect libraries from all available sources (including error messages)
|
|
613
|
-
all_detected = context7_helper.detect_libraries(
|
|
614
|
-
code=code, prompt=prompt, error_message=error_message, language=language
|
|
615
|
-
)
|
|
616
|
-
|
|
617
|
-
# Filter: Only fetch docs for libraries that are likely relevant
|
|
618
|
-
# Priority: Project deps > Explicit mentions > Well-known libraries
|
|
619
|
-
project_libs = set(context7_helper.detect_libraries(
|
|
620
|
-
code=None, prompt=None, error_message=None
|
|
621
|
-
))
|
|
622
|
-
|
|
623
|
-
filtered_libraries = []
|
|
624
|
-
prompt_lower = (prompt or "").lower()
|
|
625
|
-
|
|
626
|
-
for lib in all_detected:
|
|
627
|
-
# Always include if it's in project dependencies
|
|
628
|
-
if lib in project_libs:
|
|
629
|
-
filtered_libraries.append(lib)
|
|
630
|
-
# Include if explicitly mentioned or well-known
|
|
631
|
-
elif (context7_helper.is_well_known_library(lib) or
|
|
632
|
-
any(keyword in prompt_lower for keyword in [
|
|
633
|
-
f"{lib} library", f"{lib} framework", f"using {lib}"
|
|
634
|
-
])):
|
|
635
|
-
filtered_libraries.append(lib)
|
|
636
|
-
|
|
637
|
-
# Deduplicate
|
|
638
|
-
filtered_libraries = list(set(filtered_libraries))
|
|
639
|
-
|
|
640
|
-
# Fetch documentation for filtered libraries only
|
|
641
|
-
if filtered_libraries:
|
|
642
|
-
return await context7_helper.get_documentation_for_libraries(
|
|
643
|
-
libraries=filtered_libraries,
|
|
644
|
-
topic=None,
|
|
645
|
-
use_fuzzy_match=True,
|
|
646
|
-
)
|
|
647
|
-
|
|
1
|
+
"""
|
|
2
|
+
Base Agent Class - Common functionality for all agents
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
# @ai-prime-directive: This file implements the core agent base class for all workflow agents.
|
|
6
|
+
# All agents must inherit from BaseAgent and follow the instruction-based architecture.
|
|
7
|
+
# See ADR-001 for architectural rationale. Do not modify the activation or instruction
|
|
8
|
+
# preparation patterns without updating all agent implementations.
|
|
9
|
+
|
|
10
|
+
# @ai-constraints:
|
|
11
|
+
# - Must maintain backward compatibility with existing agent implementations
|
|
12
|
+
# - Do not modify the instruction execution model without updating all agents
|
|
13
|
+
# - Performance: Agent activation must complete in <500ms
|
|
14
|
+
# - All agents must implement the instruction preparation pattern per ADR-001
|
|
15
|
+
|
|
16
|
+
# @note[2025-01-15]: Instruction-based architecture per ADR-001.
|
|
17
|
+
# Agents prepare instruction objects instead of calling LLMs directly.
|
|
18
|
+
# See docs/architecture/decisions/ADR-001-instruction-based-architecture.md
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from abc import ABC, abstractmethod
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
from .config import ProjectConfig, load_config
|
|
27
|
+
from .error_envelope import ErrorEnvelope
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class BaseAgent(ABC):
|
|
31
|
+
"""
|
|
32
|
+
Base class for all agents.
|
|
33
|
+
|
|
34
|
+
Provides common functionality:
|
|
35
|
+
- Activation instructions
|
|
36
|
+
- Command discovery
|
|
37
|
+
- Configuration loading
|
|
38
|
+
- Help system
|
|
39
|
+
|
|
40
|
+
⚠️ CRITICAL ACCURACY REQUIREMENT:
|
|
41
|
+
All agents MUST maintain 100% accuracy:
|
|
42
|
+
- NEVER make up, invent, or fabricate information
|
|
43
|
+
- ALWAYS verify claims by checking actual results, not just test pass/fail
|
|
44
|
+
- Verify API calls succeed - inspect response data, status codes, error messages
|
|
45
|
+
- Distinguish between code paths executing and actual functionality working
|
|
46
|
+
- Admit uncertainty explicitly when you cannot verify
|
|
47
|
+
- Check actual return values, not just that functions were called
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(
|
|
51
|
+
self, agent_id: str, agent_name: str, config: ProjectConfig | None = None
|
|
52
|
+
):
|
|
53
|
+
"""
|
|
54
|
+
Initialize a base agent instance.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
agent_id: Unique identifier for the agent (e.g., "reviewer", "planner")
|
|
58
|
+
agent_name: Human-readable name for the agent (e.g., "Code Reviewer")
|
|
59
|
+
config: Optional project configuration. If None, will be loaded during activation.
|
|
60
|
+
|
|
61
|
+
Note:
|
|
62
|
+
Most agent attributes are initialized to None and populated during the
|
|
63
|
+
activate() method. This allows for lazy initialization and proper error handling.
|
|
64
|
+
"""
|
|
65
|
+
self.agent_id = agent_id
|
|
66
|
+
self.agent_name = agent_name
|
|
67
|
+
self.config = config # ProjectConfig instance
|
|
68
|
+
self.domain_config: str | None = None
|
|
69
|
+
self.customizations: Any | None = None
|
|
70
|
+
self.role_file: Any | None = None # Agent role file data
|
|
71
|
+
self.context_manager: Any | None = None
|
|
72
|
+
self.mcp_gateway: Any | None = None
|
|
73
|
+
self._unified_cache: Any | None = None # Optional unified cache instance
|
|
74
|
+
self._project_root: Path | None = None # Cached project root
|
|
75
|
+
self._cached_commands: list[dict[str, str]] | None = None # Cached command list
|
|
76
|
+
|
|
77
|
+
async def activate(self, project_root: Path | None = None, offline_mode: bool = False):
|
|
78
|
+
"""
|
|
79
|
+
Follow activation instructions sequence.
|
|
80
|
+
|
|
81
|
+
This method initializes the agent by loading all necessary configuration
|
|
82
|
+
and context. It follows the BMAD-METHOD pattern for agent activation.
|
|
83
|
+
|
|
84
|
+
BMAD-METHOD pattern:
|
|
85
|
+
1. Read agent definition
|
|
86
|
+
2. Load project config
|
|
87
|
+
3. Load domain config
|
|
88
|
+
4. Load role file (optional)
|
|
89
|
+
5. Load customizations
|
|
90
|
+
6. Greet user
|
|
91
|
+
7. Run *help
|
|
92
|
+
8. Wait for commands
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
project_root: Optional project root path. If None, will be detected
|
|
96
|
+
automatically from the current working directory or config.
|
|
97
|
+
offline_mode: If True, skip network-dependent initialization
|
|
98
|
+
(expert support, Context7 helpers, MCP gateway). Defaults to False.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
FileNotFoundError: If required configuration files are missing
|
|
102
|
+
ValueError: If configuration is invalid
|
|
103
|
+
"""
|
|
104
|
+
if project_root is None:
|
|
105
|
+
project_root = Path.cwd()
|
|
106
|
+
|
|
107
|
+
# Store project root for path validation
|
|
108
|
+
self._project_root = project_root
|
|
109
|
+
|
|
110
|
+
# Step 3: Load project configuration (offline operation)
|
|
111
|
+
# If config not already loaded, load it now
|
|
112
|
+
if self.config is None:
|
|
113
|
+
try:
|
|
114
|
+
self.config = load_config(
|
|
115
|
+
project_root / ".tapps-agents" / "config.yaml"
|
|
116
|
+
)
|
|
117
|
+
except (ValueError, FileNotFoundError):
|
|
118
|
+
# Use defaults if config file is invalid or missing
|
|
119
|
+
self.config = load_config() # Returns defaults
|
|
120
|
+
|
|
121
|
+
# Step 4: Load domain configuration (offline operation)
|
|
122
|
+
domains_path = project_root / ".tapps-agents" / "domains.md"
|
|
123
|
+
if domains_path.exists():
|
|
124
|
+
try:
|
|
125
|
+
self.domain_config = domains_path.read_text(encoding="utf-8")
|
|
126
|
+
except OSError:
|
|
127
|
+
self.domain_config = None
|
|
128
|
+
|
|
129
|
+
# Step 5: Load role file (if available) (offline operation)
|
|
130
|
+
from .role_loader import load_role_file
|
|
131
|
+
|
|
132
|
+
self.role_file = load_role_file(self.agent_id, project_root)
|
|
133
|
+
|
|
134
|
+
# Step 5b: Load user role template (if available) (offline operation)
|
|
135
|
+
from .role_template_loader import get_role_from_config
|
|
136
|
+
|
|
137
|
+
user_role_id = get_role_from_config(project_root)
|
|
138
|
+
self.user_role_template = None
|
|
139
|
+
if user_role_id:
|
|
140
|
+
from .role_template_loader import load_role_template
|
|
141
|
+
self.user_role_template = load_role_template(user_role_id, project_root)
|
|
142
|
+
|
|
143
|
+
# Step 6: Load customizations (offline operation)
|
|
144
|
+
# Customizations can override role file and role template
|
|
145
|
+
from .customization_loader import load_customization
|
|
146
|
+
|
|
147
|
+
self.customizations = load_customization(self.agent_id, project_root)
|
|
148
|
+
|
|
149
|
+
# Network-dependent initialization is deferred to agent subclasses
|
|
150
|
+
# or mixins (e.g., ExpertSupportMixin) when offline_mode=False
|
|
151
|
+
# They should check offline_mode before making network calls
|
|
152
|
+
|
|
153
|
+
def get_commands(self) -> list[dict[str, str]]:
|
|
154
|
+
"""
|
|
155
|
+
Return list of available commands for this agent.
|
|
156
|
+
|
|
157
|
+
Results are cached after first call to improve performance. Subclasses
|
|
158
|
+
should override _compute_commands() to provide agent-specific commands.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
List of command dictionaries, each containing:
|
|
162
|
+
- command (str): Command identifier (e.g., "*review", "*help")
|
|
163
|
+
- description (str): Human-readable command description
|
|
164
|
+
|
|
165
|
+
Format:
|
|
166
|
+
[
|
|
167
|
+
{"command": "*review", "description": "Review code file"},
|
|
168
|
+
{"command": "*score", "description": "Calculate scores only"},
|
|
169
|
+
...
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
Note:
|
|
173
|
+
This method caches results after the first call. If commands need
|
|
174
|
+
to be recomputed, clear the cache by setting self._cached_commands = None.
|
|
175
|
+
"""
|
|
176
|
+
if self._cached_commands is None:
|
|
177
|
+
self._cached_commands = self._compute_commands()
|
|
178
|
+
return self._cached_commands
|
|
179
|
+
|
|
180
|
+
def _compute_commands(self) -> list[dict[str, str]]:
|
|
181
|
+
"""
|
|
182
|
+
Compute the list of available commands for this agent.
|
|
183
|
+
|
|
184
|
+
This is the internal method that subclasses should override to provide
|
|
185
|
+
their command list. The base implementation returns just the help command.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
List of command dictionaries. See get_commands() for format details.
|
|
189
|
+
"""
|
|
190
|
+
return [
|
|
191
|
+
{"command": "*help", "description": "Show available commands"},
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
def format_help(self) -> str:
|
|
195
|
+
"""
|
|
196
|
+
Format help output with numbered command list.
|
|
197
|
+
|
|
198
|
+
BMAD-METHOD pattern: Show numbered list for easy selection.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Formatted help text as a string, with commands numbered and
|
|
202
|
+
formatted for easy reading.
|
|
203
|
+
|
|
204
|
+
Note:
|
|
205
|
+
Uses cached command list from get_commands() for optimal performance.
|
|
206
|
+
"""
|
|
207
|
+
commands = self.get_commands()
|
|
208
|
+
|
|
209
|
+
lines = [
|
|
210
|
+
f"{self.agent_name} - Available Commands",
|
|
211
|
+
"=" * 50,
|
|
212
|
+
"",
|
|
213
|
+
"Type the command number or command name:",
|
|
214
|
+
"",
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
# Optimize string building with list comprehension
|
|
218
|
+
lines.extend(
|
|
219
|
+
f"{i}. {cmd['command']:<20} - {cmd['description']}"
|
|
220
|
+
for i, cmd in enumerate(commands, 1)
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
lines.extend(
|
|
224
|
+
[
|
|
225
|
+
"",
|
|
226
|
+
"Examples:",
|
|
227
|
+
f" Type '1' or '{commands[0]['command']}' to get help" if commands else " Use *help to see available commands",
|
|
228
|
+
"",
|
|
229
|
+
]
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
return "\n".join(lines)
|
|
233
|
+
|
|
234
|
+
@abstractmethod
|
|
235
|
+
async def run(self, command: str, **kwargs) -> dict[str, Any]:
|
|
236
|
+
"""Execute agent command"""
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
def format_result(
|
|
240
|
+
self,
|
|
241
|
+
result: dict[str, Any],
|
|
242
|
+
command: str,
|
|
243
|
+
output_format: str = "text",
|
|
244
|
+
output_file: str | Path | None = None,
|
|
245
|
+
) -> str | Path:
|
|
246
|
+
"""
|
|
247
|
+
Format agent result in specified format and optionally save to file.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
result: Agent result dictionary
|
|
251
|
+
command: Command that was executed
|
|
252
|
+
output_format: Desired output format (json, text, markdown, yaml)
|
|
253
|
+
output_file: Optional path to save output file
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Formatted output string, or Path if output_file was provided
|
|
257
|
+
"""
|
|
258
|
+
from .output_formatter import OutputFormatter
|
|
259
|
+
|
|
260
|
+
formatted = OutputFormatter.format_output(
|
|
261
|
+
result=result,
|
|
262
|
+
agent_name=self.agent_name,
|
|
263
|
+
command=command,
|
|
264
|
+
output_format=output_format,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
if output_file:
|
|
268
|
+
return OutputFormatter.save_output(
|
|
269
|
+
result=result,
|
|
270
|
+
agent_name=self.agent_name,
|
|
271
|
+
command=command,
|
|
272
|
+
output_file=output_file,
|
|
273
|
+
output_format=output_format,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
return formatted
|
|
277
|
+
|
|
278
|
+
def wrap_instruction_result(
|
|
279
|
+
self,
|
|
280
|
+
instruction: Any,
|
|
281
|
+
auto_execute: bool = False,
|
|
282
|
+
include_directive: bool = True,
|
|
283
|
+
) -> dict[str, Any]:
|
|
284
|
+
"""
|
|
285
|
+
Wrap instruction object in result with execution directive.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
instruction: Instruction object (CodeGenerationInstruction, etc.)
|
|
289
|
+
auto_execute: If True, include auto-execution flag
|
|
290
|
+
include_directive: If True, include _cursor_execution_directive
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Result dictionary with instruction and execution directive
|
|
294
|
+
"""
|
|
295
|
+
result = {
|
|
296
|
+
"success": True,
|
|
297
|
+
"type": "instruction",
|
|
298
|
+
"instruction": instruction.to_dict(),
|
|
299
|
+
"description": instruction.get_description(),
|
|
300
|
+
"skill_command": instruction.to_skill_command(),
|
|
301
|
+
"cli_command": instruction.to_cli_command(),
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if include_directive:
|
|
305
|
+
directive = instruction.to_execution_directive()
|
|
306
|
+
if auto_execute:
|
|
307
|
+
directive["_cursor_execution_directive"]["auto_execute"] = True
|
|
308
|
+
result.update(directive)
|
|
309
|
+
|
|
310
|
+
return result
|
|
311
|
+
|
|
312
|
+
def parse_command(self, user_input: str) -> tuple[str, dict[str, str]]:
|
|
313
|
+
"""
|
|
314
|
+
Parse user input to extract command and arguments.
|
|
315
|
+
|
|
316
|
+
Supports:
|
|
317
|
+
- "*review file.py" -> ("review", {"file": "file.py"})
|
|
318
|
+
- "1" -> (command from numbered list)
|
|
319
|
+
- "review file.py" -> ("review", {"file": "file.py"})
|
|
320
|
+
"""
|
|
321
|
+
user_input = user_input.strip()
|
|
322
|
+
|
|
323
|
+
# Handle empty input
|
|
324
|
+
if not user_input:
|
|
325
|
+
return "", {}
|
|
326
|
+
|
|
327
|
+
# Handle numbered command
|
|
328
|
+
if user_input.isdigit():
|
|
329
|
+
commands = self.get_commands()
|
|
330
|
+
idx = int(user_input) - 1
|
|
331
|
+
if 0 <= idx < len(commands):
|
|
332
|
+
command_str = commands[idx]["command"]
|
|
333
|
+
# Remove * prefix for processing
|
|
334
|
+
return command_str.lstrip("*"), {}
|
|
335
|
+
|
|
336
|
+
# Handle star-prefixed command
|
|
337
|
+
if user_input.startswith("*"):
|
|
338
|
+
parts = user_input[1:].split(maxsplit=1)
|
|
339
|
+
if not parts or not parts[0]:
|
|
340
|
+
return "", {}
|
|
341
|
+
command = parts[0]
|
|
342
|
+
args_str = parts[1] if len(parts) > 1 else ""
|
|
343
|
+
else:
|
|
344
|
+
parts = user_input.split(maxsplit=1)
|
|
345
|
+
if not parts or not parts[0]:
|
|
346
|
+
return "", {}
|
|
347
|
+
command = parts[0]
|
|
348
|
+
args_str = parts[1] if len(parts) > 1 else ""
|
|
349
|
+
|
|
350
|
+
# Parse arguments (simple space-separated for now)
|
|
351
|
+
args = {}
|
|
352
|
+
if args_str:
|
|
353
|
+
# For commands that take file arguments
|
|
354
|
+
file_commands = ["review", "score", "plan", "implement", "test"]
|
|
355
|
+
if command in file_commands:
|
|
356
|
+
args["file"] = args_str.strip()
|
|
357
|
+
# Could also handle other argument patterns here
|
|
358
|
+
|
|
359
|
+
return command, args
|
|
360
|
+
|
|
361
|
+
def get_context(
|
|
362
|
+
self, file_path: Path, tier: Any | None = None, include_related: bool = False
|
|
363
|
+
) -> dict[str, Any]:
|
|
364
|
+
"""
|
|
365
|
+
Get tiered context for a file.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
file_path: Path to the file
|
|
369
|
+
tier: Context tier level (default: TIER1)
|
|
370
|
+
include_related: Whether to include related files
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
Dictionary with tiered context
|
|
374
|
+
"""
|
|
375
|
+
from .context_manager import ContextManager
|
|
376
|
+
from .tiered_context import ContextTier
|
|
377
|
+
|
|
378
|
+
if tier is None:
|
|
379
|
+
tier = ContextTier.TIER1
|
|
380
|
+
|
|
381
|
+
if self.context_manager is None:
|
|
382
|
+
self.context_manager = ContextManager()
|
|
383
|
+
|
|
384
|
+
return self.context_manager.get_context(file_path, tier, include_related)
|
|
385
|
+
|
|
386
|
+
def get_context_text(
|
|
387
|
+
self, file_path: Path, tier: Any | None = None, format: str = "text"
|
|
388
|
+
) -> str:
|
|
389
|
+
"""
|
|
390
|
+
Get tiered context as formatted text.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
file_path: Path to the file
|
|
394
|
+
tier: Context tier level
|
|
395
|
+
format: Output format (text/markdown/json)
|
|
396
|
+
|
|
397
|
+
Returns:
|
|
398
|
+
Formatted context string
|
|
399
|
+
"""
|
|
400
|
+
from .context_manager import ContextManager
|
|
401
|
+
from .tiered_context import ContextTier
|
|
402
|
+
|
|
403
|
+
if tier is None:
|
|
404
|
+
tier = ContextTier.TIER1
|
|
405
|
+
|
|
406
|
+
if self.context_manager is None:
|
|
407
|
+
self.context_manager = ContextManager()
|
|
408
|
+
|
|
409
|
+
return self.context_manager.get_context_text(file_path, tier, format)
|
|
410
|
+
|
|
411
|
+
def call_tool(self, tool_name: str, **kwargs) -> dict[str, Any]:
|
|
412
|
+
"""
|
|
413
|
+
Call a tool through the MCP Gateway.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
tool_name: Name of the tool to call
|
|
417
|
+
**kwargs: Tool arguments
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
Tool result dictionary
|
|
421
|
+
"""
|
|
422
|
+
if self.mcp_gateway is None:
|
|
423
|
+
from tapps_agents.mcp import (
|
|
424
|
+
AnalysisMCPServer,
|
|
425
|
+
FilesystemMCPServer,
|
|
426
|
+
GitMCPServer,
|
|
427
|
+
MCPGateway,
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
self.mcp_gateway = MCPGateway()
|
|
431
|
+
# Register default servers
|
|
432
|
+
FilesystemMCPServer(self.mcp_gateway.registry)
|
|
433
|
+
GitMCPServer(self.mcp_gateway.registry)
|
|
434
|
+
AnalysisMCPServer(self.mcp_gateway.registry)
|
|
435
|
+
|
|
436
|
+
return self.mcp_gateway.call_tool(tool_name, **kwargs)
|
|
437
|
+
|
|
438
|
+
def _validate_path(
|
|
439
|
+
self, file_path: Path, max_file_size: int = 10 * 1024 * 1024
|
|
440
|
+
) -> None:
|
|
441
|
+
"""
|
|
442
|
+
Validate file path for security and size using centralized path validator.
|
|
443
|
+
|
|
444
|
+
This method uses root-based validation to ensure paths are within
|
|
445
|
+
allowed boundaries (project root and .tapps-agents/).
|
|
446
|
+
|
|
447
|
+
Args:
|
|
448
|
+
file_path: Path to validate
|
|
449
|
+
max_file_size: Maximum file size in bytes (default: 10MB)
|
|
450
|
+
|
|
451
|
+
Raises:
|
|
452
|
+
ValueError: If path validation fails (renamed from PathValidationError for backward compatibility)
|
|
453
|
+
FileNotFoundError: If file doesn't exist
|
|
454
|
+
"""
|
|
455
|
+
from .path_validator import PathValidationError, PathValidator
|
|
456
|
+
|
|
457
|
+
# Use cached project root or let validator auto-detect
|
|
458
|
+
project_root = self._project_root
|
|
459
|
+
|
|
460
|
+
# Create validator with project root
|
|
461
|
+
validator = PathValidator(project_root)
|
|
462
|
+
|
|
463
|
+
try:
|
|
464
|
+
# Validate path (will raise PathValidationError or FileNotFoundError)
|
|
465
|
+
validator.validate_read_path(file_path, max_file_size=max_file_size)
|
|
466
|
+
except PathValidationError as e:
|
|
467
|
+
# Convert to ValueError for backward compatibility
|
|
468
|
+
raise ValueError(str(e)) from e
|
|
469
|
+
|
|
470
|
+
def get_unified_cache(self):
|
|
471
|
+
"""
|
|
472
|
+
Get or create unified cache instance (optional enhancement).
|
|
473
|
+
|
|
474
|
+
This provides access to the unified cache interface which includes:
|
|
475
|
+
- Tiered Context Cache
|
|
476
|
+
- Context7 KB Cache
|
|
477
|
+
- RAG Knowledge Base
|
|
478
|
+
|
|
479
|
+
Returns:
|
|
480
|
+
UnifiedCache instance (lazy initialization)
|
|
481
|
+
|
|
482
|
+
Note: This is an optional enhancement. Existing code using
|
|
483
|
+
context_manager continues to work unchanged. The unified cache
|
|
484
|
+
will use the existing context_manager if available, or create
|
|
485
|
+
a new one if not.
|
|
486
|
+
"""
|
|
487
|
+
if self._unified_cache is None:
|
|
488
|
+
from .cache_router import CacheType
|
|
489
|
+
from .unified_cache import create_unified_cache
|
|
490
|
+
|
|
491
|
+
# Use existing context_manager if available for backward compatibility
|
|
492
|
+
self._unified_cache = create_unified_cache(
|
|
493
|
+
context_manager=self.context_manager
|
|
494
|
+
)
|
|
495
|
+
# If we didn't have a context_manager, use the one from unified cache
|
|
496
|
+
if self.context_manager is None:
|
|
497
|
+
# Access the context_manager from the TieredContextAdapter
|
|
498
|
+
tiered_adapter = self._unified_cache.router.get_adapter(
|
|
499
|
+
CacheType.TIERED_CONTEXT
|
|
500
|
+
)
|
|
501
|
+
if tiered_adapter:
|
|
502
|
+
self.context_manager = tiered_adapter.context_manager
|
|
503
|
+
|
|
504
|
+
return self._unified_cache
|
|
505
|
+
|
|
506
|
+
async def close(self) -> None:
|
|
507
|
+
"""
|
|
508
|
+
Cleanup resources. Override in subclasses if needed.
|
|
509
|
+
|
|
510
|
+
This default implementation provides a no-op cleanup. Subclasses should
|
|
511
|
+
override this method to clean up specific resources like:
|
|
512
|
+
- Database connections
|
|
513
|
+
- File handles
|
|
514
|
+
- Network connections
|
|
515
|
+
- Cache instances
|
|
516
|
+
- Background tasks
|
|
517
|
+
|
|
518
|
+
Examples:
|
|
519
|
+
async def close(self) -> None:
|
|
520
|
+
await super().close() # Call parent cleanup
|
|
521
|
+
if self.dependency_analyzer:
|
|
522
|
+
await self.dependency_analyzer.close()
|
|
523
|
+
if self.cache:
|
|
524
|
+
self.cache.clear()
|
|
525
|
+
"""
|
|
526
|
+
# Default implementation - override in subclasses for specific cleanup
|
|
527
|
+
pass
|
|
528
|
+
|
|
529
|
+
def handle_optional_dependency_error(
|
|
530
|
+
self,
|
|
531
|
+
error: Exception,
|
|
532
|
+
dependency_name: str,
|
|
533
|
+
workflow_id: str | None = None,
|
|
534
|
+
step_id: str | None = None,
|
|
535
|
+
) -> dict[str, Any]:
|
|
536
|
+
"""
|
|
537
|
+
Handle errors from optional dependencies gracefully.
|
|
538
|
+
|
|
539
|
+
This method creates a structured error result that indicates
|
|
540
|
+
the dependency is optional and the operation can continue without it.
|
|
541
|
+
|
|
542
|
+
Args:
|
|
543
|
+
error: Exception that occurred
|
|
544
|
+
dependency_name: Name of the optional dependency (e.g., "Context7")
|
|
545
|
+
workflow_id: Optional workflow ID for correlation
|
|
546
|
+
step_id: Optional step ID for correlation
|
|
547
|
+
|
|
548
|
+
Returns:
|
|
549
|
+
Error result dictionary with recoverable=True
|
|
550
|
+
"""
|
|
551
|
+
from .exceptions import Context7UnavailableError
|
|
552
|
+
|
|
553
|
+
# Create a user-friendly message
|
|
554
|
+
if isinstance(error, Context7UnavailableError):
|
|
555
|
+
message = f"{dependency_name} is not available: {str(error)}"
|
|
556
|
+
else:
|
|
557
|
+
message = f"{dependency_name} operation failed: {str(error)}"
|
|
558
|
+
|
|
559
|
+
envelope = ErrorEnvelope(
|
|
560
|
+
code=f"{dependency_name.lower()}_unavailable",
|
|
561
|
+
message=message,
|
|
562
|
+
category="external_dependency",
|
|
563
|
+
workflow_id=workflow_id,
|
|
564
|
+
step_id=step_id,
|
|
565
|
+
agent=self.agent_id,
|
|
566
|
+
recoverable=True,
|
|
567
|
+
)
|
|
568
|
+
|
|
569
|
+
result = envelope.to_dict()
|
|
570
|
+
result["success"] = False
|
|
571
|
+
result["optional_dependency"] = True
|
|
572
|
+
return result
|
|
573
|
+
|
|
574
|
+
async def _auto_fetch_context7_docs(
|
|
575
|
+
self,
|
|
576
|
+
code: str | None = None,
|
|
577
|
+
prompt: str | None = None,
|
|
578
|
+
error_message: str | None = None,
|
|
579
|
+
language: str = "python",
|
|
580
|
+
) -> dict[str, dict[str, Any]]:
|
|
581
|
+
"""
|
|
582
|
+
Automatically detect libraries and fetch Context7 documentation.
|
|
583
|
+
Called before any agent operation that might benefit from library docs.
|
|
584
|
+
|
|
585
|
+
This is a universal hook that all agents can use to automatically
|
|
586
|
+
fetch Context7 documentation without manual intervention.
|
|
587
|
+
|
|
588
|
+
Args:
|
|
589
|
+
code: Optional code content to analyze
|
|
590
|
+
prompt: Optional prompt text to analyze
|
|
591
|
+
error_message: Optional error message or stack trace
|
|
592
|
+
language: Programming language (default: "python")
|
|
593
|
+
|
|
594
|
+
Returns:
|
|
595
|
+
Dictionary mapping library names to their documentation dictionaries,
|
|
596
|
+
or empty dict if Context7 is disabled or no libraries detected.
|
|
597
|
+
Format: {library_name: {content: str, source: str, ...}, ...}
|
|
598
|
+
"""
|
|
599
|
+
# Get Context7 helper if available
|
|
600
|
+
context7_helper = getattr(self, "context7", None)
|
|
601
|
+
if not context7_helper:
|
|
602
|
+
# Try to get it via the helper function
|
|
603
|
+
from ..context7.agent_integration import get_context7_helper
|
|
604
|
+
context7_helper = get_context7_helper(self, self.config, self._project_root)
|
|
605
|
+
if context7_helper:
|
|
606
|
+
# Cache it for future use
|
|
607
|
+
self.context7 = context7_helper
|
|
608
|
+
|
|
609
|
+
if not context7_helper or not context7_helper.enabled:
|
|
610
|
+
return {}
|
|
611
|
+
|
|
612
|
+
# Detect libraries from all available sources (including error messages)
|
|
613
|
+
all_detected = context7_helper.detect_libraries(
|
|
614
|
+
code=code, prompt=prompt, error_message=error_message, language=language
|
|
615
|
+
)
|
|
616
|
+
|
|
617
|
+
# Filter: Only fetch docs for libraries that are likely relevant
|
|
618
|
+
# Priority: Project deps > Explicit mentions > Well-known libraries
|
|
619
|
+
project_libs = set(context7_helper.detect_libraries(
|
|
620
|
+
code=None, prompt=None, error_message=None
|
|
621
|
+
))
|
|
622
|
+
|
|
623
|
+
filtered_libraries = []
|
|
624
|
+
prompt_lower = (prompt or "").lower()
|
|
625
|
+
|
|
626
|
+
for lib in all_detected:
|
|
627
|
+
# Always include if it's in project dependencies
|
|
628
|
+
if lib in project_libs:
|
|
629
|
+
filtered_libraries.append(lib)
|
|
630
|
+
# Include if explicitly mentioned or well-known
|
|
631
|
+
elif (context7_helper.is_well_known_library(lib) or
|
|
632
|
+
any(keyword in prompt_lower for keyword in [
|
|
633
|
+
f"{lib} library", f"{lib} framework", f"using {lib}"
|
|
634
|
+
])):
|
|
635
|
+
filtered_libraries.append(lib)
|
|
636
|
+
|
|
637
|
+
# Deduplicate
|
|
638
|
+
filtered_libraries = list(set(filtered_libraries))
|
|
639
|
+
|
|
640
|
+
# Fetch documentation for filtered libraries only
|
|
641
|
+
if filtered_libraries:
|
|
642
|
+
return await context7_helper.get_documentation_for_libraries(
|
|
643
|
+
libraries=filtered_libraries,
|
|
644
|
+
topic=None,
|
|
645
|
+
use_fuzzy_match=True,
|
|
646
|
+
)
|
|
647
|
+
|
|
648
648
|
return {}
|