tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,301 +1,301 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Direct Execution Fallback - Execute commands directly when Background Agent API is unavailable.
|
|
3
|
-
|
|
4
|
-
This module provides a simpler fallback mechanism that executes commands directly
|
|
5
|
-
via subprocess instead of relying on file-based triggers. This eliminates the
|
|
6
|
-
need for watch_paths configuration and provides more reliable execution.
|
|
7
|
-
|
|
8
|
-
Plan 2.2: When GuardrailConfig.sandbox_subprocess is True, never use shell
|
|
9
|
-
(create_subprocess_shell); use create_subprocess_exec only. Prefer exec for
|
|
10
|
-
python -m tapps_agents.cli (already the case when not is_raw_cli).
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
import asyncio
|
|
14
|
-
import logging
|
|
15
|
-
import shlex
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
from typing import Any
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def _get_guardrail_config() -> Any:
|
|
23
|
-
"""Load GuardrailConfig from project config; return defaults on failure."""
|
|
24
|
-
try:
|
|
25
|
-
from ..core.config import GuardrailConfig, load_config
|
|
26
|
-
|
|
27
|
-
cfg = load_config()
|
|
28
|
-
return getattr(cfg, "guardrails", None) or GuardrailConfig()
|
|
29
|
-
except Exception: # pylint: disable=broad-except
|
|
30
|
-
from ..core.config import GuardrailConfig
|
|
31
|
-
|
|
32
|
-
return GuardrailConfig()
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class DirectExecutionFallback:
|
|
36
|
-
"""
|
|
37
|
-
Direct execution fallback for when Background Agent API is unavailable.
|
|
38
|
-
|
|
39
|
-
This class executes commands directly via subprocess instead of using
|
|
40
|
-
file-based triggers, providing a simpler and more reliable fallback.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(
|
|
44
|
-
self,
|
|
45
|
-
project_root: Path | None = None,
|
|
46
|
-
timeout_seconds: float = 3600.0,
|
|
47
|
-
guardrail_config: Any = None,
|
|
48
|
-
):
|
|
49
|
-
"""
|
|
50
|
-
Initialize direct execution fallback.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
project_root: Project root directory
|
|
54
|
-
timeout_seconds: Maximum execution time in seconds
|
|
55
|
-
guardrail_config: Optional GuardrailConfig; if None, loaded from project config
|
|
56
|
-
"""
|
|
57
|
-
self.project_root = Path(project_root or Path.cwd())
|
|
58
|
-
self.timeout_seconds = timeout_seconds
|
|
59
|
-
self._guardrail = guardrail_config if guardrail_config is not None else _get_guardrail_config()
|
|
60
|
-
|
|
61
|
-
async def execute_command(
|
|
62
|
-
self,
|
|
63
|
-
command: str,
|
|
64
|
-
worktree_path: Path | None = None,
|
|
65
|
-
workflow_id: str | None = None,
|
|
66
|
-
step_id: str | None = None,
|
|
67
|
-
environment: dict[str, str] | None = None,
|
|
68
|
-
is_raw_cli: bool = False,
|
|
69
|
-
) -> dict[str, Any]:
|
|
70
|
-
"""
|
|
71
|
-
Execute a command directly via subprocess.
|
|
72
|
-
|
|
73
|
-
This method converts Cursor Skill commands (e.g., "@reviewer *review file.py")
|
|
74
|
-
to CLI commands (e.g., "python -m tapps_agents.cli reviewer review file.py")
|
|
75
|
-
and executes them directly.
|
|
76
|
-
|
|
77
|
-
Args:
|
|
78
|
-
command: Skill command string (e.g., "@reviewer *review file.py") or raw CLI command
|
|
79
|
-
worktree_path: Optional worktree path (uses project_root if None)
|
|
80
|
-
workflow_id: Optional workflow ID for tracking
|
|
81
|
-
step_id: Optional step ID for tracking
|
|
82
|
-
environment: Optional environment variables
|
|
83
|
-
is_raw_cli: If True, treat command as raw CLI command (skip Skill conversion)
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
Execution result dictionary:
|
|
87
|
-
- status: "completed", "failed", or "timeout"
|
|
88
|
-
- command: The command that was executed
|
|
89
|
-
- stdout: Standard output
|
|
90
|
-
- stderr: Standard error
|
|
91
|
-
- return_code: Process return code
|
|
92
|
-
- duration_seconds: Execution duration
|
|
93
|
-
- method: "direct_execution"
|
|
94
|
-
"""
|
|
95
|
-
import time
|
|
96
|
-
|
|
97
|
-
start_time = time.time()
|
|
98
|
-
execution_path = worktree_path or self.project_root
|
|
99
|
-
|
|
100
|
-
# Convert Skill command to CLI command (unless it's already a raw CLI command)
|
|
101
|
-
if is_raw_cli or (not command.startswith("@") and not command.startswith("python -m tapps_agents.cli")):
|
|
102
|
-
# Already a CLI command, use as-is
|
|
103
|
-
cli_command = command
|
|
104
|
-
else:
|
|
105
|
-
cli_command = self._convert_skill_to_cli(command)
|
|
106
|
-
|
|
107
|
-
# Prepare environment
|
|
108
|
-
env = dict(os.environ) if (os := __import__("os")) else {}
|
|
109
|
-
if environment:
|
|
110
|
-
env.update(environment)
|
|
111
|
-
env["TAPPS_AGENTS_MODE"] = "cursor"
|
|
112
|
-
if workflow_id:
|
|
113
|
-
env["TAPPS_AGENTS_WORKFLOW_ID"] = workflow_id
|
|
114
|
-
if step_id:
|
|
115
|
-
env["TAPPS_AGENTS_STEP_ID"] = step_id
|
|
116
|
-
|
|
117
|
-
logger.info(
|
|
118
|
-
f"Executing command directly (fallback mode): {cli_command}",
|
|
119
|
-
extra={
|
|
120
|
-
"command": cli_command,
|
|
121
|
-
"worktree": str(execution_path),
|
|
122
|
-
"method": "direct_execution",
|
|
123
|
-
},
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
try:
|
|
127
|
-
# Execute command in worktree directory
|
|
128
|
-
# Use shlex.split() to properly handle quoted strings
|
|
129
|
-
import platform
|
|
130
|
-
is_windows = platform.system() == "Windows"
|
|
131
|
-
|
|
132
|
-
# Plan 2.2: when sandbox_subprocess, never use shell
|
|
133
|
-
sandbox = getattr(self._guardrail, "sandbox_subprocess", True)
|
|
134
|
-
if sandbox:
|
|
135
|
-
use_shell = False
|
|
136
|
-
elif is_windows and is_raw_cli:
|
|
137
|
-
# On Windows, for raw CLI commands, use shell=True only for a fixed
|
|
138
|
-
# whitelist of builtins; do not interpolate user input into the shell string
|
|
139
|
-
first_word = cli_command.split()[0] if cli_command.split() else ""
|
|
140
|
-
shell_builtins = {"echo", "type", "dir", "cd", "set"}
|
|
141
|
-
use_shell = first_word.lower() in shell_builtins
|
|
142
|
-
else:
|
|
143
|
-
use_shell = False
|
|
144
|
-
|
|
145
|
-
# Plan 2.2: when sandbox_subprocess, use cwd=project_root
|
|
146
|
-
cwd = self.project_root if sandbox else execution_path
|
|
147
|
-
|
|
148
|
-
if use_shell:
|
|
149
|
-
# Use shell=True for Windows built-in commands only when not sandboxed
|
|
150
|
-
process = await asyncio.create_subprocess_shell(
|
|
151
|
-
cli_command,
|
|
152
|
-
cwd=cwd,
|
|
153
|
-
env=env,
|
|
154
|
-
stdout=asyncio.subprocess.PIPE,
|
|
155
|
-
stderr=asyncio.subprocess.PIPE,
|
|
156
|
-
)
|
|
157
|
-
else:
|
|
158
|
-
# Use exec for regular commands (and always when sandboxed)
|
|
159
|
-
command_parts = shlex.split(cli_command, posix=not is_windows)
|
|
160
|
-
process = await asyncio.create_subprocess_exec(
|
|
161
|
-
*command_parts,
|
|
162
|
-
cwd=cwd,
|
|
163
|
-
env=env,
|
|
164
|
-
stdout=asyncio.subprocess.PIPE,
|
|
165
|
-
stderr=asyncio.subprocess.PIPE,
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
# Wait for completion with timeout
|
|
169
|
-
try:
|
|
170
|
-
stdout, stderr = await asyncio.wait_for(
|
|
171
|
-
process.communicate(),
|
|
172
|
-
timeout=self.timeout_seconds,
|
|
173
|
-
)
|
|
174
|
-
return_code = process.returncode
|
|
175
|
-
except TimeoutError:
|
|
176
|
-
process.kill()
|
|
177
|
-
await process.wait()
|
|
178
|
-
duration = time.time() - start_time
|
|
179
|
-
return {
|
|
180
|
-
"status": "timeout",
|
|
181
|
-
"command": cli_command,
|
|
182
|
-
"stdout": "",
|
|
183
|
-
"stderr": f"Command execution exceeded timeout of {self.timeout_seconds}s",
|
|
184
|
-
"return_code": -1,
|
|
185
|
-
"duration_seconds": duration,
|
|
186
|
-
"method": "direct_execution",
|
|
187
|
-
"error": "Timeout",
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
duration = time.time() - start_time
|
|
191
|
-
stdout_text = stdout.decode("utf-8", errors="replace") if stdout else ""
|
|
192
|
-
stderr_text = stderr.decode("utf-8", errors="replace") if stderr else ""
|
|
193
|
-
|
|
194
|
-
# Determine status based on return code
|
|
195
|
-
if return_code == 0:
|
|
196
|
-
status = "completed"
|
|
197
|
-
else:
|
|
198
|
-
status = "failed"
|
|
199
|
-
|
|
200
|
-
logger.info(
|
|
201
|
-
f"Direct execution completed: {status} (return code: {return_code})",
|
|
202
|
-
extra={
|
|
203
|
-
"command": cli_command,
|
|
204
|
-
"status": status,
|
|
205
|
-
"return_code": return_code,
|
|
206
|
-
"duration_seconds": duration,
|
|
207
|
-
},
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
"status": status,
|
|
212
|
-
"command": cli_command,
|
|
213
|
-
"stdout": stdout_text,
|
|
214
|
-
"stderr": stderr_text,
|
|
215
|
-
"return_code": return_code,
|
|
216
|
-
"duration_seconds": duration,
|
|
217
|
-
"method": "direct_execution",
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
except Exception as e:
|
|
221
|
-
duration = time.time() - start_time
|
|
222
|
-
logger.error(
|
|
223
|
-
f"Direct execution failed: {e}",
|
|
224
|
-
extra={
|
|
225
|
-
"command": cli_command,
|
|
226
|
-
"error": str(e),
|
|
227
|
-
"duration_seconds": duration,
|
|
228
|
-
},
|
|
229
|
-
exc_info=True,
|
|
230
|
-
)
|
|
231
|
-
return {
|
|
232
|
-
"status": "failed",
|
|
233
|
-
"command": cli_command,
|
|
234
|
-
"stdout": "",
|
|
235
|
-
"stderr": str(e),
|
|
236
|
-
"return_code": -1,
|
|
237
|
-
"duration_seconds": duration,
|
|
238
|
-
"method": "direct_execution",
|
|
239
|
-
"error": str(e),
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
def _convert_skill_to_cli(self, skill_command: str) -> str:
|
|
243
|
-
"""
|
|
244
|
-
Convert Cursor Skill command to CLI command.
|
|
245
|
-
|
|
246
|
-
Examples:
|
|
247
|
-
"@reviewer *review file.py" -> "python -m tapps_agents.cli reviewer review file.py"
|
|
248
|
-
"@analyst gather-requirements \"desc\"" -> "python -m tapps_agents.cli analyst gather-requirements \"desc\""
|
|
249
|
-
|
|
250
|
-
Args:
|
|
251
|
-
skill_command: Skill command string
|
|
252
|
-
|
|
253
|
-
Returns:
|
|
254
|
-
CLI command string
|
|
255
|
-
"""
|
|
256
|
-
# Remove leading "@" if present
|
|
257
|
-
if skill_command.startswith("@"):
|
|
258
|
-
skill_command = skill_command[1:]
|
|
259
|
-
|
|
260
|
-
# Split into parts, preserving quoted strings
|
|
261
|
-
# Use shlex.split() to handle complex quotes properly
|
|
262
|
-
# Use posix=True to properly handle quote removal (even on Windows)
|
|
263
|
-
try:
|
|
264
|
-
parts = shlex.split(skill_command, posix=True)
|
|
265
|
-
except ValueError as e:
|
|
266
|
-
# Provide helpful error message with truncated command
|
|
267
|
-
cmd_preview = skill_command[:200] + "..." if len(skill_command) > 200 else skill_command
|
|
268
|
-
raise ValueError(f"Invalid skill command (malformed quotes): {cmd_preview}") from e
|
|
269
|
-
|
|
270
|
-
if not parts:
|
|
271
|
-
raise ValueError(f"Invalid skill command: {skill_command}")
|
|
272
|
-
|
|
273
|
-
# First part is agent name
|
|
274
|
-
agent_name = parts[0]
|
|
275
|
-
|
|
276
|
-
# Second part is command (may have "*" prefix)
|
|
277
|
-
if len(parts) > 1:
|
|
278
|
-
command_name = parts[1]
|
|
279
|
-
if command_name.startswith("*"):
|
|
280
|
-
command_name = command_name[1:]
|
|
281
|
-
remaining_args = parts[2:]
|
|
282
|
-
else:
|
|
283
|
-
command_name = None
|
|
284
|
-
remaining_args = []
|
|
285
|
-
|
|
286
|
-
# Build CLI command
|
|
287
|
-
cli_parts = ["python", "-m", "tapps_agents.cli", agent_name]
|
|
288
|
-
|
|
289
|
-
if command_name:
|
|
290
|
-
cli_parts.append(command_name)
|
|
291
|
-
|
|
292
|
-
# Safely quote arguments that may contain spaces or special characters
|
|
293
|
-
for arg in remaining_args:
|
|
294
|
-
# Check if arg needs quoting (contains spaces, quotes, or special chars)
|
|
295
|
-
if ' ' in arg or '"' in arg or "'" in arg:
|
|
296
|
-
cli_parts.append(shlex.quote(arg))
|
|
297
|
-
else:
|
|
298
|
-
cli_parts.append(arg)
|
|
299
|
-
|
|
300
|
-
return " ".join(cli_parts)
|
|
301
|
-
|
|
1
|
+
"""
|
|
2
|
+
Direct Execution Fallback - Execute commands directly when Background Agent API is unavailable.
|
|
3
|
+
|
|
4
|
+
This module provides a simpler fallback mechanism that executes commands directly
|
|
5
|
+
via subprocess instead of relying on file-based triggers. This eliminates the
|
|
6
|
+
need for watch_paths configuration and provides more reliable execution.
|
|
7
|
+
|
|
8
|
+
Plan 2.2: When GuardrailConfig.sandbox_subprocess is True, never use shell
|
|
9
|
+
(create_subprocess_shell); use create_subprocess_exec only. Prefer exec for
|
|
10
|
+
python -m tapps_agents.cli (already the case when not is_raw_cli).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import logging
|
|
15
|
+
import shlex
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_guardrail_config() -> Any:
|
|
23
|
+
"""Load GuardrailConfig from project config; return defaults on failure."""
|
|
24
|
+
try:
|
|
25
|
+
from ..core.config import GuardrailConfig, load_config
|
|
26
|
+
|
|
27
|
+
cfg = load_config()
|
|
28
|
+
return getattr(cfg, "guardrails", None) or GuardrailConfig()
|
|
29
|
+
except Exception: # pylint: disable=broad-except
|
|
30
|
+
from ..core.config import GuardrailConfig
|
|
31
|
+
|
|
32
|
+
return GuardrailConfig()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class DirectExecutionFallback:
|
|
36
|
+
"""
|
|
37
|
+
Direct execution fallback for when Background Agent API is unavailable.
|
|
38
|
+
|
|
39
|
+
This class executes commands directly via subprocess instead of using
|
|
40
|
+
file-based triggers, providing a simpler and more reliable fallback.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
project_root: Path | None = None,
|
|
46
|
+
timeout_seconds: float = 3600.0,
|
|
47
|
+
guardrail_config: Any = None,
|
|
48
|
+
):
|
|
49
|
+
"""
|
|
50
|
+
Initialize direct execution fallback.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
project_root: Project root directory
|
|
54
|
+
timeout_seconds: Maximum execution time in seconds
|
|
55
|
+
guardrail_config: Optional GuardrailConfig; if None, loaded from project config
|
|
56
|
+
"""
|
|
57
|
+
self.project_root = Path(project_root or Path.cwd())
|
|
58
|
+
self.timeout_seconds = timeout_seconds
|
|
59
|
+
self._guardrail = guardrail_config if guardrail_config is not None else _get_guardrail_config()
|
|
60
|
+
|
|
61
|
+
async def execute_command(
|
|
62
|
+
self,
|
|
63
|
+
command: str,
|
|
64
|
+
worktree_path: Path | None = None,
|
|
65
|
+
workflow_id: str | None = None,
|
|
66
|
+
step_id: str | None = None,
|
|
67
|
+
environment: dict[str, str] | None = None,
|
|
68
|
+
is_raw_cli: bool = False,
|
|
69
|
+
) -> dict[str, Any]:
|
|
70
|
+
"""
|
|
71
|
+
Execute a command directly via subprocess.
|
|
72
|
+
|
|
73
|
+
This method converts Cursor Skill commands (e.g., "@reviewer *review file.py")
|
|
74
|
+
to CLI commands (e.g., "python -m tapps_agents.cli reviewer review file.py")
|
|
75
|
+
and executes them directly.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
command: Skill command string (e.g., "@reviewer *review file.py") or raw CLI command
|
|
79
|
+
worktree_path: Optional worktree path (uses project_root if None)
|
|
80
|
+
workflow_id: Optional workflow ID for tracking
|
|
81
|
+
step_id: Optional step ID for tracking
|
|
82
|
+
environment: Optional environment variables
|
|
83
|
+
is_raw_cli: If True, treat command as raw CLI command (skip Skill conversion)
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Execution result dictionary:
|
|
87
|
+
- status: "completed", "failed", or "timeout"
|
|
88
|
+
- command: The command that was executed
|
|
89
|
+
- stdout: Standard output
|
|
90
|
+
- stderr: Standard error
|
|
91
|
+
- return_code: Process return code
|
|
92
|
+
- duration_seconds: Execution duration
|
|
93
|
+
- method: "direct_execution"
|
|
94
|
+
"""
|
|
95
|
+
import time
|
|
96
|
+
|
|
97
|
+
start_time = time.time()
|
|
98
|
+
execution_path = worktree_path or self.project_root
|
|
99
|
+
|
|
100
|
+
# Convert Skill command to CLI command (unless it's already a raw CLI command)
|
|
101
|
+
if is_raw_cli or (not command.startswith("@") and not command.startswith("python -m tapps_agents.cli")):
|
|
102
|
+
# Already a CLI command, use as-is
|
|
103
|
+
cli_command = command
|
|
104
|
+
else:
|
|
105
|
+
cli_command = self._convert_skill_to_cli(command)
|
|
106
|
+
|
|
107
|
+
# Prepare environment
|
|
108
|
+
env = dict(os.environ) if (os := __import__("os")) else {}
|
|
109
|
+
if environment:
|
|
110
|
+
env.update(environment)
|
|
111
|
+
env["TAPPS_AGENTS_MODE"] = "cursor"
|
|
112
|
+
if workflow_id:
|
|
113
|
+
env["TAPPS_AGENTS_WORKFLOW_ID"] = workflow_id
|
|
114
|
+
if step_id:
|
|
115
|
+
env["TAPPS_AGENTS_STEP_ID"] = step_id
|
|
116
|
+
|
|
117
|
+
logger.info(
|
|
118
|
+
f"Executing command directly (fallback mode): {cli_command}",
|
|
119
|
+
extra={
|
|
120
|
+
"command": cli_command,
|
|
121
|
+
"worktree": str(execution_path),
|
|
122
|
+
"method": "direct_execution",
|
|
123
|
+
},
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
# Execute command in worktree directory
|
|
128
|
+
# Use shlex.split() to properly handle quoted strings
|
|
129
|
+
import platform
|
|
130
|
+
is_windows = platform.system() == "Windows"
|
|
131
|
+
|
|
132
|
+
# Plan 2.2: when sandbox_subprocess, never use shell
|
|
133
|
+
sandbox = getattr(self._guardrail, "sandbox_subprocess", True)
|
|
134
|
+
if sandbox:
|
|
135
|
+
use_shell = False
|
|
136
|
+
elif is_windows and is_raw_cli:
|
|
137
|
+
# On Windows, for raw CLI commands, use shell=True only for a fixed
|
|
138
|
+
# whitelist of builtins; do not interpolate user input into the shell string
|
|
139
|
+
first_word = cli_command.split()[0] if cli_command.split() else ""
|
|
140
|
+
shell_builtins = {"echo", "type", "dir", "cd", "set"}
|
|
141
|
+
use_shell = first_word.lower() in shell_builtins
|
|
142
|
+
else:
|
|
143
|
+
use_shell = False
|
|
144
|
+
|
|
145
|
+
# Plan 2.2: when sandbox_subprocess, use cwd=project_root
|
|
146
|
+
cwd = self.project_root if sandbox else execution_path
|
|
147
|
+
|
|
148
|
+
if use_shell:
|
|
149
|
+
# Use shell=True for Windows built-in commands only when not sandboxed
|
|
150
|
+
process = await asyncio.create_subprocess_shell(
|
|
151
|
+
cli_command,
|
|
152
|
+
cwd=cwd,
|
|
153
|
+
env=env,
|
|
154
|
+
stdout=asyncio.subprocess.PIPE,
|
|
155
|
+
stderr=asyncio.subprocess.PIPE,
|
|
156
|
+
)
|
|
157
|
+
else:
|
|
158
|
+
# Use exec for regular commands (and always when sandboxed)
|
|
159
|
+
command_parts = shlex.split(cli_command, posix=not is_windows)
|
|
160
|
+
process = await asyncio.create_subprocess_exec(
|
|
161
|
+
*command_parts,
|
|
162
|
+
cwd=cwd,
|
|
163
|
+
env=env,
|
|
164
|
+
stdout=asyncio.subprocess.PIPE,
|
|
165
|
+
stderr=asyncio.subprocess.PIPE,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Wait for completion with timeout
|
|
169
|
+
try:
|
|
170
|
+
stdout, stderr = await asyncio.wait_for(
|
|
171
|
+
process.communicate(),
|
|
172
|
+
timeout=self.timeout_seconds,
|
|
173
|
+
)
|
|
174
|
+
return_code = process.returncode
|
|
175
|
+
except TimeoutError:
|
|
176
|
+
process.kill()
|
|
177
|
+
await process.wait()
|
|
178
|
+
duration = time.time() - start_time
|
|
179
|
+
return {
|
|
180
|
+
"status": "timeout",
|
|
181
|
+
"command": cli_command,
|
|
182
|
+
"stdout": "",
|
|
183
|
+
"stderr": f"Command execution exceeded timeout of {self.timeout_seconds}s",
|
|
184
|
+
"return_code": -1,
|
|
185
|
+
"duration_seconds": duration,
|
|
186
|
+
"method": "direct_execution",
|
|
187
|
+
"error": "Timeout",
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
duration = time.time() - start_time
|
|
191
|
+
stdout_text = stdout.decode("utf-8", errors="replace") if stdout else ""
|
|
192
|
+
stderr_text = stderr.decode("utf-8", errors="replace") if stderr else ""
|
|
193
|
+
|
|
194
|
+
# Determine status based on return code
|
|
195
|
+
if return_code == 0:
|
|
196
|
+
status = "completed"
|
|
197
|
+
else:
|
|
198
|
+
status = "failed"
|
|
199
|
+
|
|
200
|
+
logger.info(
|
|
201
|
+
f"Direct execution completed: {status} (return code: {return_code})",
|
|
202
|
+
extra={
|
|
203
|
+
"command": cli_command,
|
|
204
|
+
"status": status,
|
|
205
|
+
"return_code": return_code,
|
|
206
|
+
"duration_seconds": duration,
|
|
207
|
+
},
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
"status": status,
|
|
212
|
+
"command": cli_command,
|
|
213
|
+
"stdout": stdout_text,
|
|
214
|
+
"stderr": stderr_text,
|
|
215
|
+
"return_code": return_code,
|
|
216
|
+
"duration_seconds": duration,
|
|
217
|
+
"method": "direct_execution",
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
except Exception as e:
|
|
221
|
+
duration = time.time() - start_time
|
|
222
|
+
logger.error(
|
|
223
|
+
f"Direct execution failed: {e}",
|
|
224
|
+
extra={
|
|
225
|
+
"command": cli_command,
|
|
226
|
+
"error": str(e),
|
|
227
|
+
"duration_seconds": duration,
|
|
228
|
+
},
|
|
229
|
+
exc_info=True,
|
|
230
|
+
)
|
|
231
|
+
return {
|
|
232
|
+
"status": "failed",
|
|
233
|
+
"command": cli_command,
|
|
234
|
+
"stdout": "",
|
|
235
|
+
"stderr": str(e),
|
|
236
|
+
"return_code": -1,
|
|
237
|
+
"duration_seconds": duration,
|
|
238
|
+
"method": "direct_execution",
|
|
239
|
+
"error": str(e),
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
def _convert_skill_to_cli(self, skill_command: str) -> str:
|
|
243
|
+
"""
|
|
244
|
+
Convert Cursor Skill command to CLI command.
|
|
245
|
+
|
|
246
|
+
Examples:
|
|
247
|
+
"@reviewer *review file.py" -> "python -m tapps_agents.cli reviewer review file.py"
|
|
248
|
+
"@analyst gather-requirements \"desc\"" -> "python -m tapps_agents.cli analyst gather-requirements \"desc\""
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
skill_command: Skill command string
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
CLI command string
|
|
255
|
+
"""
|
|
256
|
+
# Remove leading "@" if present
|
|
257
|
+
if skill_command.startswith("@"):
|
|
258
|
+
skill_command = skill_command[1:]
|
|
259
|
+
|
|
260
|
+
# Split into parts, preserving quoted strings
|
|
261
|
+
# Use shlex.split() to handle complex quotes properly
|
|
262
|
+
# Use posix=True to properly handle quote removal (even on Windows)
|
|
263
|
+
try:
|
|
264
|
+
parts = shlex.split(skill_command, posix=True)
|
|
265
|
+
except ValueError as e:
|
|
266
|
+
# Provide helpful error message with truncated command
|
|
267
|
+
cmd_preview = skill_command[:200] + "..." if len(skill_command) > 200 else skill_command
|
|
268
|
+
raise ValueError(f"Invalid skill command (malformed quotes): {cmd_preview}") from e
|
|
269
|
+
|
|
270
|
+
if not parts:
|
|
271
|
+
raise ValueError(f"Invalid skill command: {skill_command}")
|
|
272
|
+
|
|
273
|
+
# First part is agent name
|
|
274
|
+
agent_name = parts[0]
|
|
275
|
+
|
|
276
|
+
# Second part is command (may have "*" prefix)
|
|
277
|
+
if len(parts) > 1:
|
|
278
|
+
command_name = parts[1]
|
|
279
|
+
if command_name.startswith("*"):
|
|
280
|
+
command_name = command_name[1:]
|
|
281
|
+
remaining_args = parts[2:]
|
|
282
|
+
else:
|
|
283
|
+
command_name = None
|
|
284
|
+
remaining_args = []
|
|
285
|
+
|
|
286
|
+
# Build CLI command
|
|
287
|
+
cli_parts = ["python", "-m", "tapps_agents.cli", agent_name]
|
|
288
|
+
|
|
289
|
+
if command_name:
|
|
290
|
+
cli_parts.append(command_name)
|
|
291
|
+
|
|
292
|
+
# Safely quote arguments that may contain spaces or special characters
|
|
293
|
+
for arg in remaining_args:
|
|
294
|
+
# Check if arg needs quoting (contains spaces, quotes, or special chars)
|
|
295
|
+
if ' ' in arg or '"' in arg or "'" in arg:
|
|
296
|
+
cli_parts.append(shlex.quote(arg))
|
|
297
|
+
else:
|
|
298
|
+
cli_parts.append(arg)
|
|
299
|
+
|
|
300
|
+
return " ".join(cli_parts)
|
|
301
|
+
|