claude-mpm 4.1.0__py3-none-any.whl → 4.1.2__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.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__main__.py +1 -1
- claude_mpm/agents/BASE_PM.md +74 -46
- claude_mpm/agents/INSTRUCTIONS.md +11 -153
- claude_mpm/agents/WORKFLOW.md +61 -321
- claude_mpm/agents/__init__.py +11 -11
- claude_mpm/agents/agent_loader.py +23 -20
- claude_mpm/agents/agent_loader_integration.py +1 -1
- claude_mpm/agents/agents_metadata.py +27 -0
- claude_mpm/agents/async_agent_loader.py +5 -8
- claude_mpm/agents/base_agent_loader.py +36 -25
- claude_mpm/agents/frontmatter_validator.py +6 -6
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +9 -9
- claude_mpm/agents/templates/api_qa.json +47 -2
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +133 -58
- claude_mpm/agents/templates/web_ui.json +3 -3
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +271 -268
- claude_mpm/cli/commands/aggregate.py +30 -29
- claude_mpm/cli/commands/cleanup.py +50 -44
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
- claude_mpm/cli/commands/config.py +162 -127
- claude_mpm/cli/commands/doctor.py +52 -62
- claude_mpm/cli/commands/info.py +37 -25
- claude_mpm/cli/commands/mcp.py +3 -7
- claude_mpm/cli/commands/mcp_command_router.py +14 -18
- claude_mpm/cli/commands/mcp_install_commands.py +28 -23
- claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
- claude_mpm/cli/commands/mcp_server_commands.py +23 -17
- claude_mpm/cli/commands/memory.py +192 -141
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +120 -84
- claude_mpm/cli/commands/run_config_checker.py +4 -5
- claude_mpm/cli/commands/socketio_monitor.py +17 -19
- claude_mpm/cli/commands/tickets.py +92 -92
- claude_mpm/cli/parser.py +1 -5
- claude_mpm/cli/parsers/__init__.py +1 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
- claude_mpm/cli/parsers/agents_parser.py +2 -3
- claude_mpm/cli/parsers/base_parser.py +7 -5
- claude_mpm/cli/parsers/mcp_parser.py +4 -2
- claude_mpm/cli/parsers/monitor_parser.py +26 -18
- claude_mpm/cli/shared/__init__.py +10 -10
- claude_mpm/cli/shared/argument_patterns.py +57 -71
- claude_mpm/cli/shared/base_command.py +61 -53
- claude_mpm/cli/shared/error_handling.py +62 -58
- claude_mpm/cli/shared/output_formatters.py +78 -77
- claude_mpm/cli/startup_logging.py +204 -172
- claude_mpm/cli/utils.py +10 -11
- claude_mpm/cli_module/__init__.py +1 -1
- claude_mpm/cli_module/args.py +1 -1
- claude_mpm/cli_module/migration_example.py +5 -5
- claude_mpm/config/__init__.py +9 -9
- claude_mpm/config/agent_config.py +15 -14
- claude_mpm/config/experimental_features.py +4 -4
- claude_mpm/config/paths.py +0 -1
- claude_mpm/config/socketio_config.py +5 -6
- claude_mpm/constants.py +1 -2
- claude_mpm/core/__init__.py +8 -8
- claude_mpm/core/agent_name_normalizer.py +1 -1
- claude_mpm/core/agent_registry.py +20 -23
- claude_mpm/core/agent_session_manager.py +3 -3
- claude_mpm/core/base_service.py +7 -15
- claude_mpm/core/cache.py +4 -6
- claude_mpm/core/claude_runner.py +85 -113
- claude_mpm/core/config.py +43 -28
- claude_mpm/core/config_aliases.py +0 -9
- claude_mpm/core/config_constants.py +52 -30
- claude_mpm/core/constants.py +0 -1
- claude_mpm/core/container.py +18 -27
- claude_mpm/core/exceptions.py +2 -2
- claude_mpm/core/factories.py +10 -12
- claude_mpm/core/framework_loader.py +581 -280
- claude_mpm/core/hook_manager.py +26 -22
- claude_mpm/core/hook_performance_config.py +58 -47
- claude_mpm/core/injectable_service.py +1 -1
- claude_mpm/core/interactive_session.py +61 -152
- claude_mpm/core/interfaces.py +1 -100
- claude_mpm/core/lazy.py +5 -5
- claude_mpm/core/log_manager.py +587 -0
- claude_mpm/core/logger.py +125 -8
- claude_mpm/core/logging_config.py +15 -15
- claude_mpm/core/minimal_framework_loader.py +5 -8
- claude_mpm/core/oneshot_session.py +15 -33
- claude_mpm/core/optimized_agent_loader.py +4 -6
- claude_mpm/core/optimized_startup.py +2 -1
- claude_mpm/core/output_style_manager.py +147 -106
- claude_mpm/core/pm_hook_interceptor.py +0 -1
- claude_mpm/core/service_registry.py +11 -8
- claude_mpm/core/session_manager.py +1 -2
- claude_mpm/core/shared/__init__.py +1 -1
- claude_mpm/core/shared/config_loader.py +101 -97
- claude_mpm/core/shared/path_resolver.py +72 -68
- claude_mpm/core/shared/singleton_manager.py +56 -50
- claude_mpm/core/socketio_pool.py +26 -6
- claude_mpm/core/tool_access_control.py +4 -5
- claude_mpm/core/typing_utils.py +50 -59
- claude_mpm/core/unified_agent_registry.py +14 -19
- claude_mpm/core/unified_config.py +4 -6
- claude_mpm/core/unified_paths.py +197 -109
- claude_mpm/dashboard/open_dashboard.py +2 -4
- claude_mpm/experimental/cli_enhancements.py +51 -36
- claude_mpm/generators/agent_profile_generator.py +2 -4
- claude_mpm/hooks/base_hook.py +1 -2
- claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
- claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
- claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
- claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
- claude_mpm/hooks/memory_integration_hook.py +5 -5
- claude_mpm/hooks/tool_call_interceptor.py +1 -1
- claude_mpm/hooks/validation_hooks.py +4 -4
- claude_mpm/init.py +4 -9
- claude_mpm/models/__init__.py +2 -2
- claude_mpm/models/agent_session.py +11 -14
- claude_mpm/scripts/mcp_server.py +20 -11
- claude_mpm/scripts/mcp_wrapper.py +5 -5
- claude_mpm/scripts/mpm_doctor.py +321 -0
- claude_mpm/scripts/socketio_daemon.py +28 -25
- claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
- claude_mpm/scripts/socketio_server_manager.py +116 -95
- claude_mpm/services/__init__.py +49 -49
- claude_mpm/services/agent_capabilities_service.py +12 -18
- claude_mpm/services/agents/__init__.py +22 -22
- claude_mpm/services/agents/agent_builder.py +140 -119
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
- claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
- claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
- claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
- claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
- claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
- claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
- claude_mpm/services/agents/deployment/agent_validator.py +0 -1
- claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
- claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
- claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
- claude_mpm/services/agents/deployment/config/__init__.py +1 -1
- claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
- claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
- claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
- claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
- claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
- claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
- claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
- claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
- claude_mpm/services/agents/deployment/results/__init__.py +1 -1
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
- claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
- claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
- claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
- claude_mpm/services/agents/loading/__init__.py +1 -1
- claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
- claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
- claude_mpm/services/agents/management/__init__.py +1 -1
- claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
- claude_mpm/services/agents/management/agent_management_service.py +5 -9
- claude_mpm/services/agents/memory/__init__.py +4 -4
- claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
- claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
- claude_mpm/services/agents/memory/content_manager.py +44 -38
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +10 -6
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
- claude_mpm/services/agents/registry/modification_tracker.py +3 -6
- claude_mpm/services/async_session_logger.py +1 -2
- claude_mpm/services/claude_session_logger.py +1 -2
- claude_mpm/services/command_deployment_service.py +173 -0
- claude_mpm/services/command_handler_service.py +20 -22
- claude_mpm/services/core/__init__.py +25 -25
- claude_mpm/services/core/base.py +0 -5
- claude_mpm/services/core/interfaces/__init__.py +32 -32
- claude_mpm/services/core/interfaces/agent.py +0 -21
- claude_mpm/services/core/interfaces/communication.py +0 -27
- claude_mpm/services/core/interfaces/infrastructure.py +0 -56
- claude_mpm/services/core/interfaces/service.py +0 -29
- claude_mpm/services/diagnostics/__init__.py +1 -1
- claude_mpm/services/diagnostics/checks/__init__.py +6 -6
- claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
- claude_mpm-4.1.2.dist-info/RECORD +498 -0
- claude_mpm-4.1.0.dist-info/RECORD +0 -494
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
|
@@ -16,7 +16,7 @@ DESIGN DECISIONS:
|
|
|
16
16
|
import json
|
|
17
17
|
import subprocess
|
|
18
18
|
import sys
|
|
19
|
-
from typing import
|
|
19
|
+
from typing import Optional
|
|
20
20
|
|
|
21
21
|
from ...constants import TicketCommands
|
|
22
22
|
from ...core.logger import get_logger
|
|
@@ -31,7 +31,7 @@ class TicketsCommand(BaseCommand):
|
|
|
31
31
|
|
|
32
32
|
def validate_args(self, args) -> Optional[str]:
|
|
33
33
|
"""Validate command arguments."""
|
|
34
|
-
if not hasattr(args,
|
|
34
|
+
if not hasattr(args, "tickets_command") or not args.tickets_command:
|
|
35
35
|
return "No tickets subcommand specified"
|
|
36
36
|
|
|
37
37
|
valid_commands = [cmd.value for cmd in TicketCommands]
|
|
@@ -58,8 +58,9 @@ class TicketsCommand(BaseCommand):
|
|
|
58
58
|
|
|
59
59
|
if args.tickets_command in command_map:
|
|
60
60
|
return command_map[args.tickets_command](args)
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
return CommandResult.error_result(
|
|
62
|
+
f"Unknown tickets command: {args.tickets_command}"
|
|
63
|
+
)
|
|
63
64
|
|
|
64
65
|
except Exception as e:
|
|
65
66
|
self.logger.error(f"Error executing tickets command: {e}", exc_info=True)
|
|
@@ -71,8 +72,9 @@ class TicketsCommand(BaseCommand):
|
|
|
71
72
|
exit_code = create_ticket_legacy(args)
|
|
72
73
|
if exit_code == 0:
|
|
73
74
|
return CommandResult.success_result("Ticket created successfully")
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
return CommandResult.error_result(
|
|
76
|
+
"Failed to create ticket", exit_code=exit_code
|
|
77
|
+
)
|
|
76
78
|
except Exception as e:
|
|
77
79
|
self.logger.error(f"Error creating ticket: {e}")
|
|
78
80
|
return CommandResult.error_result(f"Error creating ticket: {e}")
|
|
@@ -83,8 +85,9 @@ class TicketsCommand(BaseCommand):
|
|
|
83
85
|
exit_code = list_tickets_legacy(args)
|
|
84
86
|
if exit_code == 0:
|
|
85
87
|
return CommandResult.success_result("Tickets listed successfully")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
return CommandResult.error_result(
|
|
89
|
+
"Failed to list tickets", exit_code=exit_code
|
|
90
|
+
)
|
|
88
91
|
except Exception as e:
|
|
89
92
|
self.logger.error(f"Error listing tickets: {e}")
|
|
90
93
|
return CommandResult.error_result(f"Error listing tickets: {e}")
|
|
@@ -95,8 +98,9 @@ class TicketsCommand(BaseCommand):
|
|
|
95
98
|
exit_code = view_ticket_legacy(args)
|
|
96
99
|
if exit_code == 0:
|
|
97
100
|
return CommandResult.success_result("Ticket viewed successfully")
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
return CommandResult.error_result(
|
|
102
|
+
"Failed to view ticket", exit_code=exit_code
|
|
103
|
+
)
|
|
100
104
|
except Exception as e:
|
|
101
105
|
self.logger.error(f"Error viewing ticket: {e}")
|
|
102
106
|
return CommandResult.error_result(f"Error viewing ticket: {e}")
|
|
@@ -107,8 +111,9 @@ class TicketsCommand(BaseCommand):
|
|
|
107
111
|
exit_code = update_ticket_legacy(args)
|
|
108
112
|
if exit_code == 0:
|
|
109
113
|
return CommandResult.success_result("Ticket updated successfully")
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
return CommandResult.error_result(
|
|
115
|
+
"Failed to update ticket", exit_code=exit_code
|
|
116
|
+
)
|
|
112
117
|
except Exception as e:
|
|
113
118
|
self.logger.error(f"Error updating ticket: {e}")
|
|
114
119
|
return CommandResult.error_result(f"Error updating ticket: {e}")
|
|
@@ -119,8 +124,9 @@ class TicketsCommand(BaseCommand):
|
|
|
119
124
|
exit_code = close_ticket_legacy(args)
|
|
120
125
|
if exit_code == 0:
|
|
121
126
|
return CommandResult.success_result("Ticket closed successfully")
|
|
122
|
-
|
|
123
|
-
|
|
127
|
+
return CommandResult.error_result(
|
|
128
|
+
"Failed to close ticket", exit_code=exit_code
|
|
129
|
+
)
|
|
124
130
|
except Exception as e:
|
|
125
131
|
self.logger.error(f"Error closing ticket: {e}")
|
|
126
132
|
return CommandResult.error_result(f"Error closing ticket: {e}")
|
|
@@ -131,8 +137,9 @@ class TicketsCommand(BaseCommand):
|
|
|
131
137
|
exit_code = delete_ticket_legacy(args)
|
|
132
138
|
if exit_code == 0:
|
|
133
139
|
return CommandResult.success_result("Ticket deleted successfully")
|
|
134
|
-
|
|
135
|
-
|
|
140
|
+
return CommandResult.error_result(
|
|
141
|
+
"Failed to delete ticket", exit_code=exit_code
|
|
142
|
+
)
|
|
136
143
|
except Exception as e:
|
|
137
144
|
self.logger.error(f"Error deleting ticket: {e}")
|
|
138
145
|
return CommandResult.error_result(f"Error deleting ticket: {e}")
|
|
@@ -143,8 +150,9 @@ class TicketsCommand(BaseCommand):
|
|
|
143
150
|
exit_code = search_tickets_legacy(args)
|
|
144
151
|
if exit_code == 0:
|
|
145
152
|
return CommandResult.success_result("Tickets searched successfully")
|
|
146
|
-
|
|
147
|
-
|
|
153
|
+
return CommandResult.error_result(
|
|
154
|
+
"Failed to search tickets", exit_code=exit_code
|
|
155
|
+
)
|
|
148
156
|
except Exception as e:
|
|
149
157
|
self.logger.error(f"Error searching tickets: {e}")
|
|
150
158
|
return CommandResult.error_result(f"Error searching tickets: {e}")
|
|
@@ -155,8 +163,9 @@ class TicketsCommand(BaseCommand):
|
|
|
155
163
|
exit_code = add_comment_legacy(args)
|
|
156
164
|
if exit_code == 0:
|
|
157
165
|
return CommandResult.success_result("Comment added successfully")
|
|
158
|
-
|
|
159
|
-
|
|
166
|
+
return CommandResult.error_result(
|
|
167
|
+
"Failed to add comment", exit_code=exit_code
|
|
168
|
+
)
|
|
160
169
|
except Exception as e:
|
|
161
170
|
self.logger.error(f"Error adding comment: {e}")
|
|
162
171
|
return CommandResult.error_result(f"Error adding comment: {e}")
|
|
@@ -167,8 +176,9 @@ class TicketsCommand(BaseCommand):
|
|
|
167
176
|
exit_code = update_workflow_legacy(args)
|
|
168
177
|
if exit_code == 0:
|
|
169
178
|
return CommandResult.success_result("Workflow updated successfully")
|
|
170
|
-
|
|
171
|
-
|
|
179
|
+
return CommandResult.error_result(
|
|
180
|
+
"Failed to update workflow", exit_code=exit_code
|
|
181
|
+
)
|
|
172
182
|
except Exception as e:
|
|
173
183
|
self.logger.error(f"Error updating workflow: {e}")
|
|
174
184
|
return CommandResult.error_result(f"Error updating workflow: {e}")
|
|
@@ -184,7 +194,7 @@ def manage_tickets(args):
|
|
|
184
194
|
result = command.execute(args)
|
|
185
195
|
|
|
186
196
|
# Print result if structured output format is requested
|
|
187
|
-
if hasattr(args,
|
|
197
|
+
if hasattr(args, "format") and args.format in ["json", "yaml"]:
|
|
188
198
|
command.print_result(result, args)
|
|
189
199
|
|
|
190
200
|
return result.exit_code
|
|
@@ -278,7 +288,7 @@ def create_ticket_legacy(args):
|
|
|
278
288
|
Returns:
|
|
279
289
|
Exit code (0 for success, non-zero for errors)
|
|
280
290
|
"""
|
|
281
|
-
|
|
291
|
+
get_logger("cli.tickets")
|
|
282
292
|
|
|
283
293
|
try:
|
|
284
294
|
from ...services.ticket_manager import TicketManager
|
|
@@ -317,9 +327,8 @@ def create_ticket_legacy(args):
|
|
|
317
327
|
if getattr(args, "parent_issue", None):
|
|
318
328
|
print(f" Parent Issue: {args.parent_issue}")
|
|
319
329
|
return 0
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
return 1
|
|
330
|
+
print("❌ Failed to create ticket")
|
|
331
|
+
return 1
|
|
323
332
|
|
|
324
333
|
|
|
325
334
|
def list_tickets_legacy(args):
|
|
@@ -501,7 +510,7 @@ def view_ticket_legacy(args):
|
|
|
501
510
|
Returns:
|
|
502
511
|
Exit code (0 for success, non-zero for errors)
|
|
503
512
|
"""
|
|
504
|
-
|
|
513
|
+
get_logger("cli.tickets")
|
|
505
514
|
|
|
506
515
|
try:
|
|
507
516
|
from ...services.ticket_manager import TicketManager
|
|
@@ -510,7 +519,7 @@ def view_ticket_legacy(args):
|
|
|
510
519
|
|
|
511
520
|
ticket_manager = TicketManager()
|
|
512
521
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
513
|
-
ticket_id = getattr(args,
|
|
522
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
514
523
|
if not ticket_id:
|
|
515
524
|
print("❌ No ticket ID provided")
|
|
516
525
|
return 1
|
|
@@ -540,7 +549,7 @@ def view_ticket_legacy(args):
|
|
|
540
549
|
if metadata.get("parent_issue"):
|
|
541
550
|
print(f"Parent Issue: {metadata['parent_issue']}")
|
|
542
551
|
|
|
543
|
-
print(
|
|
552
|
+
print("\nDescription:")
|
|
544
553
|
print("-" * 40)
|
|
545
554
|
print(ticket.get("description", "No description"))
|
|
546
555
|
|
|
@@ -548,7 +557,7 @@ def view_ticket_legacy(args):
|
|
|
548
557
|
print(f"Updated: {ticket['updated_at']}")
|
|
549
558
|
|
|
550
559
|
if args.verbose and ticket.get("metadata"):
|
|
551
|
-
print(
|
|
560
|
+
print("\nMetadata:")
|
|
552
561
|
print("-" * 40)
|
|
553
562
|
for key, value in ticket["metadata"].items():
|
|
554
563
|
if key not in [
|
|
@@ -587,7 +596,7 @@ def update_ticket_legacy(args):
|
|
|
587
596
|
ticket_manager = TicketManager()
|
|
588
597
|
|
|
589
598
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
590
|
-
ticket_id = getattr(args,
|
|
599
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
591
600
|
if not ticket_id:
|
|
592
601
|
print("❌ No ticket ID provided")
|
|
593
602
|
return 1
|
|
@@ -620,36 +629,35 @@ def update_ticket_legacy(args):
|
|
|
620
629
|
if success:
|
|
621
630
|
print(f"✅ Updated ticket: {ticket_id}")
|
|
622
631
|
return 0
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
cmd.extend(["--comment", comment])
|
|
632
|
+
# Fallback to aitrackdown CLI for status transitions
|
|
633
|
+
if args.status:
|
|
634
|
+
logger.info("Attempting update via aitrackdown CLI")
|
|
635
|
+
cmd = ["aitrackdown", "transition", ticket_id, args.status]
|
|
636
|
+
|
|
637
|
+
# Add comment with other updates
|
|
638
|
+
comment_parts = []
|
|
639
|
+
if args.priority:
|
|
640
|
+
comment_parts.append(f"Priority: {args.priority}")
|
|
641
|
+
if args.assign:
|
|
642
|
+
comment_parts.append(f"Assigned to: {args.assign}")
|
|
643
|
+
if args.tags:
|
|
644
|
+
comment_parts.append(f"Tags: {args.tags}")
|
|
645
|
+
|
|
646
|
+
if comment_parts:
|
|
647
|
+
comment = " | ".join(comment_parts)
|
|
648
|
+
cmd.extend(["--comment", comment])
|
|
641
649
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
print(f"❌ Failed to update ticket: {ticket_id}")
|
|
649
|
-
return 1
|
|
650
|
-
else:
|
|
650
|
+
try:
|
|
651
|
+
subprocess.run(cmd, check=True, capture_output=True, text=True)
|
|
652
|
+
print(f"✅ Updated ticket: {ticket_id}")
|
|
653
|
+
return 0
|
|
654
|
+
except subprocess.CalledProcessError as e:
|
|
655
|
+
logger.error(f"Failed to update via CLI: {e}")
|
|
651
656
|
print(f"❌ Failed to update ticket: {ticket_id}")
|
|
652
657
|
return 1
|
|
658
|
+
else:
|
|
659
|
+
print(f"❌ Failed to update ticket: {ticket_id}")
|
|
660
|
+
return 1
|
|
653
661
|
|
|
654
662
|
|
|
655
663
|
def close_ticket_legacy(args):
|
|
@@ -674,7 +682,7 @@ def close_ticket_legacy(args):
|
|
|
674
682
|
ticket_manager = TicketManager()
|
|
675
683
|
|
|
676
684
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
677
|
-
ticket_id = getattr(args,
|
|
685
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
678
686
|
if not ticket_id:
|
|
679
687
|
print("❌ No ticket ID provided")
|
|
680
688
|
return 1
|
|
@@ -686,21 +694,20 @@ def close_ticket_legacy(args):
|
|
|
686
694
|
if success:
|
|
687
695
|
print(f"✅ Closed ticket: {ticket_id}")
|
|
688
696
|
return 0
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
cmd = ["aitrackdown", "close", ticket_id]
|
|
697
|
+
# Fallback to aitrackdown CLI
|
|
698
|
+
logger.info("Attempting close via aitrackdown CLI")
|
|
699
|
+
cmd = ["aitrackdown", "close", ticket_id]
|
|
693
700
|
|
|
694
|
-
|
|
695
|
-
|
|
701
|
+
if resolution:
|
|
702
|
+
cmd.extend(["--comment", resolution])
|
|
696
703
|
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
+
try:
|
|
705
|
+
subprocess.run(cmd, check=True, capture_output=True, text=True)
|
|
706
|
+
print(f"✅ Closed ticket: {ticket_id}")
|
|
707
|
+
return 0
|
|
708
|
+
except subprocess.CalledProcessError:
|
|
709
|
+
print(f"❌ Failed to close ticket: {ticket_id}")
|
|
710
|
+
return 1
|
|
704
711
|
|
|
705
712
|
|
|
706
713
|
def delete_ticket_legacy(args):
|
|
@@ -719,10 +726,10 @@ def delete_ticket_legacy(args):
|
|
|
719
726
|
Returns:
|
|
720
727
|
Exit code (0 for success, non-zero for errors)
|
|
721
728
|
"""
|
|
722
|
-
|
|
729
|
+
get_logger("cli.tickets")
|
|
723
730
|
|
|
724
731
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
725
|
-
ticket_id = getattr(args,
|
|
732
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
726
733
|
if not ticket_id:
|
|
727
734
|
print("❌ No ticket ID provided")
|
|
728
735
|
return 1
|
|
@@ -749,7 +756,9 @@ def delete_ticket_legacy(args):
|
|
|
749
756
|
# In TTY environment, use normal input()
|
|
750
757
|
try:
|
|
751
758
|
response = (
|
|
752
|
-
input(
|
|
759
|
+
input(
|
|
760
|
+
f"Are you sure you want to delete ticket {ticket_id}? (y/N): "
|
|
761
|
+
)
|
|
753
762
|
.strip()
|
|
754
763
|
.lower()
|
|
755
764
|
)
|
|
@@ -789,7 +798,7 @@ def search_tickets_legacy(args):
|
|
|
789
798
|
Returns:
|
|
790
799
|
Exit code (0 for success, non-zero for errors)
|
|
791
800
|
"""
|
|
792
|
-
|
|
801
|
+
get_logger("cli.tickets")
|
|
793
802
|
|
|
794
803
|
try:
|
|
795
804
|
from ...services.ticket_manager import TicketManager
|
|
@@ -819,9 +828,8 @@ def search_tickets_legacy(args):
|
|
|
819
828
|
continue
|
|
820
829
|
|
|
821
830
|
# Apply status filter
|
|
822
|
-
if args.status != "all":
|
|
823
|
-
|
|
824
|
-
continue
|
|
831
|
+
if args.status != "all" and ticket.get("status") != args.status:
|
|
832
|
+
continue
|
|
825
833
|
|
|
826
834
|
matched_tickets.append(ticket)
|
|
827
835
|
if len(matched_tickets) >= args.limit:
|
|
@@ -878,10 +886,10 @@ def add_comment_legacy(args):
|
|
|
878
886
|
Returns:
|
|
879
887
|
Exit code (0 for success, non-zero for errors)
|
|
880
888
|
"""
|
|
881
|
-
|
|
889
|
+
get_logger("cli.tickets")
|
|
882
890
|
|
|
883
891
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
884
|
-
ticket_id = getattr(args,
|
|
892
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
885
893
|
if not ticket_id:
|
|
886
894
|
print("❌ No ticket ID provided")
|
|
887
895
|
return 1
|
|
@@ -917,23 +925,15 @@ def update_workflow_legacy(args):
|
|
|
917
925
|
Returns:
|
|
918
926
|
Exit code (0 for success, non-zero for errors)
|
|
919
927
|
"""
|
|
920
|
-
|
|
928
|
+
get_logger("cli.tickets")
|
|
921
929
|
|
|
922
930
|
# Handle both 'id' and 'ticket_id' attributes for compatibility
|
|
923
|
-
ticket_id = getattr(args,
|
|
931
|
+
ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
|
|
924
932
|
if not ticket_id:
|
|
925
933
|
print("❌ No ticket ID provided")
|
|
926
934
|
return 1
|
|
927
935
|
|
|
928
936
|
# Map workflow states to status if needed
|
|
929
|
-
state_mapping = {
|
|
930
|
-
"todo": "open",
|
|
931
|
-
"in_progress": "in_progress",
|
|
932
|
-
"ready": "ready",
|
|
933
|
-
"tested": "tested",
|
|
934
|
-
"done": "done",
|
|
935
|
-
"blocked": "blocked",
|
|
936
|
-
}
|
|
937
937
|
|
|
938
938
|
# Use aitrackdown transition command
|
|
939
939
|
cmd = ["aitrackdown", "transition", ticket_id, args.state]
|
claude_mpm/cli/parser.py
CHANGED
|
@@ -19,15 +19,11 @@ REFACTORING NOTE: The original 961-line create_parser function has been split in
|
|
|
19
19
|
- parsers/mcp_parser.py: MCP Gateway commands
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
import argparse
|
|
23
|
-
from pathlib import Path
|
|
24
|
-
from typing import List, Optional
|
|
25
|
-
|
|
26
22
|
# Import from the new modular structure
|
|
27
23
|
from .parsers import add_common_arguments, create_parser, preprocess_args
|
|
28
24
|
|
|
29
25
|
# Re-export for backward compatibility
|
|
30
|
-
__all__ = ["
|
|
26
|
+
__all__ = ["add_common_arguments", "create_parser", "preprocess_args"]
|
|
31
27
|
|
|
32
28
|
# Legacy functions removed - all functionality moved to parsers/ modules
|
|
33
29
|
# The original parser.py file contained a massive 961-line create_parser function
|
|
@@ -22,8 +22,8 @@ from .base_parser import add_common_arguments, create_parser, preprocess_args
|
|
|
22
22
|
from .run_parser import add_run_arguments
|
|
23
23
|
|
|
24
24
|
__all__ = [
|
|
25
|
-
"create_parser",
|
|
26
25
|
"add_common_arguments",
|
|
27
26
|
"add_run_arguments",
|
|
27
|
+
"create_parser",
|
|
28
28
|
"preprocess_args",
|
|
29
29
|
]
|