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,510 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Ticketing Service
4
- =================
5
-
6
- Core service that wraps ai-trackdown-pytools for simplified ticket management.
7
- Provides a clean interface for PM orchestration and agent ticket operations.
8
-
9
- Key Features:
10
- - Singleton pattern for consistent ticket management
11
- - Simplified API wrapping ai-trackdown-pytools
12
- - Automatic ticket directory management
13
- - Thread-safe operations
14
- - Comprehensive error handling and logging
15
- - Integration with Claude PM Framework
16
-
17
- Usage:
18
- from claude_pm.services.ticketing_service import TicketingService
19
-
20
- # Get singleton instance
21
- ticketing = TicketingService.get_instance()
22
-
23
- # Create a ticket
24
- ticket = ticketing.create_ticket(
25
- title="Implement new feature",
26
- description="Detailed description",
27
- priority="high"
28
- )
29
-
30
- # List tickets
31
- tickets = ticketing.list_tickets(status="open")
32
-
33
- # Update ticket
34
- ticketing.update_ticket("CLAUDE-001", status="in_progress")
35
- """
36
-
37
- import asyncio
38
- import json
39
- import logging
40
- import os
41
- import threading
42
- from dataclasses import dataclass, field
43
- from datetime import datetime
44
- from pathlib import Path
45
- from typing import Any, Dict, List, Optional, Union
46
-
47
- from claude_mpm.core.config_paths import ConfigPaths
48
-
49
- # Import ai-trackdown-pytools
50
- try:
51
- from ai_trackdown_pytools import Task, Project
52
- from ai_trackdown_pytools.core.task import TaskManager
53
- AI_TRACKDOWN_AVAILABLE = True
54
- # Map to expected names
55
- Ticket = Task
56
- TicketManager = TaskManager
57
- except ImportError:
58
- AI_TRACKDOWN_AVAILABLE = False
59
- # Define fallback classes for type hints
60
- class TicketStatus:
61
- OPEN = "open"
62
- IN_PROGRESS = "in_progress"
63
- RESOLVED = "resolved"
64
- CLOSED = "closed"
65
-
66
- class TicketPriority:
67
- LOW = "low"
68
- MEDIUM = "medium"
69
- HIGH = "high"
70
- CRITICAL = "critical"
71
-
72
- import logging
73
-
74
- logger = logging.getLogger(__name__)
75
-
76
-
77
- @dataclass
78
- class TicketData:
79
- """Simplified ticket data structure for easy use."""
80
- id: str
81
- title: str
82
- description: str
83
- status: str = "open"
84
- priority: str = "medium"
85
- assignee: Optional[str] = None
86
- labels: List[str] = field(default_factory=list)
87
- created_at: Optional[datetime] = None
88
- updated_at: Optional[datetime] = None
89
- metadata: Dict[str, Any] = field(default_factory=dict)
90
-
91
-
92
- class TicketingService:
93
- """
94
- Core ticketing service wrapping ai-trackdown-pytools.
95
-
96
- Provides simplified interface for ticket management operations
97
- within the Claude PM Framework.
98
- """
99
-
100
- _instance = None
101
- _lock = threading.Lock()
102
-
103
- def __new__(cls):
104
- """Implement singleton pattern."""
105
- if cls._instance is None:
106
- with cls._lock:
107
- if cls._instance is None:
108
- cls._instance = super().__new__(cls)
109
- return cls._instance
110
-
111
- def __init__(self):
112
- """Initialize the ticketing service."""
113
- if not hasattr(self, '_initialized'):
114
- self._initialized = True
115
- self._ticket_manager = None
116
- self._tickets_dir = None
117
- self._setup_service()
118
-
119
- @classmethod
120
- def get_instance(cls) -> 'TicketingService':
121
- """Get singleton instance of TicketingService."""
122
- return cls()
123
-
124
- def _setup_service(self):
125
- """Set up the ticketing service."""
126
- try:
127
- # Find or create tickets directory
128
- self._tickets_dir = self._find_tickets_directory()
129
-
130
- if AI_TRACKDOWN_AVAILABLE:
131
- # Initialize ai-trackdown ticket manager
132
- # TaskManager expects project_path (parent of tickets directory)
133
- project_path = self._tickets_dir.parent
134
- self._ticket_manager = TicketManager(project_path)
135
- logger.info(f"Ticketing service initialized with project path: {project_path}")
136
- else:
137
- logger.warning("ai-trackdown-pytools not available, using stub implementation")
138
-
139
- except Exception as e:
140
- logger.error(f"Failed to initialize ticketing service: {e}")
141
- raise
142
-
143
- def _find_tickets_directory(self) -> Path:
144
- """Find or create the tickets directory."""
145
- # Check current directory first
146
- current_dir = Path.cwd()
147
- tickets_path = current_dir / "tickets"
148
-
149
- if tickets_path.exists():
150
- return tickets_path
151
-
152
- # Check for .claude-mpm directory
153
- claude_pm_dir = current_dir / ConfigPaths.CONFIG_DIR
154
- if claude_pm_dir.exists():
155
- tickets_path = claude_pm_dir / "tickets"
156
- tickets_path.mkdir(exist_ok=True)
157
- return tickets_path
158
-
159
- # Create in current directory
160
- tickets_path.mkdir(exist_ok=True)
161
- return tickets_path
162
-
163
- # Core ticket operations
164
-
165
- def create_ticket(
166
- self,
167
- title: str,
168
- description: str,
169
- priority: str = "medium",
170
- assignee: Optional[str] = None,
171
- labels: Optional[List[str]] = None,
172
- metadata: Optional[Dict[str, Any]] = None
173
- ) -> TicketData:
174
- """
175
- Create a new ticket.
176
-
177
- Args:
178
- title: Ticket title
179
- description: Detailed description
180
- priority: Priority level (low, medium, high, critical)
181
- assignee: Optional assignee
182
- labels: Optional list of labels
183
- metadata: Optional metadata dictionary
184
-
185
- Returns:
186
- TicketData object with created ticket information
187
- """
188
- try:
189
- if not AI_TRACKDOWN_AVAILABLE:
190
- # Stub implementation
191
- ticket_id = f"CLAUDE-{datetime.now().strftime('%Y%m%d%H%M%S')}"
192
- return TicketData(
193
- id=ticket_id,
194
- title=title,
195
- description=description,
196
- status="open",
197
- priority=priority,
198
- assignee=assignee,
199
- labels=labels or [],
200
- created_at=datetime.now(),
201
- updated_at=datetime.now(),
202
- metadata=metadata or {}
203
- )
204
-
205
- # Use ai-trackdown to create task
206
- # create_task expects: title, description, status, priority, assignees, tags, metadata
207
- task_data = {
208
- 'title': title,
209
- 'description': description,
210
- 'status': 'open',
211
- 'priority': priority.lower(),
212
- 'assignees': [assignee] if assignee else [],
213
- 'tags': labels or [],
214
- 'metadata': metadata or {}
215
- }
216
-
217
- ticket = self._ticket_manager.create_task(**task_data)
218
-
219
- return self._convert_to_ticket_data(ticket)
220
-
221
- except Exception as e:
222
- logger.error(f"Failed to create ticket: {e}")
223
- raise
224
-
225
- def get_ticket(self, ticket_id: str) -> Optional[TicketData]:
226
- """
227
- Get a ticket by ID.
228
-
229
- Args:
230
- ticket_id: Ticket identifier
231
-
232
- Returns:
233
- TicketData object or None if not found
234
- """
235
- try:
236
- if not AI_TRACKDOWN_AVAILABLE:
237
- return None
238
-
239
- ticket = self._ticket_manager.get_ticket(ticket_id)
240
- if ticket:
241
- return self._convert_to_ticket_data(ticket)
242
- return None
243
-
244
- except Exception as e:
245
- logger.error(f"Failed to get ticket {ticket_id}: {e}")
246
- return None
247
-
248
- def list_tickets(
249
- self,
250
- status: Optional[str] = None,
251
- priority: Optional[str] = None,
252
- assignee: Optional[str] = None,
253
- labels: Optional[List[str]] = None,
254
- limit: Optional[int] = None
255
- ) -> List[TicketData]:
256
- """
257
- List tickets with optional filters.
258
-
259
- Args:
260
- status: Filter by status (open, in_progress, resolved, closed)
261
- priority: Filter by priority (low, medium, high, critical)
262
- assignee: Filter by assignee
263
- labels: Filter by labels (tickets must have all specified labels)
264
- limit: Maximum number of tickets to return
265
-
266
- Returns:
267
- List of TicketData objects
268
- """
269
- try:
270
- if not AI_TRACKDOWN_AVAILABLE:
271
- return []
272
-
273
- # Build filter criteria
274
- filters = {}
275
- if status:
276
- filters['status'] = getattr(TicketStatus, status.upper(), None)
277
- if priority:
278
- filters['priority'] = getattr(TicketPriority, priority.upper(), None)
279
- if assignee:
280
- filters['assignee'] = assignee
281
- if labels:
282
- filters['labels'] = labels
283
-
284
- tickets = self._ticket_manager.list_tickets(**filters)
285
-
286
- # Convert and limit results
287
- result = [self._convert_to_ticket_data(t) for t in tickets]
288
- if limit:
289
- result = result[:limit]
290
-
291
- return result
292
-
293
- except Exception as e:
294
- logger.error(f"Failed to list tickets: {e}")
295
- return []
296
-
297
- def update_ticket(
298
- self,
299
- ticket_id: str,
300
- title: Optional[str] = None,
301
- description: Optional[str] = None,
302
- status: Optional[str] = None,
303
- priority: Optional[str] = None,
304
- assignee: Optional[str] = None,
305
- labels: Optional[List[str]] = None,
306
- metadata: Optional[Dict[str, Any]] = None
307
- ) -> Optional[TicketData]:
308
- """
309
- Update an existing ticket.
310
-
311
- Args:
312
- ticket_id: Ticket identifier
313
- title: New title (optional)
314
- description: New description (optional)
315
- status: New status (optional)
316
- priority: New priority (optional)
317
- assignee: New assignee (optional)
318
- labels: New labels (optional, replaces existing)
319
- metadata: New metadata (optional, merges with existing)
320
-
321
- Returns:
322
- Updated TicketData object or None if not found
323
- """
324
- try:
325
- if not AI_TRACKDOWN_AVAILABLE:
326
- return None
327
-
328
- # Build update data
329
- updates = {}
330
- if title is not None:
331
- updates['title'] = title
332
- if description is not None:
333
- updates['description'] = description
334
- if status is not None:
335
- updates['status'] = getattr(TicketStatus, status.upper(), None)
336
- if priority is not None:
337
- updates['priority'] = getattr(TicketPriority, priority.upper(), None)
338
- if assignee is not None:
339
- updates['assignee'] = assignee
340
- if labels is not None:
341
- updates['labels'] = labels
342
- if metadata is not None:
343
- updates['metadata'] = metadata
344
-
345
- ticket = self._ticket_manager.update_ticket(ticket_id, **updates)
346
- if ticket:
347
- return self._convert_to_ticket_data(ticket)
348
- return None
349
-
350
- except Exception as e:
351
- logger.error(f"Failed to update ticket {ticket_id}: {e}")
352
- return None
353
-
354
- def add_comment(
355
- self,
356
- ticket_id: str,
357
- comment: str,
358
- author: Optional[str] = None
359
- ) -> bool:
360
- """
361
- Add a comment to a ticket.
362
-
363
- Args:
364
- ticket_id: Ticket identifier
365
- comment: Comment text
366
- author: Comment author (optional)
367
-
368
- Returns:
369
- True if successful, False otherwise
370
- """
371
- try:
372
- if not AI_TRACKDOWN_AVAILABLE:
373
- return False
374
-
375
- self._ticket_manager.add_comment(
376
- ticket_id=ticket_id,
377
- comment=comment,
378
- author=author or "claude-pm"
379
- )
380
- return True
381
-
382
- except Exception as e:
383
- logger.error(f"Failed to add comment to ticket {ticket_id}: {e}")
384
- return False
385
-
386
- def close_ticket(
387
- self,
388
- ticket_id: str,
389
- resolution: Optional[str] = None
390
- ) -> Optional[TicketData]:
391
- """
392
- Close a ticket.
393
-
394
- Args:
395
- ticket_id: Ticket identifier
396
- resolution: Optional resolution description
397
-
398
- Returns:
399
- Updated TicketData object or None if not found
400
- """
401
- try:
402
- if resolution:
403
- self.add_comment(ticket_id, f"Resolution: {resolution}")
404
-
405
- return self.update_ticket(ticket_id, status="closed")
406
-
407
- except Exception as e:
408
- logger.error(f"Failed to close ticket {ticket_id}: {e}")
409
- return None
410
-
411
- # Utility methods
412
-
413
- def search_tickets(self, query: str, limit: Optional[int] = None) -> List[TicketData]:
414
- """
415
- Search tickets by text query.
416
-
417
- Args:
418
- query: Search query (searches in title and description)
419
- limit: Maximum number of results
420
-
421
- Returns:
422
- List of matching TicketData objects
423
- """
424
- try:
425
- if not AI_TRACKDOWN_AVAILABLE:
426
- return []
427
-
428
- tickets = self._ticket_manager.search_tickets(query)
429
- result = [self._convert_to_ticket_data(t) for t in tickets]
430
-
431
- if limit:
432
- result = result[:limit]
433
-
434
- return result
435
-
436
- except Exception as e:
437
- logger.error(f"Failed to search tickets: {e}")
438
- return []
439
-
440
- def get_ticket_statistics(self) -> Dict[str, Any]:
441
- """
442
- Get ticket statistics.
443
-
444
- Returns:
445
- Dictionary with ticket statistics
446
- """
447
- try:
448
- if not AI_TRACKDOWN_AVAILABLE:
449
- return {
450
- "total": 0,
451
- "by_status": {},
452
- "by_priority": {},
453
- "unassigned": 0
454
- }
455
-
456
- stats = self._ticket_manager.get_statistics()
457
- return stats
458
-
459
- except Exception as e:
460
- logger.error(f"Failed to get ticket statistics: {e}")
461
- return {}
462
-
463
- def _convert_to_ticket_data(self, ticket: Any) -> TicketData:
464
- """Convert ai-trackdown ticket to TicketData."""
465
- # Task uses 'assignees' (list) not 'assignee' (single)
466
- assignee = ticket.assignees[0] if ticket.assignees else None
467
-
468
- # Task uses 'tags' not 'labels'
469
- labels = ticket.tags if hasattr(ticket, 'tags') else []
470
-
471
- return TicketData(
472
- id=ticket.id,
473
- title=ticket.title,
474
- description=ticket.description,
475
- status=ticket.status if isinstance(ticket.status, str) else str(ticket.status),
476
- priority=ticket.priority if isinstance(ticket.priority, str) else str(ticket.priority),
477
- assignee=assignee,
478
- labels=labels,
479
- created_at=ticket.created_at,
480
- updated_at=ticket.updated_at if hasattr(ticket, 'updated_at') else ticket.created_at,
481
- metadata=ticket.metadata or {}
482
- )
483
-
484
- # Async support for PM orchestration
485
-
486
- async def acreate_ticket(self, **kwargs) -> TicketData:
487
- """Async version of create_ticket."""
488
- loop = asyncio.get_event_loop()
489
- return await loop.run_in_executor(None, self.create_ticket, **kwargs)
490
-
491
- async def aget_ticket(self, ticket_id: str) -> Optional[TicketData]:
492
- """Async version of get_ticket."""
493
- loop = asyncio.get_event_loop()
494
- return await loop.run_in_executor(None, self.get_ticket, ticket_id)
495
-
496
- async def alist_tickets(self, **kwargs) -> List[TicketData]:
497
- """Async version of list_tickets."""
498
- loop = asyncio.get_event_loop()
499
- return await loop.run_in_executor(None, self.list_tickets, **kwargs)
500
-
501
- async def aupdate_ticket(self, ticket_id: str, **kwargs) -> Optional[TicketData]:
502
- """Async version of update_ticket."""
503
- loop = asyncio.get_event_loop()
504
- return await loop.run_in_executor(None, self.update_ticket, ticket_id, **kwargs)
505
-
506
-
507
- # Convenience functions for direct import
508
- def get_ticketing_service() -> TicketingService:
509
- """Get the singleton TicketingService instance."""
510
- return TicketingService.get_instance()