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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- 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
|
@@ -2,16 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
This module provides the InteractiveSession class that manages Claude's interactive mode
|
|
4
4
|
with proper separation of concerns and reduced complexity.
|
|
5
|
+
|
|
6
|
+
DEPENDENCY INJECTION:
|
|
7
|
+
This module uses protocol-based dependency injection to break circular imports.
|
|
8
|
+
Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
|
|
9
|
+
defines the interface it needs. This allows ClaudeRunner to create instances
|
|
10
|
+
of InteractiveSession without circular dependency issues.
|
|
5
11
|
"""
|
|
6
12
|
|
|
7
13
|
import contextlib
|
|
8
14
|
import os
|
|
9
15
|
import subprocess
|
|
10
16
|
import uuid
|
|
11
|
-
from
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
|
|
12
19
|
|
|
20
|
+
from claude_mpm.core.enums import ServiceState
|
|
13
21
|
from claude_mpm.core.logger import get_logger
|
|
14
22
|
|
|
23
|
+
# Protocol imports for type checking without circular dependencies
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
26
|
+
else:
|
|
27
|
+
# At runtime, accept any object with matching interface
|
|
28
|
+
ClaudeRunnerProtocol = Any
|
|
29
|
+
|
|
15
30
|
|
|
16
31
|
class InteractiveSession:
|
|
17
32
|
"""
|
|
@@ -26,16 +41,17 @@ class InteractiveSession:
|
|
|
26
41
|
and makes testing easier while preserving all original functionality.
|
|
27
42
|
"""
|
|
28
43
|
|
|
29
|
-
def __init__(self, runner):
|
|
44
|
+
def __init__(self, runner: "ClaudeRunnerProtocol"):
|
|
30
45
|
"""Initialize interactive session handler.
|
|
31
46
|
|
|
32
47
|
Args:
|
|
33
|
-
runner: ClaudeRunner instance
|
|
48
|
+
runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
49
|
+
with all necessary services
|
|
34
50
|
"""
|
|
35
|
-
self.runner = runner
|
|
51
|
+
self.runner: ClaudeRunnerProtocol = runner
|
|
36
52
|
self.logger = get_logger("interactive_session")
|
|
37
53
|
self.session_id = None
|
|
38
|
-
self.original_cwd =
|
|
54
|
+
self.original_cwd = Path.cwd()
|
|
39
55
|
|
|
40
56
|
# Initialize response tracking for interactive sessions
|
|
41
57
|
# WHY: Interactive sessions need response logging just like oneshot sessions.
|
|
@@ -83,8 +99,8 @@ class InteractiveSession:
|
|
|
83
99
|
self.logger.warning(f"WebSocket initialization failed: {error}")
|
|
84
100
|
# Continue without WebSocket - not a fatal error
|
|
85
101
|
|
|
86
|
-
#
|
|
87
|
-
|
|
102
|
+
# Banner now displayed in CLI startup - see startup_display.py
|
|
103
|
+
# Removed duplicate _display_welcome_message() to consolidate with main banner
|
|
88
104
|
|
|
89
105
|
# Log session start
|
|
90
106
|
if self.runner.project_logger:
|
|
@@ -178,7 +194,8 @@ class InteractiveSession:
|
|
|
178
194
|
# Notify WebSocket if connected
|
|
179
195
|
if self.runner.websocket_server:
|
|
180
196
|
self.runner.websocket_server.claude_status_changed(
|
|
181
|
-
status=
|
|
197
|
+
status=ServiceState.STARTING,
|
|
198
|
+
message="Launching Claude interactive session",
|
|
182
199
|
)
|
|
183
200
|
|
|
184
201
|
# Launch using selected method
|
|
@@ -225,7 +242,7 @@ class InteractiveSession:
|
|
|
225
242
|
"""
|
|
226
243
|
try:
|
|
227
244
|
# Restore original directory
|
|
228
|
-
if self.original_cwd and
|
|
245
|
+
if self.original_cwd and Path(self.original_cwd).exists():
|
|
229
246
|
with contextlib.suppress(OSError):
|
|
230
247
|
os.chdir(self.original_cwd)
|
|
231
248
|
|
|
@@ -278,7 +295,7 @@ class InteractiveSession:
|
|
|
278
295
|
self.runner.websocket_server.session_started(
|
|
279
296
|
session_id=self.session_id,
|
|
280
297
|
launch_method=self.runner.launch_method,
|
|
281
|
-
working_dir=
|
|
298
|
+
working_dir=Path.cwd(),
|
|
282
299
|
)
|
|
283
300
|
return True, None
|
|
284
301
|
|
|
@@ -290,7 +307,12 @@ class InteractiveSession:
|
|
|
290
307
|
return False, f"Unexpected error with Socket.IO: {e}"
|
|
291
308
|
|
|
292
309
|
def _display_welcome_message(self) -> None:
|
|
293
|
-
"""Display the interactive session welcome message.
|
|
310
|
+
"""Display the interactive session welcome message.
|
|
311
|
+
|
|
312
|
+
DEPRECATED: This method is kept for backward compatibility with tests.
|
|
313
|
+
The main banner is now displayed in startup_display.py during CLI startup.
|
|
314
|
+
This consolidated approach prevents duplicate banners.
|
|
315
|
+
"""
|
|
294
316
|
version_str = self.runner._get_version()
|
|
295
317
|
|
|
296
318
|
# Get output style status
|
|
@@ -310,6 +332,9 @@ class InteractiveSession:
|
|
|
310
332
|
print(
|
|
311
333
|
"\033[32m│\033[0m /mpm - MPM overview and help \033[32m│\033[0m"
|
|
312
334
|
)
|
|
335
|
+
print(
|
|
336
|
+
"\033[32m│\033[0m /mpm-init - Initialize or update project \033[32m│\033[0m"
|
|
337
|
+
)
|
|
313
338
|
print(
|
|
314
339
|
"\033[32m│\033[0m /mpm-agents - Show available agents \033[32m│\033[0m"
|
|
315
340
|
)
|
|
@@ -369,7 +394,7 @@ class InteractiveSession:
|
|
|
369
394
|
|
|
370
395
|
return cmd
|
|
371
396
|
# Normal mode - full command with all claude-mpm enhancements
|
|
372
|
-
cmd = ["claude", "--
|
|
397
|
+
cmd = ["claude", "--dangerously-skip-permissions"]
|
|
373
398
|
|
|
374
399
|
# Add custom arguments
|
|
375
400
|
if self.runner.claude_args:
|
|
@@ -377,12 +402,82 @@ class InteractiveSession:
|
|
|
377
402
|
self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
|
|
378
403
|
cmd.extend(self.runner.claude_args)
|
|
379
404
|
|
|
380
|
-
# Add
|
|
381
|
-
|
|
405
|
+
# Add --agents flag if native agents mode is enabled
|
|
406
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
407
|
+
agents_flag = self._build_agents_flag()
|
|
408
|
+
if agents_flag:
|
|
409
|
+
# Add --agents JSON directly (already properly formatted)
|
|
410
|
+
cmd.extend(agents_flag)
|
|
411
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
412
|
+
|
|
413
|
+
# Add system instructions with file-based caching
|
|
414
|
+
from claude_mpm.core.system_context import create_simple_context
|
|
415
|
+
from claude_mpm.services.instructions.instruction_cache_service import (
|
|
416
|
+
InstructionCacheService,
|
|
417
|
+
)
|
|
382
418
|
|
|
383
419
|
system_prompt = self.runner._create_system_prompt()
|
|
384
420
|
if system_prompt and system_prompt != create_simple_context():
|
|
385
|
-
|
|
421
|
+
# Try to use cached instruction file for better performance
|
|
422
|
+
try:
|
|
423
|
+
# Initialize cache service with project root
|
|
424
|
+
if "CLAUDE_MPM_USER_PWD" in os.environ:
|
|
425
|
+
project_root = Path(os.environ["CLAUDE_MPM_USER_PWD"])
|
|
426
|
+
else:
|
|
427
|
+
project_root = Path.cwd()
|
|
428
|
+
|
|
429
|
+
# Instruction Caching (1M-446)
|
|
430
|
+
# Cache assembled instructions to file to avoid ARG_MAX limits on Linux/Windows.
|
|
431
|
+
# - Linux: 128 KB limit, instructions are ~152 KB (exceeds by 19.1%)
|
|
432
|
+
# - Windows: 32 KB limit (exceeds by 476%)
|
|
433
|
+
# Cache updates only when content hash changes (hash-based invalidation).
|
|
434
|
+
# Fallback to inline instruction if cache fails (graceful degradation).
|
|
435
|
+
cache_service = InstructionCacheService(project_root=project_root)
|
|
436
|
+
|
|
437
|
+
# Update cache with assembled instruction content
|
|
438
|
+
cache_result = cache_service.update_cache(
|
|
439
|
+
instruction_content=system_prompt
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Use cache file if available
|
|
443
|
+
if (
|
|
444
|
+
cache_result.get("updated")
|
|
445
|
+
or cache_service.get_cache_path().exists()
|
|
446
|
+
):
|
|
447
|
+
cache_file = cache_service.get_cache_path()
|
|
448
|
+
|
|
449
|
+
# Log cache operation
|
|
450
|
+
if cache_result.get("updated"):
|
|
451
|
+
self.logger.info(
|
|
452
|
+
f"Instruction cache updated: {cache_result.get('reason', 'unknown')}"
|
|
453
|
+
)
|
|
454
|
+
self.logger.debug(
|
|
455
|
+
f"Cache hash: {cache_result.get('content_hash', 'N/A')[:8]}..."
|
|
456
|
+
)
|
|
457
|
+
self.logger.debug(
|
|
458
|
+
f"Cache size: {cache_result.get('content_size_kb', 'N/A')} KB"
|
|
459
|
+
)
|
|
460
|
+
else:
|
|
461
|
+
self.logger.debug(
|
|
462
|
+
f"Using cached instructions: {cache_result.get('reason', 'unknown')}"
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Use file-based loading for better performance
|
|
466
|
+
cmd.extend(["--system-prompt-file", str(cache_file)])
|
|
467
|
+
self.logger.info(
|
|
468
|
+
f"✓ Using file-based instruction loading: {cache_file}"
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
# Fallback to inline if cache file doesn't exist
|
|
472
|
+
self.logger.warning(
|
|
473
|
+
"Cache file not available, falling back to inline instruction"
|
|
474
|
+
)
|
|
475
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
476
|
+
|
|
477
|
+
except Exception as e:
|
|
478
|
+
# Graceful fallback - cache failures don't break deployment
|
|
479
|
+
self.logger.warning(f"Failed to cache instructions, using inline: {e}")
|
|
480
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
386
481
|
|
|
387
482
|
# Final command verification
|
|
388
483
|
# self.logger.info(f"Final Claude command built: {' '.join(cmd)}")
|
|
@@ -392,10 +487,42 @@ class InteractiveSession:
|
|
|
392
487
|
self.logger.info("✅ VERIFIED: --resume flag IS included in final command")
|
|
393
488
|
self.logger.debug(f"--resume position in command: {cmd.index('--resume')}")
|
|
394
489
|
else:
|
|
395
|
-
self.logger.debug("
|
|
490
|
+
self.logger.debug("[INFO]️ --resume flag NOT included in final command")
|
|
396
491
|
|
|
397
492
|
return cmd
|
|
398
493
|
|
|
494
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
495
|
+
"""Build --agents flag with all MPM agents.
|
|
496
|
+
|
|
497
|
+
Returns:
|
|
498
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
499
|
+
"""
|
|
500
|
+
try:
|
|
501
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
502
|
+
|
|
503
|
+
converter = NativeAgentConverter()
|
|
504
|
+
agents = converter.load_agents_from_templates()
|
|
505
|
+
|
|
506
|
+
if not agents:
|
|
507
|
+
self.logger.warning("No agents loaded for native mode")
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
# Generate JSON for --agents flag
|
|
511
|
+
agents_json = converter.generate_agents_json(agents)
|
|
512
|
+
summary = converter.get_conversion_summary(agents)
|
|
513
|
+
|
|
514
|
+
self.logger.info(
|
|
515
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
516
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
# Return as list: ["--agents", "<json>"]
|
|
520
|
+
return ["--agents", agents_json]
|
|
521
|
+
|
|
522
|
+
except Exception as e:
|
|
523
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
524
|
+
return None
|
|
525
|
+
|
|
399
526
|
def _prepare_environment(self) -> dict:
|
|
400
527
|
"""Prepare clean environment variables for Claude."""
|
|
401
528
|
clean_env = os.environ.copy()
|
|
@@ -450,7 +577,8 @@ class InteractiveSession:
|
|
|
450
577
|
# Notify WebSocket before exec
|
|
451
578
|
if self.runner.websocket_server:
|
|
452
579
|
self.runner.websocket_server.claude_status_changed(
|
|
453
|
-
status=
|
|
580
|
+
status=ServiceState.RUNNING,
|
|
581
|
+
message="Claude process started (exec mode)",
|
|
454
582
|
)
|
|
455
583
|
|
|
456
584
|
# This will not return if successful
|
|
@@ -490,7 +618,7 @@ class InteractiveSession:
|
|
|
490
618
|
# Notify WebSocket of error
|
|
491
619
|
if self.runner.websocket_server:
|
|
492
620
|
self.runner.websocket_server.claude_status_changed(
|
|
493
|
-
status=
|
|
621
|
+
status=ServiceState.ERROR, message=f"Failed to launch Claude: {error}"
|
|
494
622
|
)
|
|
495
623
|
|
|
496
624
|
def _handle_keyboard_interrupt(self) -> None:
|
claude_mpm/core/interfaces.py
CHANGED
|
@@ -33,7 +33,62 @@ from pathlib import Path
|
|
|
33
33
|
from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar
|
|
34
34
|
|
|
35
35
|
# Re-export everything from the new location for backward compatibility
|
|
36
|
-
from claude_mpm.services.core.interfaces import
|
|
36
|
+
from claude_mpm.services.core.interfaces import ( # noqa: F401
|
|
37
|
+
AgentCapabilitiesInterface,
|
|
38
|
+
AgentDeploymentInterface,
|
|
39
|
+
AgentMetadata,
|
|
40
|
+
CacheEntry,
|
|
41
|
+
CommandHandlerInterface,
|
|
42
|
+
HealthStatus,
|
|
43
|
+
HookServiceInterface,
|
|
44
|
+
IAgentRecommender,
|
|
45
|
+
IAgentRegistry,
|
|
46
|
+
IAutoConfigManager,
|
|
47
|
+
ICacheService,
|
|
48
|
+
IConfigurationManager,
|
|
49
|
+
IConfigurationService,
|
|
50
|
+
ICrashDetector,
|
|
51
|
+
IDeploymentStateManager,
|
|
52
|
+
IErrorHandler,
|
|
53
|
+
IEventBus,
|
|
54
|
+
IHealthCheck,
|
|
55
|
+
IHealthCheckManager,
|
|
56
|
+
IHealthMonitor,
|
|
57
|
+
ILocalProcessManager,
|
|
58
|
+
ILogMonitor,
|
|
59
|
+
IMemoryLeakDetector,
|
|
60
|
+
IModelProvider,
|
|
61
|
+
IModelRouter,
|
|
62
|
+
InterfaceRegistry,
|
|
63
|
+
IPerformanceMonitor,
|
|
64
|
+
IPromptCache,
|
|
65
|
+
IResourceMonitor,
|
|
66
|
+
IRestartManager,
|
|
67
|
+
IRestartPolicy,
|
|
68
|
+
IServiceContainer,
|
|
69
|
+
IServiceFactory,
|
|
70
|
+
IServiceLifecycle,
|
|
71
|
+
IStructuredLogger,
|
|
72
|
+
ITemplateManager,
|
|
73
|
+
IToolchainAnalyzer,
|
|
74
|
+
MemoryHookInterface,
|
|
75
|
+
MemoryServiceInterface,
|
|
76
|
+
ModelCapability,
|
|
77
|
+
ModelProvider,
|
|
78
|
+
ModelResponse,
|
|
79
|
+
ProjectAnalyzerInterface,
|
|
80
|
+
RunnerConfigurationInterface,
|
|
81
|
+
ServiceType,
|
|
82
|
+
SessionManagementInterface,
|
|
83
|
+
SocketIOServiceInterface,
|
|
84
|
+
SubprocessLauncherInterface,
|
|
85
|
+
SystemInstructionsInterface,
|
|
86
|
+
T,
|
|
87
|
+
TemplateRenderContext,
|
|
88
|
+
TicketManagerInterface,
|
|
89
|
+
UtilityServiceInterface,
|
|
90
|
+
VersionServiceInterface,
|
|
91
|
+
)
|
|
37
92
|
|
|
38
93
|
# Type variables for generic interfaces
|
|
39
94
|
T = TypeVar("T")
|
claude_mpm/core/lazy.py
CHANGED
|
@@ -16,7 +16,7 @@ import functools
|
|
|
16
16
|
import threading
|
|
17
17
|
import time
|
|
18
18
|
from dataclasses import dataclass, field
|
|
19
|
-
from datetime import datetime
|
|
19
|
+
from datetime import datetime, timezone
|
|
20
20
|
from typing import Any, Callable, Dict, Generic, Optional, Type, TypeVar
|
|
21
21
|
|
|
22
22
|
from ..core.logger import get_logger
|
|
@@ -121,7 +121,7 @@ class LazyService(Generic[T]):
|
|
|
121
121
|
# Track initialization
|
|
122
122
|
start_time = time.time()
|
|
123
123
|
if self._metrics.first_access is None:
|
|
124
|
-
self._metrics.first_access = datetime.now()
|
|
124
|
+
self._metrics.first_access = datetime.now(timezone.utc)
|
|
125
125
|
|
|
126
126
|
try:
|
|
127
127
|
self._logger.debug(f"Initializing lazy service: {self._name}")
|
|
@@ -417,7 +417,7 @@ class AsyncLazyService(Generic[T]):
|
|
|
417
417
|
|
|
418
418
|
start_time = time.time()
|
|
419
419
|
if self._metrics.first_access is None:
|
|
420
|
-
self._metrics.first_access = datetime.now()
|
|
420
|
+
self._metrics.first_access = datetime.now(timezone.utc)
|
|
421
421
|
|
|
422
422
|
try:
|
|
423
423
|
self._logger.debug(f"Async initializing: {self._name}")
|
claude_mpm/core/log_manager.py
CHANGED
|
@@ -16,18 +16,25 @@ DESIGN DECISIONS:
|
|
|
16
16
|
|
|
17
17
|
import asyncio
|
|
18
18
|
import json
|
|
19
|
-
import logging
|
|
20
19
|
import os
|
|
21
|
-
from datetime import datetime, timedelta
|
|
20
|
+
from datetime import datetime, timedelta, timezone
|
|
22
21
|
from pathlib import Path
|
|
23
22
|
from queue import Full, Queue
|
|
24
23
|
from threading import Lock, Thread
|
|
25
24
|
from typing import Any, Dict, Optional
|
|
26
25
|
|
|
26
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
27
|
+
|
|
27
28
|
from ..core.config import Config
|
|
28
29
|
from ..core.constants import SystemLimits
|
|
29
30
|
|
|
30
|
-
logger =
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
# Import cleanup utility for automatic cleanup
|
|
34
|
+
try:
|
|
35
|
+
from ..utils.log_cleanup import run_cleanup_on_startup
|
|
36
|
+
except ImportError:
|
|
37
|
+
run_cleanup_on_startup = None
|
|
31
38
|
|
|
32
39
|
|
|
33
40
|
class LogManager:
|
|
@@ -76,6 +83,9 @@ class LogManager:
|
|
|
76
83
|
# Start background threads
|
|
77
84
|
self._start_background_threads()
|
|
78
85
|
|
|
86
|
+
# Run automatic cleanup on startup if enabled
|
|
87
|
+
self._run_startup_cleanup()
|
|
88
|
+
|
|
79
89
|
def _setup_logging_config(self):
|
|
80
90
|
"""Load and setup logging configuration from config."""
|
|
81
91
|
logging_config = self.config.get("logging", {})
|
|
@@ -101,10 +111,62 @@ class LogManager:
|
|
|
101
111
|
}
|
|
102
112
|
|
|
103
113
|
# Base directories
|
|
104
|
-
self.base_log_dir = Path(
|
|
114
|
+
self.base_log_dir = Path(
|
|
115
|
+
logging_config.get("base_directory", ".claude-mpm/logs")
|
|
116
|
+
)
|
|
105
117
|
if not self.base_log_dir.is_absolute():
|
|
106
118
|
self.base_log_dir = Path.cwd() / self.base_log_dir
|
|
107
119
|
|
|
120
|
+
def _run_startup_cleanup(self):
|
|
121
|
+
"""Run automatic log cleanup on startup if enabled."""
|
|
122
|
+
if run_cleanup_on_startup is None:
|
|
123
|
+
return # Cleanup utility not available
|
|
124
|
+
|
|
125
|
+
# Check environment variable to skip cleanup (for configure command)
|
|
126
|
+
import os
|
|
127
|
+
|
|
128
|
+
if os.environ.get("CLAUDE_MPM_SKIP_CLEANUP", "0") == "1":
|
|
129
|
+
logger.debug("Startup cleanup skipped (CLAUDE_MPM_SKIP_CLEANUP=1)")
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
# Get cleanup configuration
|
|
134
|
+
cleanup_config = self.config.get("log_cleanup", {})
|
|
135
|
+
|
|
136
|
+
# Check if automatic cleanup is enabled (default: True)
|
|
137
|
+
if not cleanup_config.get("auto_cleanup_enabled", True):
|
|
138
|
+
logger.debug("Automatic log cleanup is disabled")
|
|
139
|
+
return
|
|
140
|
+
|
|
141
|
+
# Convert hours to days for cleanup utility
|
|
142
|
+
cleanup_params = {
|
|
143
|
+
"auto_cleanup_enabled": True,
|
|
144
|
+
"session_retention_days": self.retention_hours.get("sessions", 168)
|
|
145
|
+
// 24,
|
|
146
|
+
"archive_retention_days": cleanup_config.get(
|
|
147
|
+
"archive_retention_days", 30
|
|
148
|
+
),
|
|
149
|
+
"log_retention_days": cleanup_config.get("log_retention_days", 14),
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Run cleanup in background thread to avoid blocking startup
|
|
153
|
+
def cleanup_task():
|
|
154
|
+
try:
|
|
155
|
+
result = run_cleanup_on_startup(self.base_log_dir, cleanup_params)
|
|
156
|
+
if result:
|
|
157
|
+
logger.debug(
|
|
158
|
+
f"Startup cleanup completed: "
|
|
159
|
+
f"Removed {result.get('total_removed', 0)} items"
|
|
160
|
+
)
|
|
161
|
+
except Exception as e:
|
|
162
|
+
logger.debug(f"Startup cleanup failed: {e}")
|
|
163
|
+
|
|
164
|
+
cleanup_thread = Thread(target=cleanup_task, daemon=True)
|
|
165
|
+
cleanup_thread.start()
|
|
166
|
+
|
|
167
|
+
except Exception as e:
|
|
168
|
+
logger.debug(f"Could not run startup cleanup: {e}")
|
|
169
|
+
|
|
108
170
|
def _start_background_threads(self):
|
|
109
171
|
"""Start background threads for async operations."""
|
|
110
172
|
with self._lock:
|
|
@@ -137,7 +199,7 @@ class LogManager:
|
|
|
137
199
|
finally:
|
|
138
200
|
self.write_queue.task_done()
|
|
139
201
|
|
|
140
|
-
except:
|
|
202
|
+
except Exception:
|
|
141
203
|
continue # Timeout or other error, continue loop
|
|
142
204
|
|
|
143
205
|
def _process_cleanup_queue(self):
|
|
@@ -157,7 +219,7 @@ class LogManager:
|
|
|
157
219
|
finally:
|
|
158
220
|
self.cleanup_queue.task_done()
|
|
159
221
|
|
|
160
|
-
except:
|
|
222
|
+
except Exception:
|
|
161
223
|
continue # Timeout or other error, continue loop
|
|
162
224
|
|
|
163
225
|
async def setup_logging(self, log_type: str) -> Path:
|
|
@@ -242,7 +304,7 @@ class LogManager:
|
|
|
242
304
|
return 0
|
|
243
305
|
|
|
244
306
|
# Calculate cutoff time
|
|
245
|
-
cutoff_time = datetime.now() - timedelta(hours=retention_hours)
|
|
307
|
+
cutoff_time = datetime.now(timezone.utc) - timedelta(hours=retention_hours)
|
|
246
308
|
|
|
247
309
|
# Schedule async cleanup
|
|
248
310
|
deleted_count = await self._async_cleanup(directory, pattern, cutoff_time)
|
|
@@ -283,7 +345,9 @@ class LogManager:
|
|
|
283
345
|
|
|
284
346
|
try:
|
|
285
347
|
# Check file modification time
|
|
286
|
-
mtime = datetime.fromtimestamp(
|
|
348
|
+
mtime = datetime.fromtimestamp(
|
|
349
|
+
file_path.stat().st_mtime, tz=timezone.utc
|
|
350
|
+
)
|
|
287
351
|
if mtime < cutoff_time:
|
|
288
352
|
file_path.unlink()
|
|
289
353
|
deleted_count += 1
|
|
@@ -316,7 +380,7 @@ class LogManager:
|
|
|
316
380
|
return 0
|
|
317
381
|
|
|
318
382
|
# Calculate cutoff time
|
|
319
|
-
cutoff_time = datetime.now() - timedelta(hours=retention_hours)
|
|
383
|
+
cutoff_time = datetime.now(timezone.utc) - timedelta(hours=retention_hours)
|
|
320
384
|
deleted_count = 0
|
|
321
385
|
|
|
322
386
|
try:
|
|
@@ -332,7 +396,9 @@ class LogManager:
|
|
|
332
396
|
|
|
333
397
|
try:
|
|
334
398
|
# Check file modification time
|
|
335
|
-
mtime = datetime.fromtimestamp(
|
|
399
|
+
mtime = datetime.fromtimestamp(
|
|
400
|
+
file_path.stat().st_mtime, tz=timezone.utc
|
|
401
|
+
)
|
|
336
402
|
if mtime < cutoff_time:
|
|
337
403
|
file_path.unlink()
|
|
338
404
|
deleted_count += 1
|
|
@@ -350,13 +416,14 @@ class LogManager:
|
|
|
350
416
|
"""
|
|
351
417
|
One-time migration to move existing MPM logs to new subdirectory.
|
|
352
418
|
|
|
353
|
-
Moves mpm_*.log files from .claude-mpm/logs/
|
|
419
|
+
Moves mpm_*.log files from old locations to .claude-mpm/logs/mpm/
|
|
354
420
|
"""
|
|
355
421
|
try:
|
|
356
|
-
# Check
|
|
422
|
+
# Check old possible locations (including incorrectly created ones)
|
|
357
423
|
old_locations = [
|
|
358
|
-
Path.cwd() / "
|
|
359
|
-
|
|
424
|
+
Path.cwd() / "logs", # Incorrectly created in project root
|
|
425
|
+
Path.cwd() / ".claude-mpm" / "logs", # Correct base location
|
|
426
|
+
self.base_log_dir, # Current base location (.claude-mpm/logs/)
|
|
360
427
|
]
|
|
361
428
|
new_location = self.base_log_dir / "mpm"
|
|
362
429
|
|
|
@@ -413,7 +480,7 @@ class LogManager:
|
|
|
413
480
|
prompts_dir = await self.setup_logging("prompts")
|
|
414
481
|
|
|
415
482
|
# Generate filename with timestamp
|
|
416
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[
|
|
483
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S_%f")[
|
|
417
484
|
:-3
|
|
418
485
|
] # Microseconds to milliseconds
|
|
419
486
|
|
|
@@ -439,7 +506,7 @@ class LogManager:
|
|
|
439
506
|
|
|
440
507
|
# Prepare prompt data
|
|
441
508
|
prompt_data = {
|
|
442
|
-
"timestamp": datetime.now().isoformat(),
|
|
509
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
443
510
|
"type": prompt_type,
|
|
444
511
|
"content": content,
|
|
445
512
|
"metadata": metadata or {},
|
|
@@ -475,12 +542,12 @@ class LogManager:
|
|
|
475
542
|
|
|
476
543
|
if extension == ".json":
|
|
477
544
|
# JSON files also get structured metadata for consistency
|
|
478
|
-
with open(
|
|
545
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
479
546
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
480
547
|
# For markdown or text files
|
|
481
548
|
elif isinstance(data, dict):
|
|
482
549
|
# Write as formatted markdown with metadata
|
|
483
|
-
with open(
|
|
550
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
484
551
|
f.write("---\n")
|
|
485
552
|
f.write(f"timestamp: {data.get('timestamp', 'unknown')}\n")
|
|
486
553
|
f.write(f"type: {data.get('type', 'unknown')}\n")
|
|
@@ -492,7 +559,7 @@ class LogManager:
|
|
|
492
559
|
f.write(data.get("content", ""))
|
|
493
560
|
else:
|
|
494
561
|
# Write content directly
|
|
495
|
-
with open(
|
|
562
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
496
563
|
f.write(str(data))
|
|
497
564
|
except Exception as e:
|
|
498
565
|
logger.error(f"Failed to write {file_path}: {e}")
|
|
@@ -512,16 +579,18 @@ class LogManager:
|
|
|
512
579
|
message: Log message to write
|
|
513
580
|
level: Log level (INFO, WARNING, ERROR, DEBUG)
|
|
514
581
|
"""
|
|
515
|
-
timestamp = datetime.now().isoformat()
|
|
582
|
+
timestamp = datetime.now(timezone.utc).isoformat()
|
|
516
583
|
log_entry = f"[{timestamp}] [{level}] {message}\n"
|
|
517
584
|
|
|
518
585
|
# Get appropriate log file based on context
|
|
519
586
|
log_dir = self._get_log_directory("mpm")
|
|
520
|
-
log_file = log_dir / f"mpm_{datetime.now().strftime('%Y%m%d')}.log"
|
|
587
|
+
log_file = log_dir / f"mpm_{datetime.now(timezone.utc).strftime('%Y%m%d')}.log"
|
|
521
588
|
|
|
522
589
|
def write_task():
|
|
523
590
|
try:
|
|
524
|
-
|
|
591
|
+
# Ensure directory exists before writing (race condition with cleanup)
|
|
592
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
593
|
+
with log_file.open("a", encoding="utf-8") as f:
|
|
525
594
|
f.write(log_entry)
|
|
526
595
|
except Exception as e:
|
|
527
596
|
logger.error(f"Failed to write log: {e}")
|
|
@@ -597,7 +666,7 @@ class LogManager:
|
|
|
597
666
|
try:
|
|
598
667
|
self.write_queue.put_nowait(None)
|
|
599
668
|
self.cleanup_queue.put_nowait(None)
|
|
600
|
-
except:
|
|
669
|
+
except Exception:
|
|
601
670
|
pass
|
|
602
671
|
|
|
603
672
|
# Wait for threads to finish
|