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
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
"""Hook Installer Service for Claude MPM.
|
|
2
|
+
|
|
3
|
+
This service manages the automatic installation and removal of Claude Code hooks
|
|
4
|
+
to enable monitor event forwarding via Socket.IO.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import shutil
|
|
9
|
+
import stat
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Dict, Optional, Tuple
|
|
13
|
+
|
|
14
|
+
from ..core.logging_config import get_logger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class HookInstallerService:
|
|
18
|
+
"""Service for managing Claude Code hook installation and removal."""
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
"""Initialize the hook installer service."""
|
|
22
|
+
self.logger = get_logger(__name__)
|
|
23
|
+
self.claude_dir = Path.home() / ".claude"
|
|
24
|
+
self.settings_file = self.claude_dir / "settings.json"
|
|
25
|
+
|
|
26
|
+
def is_hooks_configured(self) -> bool:
|
|
27
|
+
"""Check if hooks are configured in Claude settings.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
True if hooks are properly configured, False otherwise.
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
if not self.settings_file.exists():
|
|
34
|
+
self.logger.debug("Claude settings file does not exist")
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
with self.settings_file.open() as f:
|
|
38
|
+
settings = json.load(f)
|
|
39
|
+
|
|
40
|
+
# Check if hooks section exists
|
|
41
|
+
if "hooks" not in settings:
|
|
42
|
+
self.logger.debug("No hooks section in Claude settings")
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
# Check for required hook types
|
|
46
|
+
required_hooks = [
|
|
47
|
+
"UserPromptSubmit",
|
|
48
|
+
"PreToolUse",
|
|
49
|
+
"PostToolUse",
|
|
50
|
+
"Stop",
|
|
51
|
+
"SubagentStop",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
for hook_type in required_hooks:
|
|
55
|
+
if hook_type not in settings["hooks"]:
|
|
56
|
+
self.logger.debug(f"Missing hook type: {hook_type}")
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
# Check if hook is configured with our wrapper
|
|
60
|
+
hooks = settings["hooks"][hook_type]
|
|
61
|
+
if not hooks or not isinstance(hooks, list):
|
|
62
|
+
self.logger.debug(f"Invalid hooks for {hook_type}")
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
# Look for our hook wrapper in the configuration
|
|
66
|
+
# Accept either hook_wrapper.sh or claude-hook-handler.sh
|
|
67
|
+
has_our_hook = False
|
|
68
|
+
for hook_config in hooks:
|
|
69
|
+
if "hooks" in hook_config and isinstance(
|
|
70
|
+
hook_config["hooks"], list
|
|
71
|
+
):
|
|
72
|
+
for hook in hook_config["hooks"]:
|
|
73
|
+
if hook.get("type") == "command":
|
|
74
|
+
command = hook.get("command", "")
|
|
75
|
+
if (
|
|
76
|
+
"hook_wrapper.sh" in command
|
|
77
|
+
or "claude-hook-handler.sh" in command
|
|
78
|
+
):
|
|
79
|
+
has_our_hook = True
|
|
80
|
+
break
|
|
81
|
+
if has_our_hook:
|
|
82
|
+
break
|
|
83
|
+
|
|
84
|
+
if not has_our_hook:
|
|
85
|
+
self.logger.debug(f"Our hook not found for {hook_type}")
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
self.logger.info("Claude hooks are properly configured")
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
except Exception as e:
|
|
92
|
+
self.logger.error(f"Error checking hook configuration: {e}")
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
def _detect_package_origin(self) -> Tuple[str, Optional[Path]]:
|
|
96
|
+
"""Detect how claude-mpm was installed.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Tuple of (origin_type, base_path) where origin_type is one of:
|
|
100
|
+
'local', 'pypi', 'pipx', 'npm', or 'unknown'
|
|
101
|
+
"""
|
|
102
|
+
# Check if we're in development mode (running from source)
|
|
103
|
+
current_file = Path(__file__).resolve()
|
|
104
|
+
project_root = current_file.parent.parent.parent.parent
|
|
105
|
+
if (project_root / "src" / "claude_mpm").exists() and (
|
|
106
|
+
project_root / "pyproject.toml"
|
|
107
|
+
).exists():
|
|
108
|
+
return "local", project_root
|
|
109
|
+
|
|
110
|
+
# Check for pipx installation
|
|
111
|
+
if "pipx/venvs/claude-mpm" in str(sys.executable):
|
|
112
|
+
# pipx installation - find the site-packages directory
|
|
113
|
+
import claude_mpm
|
|
114
|
+
|
|
115
|
+
package_path = Path(claude_mpm.__file__).parent
|
|
116
|
+
return "pipx", package_path
|
|
117
|
+
|
|
118
|
+
# Check for PyPI installation
|
|
119
|
+
try:
|
|
120
|
+
import claude_mpm
|
|
121
|
+
|
|
122
|
+
package_path = Path(claude_mpm.__file__).parent
|
|
123
|
+
if "site-packages" in str(package_path):
|
|
124
|
+
return "pypi", package_path
|
|
125
|
+
return "unknown", package_path
|
|
126
|
+
except ImportError:
|
|
127
|
+
pass
|
|
128
|
+
|
|
129
|
+
# Check for npm installation (node_modules)
|
|
130
|
+
node_modules_markers = [
|
|
131
|
+
Path.cwd() / "node_modules" / "claude-mpm",
|
|
132
|
+
Path.home() / "node_modules" / "claude-mpm",
|
|
133
|
+
Path("/usr/local/lib/node_modules/claude-mpm"),
|
|
134
|
+
]
|
|
135
|
+
for marker in node_modules_markers:
|
|
136
|
+
if marker.exists():
|
|
137
|
+
return "npm", marker
|
|
138
|
+
|
|
139
|
+
return "unknown", None
|
|
140
|
+
|
|
141
|
+
def _find_hook_script(self) -> Optional[Path]:
|
|
142
|
+
"""Find the hook script based on installation type.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Path to the hook script (claude-hook-handler.sh), or None if not found.
|
|
146
|
+
"""
|
|
147
|
+
origin, base_path = self._detect_package_origin()
|
|
148
|
+
|
|
149
|
+
self.logger.debug(f"Package origin: {origin}, base_path: {base_path}")
|
|
150
|
+
|
|
151
|
+
# Primary script to look for (preferred)
|
|
152
|
+
primary_script = "claude-hook-handler.sh"
|
|
153
|
+
# Fallback script for backward compatibility
|
|
154
|
+
fallback_script = "hook_wrapper.sh"
|
|
155
|
+
|
|
156
|
+
if origin == "local":
|
|
157
|
+
# Development environment - script is in src/claude_mpm/scripts
|
|
158
|
+
script_path = base_path / "src" / "claude_mpm" / "scripts" / primary_script
|
|
159
|
+
if not script_path.exists():
|
|
160
|
+
# Try hooks directory as fallback
|
|
161
|
+
fallback_path = (
|
|
162
|
+
base_path
|
|
163
|
+
/ "src"
|
|
164
|
+
/ "claude_mpm"
|
|
165
|
+
/ "hooks"
|
|
166
|
+
/ "claude_hooks"
|
|
167
|
+
/ fallback_script
|
|
168
|
+
)
|
|
169
|
+
if fallback_path.exists():
|
|
170
|
+
script_path = fallback_path
|
|
171
|
+
self.logger.info("Package origin: Local development")
|
|
172
|
+
elif origin == "pipx":
|
|
173
|
+
# pipx installation - script should be in package/scripts
|
|
174
|
+
script_path = base_path / "scripts" / primary_script
|
|
175
|
+
if not script_path.exists():
|
|
176
|
+
# Try hooks directory as fallback
|
|
177
|
+
fallback_path = base_path / "hooks" / "claude_hooks" / fallback_script
|
|
178
|
+
if fallback_path.exists():
|
|
179
|
+
script_path = fallback_path
|
|
180
|
+
self.logger.info("Package origin: pipx")
|
|
181
|
+
elif origin == "pypi":
|
|
182
|
+
# PyPI installation
|
|
183
|
+
script_path = base_path / "scripts" / primary_script
|
|
184
|
+
if not script_path.exists():
|
|
185
|
+
# Try hooks directory as fallback
|
|
186
|
+
fallback_path = base_path / "hooks" / "claude_hooks" / fallback_script
|
|
187
|
+
if fallback_path.exists():
|
|
188
|
+
script_path = fallback_path
|
|
189
|
+
self.logger.info("Package origin: PyPI")
|
|
190
|
+
elif origin == "npm":
|
|
191
|
+
# npm installation
|
|
192
|
+
script_path = base_path / "dist" / "claude_mpm" / "scripts" / primary_script
|
|
193
|
+
if not script_path.exists():
|
|
194
|
+
# Try alternative npm structure
|
|
195
|
+
script_path = (
|
|
196
|
+
base_path / "src" / "claude_mpm" / "scripts" / primary_script
|
|
197
|
+
)
|
|
198
|
+
if not script_path.exists():
|
|
199
|
+
# Try hooks directory as fallback
|
|
200
|
+
fallback_path = (
|
|
201
|
+
base_path
|
|
202
|
+
/ "dist"
|
|
203
|
+
/ "claude_mpm"
|
|
204
|
+
/ "hooks"
|
|
205
|
+
/ "claude_hooks"
|
|
206
|
+
/ fallback_script
|
|
207
|
+
)
|
|
208
|
+
if fallback_path.exists():
|
|
209
|
+
script_path = fallback_path
|
|
210
|
+
self.logger.info("Package origin: npm")
|
|
211
|
+
else:
|
|
212
|
+
# Unknown, try to find it
|
|
213
|
+
self.logger.info("Package origin: Unknown, searching...")
|
|
214
|
+
possible_locations = [
|
|
215
|
+
Path(sys.prefix)
|
|
216
|
+
/ "lib"
|
|
217
|
+
/ f"python{sys.version_info.major}.{sys.version_info.minor}"
|
|
218
|
+
/ "site-packages"
|
|
219
|
+
/ "claude_mpm"
|
|
220
|
+
/ "scripts"
|
|
221
|
+
/ primary_script,
|
|
222
|
+
Path(sys.prefix) / "claude_mpm" / "scripts" / primary_script,
|
|
223
|
+
# For pipx environments
|
|
224
|
+
Path(sys.executable).parent.parent
|
|
225
|
+
/ "lib"
|
|
226
|
+
/ f"python{sys.version_info.major}.{sys.version_info.minor}"
|
|
227
|
+
/ "site-packages"
|
|
228
|
+
/ "claude_mpm"
|
|
229
|
+
/ "scripts"
|
|
230
|
+
/ primary_script,
|
|
231
|
+
# Fallback to hooks directory
|
|
232
|
+
Path(sys.prefix)
|
|
233
|
+
/ "lib"
|
|
234
|
+
/ f"python{sys.version_info.major}.{sys.version_info.minor}"
|
|
235
|
+
/ "site-packages"
|
|
236
|
+
/ "claude_mpm"
|
|
237
|
+
/ "hooks"
|
|
238
|
+
/ "claude_hooks"
|
|
239
|
+
/ fallback_script,
|
|
240
|
+
]
|
|
241
|
+
for loc in possible_locations:
|
|
242
|
+
self.logger.debug(f"Checking location: {loc}")
|
|
243
|
+
if loc.exists():
|
|
244
|
+
script_path = loc
|
|
245
|
+
break
|
|
246
|
+
else:
|
|
247
|
+
return None
|
|
248
|
+
|
|
249
|
+
# Verify the script exists
|
|
250
|
+
if script_path and script_path.exists():
|
|
251
|
+
self.logger.info(f"Found hook script at: {script_path}")
|
|
252
|
+
return script_path
|
|
253
|
+
|
|
254
|
+
self.logger.warning(f"Hook script not found: {script_path}")
|
|
255
|
+
return None
|
|
256
|
+
|
|
257
|
+
def install_hooks(self, force: bool = False) -> bool:
|
|
258
|
+
"""Install hooks for Claude Code integration.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
force: If True, reinstall even if already configured.
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
True if hooks were installed successfully, False otherwise.
|
|
265
|
+
"""
|
|
266
|
+
try:
|
|
267
|
+
# Check if already configured
|
|
268
|
+
if not force and self.is_hooks_configured():
|
|
269
|
+
self.logger.info("Hooks are already configured")
|
|
270
|
+
return True
|
|
271
|
+
|
|
272
|
+
self.logger.info("Installing Claude Code hooks...")
|
|
273
|
+
|
|
274
|
+
# Find hook script
|
|
275
|
+
hook_script = self._find_hook_script()
|
|
276
|
+
if not hook_script:
|
|
277
|
+
self.logger.error("Could not find claude-mpm hook script!")
|
|
278
|
+
self.logger.error("Make sure claude-mpm is properly installed.")
|
|
279
|
+
return False
|
|
280
|
+
|
|
281
|
+
# Make sure the script is executable
|
|
282
|
+
st = Path(hook_script).stat()
|
|
283
|
+
Path(hook_script).chmod(st.st_mode | stat.S_IEXEC)
|
|
284
|
+
self.logger.debug(f"Made hook script executable: {hook_script}")
|
|
285
|
+
|
|
286
|
+
hook_script_path = str(hook_script.absolute())
|
|
287
|
+
self.logger.info(f"Hook script path: {hook_script_path}")
|
|
288
|
+
|
|
289
|
+
# Create claude directory if it doesn't exist
|
|
290
|
+
self.claude_dir.mkdir(exist_ok=True)
|
|
291
|
+
|
|
292
|
+
# Load existing settings or create new
|
|
293
|
+
if self.settings_file.exists():
|
|
294
|
+
with self.settings_file.open() as f:
|
|
295
|
+
settings = json.load(f)
|
|
296
|
+
self.logger.debug("Found existing Claude settings")
|
|
297
|
+
else:
|
|
298
|
+
settings = {}
|
|
299
|
+
self.logger.debug("Creating new Claude settings")
|
|
300
|
+
|
|
301
|
+
# Configure hooks
|
|
302
|
+
hook_config = {
|
|
303
|
+
"matcher": "*",
|
|
304
|
+
"hooks": [{"type": "command", "command": hook_script_path}],
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
# Update settings
|
|
308
|
+
if "hooks" not in settings:
|
|
309
|
+
settings["hooks"] = {}
|
|
310
|
+
|
|
311
|
+
# Add hooks for all event types
|
|
312
|
+
for event_type in [
|
|
313
|
+
"UserPromptSubmit",
|
|
314
|
+
"PreToolUse",
|
|
315
|
+
"PostToolUse",
|
|
316
|
+
"Stop",
|
|
317
|
+
"SubagentStop",
|
|
318
|
+
]:
|
|
319
|
+
settings["hooks"][event_type] = [hook_config]
|
|
320
|
+
|
|
321
|
+
# Write settings
|
|
322
|
+
with self.settings_file.open("w") as f:
|
|
323
|
+
json.dump(settings, f, indent=2)
|
|
324
|
+
|
|
325
|
+
self.logger.info(f"Updated Claude settings at: {self.settings_file}")
|
|
326
|
+
|
|
327
|
+
# Copy commands if they exist (for local development)
|
|
328
|
+
origin, base_path = self._detect_package_origin()
|
|
329
|
+
if origin == "local" and base_path:
|
|
330
|
+
commands_src = base_path / "tools" / "dev" / ".claude" / "commands"
|
|
331
|
+
if commands_src.exists():
|
|
332
|
+
commands_dst = self.claude_dir / "commands"
|
|
333
|
+
commands_dst.mkdir(exist_ok=True)
|
|
334
|
+
|
|
335
|
+
for cmd_file in commands_src.glob("*.md"):
|
|
336
|
+
shutil.copy2(cmd_file, commands_dst / cmd_file.name)
|
|
337
|
+
self.logger.debug(f"Copied command: {cmd_file.name}")
|
|
338
|
+
|
|
339
|
+
self.logger.info("Hook installation complete!")
|
|
340
|
+
return True
|
|
341
|
+
|
|
342
|
+
except Exception as e:
|
|
343
|
+
self.logger.error(f"Error installing hooks: {e}")
|
|
344
|
+
return False
|
|
345
|
+
|
|
346
|
+
def _is_claude_mpm_hook(self, hook_config: Dict[str, Any]) -> bool:
|
|
347
|
+
"""Check if a hook configuration belongs to Claude MPM.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
hook_config: The hook configuration to check.
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
True if this is a Claude MPM hook, False otherwise.
|
|
354
|
+
"""
|
|
355
|
+
if "hooks" in hook_config and isinstance(hook_config["hooks"], list):
|
|
356
|
+
for hook in hook_config["hooks"]:
|
|
357
|
+
if hook.get("type") == "command":
|
|
358
|
+
command = hook.get("command", "")
|
|
359
|
+
# Check for known Claude MPM hook scripts and paths
|
|
360
|
+
claude_mpm_indicators = [
|
|
361
|
+
"hook_wrapper.sh",
|
|
362
|
+
"claude-hook-handler.sh",
|
|
363
|
+
"claude-mpm",
|
|
364
|
+
]
|
|
365
|
+
if any(indicator in command for indicator in claude_mpm_indicators):
|
|
366
|
+
return True
|
|
367
|
+
return False
|
|
368
|
+
|
|
369
|
+
def uninstall_hooks(self) -> bool:
|
|
370
|
+
"""Remove hooks from Claude settings.
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
True if hooks were removed successfully, False otherwise.
|
|
374
|
+
"""
|
|
375
|
+
try:
|
|
376
|
+
if not self.settings_file.exists():
|
|
377
|
+
self.logger.info("No Claude settings file found, nothing to uninstall")
|
|
378
|
+
return True
|
|
379
|
+
|
|
380
|
+
self.logger.info("Removing Claude Code hooks...")
|
|
381
|
+
|
|
382
|
+
with self.settings_file.open() as f:
|
|
383
|
+
settings = json.load(f)
|
|
384
|
+
|
|
385
|
+
hooks_removed = 0
|
|
386
|
+
# Remove only our hooks, preserve other settings
|
|
387
|
+
if "hooks" in settings:
|
|
388
|
+
hook_types = [
|
|
389
|
+
"UserPromptSubmit",
|
|
390
|
+
"PreToolUse",
|
|
391
|
+
"PostToolUse",
|
|
392
|
+
"Stop",
|
|
393
|
+
"SubagentStop",
|
|
394
|
+
]
|
|
395
|
+
|
|
396
|
+
for hook_type in hook_types:
|
|
397
|
+
if hook_type in settings["hooks"]:
|
|
398
|
+
# Filter out our hooks
|
|
399
|
+
original_count = len(settings["hooks"][hook_type])
|
|
400
|
+
filtered_hooks = [
|
|
401
|
+
hook_config
|
|
402
|
+
for hook_config in settings["hooks"][hook_type]
|
|
403
|
+
if not self._is_claude_mpm_hook(hook_config)
|
|
404
|
+
]
|
|
405
|
+
|
|
406
|
+
removed_count = original_count - len(filtered_hooks)
|
|
407
|
+
if removed_count > 0:
|
|
408
|
+
hooks_removed += removed_count
|
|
409
|
+
self.logger.debug(
|
|
410
|
+
f"Removed {removed_count} hook(s) from {hook_type}"
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
# Update or remove the hook type
|
|
414
|
+
if filtered_hooks:
|
|
415
|
+
settings["hooks"][hook_type] = filtered_hooks
|
|
416
|
+
else:
|
|
417
|
+
del settings["hooks"][hook_type]
|
|
418
|
+
|
|
419
|
+
# If no hooks remain, remove the hooks section
|
|
420
|
+
if not settings["hooks"]:
|
|
421
|
+
del settings["hooks"]
|
|
422
|
+
|
|
423
|
+
# Write updated settings
|
|
424
|
+
with self.settings_file.open("w") as f:
|
|
425
|
+
json.dump(settings, f, indent=2)
|
|
426
|
+
|
|
427
|
+
if hooks_removed > 0:
|
|
428
|
+
self.logger.info(
|
|
429
|
+
f"Successfully removed {hooks_removed} Claude MPM hook(s)"
|
|
430
|
+
)
|
|
431
|
+
else:
|
|
432
|
+
self.logger.info("No Claude MPM hooks found to remove")
|
|
433
|
+
|
|
434
|
+
# Optionally remove commands directory if it only contains our commands
|
|
435
|
+
commands_dir = self.claude_dir / "commands"
|
|
436
|
+
if commands_dir.exists():
|
|
437
|
+
our_commands = [
|
|
438
|
+
"mpm.md",
|
|
439
|
+
"mpm-status.md",
|
|
440
|
+
] # Add other command files as needed
|
|
441
|
+
all_files = list(commands_dir.glob("*.md"))
|
|
442
|
+
|
|
443
|
+
# Check if only our commands exist
|
|
444
|
+
if all(f.name in our_commands for f in all_files):
|
|
445
|
+
shutil.rmtree(commands_dir)
|
|
446
|
+
self.logger.debug("Removed commands directory")
|
|
447
|
+
|
|
448
|
+
return True
|
|
449
|
+
|
|
450
|
+
except Exception as e:
|
|
451
|
+
self.logger.error(f"Error uninstalling hooks: {e}")
|
|
452
|
+
return False
|
|
453
|
+
|
|
454
|
+
def get_hook_status(self) -> Dict[str, Any]:
|
|
455
|
+
"""Get detailed status of hook configuration.
|
|
456
|
+
|
|
457
|
+
Returns:
|
|
458
|
+
Dictionary with hook status information.
|
|
459
|
+
"""
|
|
460
|
+
status = {
|
|
461
|
+
"configured": False,
|
|
462
|
+
"settings_file": str(self.settings_file),
|
|
463
|
+
"settings_exists": self.settings_file.exists(),
|
|
464
|
+
"hook_types": {},
|
|
465
|
+
"hook_script_path": None,
|
|
466
|
+
"hook_wrapper_path": None, # Keep for backward compatibility
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
try:
|
|
470
|
+
if self.settings_file.exists():
|
|
471
|
+
with self.settings_file.open() as f:
|
|
472
|
+
settings = json.load(f)
|
|
473
|
+
|
|
474
|
+
if "hooks" in settings:
|
|
475
|
+
for hook_type in [
|
|
476
|
+
"UserPromptSubmit",
|
|
477
|
+
"PreToolUse",
|
|
478
|
+
"PostToolUse",
|
|
479
|
+
"Stop",
|
|
480
|
+
"SubagentStop",
|
|
481
|
+
]:
|
|
482
|
+
if hook_type in settings["hooks"]:
|
|
483
|
+
hooks = settings["hooks"][hook_type]
|
|
484
|
+
# Find our hook wrapper path
|
|
485
|
+
for hook_config in hooks:
|
|
486
|
+
if "hooks" in hook_config:
|
|
487
|
+
for hook in hook_config["hooks"]:
|
|
488
|
+
if hook.get("type") == "command":
|
|
489
|
+
command = hook.get("command", "")
|
|
490
|
+
if (
|
|
491
|
+
"hook_wrapper.sh" in command
|
|
492
|
+
or "claude-hook-handler.sh" in command
|
|
493
|
+
):
|
|
494
|
+
status["hook_script_path"] = command
|
|
495
|
+
status["hook_wrapper_path"] = (
|
|
496
|
+
command # For backward compatibility
|
|
497
|
+
)
|
|
498
|
+
status["hook_types"][hook_type] = True
|
|
499
|
+
break
|
|
500
|
+
|
|
501
|
+
status["configured"] = self.is_hooks_configured()
|
|
502
|
+
|
|
503
|
+
except Exception as e:
|
|
504
|
+
self.logger.error(f"Error getting hook status: {e}")
|
|
505
|
+
|
|
506
|
+
return status
|
|
@@ -278,12 +278,11 @@ class HookService(HookServiceInterface):
|
|
|
278
278
|
if hook_type in ["pre_delegation", "post_delegation"]:
|
|
279
279
|
# If any registered hooks are memory-related, check memory.enabled
|
|
280
280
|
for hook in getattr(self, f"{hook_type}_hooks", []):
|
|
281
|
-
if "memory" in hook.name.lower()
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return False
|
|
281
|
+
if "memory" in hook.name.lower() and not self.config.get(
|
|
282
|
+
"memory.enabled", True
|
|
283
|
+
):
|
|
284
|
+
self.logger.debug("Memory hooks disabled via memory.enabled config")
|
|
285
|
+
return False
|
|
287
286
|
|
|
288
287
|
return True
|
|
289
288
|
|
|
@@ -16,7 +16,7 @@ import gzip
|
|
|
16
16
|
import json
|
|
17
17
|
import shutil
|
|
18
18
|
from dataclasses import dataclass, field
|
|
19
|
-
from datetime import datetime
|
|
19
|
+
from datetime import datetime, timezone
|
|
20
20
|
from typing import Any, Dict, List, Optional
|
|
21
21
|
|
|
22
22
|
import ijson # For streaming JSON parsing
|
|
@@ -151,7 +151,7 @@ class ContextPreservationService(BaseService):
|
|
|
151
151
|
return None
|
|
152
152
|
|
|
153
153
|
# Use streaming to find active conversation
|
|
154
|
-
with
|
|
154
|
+
with self.claude_json_path.open("rb") as f:
|
|
155
155
|
parser = ijson.parse(f)
|
|
156
156
|
|
|
157
157
|
active_conv_id = None
|
|
@@ -203,9 +203,11 @@ class ContextPreservationService(BaseService):
|
|
|
203
203
|
await self._create_backup()
|
|
204
204
|
|
|
205
205
|
# Load and filter conversations
|
|
206
|
-
cutoff_time = datetime.now().timestamp() - (
|
|
206
|
+
cutoff_time = datetime.now(timezone.utc).timestamp() - (
|
|
207
|
+
keep_recent_days * 86400
|
|
208
|
+
)
|
|
207
209
|
|
|
208
|
-
with
|
|
210
|
+
with self.claude_json_path.open() as f:
|
|
209
211
|
data = json.load(f)
|
|
210
212
|
|
|
211
213
|
original_count = len(data.get("conversations", []))
|
|
@@ -237,7 +239,7 @@ class ContextPreservationService(BaseService):
|
|
|
237
239
|
|
|
238
240
|
# Write compressed version
|
|
239
241
|
temp_path = self.claude_json_path.with_suffix(".tmp")
|
|
240
|
-
with open(
|
|
242
|
+
with temp_path.open("w") as f:
|
|
241
243
|
json.dump(data, f, separators=(",", ":")) # Compact format
|
|
242
244
|
|
|
243
245
|
# Replace original
|
|
@@ -292,7 +294,7 @@ class ContextPreservationService(BaseService):
|
|
|
292
294
|
try:
|
|
293
295
|
if Path(file_path).exists():
|
|
294
296
|
valid_files.append(file_path)
|
|
295
|
-
except:
|
|
297
|
+
except Exception:
|
|
296
298
|
pass # Invalid path
|
|
297
299
|
|
|
298
300
|
return valid_files
|
|
@@ -314,7 +316,7 @@ class ContextPreservationService(BaseService):
|
|
|
314
316
|
# Use streaming to extract preferences
|
|
315
317
|
preferences = {}
|
|
316
318
|
|
|
317
|
-
with
|
|
319
|
+
with self.claude_json_path.open("rb") as f:
|
|
318
320
|
parser = ijson.parse(f)
|
|
319
321
|
|
|
320
322
|
for prefix, event, value in parser:
|
|
@@ -337,7 +339,7 @@ class ContextPreservationService(BaseService):
|
|
|
337
339
|
) -> ConversationState:
|
|
338
340
|
"""Parse Claude JSON using standard JSON parser."""
|
|
339
341
|
try:
|
|
340
|
-
with
|
|
342
|
+
with self.claude_json_path.open() as f:
|
|
341
343
|
data = json.load(f)
|
|
342
344
|
|
|
343
345
|
return await self._extract_conversation_state(data, extract_full)
|
|
@@ -355,7 +357,7 @@ class ContextPreservationService(BaseService):
|
|
|
355
357
|
preferences = {}
|
|
356
358
|
open_files = []
|
|
357
359
|
|
|
358
|
-
with
|
|
360
|
+
with self.claude_json_path.open("rb") as f:
|
|
359
361
|
parser = ijson.parse(f)
|
|
360
362
|
|
|
361
363
|
conversation_count = 0
|
|
@@ -516,7 +518,7 @@ class ContextPreservationService(BaseService):
|
|
|
516
518
|
async def _create_backup(self) -> Path:
|
|
517
519
|
"""Create backup of Claude configuration."""
|
|
518
520
|
try:
|
|
519
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
521
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
520
522
|
backup_name = f"claude_backup_{timestamp}.json"
|
|
521
523
|
|
|
522
524
|
# Compress if large
|
|
@@ -525,7 +527,7 @@ class ContextPreservationService(BaseService):
|
|
|
525
527
|
backup_name += ".gz"
|
|
526
528
|
backup_path = self.claude_backup_dir / backup_name
|
|
527
529
|
|
|
528
|
-
with
|
|
530
|
+
with self.claude_json_path.open("rb") as f_in:
|
|
529
531
|
with gzip.open(backup_path, "wb") as f_out:
|
|
530
532
|
shutil.copyfileobj(f_in, f_out)
|
|
531
533
|
else:
|