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
|
@@ -22,18 +22,22 @@ import os
|
|
|
22
22
|
import sys
|
|
23
23
|
import time
|
|
24
24
|
from dataclasses import asdict, dataclass
|
|
25
|
-
from datetime import datetime
|
|
25
|
+
from datetime import datetime, timezone
|
|
26
26
|
from enum import Enum
|
|
27
27
|
from queue import Full, Queue
|
|
28
28
|
from threading import Lock, Thread
|
|
29
29
|
from typing import Any, Dict, Optional
|
|
30
30
|
|
|
31
31
|
from claude_mpm.core.constants import PerformanceConfig, SystemLimits, TimeoutConfig
|
|
32
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
33
|
+
|
|
34
|
+
# Import centralized session manager
|
|
35
|
+
from claude_mpm.services.session_manager import get_session_manager
|
|
32
36
|
|
|
33
37
|
# Import configuration manager
|
|
34
38
|
from ..core.config import Config
|
|
35
39
|
|
|
36
|
-
logger =
|
|
40
|
+
logger = get_logger(__name__)
|
|
37
41
|
|
|
38
42
|
|
|
39
43
|
class LogFormat(Enum):
|
|
@@ -67,8 +71,13 @@ class AsyncSessionLogger:
|
|
|
67
71
|
- Configurable log formats (JSON, syslog, journald)
|
|
68
72
|
- Fire-and-forget pattern for zero latency impact
|
|
69
73
|
- Graceful degradation on errors
|
|
74
|
+
- Thread-safe singleton pattern with initialization flag
|
|
70
75
|
"""
|
|
71
76
|
|
|
77
|
+
_initialization_lock = Lock()
|
|
78
|
+
_initialized = False
|
|
79
|
+
_worker_started = False
|
|
80
|
+
|
|
72
81
|
def __init__(
|
|
73
82
|
self,
|
|
74
83
|
base_dir: Optional[Path] = None,
|
|
@@ -89,104 +98,108 @@ class AsyncSessionLogger:
|
|
|
89
98
|
enable_compression: Enable gzip compression for JSON logs (overrides config)
|
|
90
99
|
config: Configuration instance to use (creates new if not provided)
|
|
91
100
|
"""
|
|
92
|
-
#
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
# Get response logging configuration section
|
|
98
|
-
response_config = self.config.get("response_logging", {})
|
|
99
|
-
|
|
100
|
-
# Apply configuration with parameter overrides
|
|
101
|
-
self.base_dir = Path(
|
|
102
|
-
base_dir
|
|
103
|
-
or response_config.get("session_directory", ".claude-mpm/responses")
|
|
104
|
-
)
|
|
101
|
+
# Use initialization flag to prevent duplicate setup
|
|
102
|
+
with self._initialization_lock:
|
|
103
|
+
if self._initialized and hasattr(self, "config"):
|
|
104
|
+
logger.debug("AsyncSessionLogger already initialized, skipping setup")
|
|
105
|
+
return
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
self.
|
|
110
|
-
elif format_str == "syslog":
|
|
111
|
-
self.log_format = LogFormat.SYSLOG
|
|
112
|
-
elif format_str == "journald":
|
|
113
|
-
self.log_format = LogFormat.JOURNALD
|
|
114
|
-
else:
|
|
115
|
-
self.log_format = LogFormat.JSON
|
|
107
|
+
# Load configuration from YAML file or use provided config
|
|
108
|
+
if config is None:
|
|
109
|
+
config = Config()
|
|
110
|
+
self.config = config
|
|
116
111
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if max_queue_size is not None
|
|
120
|
-
else response_config.get("max_queue_size", SystemLimits.MAX_QUEUE_SIZE)
|
|
121
|
-
)
|
|
112
|
+
# Get response logging configuration section
|
|
113
|
+
response_config = self.config.get("response_logging", {})
|
|
122
114
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
self.enable_async = response_config.get("use_async", True)
|
|
129
|
-
# Override with environment variable if set (backward compatibility)
|
|
130
|
-
if os.environ.get("CLAUDE_USE_ASYNC_LOG"):
|
|
131
|
-
self.enable_async = (
|
|
132
|
-
os.environ.get("CLAUDE_USE_ASYNC_LOG", "true").lower() == "true"
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
# Check debug sync mode (forces synchronous for debugging)
|
|
136
|
-
if (
|
|
137
|
-
response_config.get("debug_sync", False)
|
|
138
|
-
or os.environ.get("CLAUDE_LOG_SYNC", "").lower() == "true"
|
|
139
|
-
):
|
|
140
|
-
logger.info("Debug sync mode enabled - forcing synchronous logging")
|
|
141
|
-
self.enable_async = False
|
|
142
|
-
|
|
143
|
-
self.enable_compression = (
|
|
144
|
-
enable_compression
|
|
145
|
-
if enable_compression is not None
|
|
146
|
-
else response_config.get("enable_compression", False)
|
|
147
|
-
)
|
|
115
|
+
# Apply configuration with parameter overrides
|
|
116
|
+
self.base_dir = Path(
|
|
117
|
+
base_dir
|
|
118
|
+
or response_config.get("session_directory", ".claude-mpm/responses")
|
|
119
|
+
)
|
|
148
120
|
|
|
149
|
-
|
|
150
|
-
|
|
121
|
+
# Convert log format string to enum
|
|
122
|
+
format_str = response_config.get("format", "json").lower()
|
|
123
|
+
if log_format is not None:
|
|
124
|
+
self.log_format = log_format
|
|
125
|
+
elif format_str == "syslog":
|
|
126
|
+
self.log_format = LogFormat.SYSLOG
|
|
127
|
+
elif format_str == "journald":
|
|
128
|
+
self.log_format = LogFormat.JOURNALD
|
|
129
|
+
else:
|
|
130
|
+
self.log_format = LogFormat.JSON
|
|
151
131
|
|
|
152
|
-
|
|
153
|
-
|
|
132
|
+
self.max_queue_size = (
|
|
133
|
+
max_queue_size
|
|
134
|
+
if max_queue_size is not None
|
|
135
|
+
else response_config.get("max_queue_size", SystemLimits.MAX_QUEUE_SIZE)
|
|
136
|
+
)
|
|
154
137
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
138
|
+
# Handle async configuration with backward compatibility
|
|
139
|
+
if enable_async is not None:
|
|
140
|
+
self.enable_async = enable_async
|
|
141
|
+
else:
|
|
142
|
+
# Check configuration first, then environment variables for backward compatibility
|
|
143
|
+
self.enable_async = response_config.get("use_async", True)
|
|
144
|
+
# Override with environment variable if set (backward compatibility)
|
|
145
|
+
if os.environ.get("CLAUDE_USE_ASYNC_LOG"):
|
|
146
|
+
self.enable_async = (
|
|
147
|
+
os.environ.get("CLAUDE_USE_ASYNC_LOG", "true").lower() == "true"
|
|
148
|
+
)
|
|
160
149
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
150
|
+
# Check debug sync mode (forces synchronous for debugging)
|
|
151
|
+
if (
|
|
152
|
+
response_config.get("debug_sync", False)
|
|
153
|
+
or os.environ.get("CLAUDE_LOG_SYNC", "").lower() == "true"
|
|
154
|
+
):
|
|
155
|
+
logger.info("Debug sync mode enabled - forcing synchronous logging")
|
|
156
|
+
self.enable_async = False
|
|
157
|
+
|
|
158
|
+
self.enable_compression = (
|
|
159
|
+
enable_compression
|
|
160
|
+
if enable_compression is not None
|
|
161
|
+
else response_config.get("enable_compression", False)
|
|
162
|
+
)
|
|
169
163
|
|
|
170
|
-
|
|
171
|
-
|
|
164
|
+
# Create base directory
|
|
165
|
+
self.base_dir.mkdir(parents=True, exist_ok=True)
|
|
166
|
+
|
|
167
|
+
# Use centralized SessionManager for session ID
|
|
168
|
+
session_manager = get_session_manager()
|
|
169
|
+
self.session_id = session_manager.get_session_id()
|
|
170
|
+
|
|
171
|
+
# Async infrastructure
|
|
172
|
+
self._queue: Queue = Queue(maxsize=self.max_queue_size)
|
|
173
|
+
self._worker_thread: Optional[Thread] = None
|
|
174
|
+
self._shutdown = False
|
|
175
|
+
self._lock = Lock()
|
|
176
|
+
|
|
177
|
+
# Statistics
|
|
178
|
+
self.stats = {
|
|
179
|
+
"logged": 0,
|
|
180
|
+
"queued": 0,
|
|
181
|
+
"dropped": 0,
|
|
182
|
+
"errors": 0,
|
|
183
|
+
"avg_write_time_ms": 0.0,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
# Initialize format-specific handlers
|
|
187
|
+
self._init_format_handler()
|
|
188
|
+
|
|
189
|
+
# Mark as initialized
|
|
190
|
+
self._initialized = True
|
|
191
|
+
|
|
192
|
+
# Log initialization status
|
|
193
|
+
logger.debug(
|
|
194
|
+
f"AsyncSessionLogger initialized with SessionManager: session_id={self.session_id}, async={self.enable_async}, format={self.log_format.value}"
|
|
195
|
+
)
|
|
172
196
|
|
|
173
|
-
# Start background worker if async enabled
|
|
174
|
-
if self.enable_async:
|
|
175
|
-
self.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
# Check environment variables in order of preference
|
|
180
|
-
for env_var in ["CLAUDE_SESSION_ID", "ANTHROPIC_SESSION_ID", "SESSION_ID"]:
|
|
181
|
-
session_id = os.environ.get(env_var)
|
|
182
|
-
if session_id:
|
|
183
|
-
logger.info(f"Using session ID from {env_var}: {session_id}")
|
|
184
|
-
return session_id
|
|
185
|
-
|
|
186
|
-
# Generate timestamp-based session ID
|
|
187
|
-
session_id = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
188
|
-
logger.info(f"Generated session ID: {session_id}")
|
|
189
|
-
return session_id
|
|
197
|
+
# Start background worker if async enabled (outside initialization lock)
|
|
198
|
+
if self.enable_async and not self._worker_started:
|
|
199
|
+
with self._initialization_lock:
|
|
200
|
+
if not self._worker_started:
|
|
201
|
+
self._start_worker()
|
|
202
|
+
self._worker_started = True
|
|
190
203
|
|
|
191
204
|
def _init_format_handler(self):
|
|
192
205
|
"""Initialize format-specific logging handlers."""
|
|
@@ -323,7 +336,7 @@ class AsyncSessionLogger:
|
|
|
323
336
|
with gzip.open(file_path, "wt", encoding="utf-8") as f:
|
|
324
337
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
325
338
|
else:
|
|
326
|
-
with open(
|
|
339
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
327
340
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
328
341
|
|
|
329
342
|
logger.debug(f"Wrote log entry to {file_path}")
|
|
@@ -406,7 +419,7 @@ class AsyncSessionLogger:
|
|
|
406
419
|
agent_name = metadata["agent"].replace(" ", "_").lower()
|
|
407
420
|
|
|
408
421
|
# Create timestamp with microsecond precision
|
|
409
|
-
now = datetime.now()
|
|
422
|
+
now = datetime.now(timezone.utc)
|
|
410
423
|
timestamp = now.isoformat()
|
|
411
424
|
microseconds = now.microsecond
|
|
412
425
|
|
|
@@ -470,8 +483,19 @@ class AsyncSessionLogger:
|
|
|
470
483
|
Args:
|
|
471
484
|
timeout: Maximum time to wait for shutdown
|
|
472
485
|
"""
|
|
486
|
+
# Only log shutdown if we're actually shutting down an active logger
|
|
487
|
+
if self._shutdown:
|
|
488
|
+
logger.debug("AsyncSessionLogger already shut down")
|
|
489
|
+
return
|
|
490
|
+
|
|
473
491
|
if self.enable_async:
|
|
474
|
-
|
|
492
|
+
# Only log at INFO level if we actually processed something
|
|
493
|
+
if self.stats.get("logged", 0) > 0 or self.stats.get("queued", 0) > 0:
|
|
494
|
+
logger.info(
|
|
495
|
+
f"Shutting down async logger (logged: {self.stats.get('logged', 0)}, queued: {self.stats.get('queued', 0)})"
|
|
496
|
+
)
|
|
497
|
+
else:
|
|
498
|
+
logger.debug("Shutting down async logger (no activity)")
|
|
475
499
|
|
|
476
500
|
# Signal shutdown
|
|
477
501
|
self._shutdown = True
|
|
@@ -483,8 +507,18 @@ class AsyncSessionLogger:
|
|
|
483
507
|
if self._worker_thread.is_alive():
|
|
484
508
|
logger.warning("Worker thread did not shutdown cleanly")
|
|
485
509
|
|
|
486
|
-
# Log final statistics
|
|
487
|
-
|
|
510
|
+
# Log final statistics only if we actually logged something
|
|
511
|
+
if self.stats.get("logged", 0) > 0:
|
|
512
|
+
logger.info(f"AsyncSessionLogger final stats: {self.stats}")
|
|
513
|
+
elif self.stats.get("queued", 0) > 0 or self.stats.get("dropped", 0) > 0:
|
|
514
|
+
logger.debug(
|
|
515
|
+
f"AsyncSessionLogger stats (incomplete session): {self.stats}"
|
|
516
|
+
)
|
|
517
|
+
else:
|
|
518
|
+
# Use debug level when nothing was logged
|
|
519
|
+
logger.debug(
|
|
520
|
+
f"AsyncSessionLogger stats (no sessions logged): {self.stats}"
|
|
521
|
+
)
|
|
488
522
|
|
|
489
523
|
def get_stats(self) -> Dict[str, Any]:
|
|
490
524
|
"""Get logger statistics."""
|
|
@@ -492,9 +526,18 @@ class AsyncSessionLogger:
|
|
|
492
526
|
return self.stats.copy()
|
|
493
527
|
|
|
494
528
|
def set_session_id(self, session_id: str):
|
|
495
|
-
"""Set a new session ID.
|
|
529
|
+
"""Set a new session ID.
|
|
530
|
+
|
|
531
|
+
Note: This updates both the local session ID and the SessionManager.
|
|
532
|
+
|
|
533
|
+
Args:
|
|
534
|
+
session_id: The new session ID to use
|
|
535
|
+
"""
|
|
496
536
|
self.session_id = session_id
|
|
497
|
-
|
|
537
|
+
# Also update SessionManager to keep consistency
|
|
538
|
+
session_manager = get_session_manager()
|
|
539
|
+
session_manager.set_session_id(session_id)
|
|
540
|
+
logger.debug(f"Session ID updated to: {session_id}")
|
|
498
541
|
|
|
499
542
|
def is_enabled(self) -> bool:
|
|
500
543
|
"""Check if logging is enabled."""
|
|
@@ -10,33 +10,38 @@ Now with optional async logging support for improved performance.
|
|
|
10
10
|
Configuration via .claude-mpm/configuration.yaml.
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
+
# Try to import async logger for performance optimization
|
|
14
|
+
import importlib.util
|
|
13
15
|
import json
|
|
14
|
-
import logging
|
|
15
16
|
import os
|
|
16
|
-
from datetime import datetime
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from threading import Lock
|
|
17
19
|
from typing import Any, Dict, Optional
|
|
18
20
|
|
|
19
21
|
# Import configuration manager
|
|
20
22
|
from claude_mpm.core.config import Config
|
|
21
23
|
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
log_response_async,
|
|
28
|
-
)
|
|
24
|
+
# Import centralized session manager
|
|
25
|
+
from claude_mpm.services.session_manager import get_session_manager
|
|
26
|
+
|
|
27
|
+
if importlib.util.find_spec("claude_mpm.services.async_session_logger"):
|
|
28
|
+
from claude_mpm.services.async_session_logger import get_async_logger
|
|
29
29
|
|
|
30
30
|
ASYNC_AVAILABLE = True
|
|
31
|
-
|
|
31
|
+
else:
|
|
32
32
|
ASYNC_AVAILABLE = False
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
35
|
+
|
|
36
|
+
logger = get_logger(__name__)
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
class ClaudeSessionLogger:
|
|
38
40
|
"""Simplified response logger for Claude Code sessions."""
|
|
39
41
|
|
|
42
|
+
_initialization_lock = Lock()
|
|
43
|
+
_initialized = False
|
|
44
|
+
|
|
40
45
|
def __init__(
|
|
41
46
|
self,
|
|
42
47
|
base_dir: Optional[Path] = None,
|
|
@@ -51,29 +56,41 @@ class ClaudeSessionLogger:
|
|
|
51
56
|
use_async: Use async logging if available. Overrides config.
|
|
52
57
|
config: Configuration instance to use (creates new if not provided)
|
|
53
58
|
"""
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
base_dir
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
59
|
+
# Use initialization flag to prevent duplicate setup
|
|
60
|
+
with self._initialization_lock:
|
|
61
|
+
if self._initialized and hasattr(self, "config"):
|
|
62
|
+
logger.debug("ClaudeSessionLogger already initialized, skipping setup")
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
# Load configuration
|
|
66
|
+
if config is None:
|
|
67
|
+
config = Config()
|
|
68
|
+
self.config = config
|
|
69
|
+
|
|
70
|
+
# Get response logging configuration
|
|
71
|
+
response_config = self.config.get("response_logging", {})
|
|
72
|
+
|
|
73
|
+
# Determine base directory
|
|
74
|
+
if base_dir is None:
|
|
75
|
+
# Check configuration first
|
|
76
|
+
base_dir = response_config.get("session_directory")
|
|
77
|
+
if not base_dir:
|
|
78
|
+
# Fall back to default response directory
|
|
79
|
+
base_dir = ".claude-mpm/responses"
|
|
80
|
+
base_dir = Path(base_dir)
|
|
81
|
+
|
|
82
|
+
self.base_dir = Path(base_dir)
|
|
83
|
+
self.base_dir.mkdir(parents=True, exist_ok=True)
|
|
84
|
+
|
|
85
|
+
# Use centralized SessionManager for session ID
|
|
86
|
+
session_manager = get_session_manager()
|
|
87
|
+
self.session_id = session_manager.get_session_id()
|
|
88
|
+
logger.debug(
|
|
89
|
+
f"ClaudeSessionLogger using session ID from SessionManager: {self.session_id}"
|
|
90
|
+
)
|
|
73
91
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
self.response_counter = {} # Track response count per session
|
|
92
|
+
self.response_counter = {} # Track response count per session
|
|
93
|
+
self._initialized = True
|
|
77
94
|
|
|
78
95
|
# Determine if we should use async logging
|
|
79
96
|
if use_async is None:
|
|
@@ -100,46 +117,22 @@ class ClaudeSessionLogger:
|
|
|
100
117
|
|
|
101
118
|
if self.use_async:
|
|
102
119
|
try:
|
|
120
|
+
# Pass our session_id to async logger to avoid duplicate generation
|
|
103
121
|
self._async_logger = get_async_logger(config=config)
|
|
104
|
-
|
|
122
|
+
# Synchronize session IDs - use the one we already generated
|
|
123
|
+
if self.session_id and hasattr(self._async_logger, "set_session_id"):
|
|
124
|
+
self._async_logger.set_session_id(self.session_id)
|
|
125
|
+
logger.debug(
|
|
126
|
+
f"Using async logger with session ID: {self.session_id}"
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
logger.debug("Using async logger for improved performance")
|
|
105
130
|
except Exception as e:
|
|
106
131
|
logger.warning(
|
|
107
132
|
f"Failed to initialize async logger, falling back to sync: {e}"
|
|
108
133
|
)
|
|
109
134
|
self.use_async = False
|
|
110
135
|
|
|
111
|
-
def _get_claude_session_id(self) -> Optional[str]:
|
|
112
|
-
"""
|
|
113
|
-
Get the Claude Code session ID from environment.
|
|
114
|
-
|
|
115
|
-
Returns:
|
|
116
|
-
Session ID if available, None otherwise
|
|
117
|
-
"""
|
|
118
|
-
# Claude Code may set various environment variables
|
|
119
|
-
# Check common patterns
|
|
120
|
-
session_id = None
|
|
121
|
-
|
|
122
|
-
# Check for CLAUDE_SESSION_ID
|
|
123
|
-
session_id = os.environ.get("CLAUDE_SESSION_ID")
|
|
124
|
-
|
|
125
|
-
# Check for ANTHROPIC_SESSION_ID
|
|
126
|
-
if not session_id:
|
|
127
|
-
session_id = os.environ.get("ANTHROPIC_SESSION_ID")
|
|
128
|
-
|
|
129
|
-
# Check for generic SESSION_ID
|
|
130
|
-
if not session_id:
|
|
131
|
-
session_id = os.environ.get("SESSION_ID")
|
|
132
|
-
|
|
133
|
-
# Generate a default based on timestamp if nothing found
|
|
134
|
-
if not session_id:
|
|
135
|
-
# Use a timestamp-based session ID as fallback
|
|
136
|
-
session_id = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
137
|
-
logger.info(f"No Claude session ID found, using generated: {session_id}")
|
|
138
|
-
else:
|
|
139
|
-
logger.info(f"Using Claude session ID: {session_id}")
|
|
140
|
-
|
|
141
|
-
return session_id
|
|
142
|
-
|
|
143
136
|
def _generate_filename(self, agent: Optional[str] = None) -> str:
|
|
144
137
|
"""
|
|
145
138
|
Generate a flat filename with session ID, agent, and timestamp.
|
|
@@ -156,7 +149,7 @@ class ClaudeSessionLogger:
|
|
|
156
149
|
agent_name = agent_name.replace(" ", "_").lower()
|
|
157
150
|
|
|
158
151
|
# Generate timestamp with microseconds for uniqueness
|
|
159
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
152
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S_%f")
|
|
160
153
|
|
|
161
154
|
# Create filename: session_id-agent-timestamp.json
|
|
162
155
|
return f"{self.session_id}-{agent_name}-{timestamp}.json"
|
|
@@ -216,7 +209,7 @@ class ClaudeSessionLogger:
|
|
|
216
209
|
|
|
217
210
|
# Prepare response data with standardized field names
|
|
218
211
|
response_data = {
|
|
219
|
-
"timestamp": datetime.now().isoformat(),
|
|
212
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
220
213
|
"session_id": self.session_id,
|
|
221
214
|
"request": request_summary, # Standardized field name
|
|
222
215
|
"response": response_content, # Already correct
|
|
@@ -228,7 +221,7 @@ class ClaudeSessionLogger:
|
|
|
228
221
|
|
|
229
222
|
# Save response
|
|
230
223
|
try:
|
|
231
|
-
with open(
|
|
224
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
232
225
|
json.dump(response_data, f, indent=2, ensure_ascii=False)
|
|
233
226
|
|
|
234
227
|
logger.debug(f"Logged response to {filename} for session {self.session_id}")
|
|
@@ -242,10 +235,15 @@ class ClaudeSessionLogger:
|
|
|
242
235
|
"""
|
|
243
236
|
Manually set the session ID.
|
|
244
237
|
|
|
238
|
+
Note: This updates both the local session ID and the SessionManager.
|
|
239
|
+
|
|
245
240
|
Args:
|
|
246
241
|
session_id: The session ID to use
|
|
247
242
|
"""
|
|
248
243
|
self.session_id = session_id
|
|
244
|
+
# Also update SessionManager to keep consistency
|
|
245
|
+
session_manager = get_session_manager()
|
|
246
|
+
session_manager.set_session_id(session_id)
|
|
249
247
|
logger.info(f"Session ID set to: {session_id}")
|
|
250
248
|
|
|
251
249
|
def get_session_path(self) -> Optional[Path]:
|
|
@@ -271,13 +269,16 @@ class ClaudeSessionLogger:
|
|
|
271
269
|
return self.session_id is not None
|
|
272
270
|
|
|
273
271
|
|
|
274
|
-
# Singleton instance
|
|
272
|
+
# Singleton instance with thread-safe initialization
|
|
275
273
|
_logger_instance = None
|
|
274
|
+
_logger_lock = Lock()
|
|
276
275
|
|
|
277
276
|
|
|
278
277
|
def get_session_logger(config: Optional[Config] = None) -> ClaudeSessionLogger:
|
|
279
278
|
"""
|
|
280
|
-
Get the singleton session logger instance.
|
|
279
|
+
Get the singleton session logger instance with thread-safe initialization.
|
|
280
|
+
|
|
281
|
+
Uses double-checked locking pattern to ensure thread safety.
|
|
281
282
|
|
|
282
283
|
Args:
|
|
283
284
|
config: Optional configuration instance to use
|
|
@@ -286,9 +287,16 @@ def get_session_logger(config: Optional[Config] = None) -> ClaudeSessionLogger:
|
|
|
286
287
|
The shared ClaudeSessionLogger instance
|
|
287
288
|
"""
|
|
288
289
|
global _logger_instance
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
|
|
291
|
+
# Fast path - check without lock
|
|
292
|
+
if _logger_instance is not None:
|
|
293
|
+
return _logger_instance
|
|
294
|
+
|
|
295
|
+
# Slow path - acquire lock and double-check
|
|
296
|
+
with _logger_lock:
|
|
297
|
+
if _logger_instance is None:
|
|
298
|
+
_logger_instance = ClaudeSessionLogger(config=config)
|
|
299
|
+
return _logger_instance
|
|
292
300
|
|
|
293
301
|
|
|
294
302
|
def log_response(
|
|
@@ -138,6 +138,11 @@ class AgentCleanupService(IAgentCleanupService):
|
|
|
138
138
|
if not isinstance(result, dict):
|
|
139
139
|
result = {"success": bool(result)}
|
|
140
140
|
|
|
141
|
+
# Add success flag based on whether there were errors
|
|
142
|
+
if "success" not in result:
|
|
143
|
+
# Consider it successful if no errors occurred
|
|
144
|
+
result["success"] = not bool(result.get("errors"))
|
|
145
|
+
|
|
141
146
|
# Add cleaned_count for backward compatibility
|
|
142
147
|
if "cleaned_count" not in result:
|
|
143
148
|
removed_count = len(result.get("removed", []))
|
|
@@ -169,8 +169,8 @@ class AgentListingService(IAgentListingService):
|
|
|
169
169
|
|
|
170
170
|
base_service = AgentDeploymentService()
|
|
171
171
|
self._deployment_service = DeploymentServiceWrapper(base_service)
|
|
172
|
-
except ImportError:
|
|
173
|
-
raise ImportError("Agent deployment service not available")
|
|
172
|
+
except ImportError as e:
|
|
173
|
+
raise ImportError("Agent deployment service not available") from e
|
|
174
174
|
return self._deployment_service
|
|
175
175
|
|
|
176
176
|
@property
|
|
@@ -250,11 +250,11 @@ class AgentListingService(IAgentListingService):
|
|
|
250
250
|
type=agent_data.get("type", "agent"),
|
|
251
251
|
tier=agent_data.get("tier", "system"),
|
|
252
252
|
path=agent_data.get("path", ""),
|
|
253
|
-
description=agent_data.get("description")
|
|
253
|
+
description=agent_data.get("description"),
|
|
254
254
|
specializations=(
|
|
255
255
|
agent_data.get("specializations") if verbose else None
|
|
256
256
|
),
|
|
257
|
-
version=agent_data.get("version")
|
|
257
|
+
version=agent_data.get("version"),
|
|
258
258
|
deployed=True,
|
|
259
259
|
)
|
|
260
260
|
agents.append(agent)
|
|
@@ -364,7 +364,7 @@ class AgentListingService(IAgentListingService):
|
|
|
364
364
|
if not agent_path.exists():
|
|
365
365
|
return None
|
|
366
366
|
|
|
367
|
-
with open(
|
|
367
|
+
with agent_path.open() as f:
|
|
368
368
|
content = f.read()
|
|
369
369
|
|
|
370
370
|
details = {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Agent Validation Service
|
|
3
5
|
========================
|
|
@@ -70,7 +72,7 @@ class AgentValidationService(IAgentValidationService):
|
|
|
70
72
|
self._registry = adapter.registry
|
|
71
73
|
except Exception as e:
|
|
72
74
|
self.logger.error(f"Failed to initialize agent registry: {e}")
|
|
73
|
-
raise RuntimeError(f"Could not initialize agent registry: {e}")
|
|
75
|
+
raise RuntimeError(f"Could not initialize agent registry: {e}") from e
|
|
74
76
|
return self._registry
|
|
75
77
|
|
|
76
78
|
def validate_agent(self, agent_name: str) -> Dict[str, Any]:
|