claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__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 (411) 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 +155 -0
  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 +1 -1
  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 +90 -49
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +21 -18
  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 +143 -762
  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 +203 -81
  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 +305 -197
  50. claude_mpm/cli/parser.py +24 -1150
  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 +104 -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 +217 -0
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +36 -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/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +571 -0
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +40 -23
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
  298. claude_mpm/services/mcp_gateway/main.py +307 -127
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
  303. claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +20 -534
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +9 -0
  358. claude_mpm/storage/state_storage.py +552 -0
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/config/memory_guardian_config.py +0 -325
  385. claude_mpm/core/config_paths.py +0 -150
  386. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  387. claude_mpm/deployment_paths.py +0 -261
  388. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  389. claude_mpm/models/state_models.py +0 -433
  390. claude_mpm/services/agent/__init__.py +0 -24
  391. claude_mpm/services/agent/deployment.py +0 -2548
  392. claude_mpm/services/agent/management.py +0 -598
  393. claude_mpm/services/agent/registry.py +0 -813
  394. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  395. claude_mpm/services/communication/socketio.py +0 -1935
  396. claude_mpm/services/communication/websocket.py +0 -479
  397. claude_mpm/services/framework_claude_md_generator.py +0 -624
  398. claude_mpm/services/health_monitor.py +0 -893
  399. claude_mpm/services/infrastructure/memory_guardian.py +0 -770
  400. claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
  401. claude_mpm/services/optimized_hook_service.py +0 -542
  402. claude_mpm/services/project_analyzer.py +0 -864
  403. claude_mpm/services/project_registry.py +0 -608
  404. claude_mpm/services/standalone_socketio_server.py +0 -1300
  405. claude_mpm/services/ticket_manager_di.py +0 -318
  406. claude_mpm/services/ticketing_service_original.py +0 -510
  407. claude_mpm/utils/paths.py +0 -395
  408. claude_mpm/utils/platform_memory.py +0 -524
  409. claude_mpm-3.9.9.dist-info/RECORD +0 -293
  410. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  411. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  """Tool access control system for managing which tools agents can use."""
2
2
 
3
- from typing import Dict, List, Set, Optional
4
3
  import logging
4
+ from typing import Dict, List, Optional, Set
5
5
 
6
6
  logger = logging.getLogger(__name__)
7
7
 
@@ -9,39 +9,38 @@ logger = logging.getLogger(__name__)
9
9
  class ToolAccessControl:
10
10
  """
11
11
  Manages tool access permissions for different agent types.
12
-
12
+
13
13
  This ensures that only authorized agents can access specific tools,
14
14
  particularly restricting TodoWrite to the PM (parent process) only.
15
15
  """
16
-
16
+
17
17
  # Default tool sets for different contexts
18
18
  PM_TOOLS = {
19
- "Task", # For delegating to agents
20
- "TodoWrite", # For tracking tasks (PM ONLY)
21
- "WebSearch", # For understanding requirements
22
- "WebFetch" # For fetching external resources
19
+ "Task", # For delegating to agents
20
+ "TodoWrite", # For tracking tasks (PM ONLY)
21
+ "WebSearch", # For understanding requirements
22
+ "WebFetch", # For fetching external resources
23
23
  }
24
-
24
+
25
25
  AGENT_TOOLS = {
26
- "Read", # Read files
27
- "Write", # Write files
28
- "Edit", # Edit files
29
- "MultiEdit", # Multiple edits
30
- "Bash", # Execute commands
31
- "Grep", # Search in files
32
- "Glob", # File pattern matching
33
- "LS", # List directory
34
- "WebSearch", # Search the web
35
- "WebFetch", # Fetch web content
36
- "NotebookRead", # Read Jupyter notebooks
37
- "NotebookEdit" # Edit Jupyter notebooks
26
+ "Read", # Read files
27
+ "Write", # Write files
28
+ "Edit", # Edit files
29
+ "MultiEdit", # Multiple edits
30
+ "Bash", # Execute commands
31
+ "Grep", # Search in files
32
+ "Glob", # File pattern matching
33
+ "LS", # List directory
34
+ "WebSearch", # Search the web
35
+ "WebFetch", # Fetch web content
36
+ "NotebookRead", # Read Jupyter notebooks
37
+ "NotebookEdit", # Edit Jupyter notebooks
38
38
  }
39
-
39
+
40
40
  # Tool restrictions by agent type
41
41
  AGENT_RESTRICTIONS: Dict[str, Set[str]] = {
42
42
  # PM has very limited tools - delegation only
43
43
  "pm": PM_TOOLS,
44
-
45
44
  # All other agents get standard tools WITHOUT TodoWrite
46
45
  "engineer": AGENT_TOOLS,
47
46
  "research": AGENT_TOOLS,
@@ -51,34 +50,34 @@ class ToolAccessControl:
51
50
  "ops": AGENT_TOOLS,
52
51
  "version_control": AGENT_TOOLS,
53
52
  "data_engineer": AGENT_TOOLS,
54
- "architect": AGENT_TOOLS
53
+ "architect": AGENT_TOOLS,
55
54
  }
56
-
55
+
57
56
  def __init__(self):
58
57
  """Initialize the tool access control system."""
59
58
  self.custom_restrictions: Dict[str, Set[str]] = {}
60
59
  logger.info("Tool access control system initialized")
61
-
60
+
62
61
  def get_allowed_tools(self, agent_type: str, is_parent: bool = False) -> List[str]:
63
62
  """
64
63
  Get the list of allowed tools for an agent type.
65
-
64
+
66
65
  Args:
67
66
  agent_type: The type of agent (pm, engineer, research, etc.)
68
67
  is_parent: Whether this is the parent process (PM)
69
-
68
+
70
69
  Returns:
71
70
  List of allowed tool names
72
71
  """
73
72
  # Normalize agent type
74
73
  agent_type = agent_type.lower().replace(" ", "_").replace("-", "_")
75
-
74
+
76
75
  # Parent process (PM) gets PM tools
77
76
  if is_parent or agent_type == "pm":
78
77
  allowed = self.PM_TOOLS.copy()
79
78
  logger.debug(f"PM/Parent process allowed tools: {allowed}")
80
79
  return sorted(list(allowed))
81
-
80
+
82
81
  # Check custom restrictions first
83
82
  if agent_type in self.custom_restrictions:
84
83
  allowed = self.custom_restrictions[agent_type]
@@ -86,74 +85,82 @@ class ToolAccessControl:
86
85
  allowed = self.AGENT_RESTRICTIONS[agent_type]
87
86
  else:
88
87
  # Default to agent tools for unknown types
89
- logger.warning(f"Unknown agent type '{agent_type}', using default agent tools")
88
+ logger.warning(
89
+ f"Unknown agent type '{agent_type}', using default agent tools"
90
+ )
90
91
  allowed = self.AGENT_TOOLS.copy()
91
-
92
+
92
93
  # Ensure TodoWrite is NEVER in child agent tools
93
94
  allowed = allowed - {"TodoWrite"}
94
-
95
+
95
96
  logger.debug(f"Agent '{agent_type}' allowed tools: {allowed}")
96
97
  return sorted(list(allowed))
97
-
98
+
98
99
  def format_allowed_tools_arg(self, agent_type: str, is_parent: bool = False) -> str:
99
100
  """
100
101
  Format the allowed tools as a comma-separated string for --allowedTools argument.
101
-
102
+
102
103
  Args:
103
104
  agent_type: The type of agent
104
105
  is_parent: Whether this is the parent process
105
-
106
+
106
107
  Returns:
107
108
  Comma-separated string of allowed tools
108
109
  """
109
110
  allowed_tools = self.get_allowed_tools(agent_type, is_parent)
110
111
  return ",".join(allowed_tools)
111
-
112
+
112
113
  def set_custom_restrictions(self, agent_type: str, allowed_tools: Set[str]):
113
114
  """
114
115
  Set custom tool restrictions for a specific agent type.
115
-
116
+
116
117
  Args:
117
118
  agent_type: The agent type to customize
118
119
  allowed_tools: Set of allowed tool names
119
120
  """
120
121
  agent_type = agent_type.lower().replace(" ", "_").replace("-", "_")
121
-
122
+
122
123
  # Ensure TodoWrite is not in custom restrictions for non-PM agents
123
124
  if agent_type != "pm" and "TodoWrite" in allowed_tools:
124
- logger.warning(f"Removing TodoWrite from custom restrictions for {agent_type}")
125
+ logger.warning(
126
+ f"Removing TodoWrite from custom restrictions for {agent_type}"
127
+ )
125
128
  allowed_tools = allowed_tools - {"TodoWrite"}
126
-
129
+
127
130
  self.custom_restrictions[agent_type] = allowed_tools
128
131
  logger.info(f"Set custom tool restrictions for {agent_type}: {allowed_tools}")
129
-
130
- def validate_tool_usage(self, agent_type: str, tool_name: str, is_parent: bool = False) -> bool:
132
+
133
+ def validate_tool_usage(
134
+ self, agent_type: str, tool_name: str, is_parent: bool = False
135
+ ) -> bool:
131
136
  """
132
137
  Validate if an agent is allowed to use a specific tool.
133
-
138
+
134
139
  Args:
135
140
  agent_type: The type of agent
136
141
  tool_name: The name of the tool
137
142
  is_parent: Whether this is the parent process
138
-
143
+
139
144
  Returns:
140
145
  True if allowed, False otherwise
141
146
  """
142
147
  allowed_tools = self.get_allowed_tools(agent_type, is_parent)
143
148
  is_allowed = tool_name in allowed_tools
144
-
149
+
145
150
  if not is_allowed:
146
- logger.warning(f"Agent '{agent_type}' attempted to use forbidden tool '{tool_name}'")
147
-
151
+ logger.warning(
152
+ f"Agent '{agent_type}' attempted to use forbidden tool '{tool_name}'"
153
+ )
154
+
148
155
  return is_allowed
149
-
156
+
150
157
  def get_todo_guidance(self, agent_type: str) -> str:
151
158
  """
152
159
  Get guidance text for agents on how to handle TODOs.
153
-
160
+
154
161
  Args:
155
162
  agent_type: The type of agent
156
-
163
+
157
164
  Returns:
158
165
  Guidance text for handling TODOs
159
166
  """
@@ -170,4 +177,4 @@ class ToolAccessControl:
170
177
 
171
178
 
172
179
  # Global instance for easy access
173
- tool_access_control = ToolAccessControl()
180
+ tool_access_control = ToolAccessControl()
claude_mpm/core/types.py CHANGED
@@ -1,3 +1,5 @@
1
+ from pathlib import Path
2
+
1
3
  """
2
4
  Central type definitions for Claude MPM.
3
5
 
@@ -16,7 +18,6 @@ Module-specific types should remain in their respective modules.
16
18
  from dataclasses import dataclass
17
19
  from datetime import datetime
18
20
  from enum import Enum
19
- from pathlib import Path
20
21
  from typing import Any, Dict, List, Optional, Tuple, Union
21
22
 
22
23
 
@@ -24,18 +25,19 @@ from typing import Any, Dict, List, Optional, Tuple, Union
24
25
  @dataclass
25
26
  class ServiceResult:
26
27
  """Standard result type for service operations."""
28
+
27
29
  success: bool
28
30
  message: str
29
31
  data: Optional[Dict[str, Any]] = None
30
32
  errors: Optional[List[str]] = None
31
-
33
+
32
34
  def to_dict(self) -> Dict[str, Any]:
33
35
  """Convert to dictionary representation."""
34
36
  return {
35
- 'success': self.success,
36
- 'message': self.message,
37
- 'data': self.data,
38
- 'errors': self.errors
37
+ "success": self.success,
38
+ "message": self.message,
39
+ "data": self.data,
40
+ "errors": self.errors,
39
41
  }
40
42
 
41
43
 
@@ -43,18 +45,24 @@ class ServiceResult:
43
45
  @dataclass
44
46
  class DeploymentResult:
45
47
  """Result of an agent deployment operation."""
48
+
46
49
  deployed: List[str]
47
50
  updated: List[str]
48
51
  failed: List[str]
49
52
  skipped: List[str]
50
53
  errors: Dict[str, str]
51
54
  metadata: Dict[str, Any]
52
-
55
+
53
56
  @property
54
57
  def total_processed(self) -> int:
55
58
  """Get total number of agents processed."""
56
- return len(self.deployed) + len(self.updated) + len(self.failed) + len(self.skipped)
57
-
59
+ return (
60
+ len(self.deployed)
61
+ + len(self.updated)
62
+ + len(self.failed)
63
+ + len(self.skipped)
64
+ )
65
+
58
66
  @property
59
67
  def success_rate(self) -> float:
60
68
  """Calculate deployment success rate."""
@@ -67,12 +75,13 @@ class DeploymentResult:
67
75
  # Agent-related types
68
76
  class AgentTier(Enum):
69
77
  """Agent tier levels for precedence."""
78
+
70
79
  PROJECT = "PROJECT" # Highest precedence - project-specific agents
71
- USER = "USER" # User-level agents
72
- SYSTEM = "SYSTEM" # Lowest precedence - system agents
73
-
80
+ USER = "USER" # User-level agents
81
+ SYSTEM = "SYSTEM" # Lowest precedence - system agents
82
+
74
83
  @classmethod
75
- def from_string(cls, value: str) -> 'AgentTier':
84
+ def from_string(cls, value: str) -> "AgentTier":
76
85
  """Convert string to AgentTier enum."""
77
86
  value_upper = value.upper()
78
87
  for tier in cls:
@@ -84,6 +93,7 @@ class AgentTier(Enum):
84
93
  @dataclass
85
94
  class AgentInfo:
86
95
  """Basic agent information."""
96
+
87
97
  agent_id: str
88
98
  name: str
89
99
  tier: AgentTier
@@ -92,7 +102,7 @@ class AgentInfo:
92
102
  description: Optional[str] = None
93
103
  capabilities: Optional[List[str]] = None
94
104
  metadata: Optional[Dict[str, Any]] = None
95
-
105
+
96
106
  def __post_init__(self):
97
107
  """Initialize default values."""
98
108
  if self.capabilities is None:
@@ -105,13 +115,14 @@ class AgentInfo:
105
115
  @dataclass
106
116
  class MemoryEntry:
107
117
  """Single memory entry for an agent."""
118
+
108
119
  timestamp: datetime
109
120
  content: str
110
121
  category: str
111
122
  agent_id: str
112
123
  session_id: Optional[str] = None
113
124
  metadata: Optional[Dict[str, Any]] = None
114
-
125
+
115
126
  def __post_init__(self):
116
127
  """Initialize default values."""
117
128
  if self.metadata is None:
@@ -121,6 +132,7 @@ class MemoryEntry:
121
132
  # Hook-related types
122
133
  class HookType(Enum):
123
134
  """Types of hooks in the system."""
135
+
124
136
  PRE_DELEGATION = "pre_delegation"
125
137
  POST_DELEGATION = "post_delegation"
126
138
  PRE_RESPONSE = "pre_response"
@@ -129,16 +141,17 @@ class HookType(Enum):
129
141
  SHUTDOWN = "shutdown"
130
142
 
131
143
 
132
- @dataclass
144
+ @dataclass
133
145
  class HookContext:
134
146
  """Context passed to hook handlers."""
147
+
135
148
  event_type: str
136
149
  data: Dict[str, Any]
137
150
  timestamp: datetime
138
151
  source: Optional[str] = None
139
152
  session_id: Optional[str] = None
140
153
  metadata: Optional[Dict[str, Any]] = None
141
-
154
+
142
155
  def __post_init__(self):
143
156
  """Initialize default values."""
144
157
  if self.metadata is None:
@@ -149,12 +162,13 @@ class HookContext:
149
162
  @dataclass
150
163
  class ConfigSection:
151
164
  """Configuration section with validation."""
165
+
152
166
  name: str
153
167
  values: Dict[str, Any]
154
168
  schema: Optional[Dict[str, Any]] = None
155
169
  is_valid: bool = True
156
170
  validation_errors: Optional[List[str]] = None
157
-
171
+
158
172
  def __post_init__(self):
159
173
  """Initialize default values."""
160
174
  if self.validation_errors is None:
@@ -164,6 +178,7 @@ class ConfigSection:
164
178
  # Task/Ticket types
165
179
  class TaskStatus(Enum):
166
180
  """Task/ticket status values."""
181
+
167
182
  TODO = "todo"
168
183
  IN_PROGRESS = "in_progress"
169
184
  BLOCKED = "blocked"
@@ -175,6 +190,7 @@ class TaskStatus(Enum):
175
190
  @dataclass
176
191
  class TaskInfo:
177
192
  """Basic task/ticket information."""
193
+
178
194
  task_id: str
179
195
  title: str
180
196
  status: TaskStatus
@@ -184,7 +200,7 @@ class TaskInfo:
184
200
  created_at: Optional[datetime] = None
185
201
  updated_at: Optional[datetime] = None
186
202
  metadata: Optional[Dict[str, Any]] = None
187
-
203
+
188
204
  def __post_init__(self):
189
205
  """Initialize default values."""
190
206
  if self.metadata is None:
@@ -199,13 +215,14 @@ class TaskInfo:
199
215
  @dataclass
200
216
  class SocketMessage:
201
217
  """WebSocket/SocketIO message."""
218
+
202
219
  event: str
203
220
  data: Any
204
221
  room: Optional[str] = None
205
222
  namespace: Optional[str] = None
206
223
  sid: Optional[str] = None
207
224
  metadata: Optional[Dict[str, Any]] = None
208
-
225
+
209
226
  def __post_init__(self):
210
227
  """Initialize default values."""
211
228
  if self.metadata is None:
@@ -215,6 +232,7 @@ class SocketMessage:
215
232
  # Health monitoring types
216
233
  class HealthStatus(Enum):
217
234
  """Service health status levels."""
235
+
218
236
  HEALTHY = "healthy"
219
237
  DEGRADED = "degraded"
220
238
  UNHEALTHY = "unhealthy"
@@ -224,13 +242,14 @@ class HealthStatus(Enum):
224
242
  @dataclass
225
243
  class HealthCheck:
226
244
  """Health check result."""
245
+
227
246
  service_name: str
228
247
  status: HealthStatus
229
248
  message: str
230
249
  timestamp: datetime
231
250
  metrics: Optional[Dict[str, Any]] = None
232
251
  checks: Optional[Dict[str, bool]] = None
233
-
252
+
234
253
  def __post_init__(self):
235
254
  """Initialize default values."""
236
255
  if self.metrics is None:
@@ -243,6 +262,7 @@ class HealthCheck:
243
262
  @dataclass
244
263
  class ProjectCharacteristics:
245
264
  """Analyzed project characteristics."""
265
+
246
266
  path: Path
247
267
  name: str
248
268
  type: str # e.g., "python", "node", "mixed"
@@ -250,7 +270,7 @@ class ProjectCharacteristics:
250
270
  entry_points: List[Path]
251
271
  structure: Dict[str, Any]
252
272
  metadata: Optional[Dict[str, Any]] = None
253
-
273
+
254
274
  def __post_init__(self):
255
275
  """Initialize default values."""
256
276
  if self.metadata is None:
@@ -260,6 +280,7 @@ class ProjectCharacteristics:
260
280
  # Error types
261
281
  class ErrorSeverity(Enum):
262
282
  """Error severity levels."""
283
+
263
284
  DEBUG = "debug"
264
285
  INFO = "info"
265
286
  WARNING = "warning"
@@ -270,6 +291,7 @@ class ErrorSeverity(Enum):
270
291
  @dataclass
271
292
  class ErrorContext:
272
293
  """Context for error handling."""
294
+
273
295
  error: Exception
274
296
  severity: ErrorSeverity
275
297
  component: str
@@ -278,7 +300,7 @@ class ErrorContext:
278
300
  traceback: Optional[str] = None
279
301
  recovery_attempted: bool = False
280
302
  metadata: Optional[Dict[str, Any]] = None
281
-
303
+
282
304
  def __post_init__(self):
283
305
  """Initialize default values."""
284
306
  if self.metadata is None:
@@ -289,4 +311,4 @@ class ErrorContext:
289
311
  ConfigDict = Dict[str, Any]
290
312
  ErrorDict = Dict[str, str]
291
313
  MetricsDict = Dict[str, Union[int, float, str]]
292
- ValidationResult = Tuple[bool, Optional[List[str]]]
314
+ ValidationResult = Tuple[bool, Optional[List[str]]]