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
tapps_agents/cli/base.py
CHANGED
|
@@ -1,478 +1,478 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Base classes and shared utilities for CLI commands.
|
|
3
|
-
|
|
4
|
-
This module provides standardized patterns for:
|
|
5
|
-
- Agent lifecycle management (activate/run/close)
|
|
6
|
-
- Error handling with consistent exit codes
|
|
7
|
-
- Output formatting (JSON/text)
|
|
8
|
-
- Async command execution with proper event loop management
|
|
9
|
-
"""
|
|
10
|
-
import argparse
|
|
11
|
-
import asyncio
|
|
12
|
-
import json
|
|
13
|
-
import os
|
|
14
|
-
import sys
|
|
15
|
-
from collections.abc import Callable
|
|
16
|
-
from typing import Any, TypeVar
|
|
17
|
-
|
|
18
|
-
from .feedback import FeedbackManager, get_feedback
|
|
19
|
-
|
|
20
|
-
T = TypeVar("T")
|
|
21
|
-
|
|
22
|
-
# Standard exit codes
|
|
23
|
-
EXIT_SUCCESS = 0
|
|
24
|
-
EXIT_GENERAL_ERROR = 1
|
|
25
|
-
EXIT_USAGE_ERROR = 2
|
|
26
|
-
EXIT_CONFIG_ERROR = 3
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def get_exit_code_from_error_category(category: str) -> int:
|
|
30
|
-
"""
|
|
31
|
-
Map error envelope category to appropriate CLI exit code.
|
|
32
|
-
|
|
33
|
-
Args:
|
|
34
|
-
category: Error category from ErrorEnvelope
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
Exit code (1-3)
|
|
38
|
-
"""
|
|
39
|
-
category_to_exit_code = {
|
|
40
|
-
"configuration": EXIT_CONFIG_ERROR, # 3
|
|
41
|
-
"validation": EXIT_USAGE_ERROR, # 2 - user input issue
|
|
42
|
-
"permission": EXIT_GENERAL_ERROR, # 1 - system/permission issue
|
|
43
|
-
"execution": EXIT_GENERAL_ERROR, # 1 - runtime error
|
|
44
|
-
"external_dependency": EXIT_GENERAL_ERROR, # 1 - external service issue
|
|
45
|
-
"timeout": EXIT_GENERAL_ERROR, # 1 - timeout issue
|
|
46
|
-
}
|
|
47
|
-
return category_to_exit_code.get(category, EXIT_GENERAL_ERROR)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def normalize_command(command: str | None) -> str | None:
|
|
51
|
-
"""
|
|
52
|
-
Normalize command by removing star prefix if present.
|
|
53
|
-
|
|
54
|
-
Supports both *command and command formats.
|
|
55
|
-
"""
|
|
56
|
-
if command is None:
|
|
57
|
-
return None
|
|
58
|
-
return command.lstrip("*") if command.startswith("*") else command
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def format_output(data: dict[str, Any] | str, format_type: str = "json") -> None:
|
|
62
|
-
"""
|
|
63
|
-
Format and print output based on format type.
|
|
64
|
-
|
|
65
|
-
Uses the feedback system for consistent output formatting.
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
data: Data to output (dict for JSON, str for text)
|
|
69
|
-
format_type: Output format ("json" or "text")
|
|
70
|
-
"""
|
|
71
|
-
feedback = get_feedback()
|
|
72
|
-
# Temporarily set format type for this output
|
|
73
|
-
original_format = feedback.format_type
|
|
74
|
-
feedback.format_type = format_type
|
|
75
|
-
|
|
76
|
-
try:
|
|
77
|
-
if isinstance(data, dict):
|
|
78
|
-
feedback.output_result(data)
|
|
79
|
-
else:
|
|
80
|
-
feedback.output_result(data)
|
|
81
|
-
finally:
|
|
82
|
-
feedback.format_type = original_format
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def format_error_output(
|
|
86
|
-
error: str,
|
|
87
|
-
error_type: str = "error",
|
|
88
|
-
exit_code: int = EXIT_GENERAL_ERROR,
|
|
89
|
-
format_type: str = "text",
|
|
90
|
-
details: dict[str, Any] | None = None,
|
|
91
|
-
) -> None:
|
|
92
|
-
"""
|
|
93
|
-
Format and output error message with consistent structure.
|
|
94
|
-
|
|
95
|
-
Uses the feedback system for standardized error formatting.
|
|
96
|
-
|
|
97
|
-
Args:
|
|
98
|
-
error: Error message
|
|
99
|
-
error_type: Type of error (e.g., "error", "validation_error", "config_error")
|
|
100
|
-
exit_code: Exit code to use (default: EXIT_GENERAL_ERROR)
|
|
101
|
-
format_type: Output format ("json" or "text")
|
|
102
|
-
details: Additional error details
|
|
103
|
-
"""
|
|
104
|
-
feedback = get_feedback()
|
|
105
|
-
# Temporarily set format type for this output
|
|
106
|
-
original_format = feedback.format_type
|
|
107
|
-
feedback.format_type = format_type
|
|
108
|
-
|
|
109
|
-
try:
|
|
110
|
-
# Map error_type to remediation if it's a common error
|
|
111
|
-
remediation = None
|
|
112
|
-
if error_type == "file_not_found" or "not found" in error.lower():
|
|
113
|
-
remediation = "Check that the file exists and the path is correct"
|
|
114
|
-
elif error_type == "validation_error":
|
|
115
|
-
remediation = "Check your input and try again"
|
|
116
|
-
elif error_type == "config_error":
|
|
117
|
-
remediation = "Check your configuration file and settings"
|
|
118
|
-
|
|
119
|
-
feedback.error(
|
|
120
|
-
message=error,
|
|
121
|
-
error_code=error_type,
|
|
122
|
-
context=details,
|
|
123
|
-
remediation=remediation,
|
|
124
|
-
exit_code=exit_code,
|
|
125
|
-
)
|
|
126
|
-
finally:
|
|
127
|
-
feedback.format_type = original_format
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def handle_agent_error(
|
|
131
|
-
result: dict[str, Any],
|
|
132
|
-
format_type: str = "text",
|
|
133
|
-
exit_code: int | None = None,
|
|
134
|
-
) -> None:
|
|
135
|
-
"""
|
|
136
|
-
Handle errors from agent execution with standardized output.
|
|
137
|
-
|
|
138
|
-
Uses error envelope information if available to determine appropriate exit code.
|
|
139
|
-
|
|
140
|
-
Args:
|
|
141
|
-
result: Agent result dictionary that may contain an "error" key or error envelope
|
|
142
|
-
format_type: Output format ("json" or "text")
|
|
143
|
-
exit_code: Exit code to use (if None, determined from error envelope category)
|
|
144
|
-
|
|
145
|
-
Raises:
|
|
146
|
-
SystemExit: Always raises SystemExit with appropriate code
|
|
147
|
-
"""
|
|
148
|
-
if "error" in result:
|
|
149
|
-
# Check if result contains error envelope structure
|
|
150
|
-
error_info = result.get("error", {})
|
|
151
|
-
if isinstance(error_info, dict) and "category" in error_info:
|
|
152
|
-
# Error envelope format
|
|
153
|
-
category = error_info.get("category", "execution")
|
|
154
|
-
error_message = error_info.get("message", "An error occurred")
|
|
155
|
-
error_code = error_info.get("code", "unknown_error")
|
|
156
|
-
details = error_info.get("details")
|
|
157
|
-
|
|
158
|
-
# Determine exit code from category if not explicitly provided
|
|
159
|
-
if exit_code is None:
|
|
160
|
-
exit_code = get_exit_code_from_error_category(category)
|
|
161
|
-
|
|
162
|
-
format_error_output(
|
|
163
|
-
error_message,
|
|
164
|
-
error_type=error_code,
|
|
165
|
-
exit_code=exit_code,
|
|
166
|
-
format_type=format_type,
|
|
167
|
-
details=details,
|
|
168
|
-
)
|
|
169
|
-
else:
|
|
170
|
-
# Legacy format: simple error string or dict with error_type
|
|
171
|
-
error_message = error_info if isinstance(error_info, str) else str(error_info)
|
|
172
|
-
error_type = result.get("error_type", "error")
|
|
173
|
-
details = result.get("details")
|
|
174
|
-
|
|
175
|
-
# Use provided exit_code or default
|
|
176
|
-
if exit_code is None:
|
|
177
|
-
exit_code = EXIT_GENERAL_ERROR
|
|
178
|
-
|
|
179
|
-
format_error_output(
|
|
180
|
-
error_message,
|
|
181
|
-
error_type=error_type,
|
|
182
|
-
exit_code=exit_code,
|
|
183
|
-
format_type=format_type,
|
|
184
|
-
details=details,
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def handle_network_error(error: Exception, format_type: str = "text") -> None:
|
|
189
|
-
"""Handle network errors with informative messages following Cursor CLI 2025 patterns.
|
|
190
|
-
|
|
191
|
-
Args:
|
|
192
|
-
error: NetworkError instance with operation context (or any exception)
|
|
193
|
-
format_type: Output format ("json" or "text")
|
|
194
|
-
|
|
195
|
-
Raises:
|
|
196
|
-
SystemExit: Always raises SystemExit with appropriate code
|
|
197
|
-
"""
|
|
198
|
-
from ..core.network_errors import NetworkError
|
|
199
|
-
|
|
200
|
-
feedback = get_feedback()
|
|
201
|
-
|
|
202
|
-
# Check if it's a NetworkError
|
|
203
|
-
if isinstance(error, NetworkError):
|
|
204
|
-
if format_type == "json":
|
|
205
|
-
# Output in Cursor CLI JSON format
|
|
206
|
-
error_dict = error.to_dict()
|
|
207
|
-
feedback.error(
|
|
208
|
-
message=error_dict["message"],
|
|
209
|
-
error_code="connection_error",
|
|
210
|
-
context=error_dict.get("details", {}),
|
|
211
|
-
remediation="Check your internet connection or VPN. Use offline alternatives if available.",
|
|
212
|
-
exit_code=EXIT_GENERAL_ERROR,
|
|
213
|
-
)
|
|
214
|
-
else:
|
|
215
|
-
# Text format with actionable guidance
|
|
216
|
-
feedback.error(
|
|
217
|
-
message=str(error),
|
|
218
|
-
error_code="connection_error",
|
|
219
|
-
context={
|
|
220
|
-
"operation": error.operation_name,
|
|
221
|
-
"request_id": error.request_id,
|
|
222
|
-
"session_id": error.session_id,
|
|
223
|
-
},
|
|
224
|
-
remediation=(
|
|
225
|
-
"1. Check your internet connection\n"
|
|
226
|
-
"2. Verify VPN is connected (if required)\n"
|
|
227
|
-
"3. Check firewall/proxy settings\n"
|
|
228
|
-
"4. Try again in a few moments\n"
|
|
229
|
-
"5. Use offline alternatives if available"
|
|
230
|
-
),
|
|
231
|
-
exit_code=EXIT_GENERAL_ERROR,
|
|
232
|
-
)
|
|
233
|
-
else:
|
|
234
|
-
# Generic error handling
|
|
235
|
-
feedback.error(
|
|
236
|
-
message=str(error),
|
|
237
|
-
error_code="connection_error",
|
|
238
|
-
context={},
|
|
239
|
-
remediation="Check your internet connection or VPN.",
|
|
240
|
-
exit_code=EXIT_GENERAL_ERROR,
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
async def run_with_agent_lifecycle(
|
|
245
|
-
agent: Any,
|
|
246
|
-
command_func: Callable[..., Any],
|
|
247
|
-
*args: Any,
|
|
248
|
-
offline_mode: bool = False,
|
|
249
|
-
**kwargs: Any,
|
|
250
|
-
) -> Any:
|
|
251
|
-
"""
|
|
252
|
-
Run a command function with agent lifecycle management (activate/close).
|
|
253
|
-
|
|
254
|
-
This is the standard pattern for running agent commands:
|
|
255
|
-
1. Activate agent (load configs, initialize)
|
|
256
|
-
2. Run command
|
|
257
|
-
3. Close agent (cleanup)
|
|
258
|
-
|
|
259
|
-
Args:
|
|
260
|
-
agent: Agent instance (must have activate() and close() methods)
|
|
261
|
-
command_func: Async function to execute (can be agent.run or a wrapper)
|
|
262
|
-
*args: Positional arguments for command_func
|
|
263
|
-
offline_mode: If True, activate agent in offline mode (no network operations)
|
|
264
|
-
**kwargs: Keyword arguments for command_func
|
|
265
|
-
|
|
266
|
-
Returns:
|
|
267
|
-
Result from command_func
|
|
268
|
-
|
|
269
|
-
Raises:
|
|
270
|
-
Any exception raised by command_func or agent methods
|
|
271
|
-
"""
|
|
272
|
-
try:
|
|
273
|
-
await agent.activate(offline_mode=offline_mode)
|
|
274
|
-
return await command_func(*args, **kwargs)
|
|
275
|
-
finally:
|
|
276
|
-
if hasattr(agent, "close") and agent.close is not None:
|
|
277
|
-
await agent.close()
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
def run_async_command(coro: Any) -> Any:
|
|
281
|
-
"""
|
|
282
|
-
Run an async coroutine using asyncio.run.
|
|
283
|
-
|
|
284
|
-
This function ensures proper event loop management and avoids
|
|
285
|
-
nested event loop issues. Use this instead of calling asyncio.run()
|
|
286
|
-
directly throughout the codebase.
|
|
287
|
-
|
|
288
|
-
Args:
|
|
289
|
-
coro: Coroutine to run
|
|
290
|
-
|
|
291
|
-
Returns:
|
|
292
|
-
Result from coroutine
|
|
293
|
-
|
|
294
|
-
Raises:
|
|
295
|
-
RuntimeError: If called from within an existing event loop
|
|
296
|
-
"""
|
|
297
|
-
try:
|
|
298
|
-
# If this succeeds, we're already inside an event loop.
|
|
299
|
-
asyncio.get_running_loop()
|
|
300
|
-
except RuntimeError:
|
|
301
|
-
# No running loop - safe to use asyncio.run()
|
|
302
|
-
return asyncio.run(coro)
|
|
303
|
-
|
|
304
|
-
raise RuntimeError(
|
|
305
|
-
"run_async_command() called from within an event loop. "
|
|
306
|
-
"Use 'await' instead of run_async_command()."
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
async def run_agent_command(
|
|
311
|
-
agent: Any,
|
|
312
|
-
command: str,
|
|
313
|
-
format_type: str = "json",
|
|
314
|
-
exit_on_error: bool = True,
|
|
315
|
-
**kwargs: Any,
|
|
316
|
-
) -> dict[str, Any]:
|
|
317
|
-
"""
|
|
318
|
-
Run an agent command with full lifecycle management and error handling.
|
|
319
|
-
|
|
320
|
-
This is the high-level convenience function that combines:
|
|
321
|
-
- Agent lifecycle management
|
|
322
|
-
- Command execution
|
|
323
|
-
- Error handling
|
|
324
|
-
- Output formatting
|
|
325
|
-
|
|
326
|
-
Args:
|
|
327
|
-
agent: Agent instance
|
|
328
|
-
command: Command name to run (will be normalized)
|
|
329
|
-
format_type: Output format ("json" or "text")
|
|
330
|
-
exit_on_error: If True, exit on error; if False, return error in result
|
|
331
|
-
**kwargs: Arguments to pass to agent.run()
|
|
332
|
-
|
|
333
|
-
Returns:
|
|
334
|
-
Result dictionary (may contain "error" key if exit_on_error=False)
|
|
335
|
-
|
|
336
|
-
Raises:
|
|
337
|
-
SystemExit: If exit_on_error=True and command fails
|
|
338
|
-
"""
|
|
339
|
-
normalized_command = normalize_command(command)
|
|
340
|
-
|
|
341
|
-
async def _run_command() -> dict[str, Any]:
|
|
342
|
-
return await agent.run(normalized_command, **kwargs)
|
|
343
|
-
|
|
344
|
-
result = await run_with_agent_lifecycle(agent, _run_command)
|
|
345
|
-
|
|
346
|
-
if exit_on_error:
|
|
347
|
-
handle_agent_error(result, format_type=format_type)
|
|
348
|
-
else:
|
|
349
|
-
return result
|
|
350
|
-
|
|
351
|
-
return result
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def get_verbosity_level() -> str:
|
|
355
|
-
"""
|
|
356
|
-
Get current verbosity level as string.
|
|
357
|
-
|
|
358
|
-
Returns:
|
|
359
|
-
Verbosity level: "quiet", "normal", or "verbose"
|
|
360
|
-
"""
|
|
361
|
-
from .feedback import VerbosityLevel
|
|
362
|
-
verbosity = FeedbackManager.get_verbosity()
|
|
363
|
-
return verbosity.value
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
class HelpfulArgumentParser(argparse.ArgumentParser):
|
|
367
|
-
"""
|
|
368
|
-
ArgumentParser subclass with improved error messages and suggestions.
|
|
369
|
-
|
|
370
|
-
Provides helpful hints for common errors like unrecognized arguments,
|
|
371
|
-
missing required arguments, and invalid choices.
|
|
372
|
-
Also handles Windows encoding issues when printing help.
|
|
373
|
-
"""
|
|
374
|
-
|
|
375
|
-
def _ensure_windows_encoding(self) -> None:
|
|
376
|
-
"""Ensure Windows console encoding is set up for UTF-8."""
|
|
377
|
-
if sys.platform == "win32":
|
|
378
|
-
os.environ.setdefault("PYTHONIOENCODING", "utf-8")
|
|
379
|
-
try:
|
|
380
|
-
if hasattr(sys.stdout, 'reconfigure'):
|
|
381
|
-
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
382
|
-
if hasattr(sys.stderr, 'reconfigure'):
|
|
383
|
-
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
384
|
-
except (AttributeError, ValueError, OSError):
|
|
385
|
-
pass
|
|
386
|
-
|
|
387
|
-
def print_help(self, file=None) -> None:
|
|
388
|
-
"""
|
|
389
|
-
Override print_help to ensure Windows encoding is set up.
|
|
390
|
-
|
|
391
|
-
Args:
|
|
392
|
-
file: File object to write to (default: sys.stdout)
|
|
393
|
-
"""
|
|
394
|
-
self._ensure_windows_encoding()
|
|
395
|
-
try:
|
|
396
|
-
super().print_help(file=file)
|
|
397
|
-
except (UnicodeEncodeError, OSError) as e:
|
|
398
|
-
# If encoding fails, try ASCII-safe version
|
|
399
|
-
try:
|
|
400
|
-
help_text = self.format_help()
|
|
401
|
-
safe_text = help_text.encode('ascii', 'replace').decode('ascii')
|
|
402
|
-
output_file = file or sys.stdout
|
|
403
|
-
print(safe_text, file=output_file)
|
|
404
|
-
except Exception:
|
|
405
|
-
# Last resort: print basic error
|
|
406
|
-
error_file = file or sys.stderr
|
|
407
|
-
print("Help text unavailable due to encoding issues.", file=error_file)
|
|
408
|
-
print(f"Error: {e}", file=error_file)
|
|
409
|
-
|
|
410
|
-
def error(self, message: str) -> None:
|
|
411
|
-
"""
|
|
412
|
-
Override error method to provide helpful suggestions.
|
|
413
|
-
|
|
414
|
-
Args:
|
|
415
|
-
message: Error message from argparse
|
|
416
|
-
"""
|
|
417
|
-
# Handle unrecognized arguments (common when user tries to pass multiple files)
|
|
418
|
-
if "unrecognized arguments" in message:
|
|
419
|
-
# Extract the unrecognized arguments
|
|
420
|
-
import re
|
|
421
|
-
match = re.search(r"unrecognized arguments: (.+)", message)
|
|
422
|
-
if match:
|
|
423
|
-
unrecognized = match.group(1).split()
|
|
424
|
-
# Check if they look like file paths
|
|
425
|
-
if any(arg.endswith(('.py', '.js', '.ts', '.java', '.go', '.rs')) for arg in unrecognized):
|
|
426
|
-
self.print_help()
|
|
427
|
-
print("\n" + "="*70)
|
|
428
|
-
print("ERROR: Multiple files detected but batch mode not enabled")
|
|
429
|
-
print("="*70)
|
|
430
|
-
print(f"\nUnrecognized arguments: {', '.join(unrecognized)}")
|
|
431
|
-
print("\nHint: The command accepts multiple files. Try one of these:")
|
|
432
|
-
print(f" 1. Specify files as positional arguments:")
|
|
433
|
-
print(f" tapps-agents reviewer score {' '.join(unrecognized)}")
|
|
434
|
-
print(f" 2. Use a glob pattern:")
|
|
435
|
-
print(f" tapps-agents reviewer score --pattern '**/*.py'")
|
|
436
|
-
print(f" 3. Process files one at a time:")
|
|
437
|
-
for arg in unrecognized[:3]: # Show first 3
|
|
438
|
-
print(f" tapps-agents reviewer score {arg}")
|
|
439
|
-
if len(unrecognized) > 3:
|
|
440
|
-
print(f" ... and {len(unrecognized) - 3} more files")
|
|
441
|
-
print("\nFor more information, use: tapps-agents reviewer score --help")
|
|
442
|
-
sys.exit(EXIT_USAGE_ERROR)
|
|
443
|
-
|
|
444
|
-
# Handle missing required arguments
|
|
445
|
-
if "the following arguments are required" in message.lower():
|
|
446
|
-
self.print_help()
|
|
447
|
-
print("\n" + "="*70)
|
|
448
|
-
print("ERROR: Missing required arguments")
|
|
449
|
-
print("="*70)
|
|
450
|
-
print(f"\n{message}")
|
|
451
|
-
print("\nHint: Check the command syntax above and provide all required arguments.")
|
|
452
|
-
sys.exit(EXIT_USAGE_ERROR)
|
|
453
|
-
|
|
454
|
-
# Handle invalid choice errors
|
|
455
|
-
if "invalid choice" in message.lower():
|
|
456
|
-
import re
|
|
457
|
-
match = re.search(r"invalid choice: '(.+)' \(choose from: (.+)\)", message)
|
|
458
|
-
if match:
|
|
459
|
-
invalid = match.group(1)
|
|
460
|
-
choices = match.group(2)
|
|
461
|
-
self.print_help()
|
|
462
|
-
print("\n" + "="*70)
|
|
463
|
-
print("ERROR: Invalid choice")
|
|
464
|
-
print("="*70)
|
|
465
|
-
print(f"\nInvalid choice: '{invalid}'")
|
|
466
|
-
print(f"Valid choices: {choices}")
|
|
467
|
-
print("\nHint: Use one of the valid choices listed above.")
|
|
468
|
-
sys.exit(EXIT_USAGE_ERROR)
|
|
469
|
-
|
|
470
|
-
# Default behavior for other errors
|
|
471
|
-
self.print_help()
|
|
472
|
-
print("\n" + "="*70)
|
|
473
|
-
print("ERROR")
|
|
474
|
-
print("="*70)
|
|
475
|
-
print(f"\n{message}")
|
|
476
|
-
print("\nFor more information, use --help")
|
|
477
|
-
sys.exit(EXIT_USAGE_ERROR)
|
|
478
|
-
|
|
1
|
+
"""
|
|
2
|
+
Base classes and shared utilities for CLI commands.
|
|
3
|
+
|
|
4
|
+
This module provides standardized patterns for:
|
|
5
|
+
- Agent lifecycle management (activate/run/close)
|
|
6
|
+
- Error handling with consistent exit codes
|
|
7
|
+
- Output formatting (JSON/text)
|
|
8
|
+
- Async command execution with proper event loop management
|
|
9
|
+
"""
|
|
10
|
+
import argparse
|
|
11
|
+
import asyncio
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
from collections.abc import Callable
|
|
16
|
+
from typing import Any, TypeVar
|
|
17
|
+
|
|
18
|
+
from .feedback import FeedbackManager, get_feedback
|
|
19
|
+
|
|
20
|
+
T = TypeVar("T")
|
|
21
|
+
|
|
22
|
+
# Standard exit codes
|
|
23
|
+
EXIT_SUCCESS = 0
|
|
24
|
+
EXIT_GENERAL_ERROR = 1
|
|
25
|
+
EXIT_USAGE_ERROR = 2
|
|
26
|
+
EXIT_CONFIG_ERROR = 3
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_exit_code_from_error_category(category: str) -> int:
|
|
30
|
+
"""
|
|
31
|
+
Map error envelope category to appropriate CLI exit code.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
category: Error category from ErrorEnvelope
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Exit code (1-3)
|
|
38
|
+
"""
|
|
39
|
+
category_to_exit_code = {
|
|
40
|
+
"configuration": EXIT_CONFIG_ERROR, # 3
|
|
41
|
+
"validation": EXIT_USAGE_ERROR, # 2 - user input issue
|
|
42
|
+
"permission": EXIT_GENERAL_ERROR, # 1 - system/permission issue
|
|
43
|
+
"execution": EXIT_GENERAL_ERROR, # 1 - runtime error
|
|
44
|
+
"external_dependency": EXIT_GENERAL_ERROR, # 1 - external service issue
|
|
45
|
+
"timeout": EXIT_GENERAL_ERROR, # 1 - timeout issue
|
|
46
|
+
}
|
|
47
|
+
return category_to_exit_code.get(category, EXIT_GENERAL_ERROR)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def normalize_command(command: str | None) -> str | None:
|
|
51
|
+
"""
|
|
52
|
+
Normalize command by removing star prefix if present.
|
|
53
|
+
|
|
54
|
+
Supports both *command and command formats.
|
|
55
|
+
"""
|
|
56
|
+
if command is None:
|
|
57
|
+
return None
|
|
58
|
+
return command.lstrip("*") if command.startswith("*") else command
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def format_output(data: dict[str, Any] | str, format_type: str = "json") -> None:
|
|
62
|
+
"""
|
|
63
|
+
Format and print output based on format type.
|
|
64
|
+
|
|
65
|
+
Uses the feedback system for consistent output formatting.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
data: Data to output (dict for JSON, str for text)
|
|
69
|
+
format_type: Output format ("json" or "text")
|
|
70
|
+
"""
|
|
71
|
+
feedback = get_feedback()
|
|
72
|
+
# Temporarily set format type for this output
|
|
73
|
+
original_format = feedback.format_type
|
|
74
|
+
feedback.format_type = format_type
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
if isinstance(data, dict):
|
|
78
|
+
feedback.output_result(data)
|
|
79
|
+
else:
|
|
80
|
+
feedback.output_result(data)
|
|
81
|
+
finally:
|
|
82
|
+
feedback.format_type = original_format
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def format_error_output(
|
|
86
|
+
error: str,
|
|
87
|
+
error_type: str = "error",
|
|
88
|
+
exit_code: int = EXIT_GENERAL_ERROR,
|
|
89
|
+
format_type: str = "text",
|
|
90
|
+
details: dict[str, Any] | None = None,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""
|
|
93
|
+
Format and output error message with consistent structure.
|
|
94
|
+
|
|
95
|
+
Uses the feedback system for standardized error formatting.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
error: Error message
|
|
99
|
+
error_type: Type of error (e.g., "error", "validation_error", "config_error")
|
|
100
|
+
exit_code: Exit code to use (default: EXIT_GENERAL_ERROR)
|
|
101
|
+
format_type: Output format ("json" or "text")
|
|
102
|
+
details: Additional error details
|
|
103
|
+
"""
|
|
104
|
+
feedback = get_feedback()
|
|
105
|
+
# Temporarily set format type for this output
|
|
106
|
+
original_format = feedback.format_type
|
|
107
|
+
feedback.format_type = format_type
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
# Map error_type to remediation if it's a common error
|
|
111
|
+
remediation = None
|
|
112
|
+
if error_type == "file_not_found" or "not found" in error.lower():
|
|
113
|
+
remediation = "Check that the file exists and the path is correct"
|
|
114
|
+
elif error_type == "validation_error":
|
|
115
|
+
remediation = "Check your input and try again"
|
|
116
|
+
elif error_type == "config_error":
|
|
117
|
+
remediation = "Check your configuration file and settings"
|
|
118
|
+
|
|
119
|
+
feedback.error(
|
|
120
|
+
message=error,
|
|
121
|
+
error_code=error_type,
|
|
122
|
+
context=details,
|
|
123
|
+
remediation=remediation,
|
|
124
|
+
exit_code=exit_code,
|
|
125
|
+
)
|
|
126
|
+
finally:
|
|
127
|
+
feedback.format_type = original_format
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def handle_agent_error(
|
|
131
|
+
result: dict[str, Any],
|
|
132
|
+
format_type: str = "text",
|
|
133
|
+
exit_code: int | None = None,
|
|
134
|
+
) -> None:
|
|
135
|
+
"""
|
|
136
|
+
Handle errors from agent execution with standardized output.
|
|
137
|
+
|
|
138
|
+
Uses error envelope information if available to determine appropriate exit code.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
result: Agent result dictionary that may contain an "error" key or error envelope
|
|
142
|
+
format_type: Output format ("json" or "text")
|
|
143
|
+
exit_code: Exit code to use (if None, determined from error envelope category)
|
|
144
|
+
|
|
145
|
+
Raises:
|
|
146
|
+
SystemExit: Always raises SystemExit with appropriate code
|
|
147
|
+
"""
|
|
148
|
+
if "error" in result:
|
|
149
|
+
# Check if result contains error envelope structure
|
|
150
|
+
error_info = result.get("error", {})
|
|
151
|
+
if isinstance(error_info, dict) and "category" in error_info:
|
|
152
|
+
# Error envelope format
|
|
153
|
+
category = error_info.get("category", "execution")
|
|
154
|
+
error_message = error_info.get("message", "An error occurred")
|
|
155
|
+
error_code = error_info.get("code", "unknown_error")
|
|
156
|
+
details = error_info.get("details")
|
|
157
|
+
|
|
158
|
+
# Determine exit code from category if not explicitly provided
|
|
159
|
+
if exit_code is None:
|
|
160
|
+
exit_code = get_exit_code_from_error_category(category)
|
|
161
|
+
|
|
162
|
+
format_error_output(
|
|
163
|
+
error_message,
|
|
164
|
+
error_type=error_code,
|
|
165
|
+
exit_code=exit_code,
|
|
166
|
+
format_type=format_type,
|
|
167
|
+
details=details,
|
|
168
|
+
)
|
|
169
|
+
else:
|
|
170
|
+
# Legacy format: simple error string or dict with error_type
|
|
171
|
+
error_message = error_info if isinstance(error_info, str) else str(error_info)
|
|
172
|
+
error_type = result.get("error_type", "error")
|
|
173
|
+
details = result.get("details")
|
|
174
|
+
|
|
175
|
+
# Use provided exit_code or default
|
|
176
|
+
if exit_code is None:
|
|
177
|
+
exit_code = EXIT_GENERAL_ERROR
|
|
178
|
+
|
|
179
|
+
format_error_output(
|
|
180
|
+
error_message,
|
|
181
|
+
error_type=error_type,
|
|
182
|
+
exit_code=exit_code,
|
|
183
|
+
format_type=format_type,
|
|
184
|
+
details=details,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def handle_network_error(error: Exception, format_type: str = "text") -> None:
|
|
189
|
+
"""Handle network errors with informative messages following Cursor CLI 2025 patterns.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
error: NetworkError instance with operation context (or any exception)
|
|
193
|
+
format_type: Output format ("json" or "text")
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
SystemExit: Always raises SystemExit with appropriate code
|
|
197
|
+
"""
|
|
198
|
+
from ..core.network_errors import NetworkError
|
|
199
|
+
|
|
200
|
+
feedback = get_feedback()
|
|
201
|
+
|
|
202
|
+
# Check if it's a NetworkError
|
|
203
|
+
if isinstance(error, NetworkError):
|
|
204
|
+
if format_type == "json":
|
|
205
|
+
# Output in Cursor CLI JSON format
|
|
206
|
+
error_dict = error.to_dict()
|
|
207
|
+
feedback.error(
|
|
208
|
+
message=error_dict["message"],
|
|
209
|
+
error_code="connection_error",
|
|
210
|
+
context=error_dict.get("details", {}),
|
|
211
|
+
remediation="Check your internet connection or VPN. Use offline alternatives if available.",
|
|
212
|
+
exit_code=EXIT_GENERAL_ERROR,
|
|
213
|
+
)
|
|
214
|
+
else:
|
|
215
|
+
# Text format with actionable guidance
|
|
216
|
+
feedback.error(
|
|
217
|
+
message=str(error),
|
|
218
|
+
error_code="connection_error",
|
|
219
|
+
context={
|
|
220
|
+
"operation": error.operation_name,
|
|
221
|
+
"request_id": error.request_id,
|
|
222
|
+
"session_id": error.session_id,
|
|
223
|
+
},
|
|
224
|
+
remediation=(
|
|
225
|
+
"1. Check your internet connection\n"
|
|
226
|
+
"2. Verify VPN is connected (if required)\n"
|
|
227
|
+
"3. Check firewall/proxy settings\n"
|
|
228
|
+
"4. Try again in a few moments\n"
|
|
229
|
+
"5. Use offline alternatives if available"
|
|
230
|
+
),
|
|
231
|
+
exit_code=EXIT_GENERAL_ERROR,
|
|
232
|
+
)
|
|
233
|
+
else:
|
|
234
|
+
# Generic error handling
|
|
235
|
+
feedback.error(
|
|
236
|
+
message=str(error),
|
|
237
|
+
error_code="connection_error",
|
|
238
|
+
context={},
|
|
239
|
+
remediation="Check your internet connection or VPN.",
|
|
240
|
+
exit_code=EXIT_GENERAL_ERROR,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
async def run_with_agent_lifecycle(
|
|
245
|
+
agent: Any,
|
|
246
|
+
command_func: Callable[..., Any],
|
|
247
|
+
*args: Any,
|
|
248
|
+
offline_mode: bool = False,
|
|
249
|
+
**kwargs: Any,
|
|
250
|
+
) -> Any:
|
|
251
|
+
"""
|
|
252
|
+
Run a command function with agent lifecycle management (activate/close).
|
|
253
|
+
|
|
254
|
+
This is the standard pattern for running agent commands:
|
|
255
|
+
1. Activate agent (load configs, initialize)
|
|
256
|
+
2. Run command
|
|
257
|
+
3. Close agent (cleanup)
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
agent: Agent instance (must have activate() and close() methods)
|
|
261
|
+
command_func: Async function to execute (can be agent.run or a wrapper)
|
|
262
|
+
*args: Positional arguments for command_func
|
|
263
|
+
offline_mode: If True, activate agent in offline mode (no network operations)
|
|
264
|
+
**kwargs: Keyword arguments for command_func
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Result from command_func
|
|
268
|
+
|
|
269
|
+
Raises:
|
|
270
|
+
Any exception raised by command_func or agent methods
|
|
271
|
+
"""
|
|
272
|
+
try:
|
|
273
|
+
await agent.activate(offline_mode=offline_mode)
|
|
274
|
+
return await command_func(*args, **kwargs)
|
|
275
|
+
finally:
|
|
276
|
+
if hasattr(agent, "close") and agent.close is not None:
|
|
277
|
+
await agent.close()
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def run_async_command(coro: Any) -> Any:
|
|
281
|
+
"""
|
|
282
|
+
Run an async coroutine using asyncio.run.
|
|
283
|
+
|
|
284
|
+
This function ensures proper event loop management and avoids
|
|
285
|
+
nested event loop issues. Use this instead of calling asyncio.run()
|
|
286
|
+
directly throughout the codebase.
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
coro: Coroutine to run
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
Result from coroutine
|
|
293
|
+
|
|
294
|
+
Raises:
|
|
295
|
+
RuntimeError: If called from within an existing event loop
|
|
296
|
+
"""
|
|
297
|
+
try:
|
|
298
|
+
# If this succeeds, we're already inside an event loop.
|
|
299
|
+
asyncio.get_running_loop()
|
|
300
|
+
except RuntimeError:
|
|
301
|
+
# No running loop - safe to use asyncio.run()
|
|
302
|
+
return asyncio.run(coro)
|
|
303
|
+
|
|
304
|
+
raise RuntimeError(
|
|
305
|
+
"run_async_command() called from within an event loop. "
|
|
306
|
+
"Use 'await' instead of run_async_command()."
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
async def run_agent_command(
|
|
311
|
+
agent: Any,
|
|
312
|
+
command: str,
|
|
313
|
+
format_type: str = "json",
|
|
314
|
+
exit_on_error: bool = True,
|
|
315
|
+
**kwargs: Any,
|
|
316
|
+
) -> dict[str, Any]:
|
|
317
|
+
"""
|
|
318
|
+
Run an agent command with full lifecycle management and error handling.
|
|
319
|
+
|
|
320
|
+
This is the high-level convenience function that combines:
|
|
321
|
+
- Agent lifecycle management
|
|
322
|
+
- Command execution
|
|
323
|
+
- Error handling
|
|
324
|
+
- Output formatting
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
agent: Agent instance
|
|
328
|
+
command: Command name to run (will be normalized)
|
|
329
|
+
format_type: Output format ("json" or "text")
|
|
330
|
+
exit_on_error: If True, exit on error; if False, return error in result
|
|
331
|
+
**kwargs: Arguments to pass to agent.run()
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
Result dictionary (may contain "error" key if exit_on_error=False)
|
|
335
|
+
|
|
336
|
+
Raises:
|
|
337
|
+
SystemExit: If exit_on_error=True and command fails
|
|
338
|
+
"""
|
|
339
|
+
normalized_command = normalize_command(command)
|
|
340
|
+
|
|
341
|
+
async def _run_command() -> dict[str, Any]:
|
|
342
|
+
return await agent.run(normalized_command, **kwargs)
|
|
343
|
+
|
|
344
|
+
result = await run_with_agent_lifecycle(agent, _run_command)
|
|
345
|
+
|
|
346
|
+
if exit_on_error:
|
|
347
|
+
handle_agent_error(result, format_type=format_type)
|
|
348
|
+
else:
|
|
349
|
+
return result
|
|
350
|
+
|
|
351
|
+
return result
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def get_verbosity_level() -> str:
|
|
355
|
+
"""
|
|
356
|
+
Get current verbosity level as string.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Verbosity level: "quiet", "normal", or "verbose"
|
|
360
|
+
"""
|
|
361
|
+
from .feedback import VerbosityLevel
|
|
362
|
+
verbosity = FeedbackManager.get_verbosity()
|
|
363
|
+
return verbosity.value
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
class HelpfulArgumentParser(argparse.ArgumentParser):
|
|
367
|
+
"""
|
|
368
|
+
ArgumentParser subclass with improved error messages and suggestions.
|
|
369
|
+
|
|
370
|
+
Provides helpful hints for common errors like unrecognized arguments,
|
|
371
|
+
missing required arguments, and invalid choices.
|
|
372
|
+
Also handles Windows encoding issues when printing help.
|
|
373
|
+
"""
|
|
374
|
+
|
|
375
|
+
def _ensure_windows_encoding(self) -> None:
|
|
376
|
+
"""Ensure Windows console encoding is set up for UTF-8."""
|
|
377
|
+
if sys.platform == "win32":
|
|
378
|
+
os.environ.setdefault("PYTHONIOENCODING", "utf-8")
|
|
379
|
+
try:
|
|
380
|
+
if hasattr(sys.stdout, 'reconfigure'):
|
|
381
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
382
|
+
if hasattr(sys.stderr, 'reconfigure'):
|
|
383
|
+
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
384
|
+
except (AttributeError, ValueError, OSError):
|
|
385
|
+
pass
|
|
386
|
+
|
|
387
|
+
def print_help(self, file=None) -> None:
|
|
388
|
+
"""
|
|
389
|
+
Override print_help to ensure Windows encoding is set up.
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
file: File object to write to (default: sys.stdout)
|
|
393
|
+
"""
|
|
394
|
+
self._ensure_windows_encoding()
|
|
395
|
+
try:
|
|
396
|
+
super().print_help(file=file)
|
|
397
|
+
except (UnicodeEncodeError, OSError) as e:
|
|
398
|
+
# If encoding fails, try ASCII-safe version
|
|
399
|
+
try:
|
|
400
|
+
help_text = self.format_help()
|
|
401
|
+
safe_text = help_text.encode('ascii', 'replace').decode('ascii')
|
|
402
|
+
output_file = file or sys.stdout
|
|
403
|
+
print(safe_text, file=output_file)
|
|
404
|
+
except Exception:
|
|
405
|
+
# Last resort: print basic error
|
|
406
|
+
error_file = file or sys.stderr
|
|
407
|
+
print("Help text unavailable due to encoding issues.", file=error_file)
|
|
408
|
+
print(f"Error: {e}", file=error_file)
|
|
409
|
+
|
|
410
|
+
def error(self, message: str) -> None:
|
|
411
|
+
"""
|
|
412
|
+
Override error method to provide helpful suggestions.
|
|
413
|
+
|
|
414
|
+
Args:
|
|
415
|
+
message: Error message from argparse
|
|
416
|
+
"""
|
|
417
|
+
# Handle unrecognized arguments (common when user tries to pass multiple files)
|
|
418
|
+
if "unrecognized arguments" in message:
|
|
419
|
+
# Extract the unrecognized arguments
|
|
420
|
+
import re
|
|
421
|
+
match = re.search(r"unrecognized arguments: (.+)", message)
|
|
422
|
+
if match:
|
|
423
|
+
unrecognized = match.group(1).split()
|
|
424
|
+
# Check if they look like file paths
|
|
425
|
+
if any(arg.endswith(('.py', '.js', '.ts', '.java', '.go', '.rs')) for arg in unrecognized):
|
|
426
|
+
self.print_help()
|
|
427
|
+
print("\n" + "="*70)
|
|
428
|
+
print("ERROR: Multiple files detected but batch mode not enabled")
|
|
429
|
+
print("="*70)
|
|
430
|
+
print(f"\nUnrecognized arguments: {', '.join(unrecognized)}")
|
|
431
|
+
print("\nHint: The command accepts multiple files. Try one of these:")
|
|
432
|
+
print(f" 1. Specify files as positional arguments:")
|
|
433
|
+
print(f" tapps-agents reviewer score {' '.join(unrecognized)}")
|
|
434
|
+
print(f" 2. Use a glob pattern:")
|
|
435
|
+
print(f" tapps-agents reviewer score --pattern '**/*.py'")
|
|
436
|
+
print(f" 3. Process files one at a time:")
|
|
437
|
+
for arg in unrecognized[:3]: # Show first 3
|
|
438
|
+
print(f" tapps-agents reviewer score {arg}")
|
|
439
|
+
if len(unrecognized) > 3:
|
|
440
|
+
print(f" ... and {len(unrecognized) - 3} more files")
|
|
441
|
+
print("\nFor more information, use: tapps-agents reviewer score --help")
|
|
442
|
+
sys.exit(EXIT_USAGE_ERROR)
|
|
443
|
+
|
|
444
|
+
# Handle missing required arguments
|
|
445
|
+
if "the following arguments are required" in message.lower():
|
|
446
|
+
self.print_help()
|
|
447
|
+
print("\n" + "="*70)
|
|
448
|
+
print("ERROR: Missing required arguments")
|
|
449
|
+
print("="*70)
|
|
450
|
+
print(f"\n{message}")
|
|
451
|
+
print("\nHint: Check the command syntax above and provide all required arguments.")
|
|
452
|
+
sys.exit(EXIT_USAGE_ERROR)
|
|
453
|
+
|
|
454
|
+
# Handle invalid choice errors
|
|
455
|
+
if "invalid choice" in message.lower():
|
|
456
|
+
import re
|
|
457
|
+
match = re.search(r"invalid choice: '(.+)' \(choose from: (.+)\)", message)
|
|
458
|
+
if match:
|
|
459
|
+
invalid = match.group(1)
|
|
460
|
+
choices = match.group(2)
|
|
461
|
+
self.print_help()
|
|
462
|
+
print("\n" + "="*70)
|
|
463
|
+
print("ERROR: Invalid choice")
|
|
464
|
+
print("="*70)
|
|
465
|
+
print(f"\nInvalid choice: '{invalid}'")
|
|
466
|
+
print(f"Valid choices: {choices}")
|
|
467
|
+
print("\nHint: Use one of the valid choices listed above.")
|
|
468
|
+
sys.exit(EXIT_USAGE_ERROR)
|
|
469
|
+
|
|
470
|
+
# Default behavior for other errors
|
|
471
|
+
self.print_help()
|
|
472
|
+
print("\n" + "="*70)
|
|
473
|
+
print("ERROR")
|
|
474
|
+
print("="*70)
|
|
475
|
+
print(f"\n{message}")
|
|
476
|
+
print("\nFor more information, use --help")
|
|
477
|
+
sys.exit(EXIT_USAGE_ERROR)
|
|
478
|
+
|