claude-mpm 4.1.1__py3-none-any.whl → 4.1.3__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/engineer.json +33 -11
- 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 +50 -2
- 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 +648 -1098
- 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 +339 -967
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +233 -542
- 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 +280 -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 +22 -29
- 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 +500 -680
- 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 -17
- 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 +99 -154
- claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
- 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/services/__init__.py +13 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- 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 +129 -511
- 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/base_agent_locator.py +132 -0
- 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_results_manager.py +185 -0
- 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/single_agent_deployer.py +315 -0
- 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 +157 -503
- 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/memory_categorization_service.py +165 -0
- claude_mpm/services/agents/memory/memory_file_service.py +103 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +11 -7
- 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/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +407 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +589 -0
- claude_mpm/services/cli/dashboard_launcher.py +424 -0
- claude_mpm/services/cli/memory_crud_service.py +617 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/session_manager.py +513 -0
- claude_mpm/services/cli/socketio_manager.py +498 -0
- claude_mpm/services/cli/startup_checker.py +370 -0
- 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/cache_manager.py +311 -0
- 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/core/memory_manager.py +637 -0
- claude_mpm/services/core/path_resolver.py +498 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- 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 +152 -97
- 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.1.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
- claude_mpm-4.1.3.dist-info/RECORD +528 -0
- claude_mpm/cli/commands/run_config_checker.py +0 -160
- claude_mpm-4.1.1.dist-info/RECORD +0 -494
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
|
@@ -5,13 +5,12 @@ This module provides individual event handlers for different types of
|
|
|
5
5
|
Claude Code hook events.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import json
|
|
9
8
|
import os
|
|
10
9
|
import re
|
|
11
10
|
import subprocess
|
|
12
11
|
import sys
|
|
13
12
|
from datetime import datetime
|
|
14
|
-
from typing import
|
|
13
|
+
from typing import Optional
|
|
15
14
|
|
|
16
15
|
# Import tool analysis with fallback for direct execution
|
|
17
16
|
try:
|
|
@@ -221,7 +220,7 @@ class EventHandlers:
|
|
|
221
220
|
self.hook_handler._track_delegation(session_id, agent_type, request_data)
|
|
222
221
|
|
|
223
222
|
if DEBUG:
|
|
224
|
-
print(
|
|
223
|
+
print(" - Delegation tracked successfully", file=sys.stderr)
|
|
225
224
|
print(
|
|
226
225
|
f" - Request data keys: {list(request_data.keys())}",
|
|
227
226
|
file=sys.stderr,
|
|
@@ -257,7 +256,56 @@ class EventHandlers:
|
|
|
257
256
|
"", "subagent_start", subagent_start_data
|
|
258
257
|
)
|
|
259
258
|
|
|
260
|
-
|
|
259
|
+
# Log agent prompt if LogManager is available
|
|
260
|
+
try:
|
|
261
|
+
from claude_mpm.core.log_manager import get_log_manager
|
|
262
|
+
|
|
263
|
+
log_manager = get_log_manager()
|
|
264
|
+
|
|
265
|
+
# Prepare prompt content
|
|
266
|
+
prompt_content = tool_input.get("prompt", "")
|
|
267
|
+
if not prompt_content:
|
|
268
|
+
prompt_content = tool_input.get("description", "")
|
|
269
|
+
|
|
270
|
+
if prompt_content:
|
|
271
|
+
import asyncio
|
|
272
|
+
|
|
273
|
+
# Prepare metadata
|
|
274
|
+
metadata = {
|
|
275
|
+
"agent_type": agent_type,
|
|
276
|
+
"agent_id": f"{agent_type}_{session_id}",
|
|
277
|
+
"session_id": session_id,
|
|
278
|
+
"delegation_context": {
|
|
279
|
+
"description": tool_input.get("description", ""),
|
|
280
|
+
"timestamp": datetime.now().isoformat(),
|
|
281
|
+
},
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
# Log the agent prompt asynchronously
|
|
285
|
+
try:
|
|
286
|
+
loop = asyncio.get_running_loop()
|
|
287
|
+
asyncio.create_task(
|
|
288
|
+
log_manager.log_prompt(
|
|
289
|
+
f"agent_{agent_type}", prompt_content, metadata
|
|
290
|
+
)
|
|
291
|
+
)
|
|
292
|
+
except RuntimeError:
|
|
293
|
+
# No running loop, create one
|
|
294
|
+
loop = asyncio.new_event_loop()
|
|
295
|
+
asyncio.set_event_loop(loop)
|
|
296
|
+
loop.run_until_complete(
|
|
297
|
+
log_manager.log_prompt(
|
|
298
|
+
f"agent_{agent_type}", prompt_content, metadata
|
|
299
|
+
)
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
if DEBUG:
|
|
303
|
+
print(f" - Agent prompt logged for {agent_type}", file=sys.stderr)
|
|
304
|
+
except Exception as e:
|
|
305
|
+
if DEBUG:
|
|
306
|
+
print(f" - Could not log agent prompt: {e}", file=sys.stderr)
|
|
307
|
+
|
|
308
|
+
def _get_git_branch(self, working_dir: Optional[str] = None) -> str:
|
|
261
309
|
"""Get git branch for the given directory with caching."""
|
|
262
310
|
# Use current working directory if not specified
|
|
263
311
|
if not working_dir:
|
|
@@ -285,7 +333,8 @@ class EventHandlers:
|
|
|
285
333
|
["git", "branch", "--show-current"],
|
|
286
334
|
capture_output=True,
|
|
287
335
|
text=True,
|
|
288
|
-
timeout=TimeoutConfig.QUICK_TIMEOUT,
|
|
336
|
+
timeout=TimeoutConfig.QUICK_TIMEOUT,
|
|
337
|
+
check=False, # Quick timeout to avoid hanging
|
|
289
338
|
)
|
|
290
339
|
|
|
291
340
|
# Restore original directory
|
|
@@ -297,11 +346,10 @@ class EventHandlers:
|
|
|
297
346
|
self.hook_handler._git_branch_cache[cache_key] = branch
|
|
298
347
|
self.hook_handler._git_branch_cache_time[cache_key] = current_time
|
|
299
348
|
return branch
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
return "Unknown"
|
|
349
|
+
# Not a git repository or no branch
|
|
350
|
+
self.hook_handler._git_branch_cache[cache_key] = "Unknown"
|
|
351
|
+
self.hook_handler._git_branch_cache_time[cache_key] = current_time
|
|
352
|
+
return "Unknown"
|
|
305
353
|
|
|
306
354
|
except (
|
|
307
355
|
subprocess.TimeoutExpired,
|
|
@@ -339,11 +387,11 @@ class EventHandlers:
|
|
|
339
387
|
"tool_name": tool_name,
|
|
340
388
|
"exit_code": exit_code,
|
|
341
389
|
"success": exit_code == 0,
|
|
342
|
-
"status":
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
390
|
+
"status": (
|
|
391
|
+
"success"
|
|
392
|
+
if exit_code == 0
|
|
393
|
+
else "blocked" if exit_code == 2 else "error"
|
|
394
|
+
),
|
|
347
395
|
"duration_ms": duration,
|
|
348
396
|
"result_summary": result_data,
|
|
349
397
|
"session_id": event.get("session_id", ""),
|
|
@@ -412,9 +460,7 @@ class EventHandlers:
|
|
|
412
460
|
}
|
|
413
461
|
|
|
414
462
|
# Emit normalized event
|
|
415
|
-
self.hook_handler._emit_socketio_event(
|
|
416
|
-
"", "notification", notification_data
|
|
417
|
-
)
|
|
463
|
+
self.hook_handler._emit_socketio_event("", "notification", notification_data)
|
|
418
464
|
|
|
419
465
|
def handle_stop_fast(self, event):
|
|
420
466
|
"""Handle stop events when Claude processing stops.
|
|
@@ -448,9 +494,9 @@ class EventHandlers:
|
|
|
448
494
|
return {
|
|
449
495
|
"timestamp": datetime.now().isoformat(),
|
|
450
496
|
"working_directory": working_dir,
|
|
451
|
-
"git_branch":
|
|
452
|
-
|
|
453
|
-
|
|
497
|
+
"git_branch": (
|
|
498
|
+
self._get_git_branch(working_dir) if working_dir else "Unknown"
|
|
499
|
+
),
|
|
454
500
|
"event_type": "stop",
|
|
455
501
|
"reason": event.get("reason", "unknown"),
|
|
456
502
|
"stop_type": event.get("stop_type", "normal"),
|
|
@@ -497,124 +543,13 @@ class EventHandlers:
|
|
|
497
543
|
self.hook_handler._emit_socketio_event("", "stop", stop_data)
|
|
498
544
|
|
|
499
545
|
def handle_subagent_stop_fast(self, event):
|
|
500
|
-
"""Handle subagent stop events
|
|
501
|
-
#
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
)
|
|
508
|
-
print(f" - event keys: {list(event.keys())}", file=sys.stderr)
|
|
509
|
-
print(
|
|
510
|
-
f" - delegation_requests size: {len(self.hook_handler.delegation_requests)}",
|
|
511
|
-
file=sys.stderr,
|
|
512
|
-
)
|
|
513
|
-
|
|
514
|
-
# First try to get agent type from our tracking
|
|
515
|
-
agent_type = (
|
|
516
|
-
self.hook_handler._get_delegation_agent_type(session_id)
|
|
517
|
-
if session_id
|
|
518
|
-
else "unknown"
|
|
519
|
-
)
|
|
520
|
-
|
|
521
|
-
# Fall back to event data if tracking didn't have it
|
|
522
|
-
if agent_type == "unknown":
|
|
523
|
-
agent_type = event.get("agent_type", event.get("subagent_type", "unknown"))
|
|
524
|
-
|
|
525
|
-
agent_id = event.get("agent_id", event.get("subagent_id", ""))
|
|
526
|
-
reason = event.get("reason", event.get("stop_reason", "unknown"))
|
|
527
|
-
|
|
528
|
-
# Try to infer agent type from other fields if still unknown
|
|
529
|
-
if agent_type == "unknown" and "task" in event:
|
|
530
|
-
task_desc = str(event.get("task", "")).lower()
|
|
531
|
-
if "research" in task_desc:
|
|
532
|
-
agent_type = "research"
|
|
533
|
-
elif "engineer" in task_desc or "code" in task_desc:
|
|
534
|
-
agent_type = "engineer"
|
|
535
|
-
elif "pm" in task_desc or "project" in task_desc:
|
|
536
|
-
agent_type = "pm"
|
|
537
|
-
|
|
538
|
-
# Always log SubagentStop events for debugging
|
|
539
|
-
if DEBUG or agent_type != "unknown":
|
|
540
|
-
print(
|
|
541
|
-
f"Hook handler: Processing SubagentStop - agent: '{agent_type}', session: '{session_id}', reason: '{reason}'",
|
|
542
|
-
file=sys.stderr,
|
|
543
|
-
)
|
|
544
|
-
|
|
545
|
-
# Get working directory and git branch
|
|
546
|
-
working_dir = event.get("cwd", "")
|
|
547
|
-
git_branch = self._get_git_branch(working_dir) if working_dir else "Unknown"
|
|
548
|
-
|
|
549
|
-
# Try to extract structured response from output if available
|
|
550
|
-
output = event.get("output", "")
|
|
551
|
-
structured_response = None
|
|
552
|
-
if output:
|
|
553
|
-
try:
|
|
554
|
-
json_match = re.search(
|
|
555
|
-
r"```json\s*(\{.*?\})\s*```", str(output), re.DOTALL
|
|
556
|
-
)
|
|
557
|
-
if json_match:
|
|
558
|
-
structured_response = json.loads(json_match.group(1))
|
|
559
|
-
if DEBUG:
|
|
560
|
-
print(
|
|
561
|
-
f"Extracted structured response from {agent_type} agent in SubagentStop",
|
|
562
|
-
file=sys.stderr,
|
|
563
|
-
)
|
|
564
|
-
except (json.JSONDecodeError, AttributeError):
|
|
565
|
-
pass # No structured response, that's okay
|
|
566
|
-
|
|
567
|
-
# Handle response tracking with fuzzy matching
|
|
568
|
-
self._handle_subagent_response_tracking(
|
|
569
|
-
session_id,
|
|
570
|
-
agent_type,
|
|
571
|
-
reason,
|
|
572
|
-
output,
|
|
573
|
-
structured_response,
|
|
574
|
-
working_dir,
|
|
575
|
-
git_branch,
|
|
576
|
-
)
|
|
577
|
-
|
|
578
|
-
# Prepare subagent stop data
|
|
579
|
-
subagent_stop_data = {
|
|
580
|
-
"agent_type": agent_type,
|
|
581
|
-
"agent_id": agent_id,
|
|
582
|
-
"reason": reason,
|
|
583
|
-
"session_id": session_id,
|
|
584
|
-
"working_directory": working_dir,
|
|
585
|
-
"git_branch": git_branch,
|
|
586
|
-
"timestamp": datetime.now().isoformat(),
|
|
587
|
-
"is_successful_completion": reason in ["completed", "finished", "done"],
|
|
588
|
-
"is_error_termination": reason in ["error", "timeout", "failed", "blocked"],
|
|
589
|
-
"is_delegation_related": agent_type
|
|
590
|
-
in ["research", "engineer", "pm", "ops", "qa", "documentation", "security"],
|
|
591
|
-
"has_results": bool(event.get("results") or event.get("output")),
|
|
592
|
-
"duration_context": event.get("duration_ms"),
|
|
593
|
-
"hook_event_name": "SubagentStop", # Explicitly set for dashboard
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
# Add structured response data if available
|
|
597
|
-
if structured_response:
|
|
598
|
-
subagent_stop_data["structured_response"] = {
|
|
599
|
-
"task_completed": structured_response.get("task_completed", False),
|
|
600
|
-
"instructions": structured_response.get("instructions", ""),
|
|
601
|
-
"results": structured_response.get("results", ""),
|
|
602
|
-
"files_modified": structured_response.get("files_modified", []),
|
|
603
|
-
"tools_used": structured_response.get("tools_used", []),
|
|
604
|
-
"remember": structured_response.get("remember"),
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
# Debug log the processed data
|
|
608
|
-
if DEBUG:
|
|
609
|
-
print(
|
|
610
|
-
f"SubagentStop processed data: agent_type='{agent_type}', session_id='{session_id}'",
|
|
611
|
-
file=sys.stderr,
|
|
612
|
-
)
|
|
613
|
-
|
|
614
|
-
# Emit normalized event with high priority
|
|
615
|
-
self.hook_handler._emit_socketio_event(
|
|
616
|
-
"", "subagent_stop", subagent_stop_data
|
|
617
|
-
)
|
|
546
|
+
"""Handle subagent stop events by delegating to the specialized processor."""
|
|
547
|
+
# Delegate to the specialized subagent processor
|
|
548
|
+
if hasattr(self.hook_handler, "subagent_processor"):
|
|
549
|
+
self.hook_handler.subagent_processor.process_subagent_stop(event)
|
|
550
|
+
else:
|
|
551
|
+
# Fallback to handle_subagent_stop if processor not available
|
|
552
|
+
self.hook_handler.handle_subagent_stop(event)
|
|
618
553
|
|
|
619
554
|
def _handle_subagent_response_tracking(
|
|
620
555
|
self,
|
|
@@ -665,9 +600,9 @@ class EventHandlers:
|
|
|
665
600
|
)
|
|
666
601
|
# Update the key to use the current session_id for consistency
|
|
667
602
|
if request_info:
|
|
668
|
-
self.hook_handler.delegation_requests[
|
|
669
|
-
|
|
670
|
-
|
|
603
|
+
self.hook_handler.delegation_requests[session_id] = (
|
|
604
|
+
request_info
|
|
605
|
+
)
|
|
671
606
|
# Optionally remove the old key to avoid duplicates
|
|
672
607
|
if stored_sid != session_id:
|
|
673
608
|
del self.hook_handler.delegation_requests[stored_sid]
|
|
@@ -750,7 +685,7 @@ class EventHandlers:
|
|
|
750
685
|
|
|
751
686
|
def handle_assistant_response(self, event):
|
|
752
687
|
"""Handle assistant response events for comprehensive response tracking.
|
|
753
|
-
|
|
688
|
+
|
|
754
689
|
WHY emit assistant response events:
|
|
755
690
|
- Provides visibility into Claude's responses to user prompts
|
|
756
691
|
- Captures response content and metadata for analysis
|
|
@@ -761,19 +696,21 @@ class EventHandlers:
|
|
|
761
696
|
self.hook_handler.response_tracking_manager.track_assistant_response(
|
|
762
697
|
event, self.hook_handler.pending_prompts
|
|
763
698
|
)
|
|
764
|
-
|
|
699
|
+
|
|
765
700
|
# Get working directory and git branch
|
|
766
701
|
working_dir = event.get("cwd", "")
|
|
767
702
|
git_branch = self._get_git_branch(working_dir) if working_dir else "Unknown"
|
|
768
|
-
|
|
703
|
+
|
|
769
704
|
# Extract response data
|
|
770
705
|
response_text = event.get("response", "")
|
|
771
706
|
session_id = event.get("session_id", "")
|
|
772
|
-
|
|
707
|
+
|
|
773
708
|
# Prepare assistant response data for Socket.IO emission
|
|
774
709
|
assistant_response_data = {
|
|
775
710
|
"response_text": response_text,
|
|
776
|
-
"response_preview":
|
|
711
|
+
"response_preview": (
|
|
712
|
+
response_text[:500] if len(response_text) > 500 else response_text
|
|
713
|
+
),
|
|
777
714
|
"response_length": len(response_text),
|
|
778
715
|
"session_id": session_id,
|
|
779
716
|
"working_directory": working_dir,
|
|
@@ -782,24 +719,32 @@ class EventHandlers:
|
|
|
782
719
|
"contains_code": "```" in response_text,
|
|
783
720
|
"contains_json": "```json" in response_text,
|
|
784
721
|
"hook_event_name": "AssistantResponse", # Explicitly set for dashboard
|
|
785
|
-
"has_structured_response": bool(
|
|
722
|
+
"has_structured_response": bool(
|
|
723
|
+
re.search(r"```json\s*\{.*?\}\s*```", response_text, re.DOTALL)
|
|
724
|
+
),
|
|
786
725
|
}
|
|
787
|
-
|
|
726
|
+
|
|
788
727
|
# Check if this is a response to a tracked prompt
|
|
789
728
|
if session_id in self.hook_handler.pending_prompts:
|
|
790
729
|
prompt_data = self.hook_handler.pending_prompts[session_id]
|
|
791
|
-
assistant_response_data["original_prompt"] = prompt_data.get("prompt", "")[
|
|
792
|
-
|
|
730
|
+
assistant_response_data["original_prompt"] = prompt_data.get("prompt", "")[
|
|
731
|
+
:200
|
|
732
|
+
]
|
|
733
|
+
assistant_response_data["prompt_timestamp"] = prompt_data.get(
|
|
734
|
+
"timestamp", ""
|
|
735
|
+
)
|
|
793
736
|
assistant_response_data["is_tracked_response"] = True
|
|
794
737
|
else:
|
|
795
738
|
assistant_response_data["is_tracked_response"] = False
|
|
796
|
-
|
|
739
|
+
|
|
797
740
|
# Debug logging
|
|
798
741
|
if DEBUG:
|
|
799
742
|
print(
|
|
800
743
|
f"Hook handler: Processing AssistantResponse - session: '{session_id}', response_length: {len(response_text)}",
|
|
801
744
|
file=sys.stderr,
|
|
802
745
|
)
|
|
803
|
-
|
|
746
|
+
|
|
804
747
|
# Emit normalized event
|
|
805
|
-
self.hook_handler._emit_socketio_event(
|
|
748
|
+
self.hook_handler._emit_socketio_event(
|
|
749
|
+
"", "assistant_response", assistant_response_data
|
|
750
|
+
)
|