claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +432 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +11 -7
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +22 -41
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +9 -9
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +3 -5
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +9 -9
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +5 -3
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,8 @@ import os
|
|
|
9
9
|
import re
|
|
10
10
|
import subprocess
|
|
11
11
|
import sys
|
|
12
|
-
from datetime import datetime
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
13
14
|
from typing import Optional
|
|
14
15
|
|
|
15
16
|
# Import tool analysis with fallback for direct execution
|
|
@@ -77,7 +78,7 @@ class EventHandlers:
|
|
|
77
78
|
"session_id": event.get("session_id", ""),
|
|
78
79
|
"working_directory": working_dir,
|
|
79
80
|
"git_branch": git_branch,
|
|
80
|
-
"timestamp": datetime.now().isoformat(),
|
|
81
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
81
82
|
"is_command": prompt.startswith("/"),
|
|
82
83
|
"contains_code": "```" in prompt
|
|
83
84
|
or "python" in prompt.lower()
|
|
@@ -101,7 +102,7 @@ class EventHandlers:
|
|
|
101
102
|
if session_id:
|
|
102
103
|
self.hook_handler.pending_prompts[session_id] = {
|
|
103
104
|
"prompt": prompt,
|
|
104
|
-
"timestamp": datetime.now().isoformat(),
|
|
105
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
105
106
|
"working_directory": working_dir,
|
|
106
107
|
}
|
|
107
108
|
if DEBUG:
|
|
@@ -150,7 +151,7 @@ class EventHandlers:
|
|
|
150
151
|
"session_id": event.get("session_id", ""),
|
|
151
152
|
"working_directory": working_dir,
|
|
152
153
|
"git_branch": git_branch,
|
|
153
|
-
"timestamp": datetime.now().isoformat(),
|
|
154
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
154
155
|
"parameter_count": len(tool_input) if isinstance(tool_input, dict) else 0,
|
|
155
156
|
"is_file_operation": tool_name
|
|
156
157
|
in ["Write", "Edit", "MultiEdit", "Read", "LS", "Glob"],
|
|
@@ -249,7 +250,7 @@ class EventHandlers:
|
|
|
249
250
|
"session_id": session_id,
|
|
250
251
|
"prompt": tool_input.get("prompt", ""),
|
|
251
252
|
"description": tool_input.get("description", ""),
|
|
252
|
-
"timestamp": datetime.now().isoformat(),
|
|
253
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
253
254
|
"hook_event_name": "SubagentStart", # For dashboard compatibility
|
|
254
255
|
}
|
|
255
256
|
self.hook_handler._emit_socketio_event(
|
|
@@ -277,18 +278,18 @@ class EventHandlers:
|
|
|
277
278
|
"session_id": session_id,
|
|
278
279
|
"delegation_context": {
|
|
279
280
|
"description": tool_input.get("description", ""),
|
|
280
|
-
"timestamp": datetime.now().isoformat(),
|
|
281
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
281
282
|
},
|
|
282
283
|
}
|
|
283
284
|
|
|
284
285
|
# Log the agent prompt asynchronously
|
|
285
286
|
try:
|
|
286
287
|
loop = asyncio.get_running_loop()
|
|
287
|
-
asyncio.create_task(
|
|
288
|
+
_task = asyncio.create_task(
|
|
288
289
|
log_manager.log_prompt(
|
|
289
290
|
f"agent_{agent_type}", prompt_content, metadata
|
|
290
291
|
)
|
|
291
|
-
)
|
|
292
|
+
) # Fire-and-forget logging (ephemeral hook process)
|
|
292
293
|
except RuntimeError:
|
|
293
294
|
# No running loop, create one
|
|
294
295
|
loop = asyncio.new_event_loop()
|
|
@@ -309,23 +310,25 @@ class EventHandlers:
|
|
|
309
310
|
"""Get git branch for the given directory with caching."""
|
|
310
311
|
# Use current working directory if not specified
|
|
311
312
|
if not working_dir:
|
|
312
|
-
working_dir =
|
|
313
|
+
working_dir = Path.cwd()
|
|
313
314
|
|
|
314
|
-
# Check cache first (cache for
|
|
315
|
-
|
|
315
|
+
# Check cache first (cache for 300 seconds = 5 minutes)
|
|
316
|
+
# WHY 5 minutes: Git branches rarely change during development sessions,
|
|
317
|
+
# reducing subprocess overhead significantly without staleness issues
|
|
318
|
+
current_time = datetime.now(timezone.utc).timestamp()
|
|
316
319
|
cache_key = working_dir
|
|
317
320
|
|
|
318
321
|
if (
|
|
319
322
|
cache_key in self.hook_handler._git_branch_cache
|
|
320
323
|
and cache_key in self.hook_handler._git_branch_cache_time
|
|
321
|
-
and current_time - self.hook_handler._git_branch_cache_time[cache_key] <
|
|
324
|
+
and current_time - self.hook_handler._git_branch_cache_time[cache_key] < 300
|
|
322
325
|
):
|
|
323
326
|
return self.hook_handler._git_branch_cache[cache_key]
|
|
324
327
|
|
|
325
328
|
# Try to get git branch
|
|
326
329
|
try:
|
|
327
330
|
# Change to the working directory temporarily
|
|
328
|
-
original_cwd =
|
|
331
|
+
original_cwd = Path.cwd()
|
|
329
332
|
os.chdir(working_dir)
|
|
330
333
|
|
|
331
334
|
# Run git command to get current branch
|
|
@@ -390,14 +393,16 @@ class EventHandlers:
|
|
|
390
393
|
"status": (
|
|
391
394
|
"success"
|
|
392
395
|
if exit_code == 0
|
|
393
|
-
else "blocked"
|
|
396
|
+
else "blocked"
|
|
397
|
+
if exit_code == 2
|
|
398
|
+
else "error"
|
|
394
399
|
),
|
|
395
400
|
"duration_ms": duration,
|
|
396
401
|
"result_summary": result_data,
|
|
397
402
|
"session_id": event.get("session_id", ""),
|
|
398
403
|
"working_directory": working_dir,
|
|
399
404
|
"git_branch": git_branch,
|
|
400
|
-
"timestamp": datetime.now().isoformat(),
|
|
405
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
401
406
|
"has_output": bool(result_data.get("output")),
|
|
402
407
|
"has_error": bool(result_data.get("error")),
|
|
403
408
|
"output_size": (
|
|
@@ -448,7 +453,7 @@ class EventHandlers:
|
|
|
448
453
|
"session_id": event.get("session_id", ""),
|
|
449
454
|
"working_directory": working_dir,
|
|
450
455
|
"git_branch": git_branch,
|
|
451
|
-
"timestamp": datetime.now().isoformat(),
|
|
456
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
452
457
|
"is_user_input_request": "input" in message.lower()
|
|
453
458
|
or "waiting" in message.lower(),
|
|
454
459
|
"is_error_notification": "error" in message.lower()
|
|
@@ -492,7 +497,7 @@ class EventHandlers:
|
|
|
492
497
|
"""Extract metadata from stop event."""
|
|
493
498
|
working_dir = event.get("cwd", "")
|
|
494
499
|
return {
|
|
495
|
-
"timestamp": datetime.now().isoformat(),
|
|
500
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
496
501
|
"working_directory": working_dir,
|
|
497
502
|
"git_branch": (
|
|
498
503
|
self._get_git_branch(working_dir) if working_dir else "Unknown"
|
|
@@ -639,7 +644,7 @@ class EventHandlers:
|
|
|
639
644
|
"has_error": reason in ["error", "timeout", "failed", "blocked"],
|
|
640
645
|
"working_directory": working_dir,
|
|
641
646
|
"git_branch": git_branch,
|
|
642
|
-
"timestamp": datetime.now().isoformat(),
|
|
647
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
643
648
|
"event_type": "subagent_stop",
|
|
644
649
|
"reason": reason,
|
|
645
650
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
@@ -715,7 +720,7 @@ class EventHandlers:
|
|
|
715
720
|
"session_id": session_id,
|
|
716
721
|
"working_directory": working_dir,
|
|
717
722
|
"git_branch": git_branch,
|
|
718
|
-
"timestamp": datetime.now().isoformat(),
|
|
723
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
719
724
|
"contains_code": "```" in response_text,
|
|
720
725
|
"contains_json": "```json" in response_text,
|
|
721
726
|
"hook_event_name": "AssistantResponse", # Explicitly set for dashboard
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
This handler uses a service-oriented architecture with:
|
|
5
5
|
- StateManagerService: Manages state and delegation tracking
|
|
6
|
-
- ConnectionManagerService: Handles SocketIO
|
|
6
|
+
- ConnectionManagerService: Handles SocketIO connections with HTTP fallback
|
|
7
7
|
- SubagentResponseProcessor: Processes complex subagent responses
|
|
8
8
|
- DuplicateEventDetector: Detects and filters duplicate events
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ import signal
|
|
|
25
25
|
import subprocess
|
|
26
26
|
import sys
|
|
27
27
|
import threading
|
|
28
|
-
from datetime import datetime
|
|
28
|
+
from datetime import datetime, timezone
|
|
29
29
|
from typing import Optional, Tuple
|
|
30
30
|
|
|
31
31
|
# Import extracted modules with fallback for direct execution
|
|
@@ -73,19 +73,10 @@ DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
|
73
73
|
Conditional imports with graceful fallbacks for testing and modularity.
|
|
74
74
|
|
|
75
75
|
WHY conditional imports:
|
|
76
|
-
- EventBus is optional for basic hook functionality
|
|
77
76
|
- Tests may not have full environment setup
|
|
78
77
|
- Allows hooks to work in minimal configurations
|
|
79
78
|
- Graceful degradation when dependencies unavailable
|
|
80
79
|
"""
|
|
81
|
-
# Import EventBus availability flag for backward compatibility with tests
|
|
82
|
-
try:
|
|
83
|
-
from claude_mpm.services.event_bus import EventBus
|
|
84
|
-
|
|
85
|
-
EVENTBUS_AVAILABLE = True
|
|
86
|
-
except ImportError:
|
|
87
|
-
EVENTBUS_AVAILABLE = False
|
|
88
|
-
EventBus = None
|
|
89
80
|
|
|
90
81
|
# Import get_connection_pool for backward compatibility with tests
|
|
91
82
|
try:
|
|
@@ -241,7 +232,6 @@ class ClaudeHookHandler:
|
|
|
241
232
|
|
|
242
233
|
# Backward compatibility properties for tests
|
|
243
234
|
self.connection_pool = self.connection_manager.connection_pool
|
|
244
|
-
self.event_bus = self.connection_manager.event_bus
|
|
245
235
|
|
|
246
236
|
# Expose state manager properties for backward compatibility
|
|
247
237
|
self.active_delegations = self.state_manager.active_delegations
|
|
@@ -294,7 +284,7 @@ class ClaudeHookHandler:
|
|
|
294
284
|
if self.duplicate_detector.is_duplicate(event):
|
|
295
285
|
if DEBUG:
|
|
296
286
|
print(
|
|
297
|
-
f"[{datetime.now().isoformat()}] Skipping duplicate event: {event.get('hook_event_name', 'unknown')} (PID: {os.getpid()})",
|
|
287
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Skipping duplicate event: {event.get('hook_event_name', 'unknown')} (PID: {os.getpid()})",
|
|
298
288
|
file=sys.stderr,
|
|
299
289
|
)
|
|
300
290
|
# Still need to output continue for this invocation
|
|
@@ -307,7 +297,7 @@ class ClaudeHookHandler:
|
|
|
307
297
|
if DEBUG:
|
|
308
298
|
hook_type = event.get("hook_event_name", "unknown")
|
|
309
299
|
print(
|
|
310
|
-
f"\n[{datetime.now().isoformat()}] Processing hook event: {hook_type} (PID: {os.getpid()})",
|
|
300
|
+
f"\n[{datetime.now(timezone.utc).isoformat()}] Processing hook event: {hook_type} (PID: {os.getpid()})",
|
|
311
301
|
file=sys.stderr,
|
|
312
302
|
)
|
|
313
303
|
|
|
@@ -321,11 +311,12 @@ class ClaudeHookHandler:
|
|
|
321
311
|
)
|
|
322
312
|
|
|
323
313
|
# Route event to appropriate handler
|
|
324
|
-
|
|
314
|
+
# Handlers can optionally return modified input for PreToolUse events
|
|
315
|
+
modified_input = self._route_event(event)
|
|
325
316
|
|
|
326
317
|
# Always continue execution (only if not already sent)
|
|
327
318
|
if not _continue_sent:
|
|
328
|
-
self._continue_execution()
|
|
319
|
+
self._continue_execution(modified_input)
|
|
329
320
|
_continue_sent = True
|
|
330
321
|
|
|
331
322
|
except Exception:
|
|
@@ -386,7 +377,7 @@ class ClaudeHookHandler:
|
|
|
386
377
|
print(f"Error reading hook event: {e}", file=sys.stderr)
|
|
387
378
|
return None
|
|
388
379
|
|
|
389
|
-
def _route_event(self, event: dict) ->
|
|
380
|
+
def _route_event(self, event: dict) -> Optional[dict]:
|
|
390
381
|
"""
|
|
391
382
|
Route event to appropriate handler based on type.
|
|
392
383
|
|
|
@@ -395,6 +386,9 @@ class ClaudeHookHandler:
|
|
|
395
386
|
|
|
396
387
|
Args:
|
|
397
388
|
event: Hook event dictionary
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Modified input for PreToolUse events (v2.0.30+), None otherwise
|
|
398
392
|
"""
|
|
399
393
|
# Try multiple field names for compatibility
|
|
400
394
|
hook_type = (
|
|
@@ -426,23 +420,36 @@ class ClaudeHookHandler:
|
|
|
426
420
|
handler = event_handlers.get(hook_type)
|
|
427
421
|
if handler:
|
|
428
422
|
try:
|
|
429
|
-
|
|
423
|
+
# Handlers can optionally return modified input
|
|
424
|
+
result = handler(event)
|
|
425
|
+
# Only PreToolUse handlers should return modified input
|
|
426
|
+
if hook_type == "PreToolUse" and result is not None:
|
|
427
|
+
return result
|
|
430
428
|
except Exception as e:
|
|
431
429
|
if DEBUG:
|
|
432
430
|
print(f"Error handling {hook_type}: {e}", file=sys.stderr)
|
|
433
431
|
|
|
432
|
+
return None
|
|
433
|
+
|
|
434
434
|
def handle_subagent_stop(self, event: dict):
|
|
435
435
|
"""Delegate subagent stop processing to the specialized processor."""
|
|
436
436
|
self.subagent_processor.process_subagent_stop(event)
|
|
437
437
|
|
|
438
|
-
def _continue_execution(self) -> None:
|
|
438
|
+
def _continue_execution(self, modified_input: Optional[dict] = None) -> None:
|
|
439
439
|
"""
|
|
440
|
-
Send continue action to Claude.
|
|
440
|
+
Send continue action to Claude with optional input modification.
|
|
441
441
|
|
|
442
442
|
WHY: Centralized response ensures consistent format
|
|
443
443
|
and makes it easier to add response modifications.
|
|
444
|
+
|
|
445
|
+
Args:
|
|
446
|
+
modified_input: Modified tool parameters for PreToolUse hooks (v2.0.30+)
|
|
444
447
|
"""
|
|
445
|
-
|
|
448
|
+
if modified_input is not None:
|
|
449
|
+
# Claude Code v2.0.30+ supports modifying PreToolUse tool inputs
|
|
450
|
+
print(json.dumps({"action": "continue", "tool_input": modified_input}))
|
|
451
|
+
else:
|
|
452
|
+
print(json.dumps({"action": "continue"}))
|
|
446
453
|
|
|
447
454
|
# Delegation methods for compatibility with event_handlers
|
|
448
455
|
def _track_delegation(self, session_id: str, agent_type: str, request_data=None):
|
|
@@ -471,7 +478,7 @@ class ClaudeHookHandler:
|
|
|
471
478
|
if hasattr(self, "connection_manager") and self.connection_manager:
|
|
472
479
|
try:
|
|
473
480
|
self.connection_manager.cleanup()
|
|
474
|
-
except:
|
|
481
|
+
except Exception:
|
|
475
482
|
pass # Ignore cleanup errors during destruction
|
|
476
483
|
|
|
477
484
|
|
|
@@ -37,7 +37,7 @@ find_claude_mpm() {
|
|
|
37
37
|
cmd_path=$(readlink -f "$cmd_path")
|
|
38
38
|
fi
|
|
39
39
|
# Extract the base directory (usually site-packages or venv)
|
|
40
|
-
local base_dir=$(python3 -c "import claude_mpm; import os; print(
|
|
40
|
+
local base_dir=$(python3 -c "import claude_mpm; import os; print(Path(os.path.dirname(claude_mpm.__file__).parent))" 2>/dev/null)
|
|
41
41
|
if [ -n "$base_dir" ]; then
|
|
42
42
|
echo "$base_dir"
|
|
43
43
|
return 0
|
|
@@ -71,7 +71,7 @@ try:
|
|
|
71
71
|
import claude_mpm
|
|
72
72
|
import os
|
|
73
73
|
# Get the package directory
|
|
74
|
-
pkg_dir =
|
|
74
|
+
pkg_dir = Path(claude_mpm.__file__).parent
|
|
75
75
|
# Check if we're in a development install (src directory)
|
|
76
76
|
if 'src' in pkg_dir:
|
|
77
77
|
# Go up to find the project root
|
|
@@ -81,11 +81,11 @@ try:
|
|
|
81
81
|
project_root = os.sep.join(parts[:src_idx])
|
|
82
82
|
print(project_root)
|
|
83
83
|
else:
|
|
84
|
-
print(
|
|
84
|
+
print(Path(os.path.dirname(pkg_dir).parent))
|
|
85
85
|
else:
|
|
86
86
|
# Installed package - just return the package location
|
|
87
|
-
print(
|
|
88
|
-
except:
|
|
87
|
+
print(Path(pkg_dir).parent)
|
|
88
|
+
except Exception:
|
|
89
89
|
pass
|
|
90
90
|
" 2>/dev/null)
|
|
91
91
|
|
|
@@ -99,7 +99,7 @@ except:
|
|
|
99
99
|
for path_dir in $PATH; do
|
|
100
100
|
if [ -f "$path_dir/claude-mpm" ]; then
|
|
101
101
|
# Found claude-mpm executable, try to find its package
|
|
102
|
-
local pkg_dir=$(cd "$path_dir" && python3 -c "import claude_mpm; import os; print(
|
|
102
|
+
local pkg_dir=$(cd "$path_dir" && python3 -c "import claude_mpm; import os; print(Path(os.path.dirname(claude_mpm.__file__).parent))" 2>/dev/null)
|
|
103
103
|
if [ -n "$pkg_dir" ]; then
|
|
104
104
|
echo "$pkg_dir"
|
|
105
105
|
return 0
|
|
@@ -192,6 +192,8 @@ main "$@"
|
|
|
192
192
|
|
|
193
193
|
# Minimum Claude Code version required for hook monitoring
|
|
194
194
|
MIN_CLAUDE_VERSION = "1.0.92"
|
|
195
|
+
# Minimum version for PreToolUse input modification support
|
|
196
|
+
MIN_PRETOOL_MODIFY_VERSION = "2.0.30"
|
|
195
197
|
|
|
196
198
|
def __init__(self):
|
|
197
199
|
"""Initialize the hook installer."""
|
|
@@ -292,6 +294,42 @@ main "$@"
|
|
|
292
294
|
|
|
293
295
|
return (True, f"Claude Code {version} is compatible with hook monitoring.")
|
|
294
296
|
|
|
297
|
+
def supports_pretool_modify(self) -> bool:
|
|
298
|
+
"""
|
|
299
|
+
Check if the installed Claude Code version supports PreToolUse input modification.
|
|
300
|
+
|
|
301
|
+
PreToolUse input modification was added in Claude Code v2.0.30.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
True if version supports input modification, False otherwise
|
|
305
|
+
"""
|
|
306
|
+
version = self.get_claude_version()
|
|
307
|
+
|
|
308
|
+
if version is None:
|
|
309
|
+
return False
|
|
310
|
+
|
|
311
|
+
def parse_version(v: str) -> List[int]:
|
|
312
|
+
"""Parse semantic version string to list of integers."""
|
|
313
|
+
try:
|
|
314
|
+
return [int(x) for x in v.split(".")]
|
|
315
|
+
except (ValueError, AttributeError):
|
|
316
|
+
return [0]
|
|
317
|
+
|
|
318
|
+
current = parse_version(version)
|
|
319
|
+
required = parse_version(self.MIN_PRETOOL_MODIFY_VERSION)
|
|
320
|
+
|
|
321
|
+
# Compare versions
|
|
322
|
+
for i in range(max(len(current), len(required))):
|
|
323
|
+
curr_part = current[i] if i < len(current) else 0
|
|
324
|
+
req_part = required[i] if i < len(required) else 0
|
|
325
|
+
|
|
326
|
+
if curr_part < req_part:
|
|
327
|
+
return False
|
|
328
|
+
if curr_part > req_part:
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
return True
|
|
332
|
+
|
|
295
333
|
def get_hook_script_path(self) -> Path:
|
|
296
334
|
"""Get the path to the hook handler script based on installation method.
|
|
297
335
|
|
|
@@ -339,8 +377,8 @@ main "$@"
|
|
|
339
377
|
|
|
340
378
|
# Make sure it's executable
|
|
341
379
|
if script_path.exists():
|
|
342
|
-
st =
|
|
343
|
-
|
|
380
|
+
st = Path(script_path).stat()
|
|
381
|
+
Path(script_path).chmod(st.st_mode | stat.S_IEXEC)
|
|
344
382
|
self._hook_script_path = script_path
|
|
345
383
|
return script_path
|
|
346
384
|
|
|
@@ -428,7 +466,7 @@ main "$@"
|
|
|
428
466
|
return
|
|
429
467
|
|
|
430
468
|
try:
|
|
431
|
-
with
|
|
469
|
+
with self.old_settings_file.open() as f:
|
|
432
470
|
old_settings = json.load(f)
|
|
433
471
|
|
|
434
472
|
# Remove hooks section if present
|
|
@@ -437,7 +475,7 @@ main "$@"
|
|
|
437
475
|
self.logger.info(f"Removing hooks from {self.old_settings_file}")
|
|
438
476
|
|
|
439
477
|
# Write back the cleaned settings
|
|
440
|
-
with
|
|
478
|
+
with self.old_settings_file.open("w") as f:
|
|
441
479
|
json.dump(old_settings, f, indent=2)
|
|
442
480
|
|
|
443
481
|
self.logger.info(f"Cleaned up hooks from {self.old_settings_file}")
|
|
@@ -450,7 +488,7 @@ main "$@"
|
|
|
450
488
|
|
|
451
489
|
# Load existing settings.json or create new
|
|
452
490
|
if self.settings_file.exists():
|
|
453
|
-
with
|
|
491
|
+
with self.settings_file.open() as f:
|
|
454
492
|
settings = json.load(f)
|
|
455
493
|
self.logger.info(f"Found existing Claude settings at {self.settings_file}")
|
|
456
494
|
else:
|
|
@@ -490,7 +528,7 @@ main "$@"
|
|
|
490
528
|
]
|
|
491
529
|
|
|
492
530
|
# Write settings to settings.json
|
|
493
|
-
with
|
|
531
|
+
with self.settings_file.open("w") as f:
|
|
494
532
|
json.dump(settings, f, indent=2)
|
|
495
533
|
|
|
496
534
|
self.logger.info(f"Updated Claude settings at {self.settings_file}")
|
|
@@ -564,7 +602,7 @@ main "$@"
|
|
|
564
602
|
issues.append(f"Claude settings file not found at {self.settings_file}")
|
|
565
603
|
else:
|
|
566
604
|
try:
|
|
567
|
-
with
|
|
605
|
+
with self.settings_file.open() as f:
|
|
568
606
|
settings = json.load(f)
|
|
569
607
|
|
|
570
608
|
if "hooks" not in settings:
|
|
@@ -588,9 +626,9 @@ main "$@"
|
|
|
588
626
|
issues.append(f"Invalid Claude settings JSON: {e}")
|
|
589
627
|
|
|
590
628
|
# Check if claude-mpm is accessible
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
629
|
+
import importlib.util
|
|
630
|
+
|
|
631
|
+
if importlib.util.find_spec("claude_mpm") is None:
|
|
594
632
|
issues.append("claude-mpm package not found in Python environment")
|
|
595
633
|
|
|
596
634
|
is_valid = len(issues) == 0
|
|
@@ -615,7 +653,7 @@ main "$@"
|
|
|
615
653
|
# Remove from Claude settings (both old and new locations)
|
|
616
654
|
for settings_path in [self.settings_file, self.old_settings_file]:
|
|
617
655
|
if settings_path.exists():
|
|
618
|
-
with open(
|
|
656
|
+
with settings_path.open() as f:
|
|
619
657
|
settings = json.load(f)
|
|
620
658
|
|
|
621
659
|
if "hooks" in settings:
|
|
@@ -655,7 +693,7 @@ main "$@"
|
|
|
655
693
|
del settings["hooks"]
|
|
656
694
|
|
|
657
695
|
# Write back settings
|
|
658
|
-
with open(
|
|
696
|
+
with settings_path.open("w") as f:
|
|
659
697
|
json.dump(settings, f, indent=2)
|
|
660
698
|
|
|
661
699
|
self.logger.info(f"Removed hooks from {settings_path}")
|
|
@@ -677,6 +715,7 @@ main "$@"
|
|
|
677
715
|
# Check version compatibility
|
|
678
716
|
claude_version = self.get_claude_version()
|
|
679
717
|
is_compatible, version_message = self.is_version_compatible()
|
|
718
|
+
pretool_modify_supported = self.supports_pretool_modify()
|
|
680
719
|
|
|
681
720
|
is_valid, issues = self.verify_hooks()
|
|
682
721
|
|
|
@@ -701,6 +740,12 @@ main "$@"
|
|
|
701
740
|
"version_compatible": is_compatible,
|
|
702
741
|
"version_message": version_message,
|
|
703
742
|
"deployment_type": "deployment-root", # New field to indicate new architecture
|
|
743
|
+
"pretool_modify_supported": pretool_modify_supported, # v2.0.30+ feature
|
|
744
|
+
"pretool_modify_message": (
|
|
745
|
+
f"PreToolUse input modification supported (v{claude_version})"
|
|
746
|
+
if pretool_modify_supported
|
|
747
|
+
else f"PreToolUse input modification requires Claude Code {self.MIN_PRETOOL_MODIFY_VERSION}+ (current: {claude_version or 'unknown'})"
|
|
748
|
+
),
|
|
704
749
|
}
|
|
705
750
|
|
|
706
751
|
# Check Claude settings for hook configuration
|
|
@@ -709,18 +754,18 @@ main "$@"
|
|
|
709
754
|
|
|
710
755
|
if self.settings_file.exists():
|
|
711
756
|
try:
|
|
712
|
-
with
|
|
757
|
+
with self.settings_file.open() as f:
|
|
713
758
|
settings = json.load(f)
|
|
714
759
|
if "hooks" in settings:
|
|
715
760
|
status["configured_events"] = list(settings["hooks"].keys())
|
|
716
761
|
configured_in_local = True
|
|
717
|
-
except:
|
|
762
|
+
except Exception:
|
|
718
763
|
pass
|
|
719
764
|
|
|
720
765
|
# Also check old settings file
|
|
721
766
|
if self.old_settings_file.exists():
|
|
722
767
|
try:
|
|
723
|
-
with
|
|
768
|
+
with self.old_settings_file.open() as f:
|
|
724
769
|
old_settings = json.load(f)
|
|
725
770
|
if "hooks" in old_settings:
|
|
726
771
|
status["old_file_has_hooks"] = True
|
|
@@ -728,7 +773,7 @@ main "$@"
|
|
|
728
773
|
status["warning"] = (
|
|
729
774
|
"Hooks found in settings.local.json but Claude Code reads from settings.json"
|
|
730
775
|
)
|
|
731
|
-
except:
|
|
776
|
+
except Exception:
|
|
732
777
|
pass
|
|
733
778
|
|
|
734
779
|
status["settings_location"] = (
|
|
@@ -7,7 +7,7 @@ including pre and post delegation hooks.
|
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
10
|
-
from datetime import datetime
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from typing import Optional
|
|
12
12
|
|
|
13
13
|
# Debug mode
|
|
@@ -122,7 +122,7 @@ class MemoryHookManager:
|
|
|
122
122
|
"session_id": session_id,
|
|
123
123
|
},
|
|
124
124
|
metadata={"source": "claude_hook_handler", "tool_name": "Task"},
|
|
125
|
-
timestamp=datetime.now().isoformat(),
|
|
125
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
126
126
|
session_id=session_id,
|
|
127
127
|
)
|
|
128
128
|
|
|
@@ -200,7 +200,7 @@ class MemoryHookManager:
|
|
|
200
200
|
"tool_name": "Task",
|
|
201
201
|
"duration_ms": event.get("duration_ms", 0),
|
|
202
202
|
},
|
|
203
|
-
timestamp=datetime.now().isoformat(),
|
|
203
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
204
204
|
session_id=session_id,
|
|
205
205
|
)
|
|
206
206
|
|