claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Git Operations Manager - Core Git operation automation for Version Control Agent.
         | 
| 3 5 |  | 
| @@ -9,14 +11,13 @@ This module provides comprehensive Git operation management including: | |
| 9 11 | 
             
            5. Automatic branch lifecycle management
         | 
| 10 12 | 
             
            """
         | 
| 11 13 |  | 
| 14 | 
            +
            import logging
         | 
| 12 15 | 
             
            import os
         | 
| 13 | 
            -
            import subprocess
         | 
| 14 16 | 
             
            import re
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            from pathlib import Path
         | 
| 17 | 
            -
            from typing import Dict, List, Optional, Any, Tuple
         | 
| 17 | 
            +
            import subprocess
         | 
| 18 18 | 
             
            from dataclasses import dataclass, field
         | 
| 19 | 
            -
            import  | 
| 19 | 
            +
            from datetime import datetime
         | 
| 20 | 
            +
            from typing import Any, Dict, List, Optional, Tuple
         | 
| 20 21 |  | 
| 21 22 |  | 
| 22 23 | 
             
            @dataclass
         | 
| @@ -52,7 +53,9 @@ class GitOperationResult: | |
| 52 53 | 
             
            class GitOperationError(Exception):
         | 
| 53 54 | 
             
                """Exception raised for Git operation errors."""
         | 
| 54 55 |  | 
| 55 | 
            -
                def __init__( | 
| 56 | 
            +
                def __init__(
         | 
| 57 | 
            +
                    self, message: str, command: str = "", output: str = "", error: str = ""
         | 
| 58 | 
            +
                ):
         | 
| 56 59 | 
             
                    super().__init__(message)
         | 
| 57 60 | 
             
                    self.command = command
         | 
| 58 61 | 
             
                    self.output = output
         | 
| @@ -89,7 +92,11 @@ class GitOperationsManager: | |
| 89 92 | 
             
                    }
         | 
| 90 93 |  | 
| 91 94 | 
             
                    # Merge strategies
         | 
| 92 | 
            -
                    self.merge_strategies = { | 
| 95 | 
            +
                    self.merge_strategies = {
         | 
| 96 | 
            +
                        "merge": "--no-ff",
         | 
| 97 | 
            +
                        "squash": "--squash",
         | 
| 98 | 
            +
                        "rebase": "--rebase",
         | 
| 99 | 
            +
                    }
         | 
| 93 100 |  | 
| 94 101 | 
             
                    # Validate Git repository
         | 
| 95 102 | 
             
                    if not self._is_git_repository():
         | 
| @@ -182,7 +189,8 @@ class GitOperationsManager: | |
| 182 189 | 
             
                    try:
         | 
| 183 190 | 
             
                        # Get remote tracking branch
         | 
| 184 191 | 
             
                        result = self._run_git_command(
         | 
| 185 | 
            -
                            ["rev-parse", "--abbrev-ref", f"{branch_name}@{{upstream}}"], | 
| 192 | 
            +
                            ["rev-parse", "--abbrev-ref", f"{branch_name}@{{upstream}}"],
         | 
| 193 | 
            +
                            check=False,
         | 
| 186 194 | 
             
                        )
         | 
| 187 195 |  | 
| 188 196 | 
             
                        if result.returncode == 0:
         | 
| @@ -191,7 +199,12 @@ class GitOperationsManager: | |
| 191 199 |  | 
| 192 200 | 
             
                            # Get ahead/behind info
         | 
| 193 201 | 
             
                            result = self._run_git_command(
         | 
| 194 | 
            -
                                [ | 
| 202 | 
            +
                                [
         | 
| 203 | 
            +
                                    "rev-list",
         | 
| 204 | 
            +
                                    "--left-right",
         | 
| 205 | 
            +
                                    "--count",
         | 
| 206 | 
            +
                                    f"{upstream}...{branch_name}",
         | 
| 207 | 
            +
                                ],
         | 
| 195 208 | 
             
                                check=False,
         | 
| 196 209 | 
             
                            )
         | 
| 197 210 |  | 
| @@ -208,7 +221,9 @@ class GitOperationsManager: | |
| 208 221 | 
             
                    last_commit_message = None
         | 
| 209 222 |  | 
| 210 223 | 
             
                    try:
         | 
| 211 | 
            -
                        result = self._run_git_command( | 
| 224 | 
            +
                        result = self._run_git_command(
         | 
| 225 | 
            +
                            ["log", "-1", "--format=%H", branch_name], check=False
         | 
| 226 | 
            +
                        )
         | 
| 212 227 |  | 
| 213 228 | 
             
                        if result.returncode == 0:
         | 
| 214 229 | 
             
                            last_commit = result.stdout.strip()
         | 
| @@ -273,7 +288,9 @@ class GitOperationsManager: | |
| 273 288 | 
             
                                            name=remote_branch,
         | 
| 274 289 | 
             
                                            current=False,
         | 
| 275 290 | 
             
                                            remote=(
         | 
| 276 | 
            -
                                                remote_branch.split("/")[0] | 
| 291 | 
            +
                                                remote_branch.split("/")[0]
         | 
| 292 | 
            +
                                                if "/" in remote_branch
         | 
| 293 | 
            +
                                                else None
         | 
| 277 294 | 
             
                                            ),
         | 
| 278 295 | 
             
                                        )
         | 
| 279 296 | 
             
                                    )
         | 
| @@ -308,10 +325,10 @@ class GitOperationsManager: | |
| 308 325 | 
             
                def is_file_tracked(self, file_path: str) -> bool:
         | 
| 309 326 | 
             
                    """
         | 
| 310 327 | 
             
                    Check if a file is tracked by git.
         | 
| 311 | 
            -
             | 
| 328 | 
            +
             | 
| 312 329 | 
             
                    Args:
         | 
| 313 330 | 
             
                        file_path: Path to the file to check (can be absolute or relative)
         | 
| 314 | 
            -
             | 
| 331 | 
            +
             | 
| 315 332 | 
             
                    Returns:
         | 
| 316 333 | 
             
                        bool: True if file is tracked, False otherwise
         | 
| 317 334 | 
             
                    """
         | 
| @@ -323,11 +340,11 @@ class GitOperationsManager: | |
| 323 340 | 
             
                            except ValueError:
         | 
| 324 341 | 
             
                                # If file is outside project root, it's not tracked
         | 
| 325 342 | 
             
                                return False
         | 
| 326 | 
            -
             | 
| 343 | 
            +
             | 
| 327 344 | 
             
                        # Use git ls-files to check if file is tracked
         | 
| 328 345 | 
             
                        result = self._run_git_command(["ls-files", "--", file_path])
         | 
| 329 346 | 
             
                        return bool(result.stdout.strip())
         | 
| 330 | 
            -
             | 
| 347 | 
            +
             | 
| 331 348 | 
             
                    except GitOperationError:
         | 
| 332 349 | 
             
                        return False
         | 
| 333 350 |  | 
| @@ -375,7 +392,9 @@ class GitOperationsManager: | |
| 375 392 | 
             
                        # Set up remote tracking if creating a new branch
         | 
| 376 393 | 
             
                        if switch_to_branch:
         | 
| 377 394 | 
             
                            try:
         | 
| 378 | 
            -
                                self._run_git_command( | 
| 395 | 
            +
                                self._run_git_command(
         | 
| 396 | 
            +
                                    ["push", "-u", "origin", full_branch_name], check=False
         | 
| 397 | 
            +
                                )
         | 
| 379 398 | 
             
                            except GitOperationError:
         | 
| 380 399 | 
             
                                # Remote push failed, continue without remote tracking
         | 
| 381 400 | 
             
                                pass
         | 
| @@ -504,7 +523,9 @@ class GitOperationsManager: | |
| 504 523 | 
             
                            merge_args = ["merge", strategy_arg, source_branch]
         | 
| 505 524 | 
             
                            if merge_strategy == "merge":
         | 
| 506 525 | 
             
                                # Add merge commit message
         | 
| 507 | 
            -
                                merge_args.extend( | 
| 526 | 
            +
                                merge_args.extend(
         | 
| 527 | 
            +
                                    ["-m", f"Merge {source_branch} into {target_branch}"]
         | 
| 528 | 
            +
                                )
         | 
| 508 529 |  | 
| 509 530 | 
             
                            result = self._run_git_command(merge_args)
         | 
| 510 531 |  | 
| @@ -547,7 +568,9 @@ class GitOperationsManager: | |
| 547 568 | 
             
                            execution_time=execution_time,
         | 
| 548 569 | 
             
                        )
         | 
| 549 570 |  | 
| 550 | 
            -
                def detect_merge_conflicts( | 
| 571 | 
            +
                def detect_merge_conflicts(
         | 
| 572 | 
            +
                    self, source_branch: str, target_branch: str
         | 
| 573 | 
            +
                ) -> Dict[str, Any]:
         | 
| 551 574 | 
             
                    """
         | 
| 552 575 | 
             
                    Detect potential merge conflicts between branches.
         | 
| 553 576 |  | 
| @@ -584,7 +607,10 @@ class GitOperationsManager: | |
| 584 607 | 
             
                                    parts = line.split("\t")
         | 
| 585 608 | 
             
                                    if len(parts) > 1:
         | 
| 586 609 | 
             
                                        filename = parts[1].strip()
         | 
| 587 | 
            -
                                        if  | 
| 610 | 
            +
                                        if (
         | 
| 611 | 
            +
                                            filename != "/dev/null"
         | 
| 612 | 
            +
                                            and filename not in conflicted_files
         | 
| 613 | 
            +
                                        ):
         | 
| 588 614 | 
             
                                            conflicted_files.append(filename)
         | 
| 589 615 |  | 
| 590 616 | 
             
                        return {
         | 
| @@ -611,7 +637,10 @@ class GitOperationsManager: | |
| 611 637 | 
             
                        return None
         | 
| 612 638 |  | 
| 613 639 | 
             
                def push_to_remote(
         | 
| 614 | 
            -
                    self, | 
| 640 | 
            +
                    self,
         | 
| 641 | 
            +
                    branch_name: Optional[str] = None,
         | 
| 642 | 
            +
                    remote: str = "origin",
         | 
| 643 | 
            +
                    set_upstream: bool = False,
         | 
| 615 644 | 
             
                ) -> GitOperationResult:
         | 
| 616 645 | 
             
                    """
         | 
| 617 646 | 
             
                    Push branch to remote repository.
         | 
| @@ -723,7 +752,9 @@ class GitOperationsManager: | |
| 723 752 | 
             
                            execution_time=execution_time,
         | 
| 724 753 | 
             
                        )
         | 
| 725 754 |  | 
| 726 | 
            -
                def cleanup_merged_branches( | 
| 755 | 
            +
                def cleanup_merged_branches(
         | 
| 756 | 
            +
                    self, target_branch: str = "main"
         | 
| 757 | 
            +
                ) -> GitOperationResult:
         | 
| 727 758 | 
             
                    """
         | 
| 728 759 | 
             
                    Clean up branches that have been merged into target branch.
         | 
| 729 760 |  | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Semantic Versioning Manager - Version management logic for Version Control Agent.
         | 
| 3 5 |  | 
| @@ -37,14 +39,13 @@ Change Analysis: | |
| 37 39 | 
             
            - Confidence scoring for version bump suggestions
         | 
| 38 40 | 
             
            """
         | 
| 39 41 |  | 
| 40 | 
            -
            import re
         | 
| 41 42 | 
             
            import json
         | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
            from typing import Dict, List, Optional, Any, Tuple, Union
         | 
| 43 | 
            +
            import logging
         | 
| 44 | 
            +
            import re
         | 
| 45 45 | 
             
            from dataclasses import dataclass, field
         | 
| 46 | 
            +
            from datetime import datetime
         | 
| 46 47 | 
             
            from enum import Enum
         | 
| 47 | 
            -
            import  | 
| 48 | 
            +
            from typing import Any, Dict, List, Optional, Tuple, Union
         | 
| 48 49 |  | 
| 49 50 | 
             
            from ...utils.config_manager import ConfigurationManager
         | 
| 50 51 |  | 
| @@ -61,20 +62,20 @@ class VersionBumpType(Enum): | |
| 61 62 | 
             
            @dataclass
         | 
| 62 63 | 
             
            class SemanticVersion:
         | 
| 63 64 | 
             
                """Represents a semantic version following semver.org specification.
         | 
| 64 | 
            -
             | 
| 65 | 
            +
             | 
| 65 66 | 
             
                This class encapsulates a semantic version with support for:
         | 
| 66 67 | 
             
                - Major, minor, and patch version numbers
         | 
| 67 68 | 
             
                - Pre-release identifiers (alpha, beta, rc, etc.)
         | 
| 68 69 | 
             
                - Build metadata
         | 
| 69 70 | 
             
                - Version comparison and sorting
         | 
| 70 71 | 
             
                - Version bumping operations
         | 
| 71 | 
            -
             | 
| 72 | 
            +
             | 
| 72 73 | 
             
                The comparison logic follows semver precedence rules:
         | 
| 73 74 | 
             
                1. Compare major, minor, patch numerically
         | 
| 74 75 | 
             
                2. Pre-release versions have lower precedence than normal versions
         | 
| 75 76 | 
             
                3. Pre-release identifiers are compared alphanumerically
         | 
| 76 77 | 
             
                4. Build metadata is ignored in comparisons
         | 
| 77 | 
            -
             | 
| 78 | 
            +
             | 
| 78 79 | 
             
                This is used for both project versioning and agent version management.
         | 
| 79 80 | 
             
                """
         | 
| 80 81 |  | 
| @@ -86,7 +87,7 @@ class SemanticVersion: | |
| 86 87 |  | 
| 87 88 | 
             
                def __str__(self) -> str:
         | 
| 88 89 | 
             
                    """String representation of version in semver format.
         | 
| 89 | 
            -
             | 
| 90 | 
            +
             | 
| 90 91 | 
             
                    Examples:
         | 
| 91 92 | 
             
                    - 1.2.3
         | 
| 92 93 | 
             
                    - 1.2.3-alpha.1
         | 
| @@ -102,13 +103,13 @@ class SemanticVersion: | |
| 102 103 |  | 
| 103 104 | 
             
                def __lt__(self, other: "SemanticVersion") -> bool:
         | 
| 104 105 | 
             
                    """Compare versions for sorting according to semver precedence.
         | 
| 105 | 
            -
             | 
| 106 | 
            +
             | 
| 106 107 | 
             
                    Comparison Rules:
         | 
| 107 108 | 
             
                    1. Version core (major.minor.patch) compared numerically
         | 
| 108 109 | 
             
                    2. Version with pre-release < same version without pre-release
         | 
| 109 110 | 
             
                    3. Pre-release versions compared alphanumerically
         | 
| 110 111 | 
             
                    4. Build metadata ignored (1.0.0+build1 == 1.0.0+build2)
         | 
| 111 | 
            -
             | 
| 112 | 
            +
             | 
| 112 113 | 
             
                    This enables proper version sorting for:
         | 
| 113 114 | 
             
                    - Determining latest version
         | 
| 114 115 | 
             
                    - Agent deployment decisions
         | 
| @@ -136,30 +137,30 @@ class SemanticVersion: | |
| 136 137 |  | 
| 137 138 | 
             
                def bump(self, bump_type: VersionBumpType) -> "SemanticVersion":
         | 
| 138 139 | 
             
                    """Create a new version with the specified bump applied.
         | 
| 139 | 
            -
             | 
| 140 | 
            +
             | 
| 140 141 | 
             
                    Version Bump Rules:
         | 
| 141 142 | 
             
                    - MAJOR: Increment major, reset minor and patch to 0
         | 
| 142 143 | 
             
                    - MINOR: Increment minor, reset patch to 0
         | 
| 143 144 | 
             
                    - PATCH: Increment patch only
         | 
| 144 145 | 
             
                    - PRERELEASE: Handle pre-release progression
         | 
| 145 | 
            -
             | 
| 146 | 
            +
             | 
| 146 147 | 
             
                    Pre-release Progression:
         | 
| 147 148 | 
             
                    - No prerelease -> alpha.1
         | 
| 148 149 | 
             
                    - alpha.1 -> alpha.2
         | 
| 149 150 | 
             
                    - beta.1 -> beta.2
         | 
| 150 151 | 
             
                    - rc.1 -> rc.2
         | 
| 151 152 | 
             
                    - custom -> custom.1
         | 
| 152 | 
            -
             | 
| 153 | 
            +
             | 
| 153 154 | 
             
                    Examples:
         | 
| 154 155 | 
             
                    - 1.2.3 + MAJOR -> 2.0.0
         | 
| 155 156 | 
             
                    - 1.2.3 + MINOR -> 1.3.0
         | 
| 156 157 | 
             
                    - 1.2.3 + PATCH -> 1.2.4
         | 
| 157 158 | 
             
                    - 1.2.3 + PRERELEASE -> 1.2.3-alpha.1
         | 
| 158 159 | 
             
                    - 1.2.3-alpha.1 + PRERELEASE -> 1.2.3-alpha.2
         | 
| 159 | 
            -
             | 
| 160 | 
            +
             | 
| 160 161 | 
             
                    Args:
         | 
| 161 162 | 
             
                        bump_type: Type of version bump to apply
         | 
| 162 | 
            -
             | 
| 163 | 
            +
             | 
| 163 164 | 
             
                    Returns:
         | 
| 164 165 | 
             
                        New SemanticVersion instance with bump applied
         | 
| 165 166 | 
             
                    """
         | 
| @@ -186,7 +187,9 @@ class SemanticVersion: | |
| 186 187 | 
             
                            # Start new prerelease series
         | 
| 187 188 | 
             
                            new_prerelease = "alpha.1"
         | 
| 188 189 |  | 
| 189 | 
            -
                        return SemanticVersion( | 
| 190 | 
            +
                        return SemanticVersion(
         | 
| 191 | 
            +
                            self.major, self.minor, self.patch, prerelease=new_prerelease
         | 
| 192 | 
            +
                        )
         | 
| 190 193 |  | 
| 191 194 | 
             
                    return self
         | 
| 192 195 |  | 
| @@ -287,13 +290,13 @@ class SemanticVersionManager: | |
| 287 290 | 
             
                    - 1.2.3-alpha.1 (with prerelease and number)
         | 
| 288 291 | 
             
                    - 1.2.3-beta.2+build.123 (full format)
         | 
| 289 292 | 
             
                    - 1.2.3+20230615 (with build metadata only)
         | 
| 290 | 
            -
             | 
| 293 | 
            +
             | 
| 291 294 | 
             
                    The parser is flexible and handles:
         | 
| 292 295 | 
             
                    - Optional 'v' prefix (stripped automatically)
         | 
| 293 296 | 
             
                    - Whitespace trimming
         | 
| 294 297 | 
             
                    - Full semver specification compliance
         | 
| 295 298 | 
             
                    - Graceful failure for invalid formats
         | 
| 296 | 
            -
             | 
| 299 | 
            +
             | 
| 297 300 | 
             
                    This is used for:
         | 
| 298 301 | 
             
                    - Parsing versions from files (package.json, etc.)
         | 
| 299 302 | 
             
                    - Converting git tags to versions
         | 
| @@ -335,7 +338,7 @@ class SemanticVersionManager: | |
| 335 338 | 
             
                def get_current_version(self) -> Optional[SemanticVersion]:
         | 
| 336 339 | 
             
                    """
         | 
| 337 340 | 
             
                    Get the current version from multiple sources with intelligent fallback.
         | 
| 338 | 
            -
             | 
| 341 | 
            +
             | 
| 339 342 | 
             
                    Uses the enhanced version parser to check:
         | 
| 340 343 | 
             
                    1. Git tags (most recent)
         | 
| 341 344 | 
             
                    2. VERSION file
         | 
| @@ -348,27 +351,33 @@ class SemanticVersionManager: | |
| 348 351 | 
             
                    """
         | 
| 349 352 | 
             
                    try:
         | 
| 350 353 | 
             
                        # Import here to avoid circular dependency
         | 
| 351 | 
            -
                        from claude_mpm.services.version_control.version_parser import  | 
| 352 | 
            -
             | 
| 354 | 
            +
                        from claude_mpm.services.version_control.version_parser import (
         | 
| 355 | 
            +
                            get_version_parser,
         | 
| 356 | 
            +
                        )
         | 
| 357 | 
            +
             | 
| 353 358 | 
             
                        # Use enhanced parser for current version
         | 
| 354 359 | 
             
                        parser = get_version_parser(self.project_root)
         | 
| 355 360 | 
             
                        version_meta = parser.get_current_version()
         | 
| 356 | 
            -
             | 
| 361 | 
            +
             | 
| 357 362 | 
             
                        if version_meta:
         | 
| 358 363 | 
             
                            version = self.parse_version(version_meta.version)
         | 
| 359 364 | 
             
                            if version:
         | 
| 360 | 
            -
                                self.logger.info( | 
| 365 | 
            +
                                self.logger.info(
         | 
| 366 | 
            +
                                    f"Found version {version} from {version_meta.source}"
         | 
| 367 | 
            +
                                )
         | 
| 361 368 | 
             
                                # Optionally attach metadata
         | 
| 362 | 
            -
                                if hasattr(version,  | 
| 369 | 
            +
                                if hasattr(version, "__dict__"):
         | 
| 363 370 | 
             
                                    version.source = version_meta.source
         | 
| 364 371 | 
             
                                return version
         | 
| 365 | 
            -
             | 
| 372 | 
            +
             | 
| 366 373 | 
             
                    except ImportError:
         | 
| 367 374 | 
             
                        # Fallback to original implementation
         | 
| 368 375 | 
             
                        self.logger.debug("Enhanced version parser not available, using fallback")
         | 
| 369 376 | 
             
                    except Exception as e:
         | 
| 370 | 
            -
                        self.logger.error( | 
| 371 | 
            -
             | 
| 377 | 
            +
                        self.logger.error(
         | 
| 378 | 
            +
                            f"Error getting current version with enhanced parser: {e}"
         | 
| 379 | 
            +
                        )
         | 
| 380 | 
            +
             | 
| 372 381 | 
             
                    # Fallback to original implementation
         | 
| 373 382 | 
             
                    for filename, parser in self.version_files.items():
         | 
| 374 383 | 
             
                        file_path = self.project_root / filename
         | 
| @@ -415,7 +424,9 @@ class SemanticVersionManager: | |
| 415 424 | 
             
                        if "project" in data and "version" in data["project"]:
         | 
| 416 425 | 
             
                            return data["project"]["version"]
         | 
| 417 426 | 
             
                        elif (
         | 
| 418 | 
            -
                            "tool" in data | 
| 427 | 
            +
                            "tool" in data
         | 
| 428 | 
            +
                            and "poetry" in data["tool"]
         | 
| 429 | 
            +
                            and "version" in data["tool"]["poetry"]
         | 
| 419 430 | 
             
                        ):
         | 
| 420 431 | 
             
                            return data["tool"]["poetry"]["version"]
         | 
| 421 432 |  | 
| @@ -431,7 +442,10 @@ class SemanticVersionManager: | |
| 431 442 | 
             
                            content = f.read()
         | 
| 432 443 |  | 
| 433 444 | 
             
                        # Look for version = "x.y.z" pattern
         | 
| 434 | 
            -
                        patterns = [ | 
| 445 | 
            +
                        patterns = [
         | 
| 446 | 
            +
                            r'version\s*=\s*["\']([^"\']+)["\']',
         | 
| 447 | 
            +
                            r'version:\s*["\']([^"\']+)["\']',
         | 
| 448 | 
            +
                        ]
         | 
| 435 449 |  | 
| 436 450 | 
             
                        for pattern in patterns:
         | 
| 437 451 | 
             
                            match = re.search(pattern, content)
         | 
| @@ -483,24 +497,24 @@ class SemanticVersionManager: | |
| 483 497 | 
             
                    3. Determine highest priority change type
         | 
| 484 498 | 
             
                    4. Suggest appropriate version bump
         | 
| 485 499 | 
             
                    5. Calculate confidence score
         | 
| 486 | 
            -
             | 
| 500 | 
            +
             | 
| 487 501 | 
             
                    Pattern Matching:
         | 
| 488 502 | 
             
                    - Breaking: "breaking", "breaking change", "remove api", etc.
         | 
| 489 503 | 
             
                    - Features: "add", "new feature", "implement", "enhance"
         | 
| 490 504 | 
             
                    - Fixes: "fix", "bug fix", "resolve", "correct"
         | 
| 491 | 
            -
             | 
| 505 | 
            +
             | 
| 492 506 | 
             
                    Version Bump Priority:
         | 
| 493 507 | 
             
                    1. Breaking changes -> MAJOR (highest priority)
         | 
| 494 508 | 
             
                    2. New features -> MINOR
         | 
| 495 509 | 
             
                    3. Bug fixes -> PATCH
         | 
| 496 510 | 
             
                    4. Other changes -> PATCH (default)
         | 
| 497 | 
            -
             | 
| 511 | 
            +
             | 
| 498 512 | 
             
                    Confidence Scoring:
         | 
| 499 513 | 
             
                    - 0.9: Clear breaking changes detected
         | 
| 500 514 | 
             
                    - 0.8: Clear new features detected
         | 
| 501 515 | 
             
                    - 0.7: Clear bug fixes detected
         | 
| 502 516 | 
             
                    - 0.5: No clear patterns (default to patch)
         | 
| 503 | 
            -
             | 
| 517 | 
            +
             | 
| 504 518 | 
             
                    This analysis is used for:
         | 
| 505 519 | 
             
                    - Conventional commit integration
         | 
| 506 520 | 
             
                    - Automated version bumping
         | 
| @@ -521,15 +535,22 @@ class SemanticVersionManager: | |
| 521 535 | 
             
                        change_lower = change.lower()
         | 
| 522 536 |  | 
| 523 537 | 
             
                        # Check for breaking changes (highest priority)
         | 
| 524 | 
            -
                        if any( | 
| 538 | 
            +
                        if any(
         | 
| 539 | 
            +
                            re.search(pattern, change_lower)
         | 
| 540 | 
            +
                            for pattern in self.breaking_change_patterns
         | 
| 541 | 
            +
                        ):
         | 
| 525 542 | 
             
                            analysis.has_breaking_changes = True
         | 
| 526 543 |  | 
| 527 544 | 
             
                        # Check for new features
         | 
| 528 | 
            -
                        elif any( | 
| 545 | 
            +
                        elif any(
         | 
| 546 | 
            +
                            re.search(pattern, change_lower) for pattern in self.feature_patterns
         | 
| 547 | 
            +
                        ):
         | 
| 529 548 | 
             
                            analysis.has_new_features = True
         | 
| 530 549 |  | 
| 531 550 | 
             
                        # Check for bug fixes
         | 
| 532 | 
            -
                        elif any( | 
| 551 | 
            +
                        elif any(
         | 
| 552 | 
            +
                            re.search(pattern, change_lower) for pattern in self.bug_fix_patterns
         | 
| 553 | 
            +
                        ):
         | 
| 533 554 | 
             
                            analysis.has_bug_fixes = True
         | 
| 534 555 |  | 
| 535 556 | 
             
                    # Determine suggested bump based on priority
         | 
| @@ -563,7 +584,9 @@ class SemanticVersionManager: | |
| 563 584 | 
             
                    """
         | 
| 564 585 | 
             
                    return current_version.bump(bump_type)
         | 
| 565 586 |  | 
| 566 | 
            -
                def suggest_version_bump( | 
| 587 | 
            +
                def suggest_version_bump(
         | 
| 588 | 
            +
                    self, commit_messages: List[str]
         | 
| 589 | 
            +
                ) -> Tuple[VersionBumpType, float]:
         | 
| 567 590 | 
             
                    """
         | 
| 568 591 | 
             
                    Suggest version bump based on commit messages.
         | 
| 569 592 |  | 
| @@ -603,7 +626,9 @@ class SemanticVersionManager: | |
| 603 626 | 
             
                                results[filename] = success
         | 
| 604 627 |  | 
| 605 628 | 
             
                                if success:
         | 
| 606 | 
            -
                                    self.logger.info( | 
| 629 | 
            +
                                    self.logger.info(
         | 
| 630 | 
            +
                                        f"Updated version to {version_string} in {filename}"
         | 
| 631 | 
            +
                                    )
         | 
| 607 632 | 
             
                                else:
         | 
| 608 633 | 
             
                                    self.logger.error(f"Failed to update version in {filename}")
         | 
| 609 634 |  | 
| @@ -740,11 +765,18 @@ class SemanticVersionManager: | |
| 740 765 | 
             
                    for change in changes:
         | 
| 741 766 | 
             
                        change_lower = change.lower()
         | 
| 742 767 |  | 
| 743 | 
            -
                        if any( | 
| 768 | 
            +
                        if any(
         | 
| 769 | 
            +
                            re.search(pattern, change_lower)
         | 
| 770 | 
            +
                            for pattern in self.breaking_change_patterns
         | 
| 771 | 
            +
                        ):
         | 
| 744 772 | 
             
                            breaking_changes.append(change)
         | 
| 745 | 
            -
                        elif any( | 
| 773 | 
            +
                        elif any(
         | 
| 774 | 
            +
                            re.search(pattern, change_lower) for pattern in self.feature_patterns
         | 
| 775 | 
            +
                        ):
         | 
| 746 776 | 
             
                            features.append(change)
         | 
| 747 | 
            -
                        elif any( | 
| 777 | 
            +
                        elif any(
         | 
| 778 | 
            +
                            re.search(pattern, change_lower) for pattern in self.bug_fix_patterns
         | 
| 779 | 
            +
                        ):
         | 
| 748 780 | 
             
                            fixes.append(change)
         | 
| 749 781 | 
             
                        else:
         | 
| 750 782 | 
             
                            other_changes.append(change)
         | 
| @@ -786,7 +818,10 @@ class SemanticVersionManager: | |
| 786 818 | 
             
                    return "\n".join(lines)
         | 
| 787 819 |  | 
| 788 820 | 
             
                def update_changelog(
         | 
| 789 | 
            -
                    self, | 
| 821 | 
            +
                    self,
         | 
| 822 | 
            +
                    version: SemanticVersion,
         | 
| 823 | 
            +
                    changes: List[str],
         | 
| 824 | 
            +
                    changelog_file: str = "docs/CHANGELOG.md",
         | 
| 790 825 | 
             
                ) -> bool:
         | 
| 791 826 | 
             
                    """
         | 
| 792 827 | 
             
                    Update CHANGELOG.md with new version entry.
         | 
| @@ -843,7 +878,7 @@ class SemanticVersionManager: | |
| 843 878 | 
             
                def get_version_history(self) -> List[SemanticVersion]:
         | 
| 844 879 | 
             
                    """
         | 
| 845 880 | 
             
                    Get version history from multiple sources with intelligent fallback.
         | 
| 846 | 
            -
             | 
| 881 | 
            +
             | 
| 847 882 | 
             
                    Uses the enhanced version parser to retrieve version history from:
         | 
| 848 883 | 
             
                    1. Git tags (primary source)
         | 
| 849 884 | 
             
                    2. CHANGELOG.md (fallback)
         | 
| @@ -854,29 +889,33 @@ class SemanticVersionManager: | |
| 854 889 | 
             
                    """
         | 
| 855 890 | 
             
                    try:
         | 
| 856 891 | 
             
                        # Import here to avoid circular dependency
         | 
| 857 | 
            -
                        from claude_mpm.services.version_control.version_parser import  | 
| 858 | 
            -
             | 
| 892 | 
            +
                        from claude_mpm.services.version_control.version_parser import (
         | 
| 893 | 
            +
                            get_version_parser,
         | 
| 894 | 
            +
                        )
         | 
| 895 | 
            +
             | 
| 859 896 | 
             
                        # Use enhanced parser for comprehensive version history
         | 
| 860 897 | 
             
                        parser = get_version_parser(self.project_root)
         | 
| 861 898 | 
             
                        version_metadata = parser.get_version_history(include_prereleases=False)
         | 
| 862 | 
            -
             | 
| 899 | 
            +
             | 
| 863 900 | 
             
                        # Convert to SemanticVersion objects
         | 
| 864 901 | 
             
                        versions = []
         | 
| 865 902 | 
             
                        for meta in version_metadata:
         | 
| 866 903 | 
             
                            version = self.parse_version(meta.version)
         | 
| 867 904 | 
             
                            if version:
         | 
| 868 905 | 
             
                                # Optionally attach metadata to version
         | 
| 869 | 
            -
                                if hasattr(version,  | 
| 906 | 
            +
                                if hasattr(version, "__dict__"):
         | 
| 870 907 | 
             
                                    version.source = meta.source
         | 
| 871 908 | 
             
                                    version.release_date = meta.release_date
         | 
| 872 909 | 
             
                                    version.commit_hash = meta.commit_hash
         | 
| 873 910 | 
             
                                versions.append(version)
         | 
| 874 | 
            -
             | 
| 911 | 
            +
             | 
| 875 912 | 
             
                        return versions
         | 
| 876 | 
            -
             | 
| 913 | 
            +
             | 
| 877 914 | 
             
                    except ImportError:
         | 
| 878 915 | 
             
                        # Fallback to original implementation if enhanced parser not available
         | 
| 879 | 
            -
                        self.logger.warning( | 
| 916 | 
            +
                        self.logger.warning(
         | 
| 917 | 
            +
                            "Enhanced version parser not available, falling back to changelog parsing"
         | 
| 918 | 
            +
                        )
         | 
| 880 919 | 
             
                        return self._parse_changelog_versions_fallback()
         | 
| 881 920 | 
             
                    except Exception as e:
         | 
| 882 921 | 
             
                        self.logger.error(f"Error getting version history: {e}")
         | 
| @@ -890,9 +929,9 @@ class SemanticVersionManager: | |
| 890 929 | 
             
                    # Try to get versions from changelog
         | 
| 891 930 | 
             
                    changelog_paths = [
         | 
| 892 931 | 
             
                        self.project_root / "CHANGELOG.md",
         | 
| 893 | 
            -
                        self.project_root / "docs" / "CHANGELOG.md"
         | 
| 932 | 
            +
                        self.project_root / "docs" / "CHANGELOG.md",
         | 
| 894 933 | 
             
                    ]
         | 
| 895 | 
            -
             | 
| 934 | 
            +
             | 
| 896 935 | 
             
                    for changelog_path in changelog_paths:
         | 
| 897 936 | 
             
                        if changelog_path.exists():
         | 
| 898 937 | 
             
                            versions.extend(self._parse_changelog_versions(changelog_path))
         |