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.
Files changed (434) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +2 -2
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +330 -86
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +363 -220
  50. claude_mpm/cli/parser.py +24 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +124 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
  113. claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
  114. claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
  115. claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
  116. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
  117. claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
  118. claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
  119. claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
  120. claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  121. claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
  122. claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
  123. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
  124. claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
  125. claude_mpm/dashboard/static/built/dashboard.js +2 -0
  126. claude_mpm/dashboard/static/built/socket-client.js +2 -0
  127. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  128. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  129. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  130. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  131. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  132. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  133. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  134. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  135. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  136. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  137. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  138. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  139. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  140. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  141. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  142. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  143. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  144. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  145. claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
  146. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  147. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
  148. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  149. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  150. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  151. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  152. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  153. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  154. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  155. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  156. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  157. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  158. claude_mpm/dashboard/static/js/socket-client.js +133 -53
  159. claude_mpm/dashboard/templates/index.html +40 -50
  160. claude_mpm/experimental/cli_enhancements.py +60 -58
  161. claude_mpm/generators/__init__.py +1 -1
  162. claude_mpm/generators/agent_profile_generator.py +75 -65
  163. claude_mpm/hooks/__init__.py +1 -1
  164. claude_mpm/hooks/base_hook.py +33 -28
  165. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  166. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  167. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  168. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  169. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  170. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  171. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  172. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  173. claude_mpm/hooks/memory_integration_hook.py +140 -100
  174. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  175. claude_mpm/hooks/validation_hooks.py +57 -49
  176. claude_mpm/init.py +145 -121
  177. claude_mpm/models/__init__.py +9 -9
  178. claude_mpm/models/agent_definition.py +33 -23
  179. claude_mpm/models/agent_session.py +228 -200
  180. claude_mpm/scripts/__init__.py +1 -1
  181. claude_mpm/scripts/socketio_daemon.py +192 -75
  182. claude_mpm/scripts/socketio_server_manager.py +328 -0
  183. claude_mpm/scripts/start_activity_logging.py +25 -22
  184. claude_mpm/services/__init__.py +68 -43
  185. claude_mpm/services/agent_capabilities_service.py +271 -0
  186. claude_mpm/services/agents/__init__.py +23 -32
  187. claude_mpm/services/agents/deployment/__init__.py +3 -3
  188. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  189. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  190. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  191. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  192. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  193. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  194. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  195. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  196. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  197. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  198. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  199. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  200. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  201. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  202. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  203. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  204. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  205. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  206. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  207. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  208. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  209. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  210. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  211. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  212. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  213. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  214. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  215. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  216. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  217. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  218. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  219. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  220. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  221. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  222. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  223. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  224. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  225. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  226. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  227. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  228. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  229. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  230. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  231. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  232. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  233. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  234. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  235. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  236. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  237. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  238. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  239. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  240. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  241. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  242. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  243. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  244. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  245. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  246. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  247. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  248. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  249. claude_mpm/services/agents/loading/__init__.py +2 -2
  250. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  251. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  252. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  253. claude_mpm/services/agents/management/__init__.py +2 -2
  254. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  255. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  256. claude_mpm/services/agents/memory/__init__.py +9 -6
  257. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  258. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  259. claude_mpm/services/agents/memory/analyzer.py +430 -0
  260. claude_mpm/services/agents/memory/content_manager.py +376 -0
  261. claude_mpm/services/agents/memory/template_generator.py +468 -0
  262. claude_mpm/services/agents/registry/__init__.py +7 -10
  263. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  264. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  265. claude_mpm/services/async_session_logger.py +187 -153
  266. claude_mpm/services/claude_session_logger.py +87 -72
  267. claude_mpm/services/command_handler_service.py +217 -0
  268. claude_mpm/services/communication/__init__.py +3 -2
  269. claude_mpm/services/core/__init__.py +50 -97
  270. claude_mpm/services/core/base.py +60 -53
  271. claude_mpm/services/core/interfaces/__init__.py +188 -0
  272. claude_mpm/services/core/interfaces/agent.py +351 -0
  273. claude_mpm/services/core/interfaces/communication.py +343 -0
  274. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  275. claude_mpm/services/core/interfaces/service.py +434 -0
  276. claude_mpm/services/core/interfaces.py +19 -944
  277. claude_mpm/services/event_aggregator.py +208 -170
  278. claude_mpm/services/exceptions.py +387 -308
  279. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  280. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  281. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  282. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  283. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  284. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  285. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  286. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  287. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  288. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  289. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  290. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  291. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  292. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  293. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  294. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  295. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  296. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  297. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  298. claude_mpm/services/hook_service.py +106 -114
  299. claude_mpm/services/infrastructure/__init__.py +7 -5
  300. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  301. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  302. claude_mpm/services/infrastructure/logging.py +83 -76
  303. claude_mpm/services/infrastructure/monitoring.py +547 -404
  304. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  305. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  306. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  307. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  308. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  309. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  310. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  311. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  312. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  313. claude_mpm/services/mcp_gateway/main.py +287 -137
  314. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  315. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  316. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  317. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  318. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  319. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  320. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  321. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  322. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  323. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  324. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  325. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  326. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  327. claude_mpm/services/memory/__init__.py +2 -2
  328. claude_mpm/services/memory/builder.py +451 -362
  329. claude_mpm/services/memory/cache/__init__.py +2 -2
  330. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  331. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  332. claude_mpm/services/memory/indexed_memory.py +195 -193
  333. claude_mpm/services/memory/optimizer.py +267 -234
  334. claude_mpm/services/memory/router.py +571 -263
  335. claude_mpm/services/memory_hook_service.py +237 -0
  336. claude_mpm/services/port_manager.py +575 -0
  337. claude_mpm/services/project/__init__.py +3 -3
  338. claude_mpm/services/project/analyzer.py +451 -305
  339. claude_mpm/services/project/registry.py +262 -240
  340. claude_mpm/services/recovery_manager.py +287 -231
  341. claude_mpm/services/response_tracker.py +87 -67
  342. claude_mpm/services/runner_configuration_service.py +587 -0
  343. claude_mpm/services/session_management_service.py +304 -0
  344. claude_mpm/services/socketio/__init__.py +4 -4
  345. claude_mpm/services/socketio/client_proxy.py +174 -0
  346. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  347. claude_mpm/services/socketio/handlers/base.py +44 -30
  348. claude_mpm/services/socketio/handlers/connection.py +166 -64
  349. claude_mpm/services/socketio/handlers/file.py +123 -108
  350. claude_mpm/services/socketio/handlers/git.py +607 -373
  351. claude_mpm/services/socketio/handlers/hook.py +185 -0
  352. claude_mpm/services/socketio/handlers/memory.py +4 -4
  353. claude_mpm/services/socketio/handlers/project.py +4 -4
  354. claude_mpm/services/socketio/handlers/registry.py +53 -38
  355. claude_mpm/services/socketio/server/__init__.py +18 -0
  356. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  357. claude_mpm/services/socketio/server/core.py +399 -0
  358. claude_mpm/services/socketio/server/main.py +323 -0
  359. claude_mpm/services/socketio_client_manager.py +160 -133
  360. claude_mpm/services/socketio_server.py +36 -1885
  361. claude_mpm/services/subprocess_launcher_service.py +316 -0
  362. claude_mpm/services/system_instructions_service.py +258 -0
  363. claude_mpm/services/ticket_manager.py +19 -533
  364. claude_mpm/services/utility_service.py +285 -0
  365. claude_mpm/services/version_control/__init__.py +18 -21
  366. claude_mpm/services/version_control/branch_strategy.py +20 -10
  367. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  368. claude_mpm/services/version_control/git_operations.py +52 -21
  369. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  370. claude_mpm/services/version_control/version_parser.py +145 -125
  371. claude_mpm/services/version_service.py +270 -0
  372. claude_mpm/storage/__init__.py +2 -2
  373. claude_mpm/storage/state_storage.py +177 -181
  374. claude_mpm/ticket_wrapper.py +2 -2
  375. claude_mpm/utils/__init__.py +2 -2
  376. claude_mpm/utils/agent_dependency_loader.py +453 -243
  377. claude_mpm/utils/config_manager.py +157 -118
  378. claude_mpm/utils/console.py +1 -1
  379. claude_mpm/utils/dependency_cache.py +102 -107
  380. claude_mpm/utils/dependency_manager.py +52 -47
  381. claude_mpm/utils/dependency_strategies.py +131 -96
  382. claude_mpm/utils/environment_context.py +110 -102
  383. claude_mpm/utils/error_handler.py +75 -55
  384. claude_mpm/utils/file_utils.py +80 -67
  385. claude_mpm/utils/framework_detection.py +12 -11
  386. claude_mpm/utils/import_migration_example.py +12 -60
  387. claude_mpm/utils/imports.py +48 -45
  388. claude_mpm/utils/path_operations.py +100 -93
  389. claude_mpm/utils/robust_installer.py +172 -164
  390. claude_mpm/utils/session_logging.py +30 -23
  391. claude_mpm/utils/subprocess_utils.py +99 -61
  392. claude_mpm/validation/__init__.py +1 -1
  393. claude_mpm/validation/agent_validator.py +151 -111
  394. claude_mpm/validation/frontmatter_validator.py +92 -71
  395. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
  396. claude_mpm-4.0.4.dist-info/RECORD +417 -0
  397. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
  398. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
  399. claude_mpm/cli/commands/run_guarded.py +0 -511
  400. claude_mpm/config/memory_guardian_config.py +0 -325
  401. claude_mpm/config/memory_guardian_yaml.py +0 -335
  402. claude_mpm/core/config_paths.py +0 -150
  403. claude_mpm/core/memory_aware_runner.py +0 -353
  404. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  405. claude_mpm/deployment_paths.py +0 -261
  406. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  407. claude_mpm/models/state_models.py +0 -433
  408. claude_mpm/services/agent/__init__.py +0 -24
  409. claude_mpm/services/agent/deployment.py +0 -2548
  410. claude_mpm/services/agent/management.py +0 -598
  411. claude_mpm/services/agent/registry.py +0 -813
  412. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  413. claude_mpm/services/communication/socketio.py +0 -1935
  414. claude_mpm/services/communication/websocket.py +0 -479
  415. claude_mpm/services/framework_claude_md_generator.py +0 -624
  416. claude_mpm/services/health_monitor.py +0 -893
  417. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  418. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  419. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  420. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  421. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  422. claude_mpm/services/infrastructure/state_manager.py +0 -774
  423. claude_mpm/services/mcp_gateway/manager.py +0 -334
  424. claude_mpm/services/optimized_hook_service.py +0 -542
  425. claude_mpm/services/project_analyzer.py +0 -864
  426. claude_mpm/services/project_registry.py +0 -608
  427. claude_mpm/services/standalone_socketio_server.py +0 -1300
  428. claude_mpm/services/ticket_manager_di.py +0 -318
  429. claude_mpm/services/ticketing_service_original.py +0 -510
  430. claude_mpm/utils/paths.py +0 -395
  431. claude_mpm/utils/platform_memory.py +0 -524
  432. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  433. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
  434. {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
- from datetime import datetime
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 logging
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__(self, message: str, command: str = "", output: str = "", error: str = ""):
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 = {"merge": "--no-ff", "squash": "--squash", "rebase": "--rebase"}
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}}"], check=False
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
- ["rev-list", "--left-right", "--count", f"{upstream}...{branch_name}"],
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(["log", "-1", "--format=%H", branch_name], check=False)
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] if "/" in remote_branch else None
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(["push", "-u", "origin", full_branch_name], check=False)
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(["-m", f"Merge {source_branch} into {target_branch}"])
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(self, source_branch: str, target_branch: str) -> Dict[str, Any]:
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 filename != "/dev/null" and filename not in conflicted_files:
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, branch_name: Optional[str] = None, remote: str = "origin", set_upstream: bool = False
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(self, target_branch: str = "main") -> GitOperationResult:
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
- from datetime import datetime
43
- from pathlib import Path
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 logging
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(self.major, self.minor, self.patch, prerelease=new_prerelease)
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 get_version_parser
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(f"Found version {version} from {version_meta.source}")
365
+ self.logger.info(
366
+ f"Found version {version} from {version_meta.source}"
367
+ )
361
368
  # Optionally attach metadata
362
- if hasattr(version, '__dict__'):
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(f"Error getting current version with enhanced parser: {e}")
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 and "poetry" in data["tool"] and "version" in data["tool"]["poetry"]
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 = [r'version\s*=\s*["\']([^"\']+)["\']', r'version:\s*["\']([^"\']+)["\']']
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(re.search(pattern, change_lower) for pattern in self.breaking_change_patterns):
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(re.search(pattern, change_lower) for pattern in self.feature_patterns):
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(re.search(pattern, change_lower) for pattern in self.bug_fix_patterns):
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(self, commit_messages: List[str]) -> Tuple[VersionBumpType, float]:
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(f"Updated version to {version_string} in {filename}")
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(re.search(pattern, change_lower) for pattern in self.breaking_change_patterns):
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(re.search(pattern, change_lower) for pattern in self.feature_patterns):
773
+ elif any(
774
+ re.search(pattern, change_lower) for pattern in self.feature_patterns
775
+ ):
746
776
  features.append(change)
747
- elif any(re.search(pattern, change_lower) for pattern in self.bug_fix_patterns):
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, version: SemanticVersion, changes: List[str], changelog_file: str = "docs/CHANGELOG.md"
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 get_version_parser
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, '__dict__'):
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("Enhanced version parser not available, falling back to changelog parsing")
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))