claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (792) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +432 -158
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/OUTPUT_STYLE.md +254 -29
  13. claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -191
  16. claude_mpm/agents/__init__.py +6 -0
  17. claude_mpm/agents/agent_loader.py +41 -14
  18. claude_mpm/agents/agent_loader_integration.py +3 -2
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent.json +6 -3
  21. claude_mpm/agents/base_agent_loader.py +21 -44
  22. claude_mpm/agents/frontmatter_validator.py +292 -252
  23. claude_mpm/agents/system_agent_config.py +3 -2
  24. claude_mpm/agents/templates/README.md +465 -0
  25. claude_mpm/agents/templates/circuit-breakers.md +1005 -0
  26. claude_mpm/agents/templates/context-management-examples.md +544 -0
  27. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  28. claude_mpm/agents/templates/pm-examples.md +474 -0
  29. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  30. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  31. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  32. claude_mpm/agents/templates/response-format.md +583 -0
  33. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  34. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  35. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  36. claude_mpm/agents/templates/validation-templates.md +312 -0
  37. claude_mpm/cli/__init__.py +72 -376
  38. claude_mpm/cli/commands/__init__.py +4 -0
  39. claude_mpm/cli/commands/agent_manager.py +675 -20
  40. claude_mpm/cli/commands/agent_source.py +774 -0
  41. claude_mpm/cli/commands/agent_state_manager.py +344 -0
  42. claude_mpm/cli/commands/agents.py +1673 -178
  43. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  44. claude_mpm/cli/commands/agents_detect.py +380 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_recommend.py +309 -0
  47. claude_mpm/cli/commands/aggregate.py +11 -7
  48. claude_mpm/cli/commands/analyze.py +18 -13
  49. claude_mpm/cli/commands/analyze_code.py +8 -4
  50. claude_mpm/cli/commands/auto_configure.py +566 -0
  51. claude_mpm/cli/commands/cleanup.py +12 -12
  52. claude_mpm/cli/commands/config.py +54 -17
  53. claude_mpm/cli/commands/configure.py +1184 -1055
  54. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  55. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  56. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  57. claude_mpm/cli/commands/configure_models.py +18 -0
  58. claude_mpm/cli/commands/configure_navigation.py +184 -0
  59. claude_mpm/cli/commands/configure_paths.py +104 -0
  60. claude_mpm/cli/commands/configure_persistence.py +254 -0
  61. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  62. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  63. claude_mpm/cli/commands/configure_validators.py +73 -0
  64. claude_mpm/cli/commands/dashboard.py +50 -52
  65. claude_mpm/cli/commands/debug.py +19 -19
  66. claude_mpm/cli/commands/doctor.py +51 -7
  67. claude_mpm/cli/commands/hook_errors.py +277 -0
  68. claude_mpm/cli/commands/info.py +3 -4
  69. claude_mpm/cli/commands/local_deploy.py +534 -0
  70. claude_mpm/cli/commands/mcp.py +17 -10
  71. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  72. claude_mpm/cli/commands/mcp_config.py +154 -0
  73. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  74. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  75. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  76. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  77. claude_mpm/cli/commands/memory.py +55 -21
  78. claude_mpm/cli/commands/monitor.py +160 -70
  79. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  80. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  81. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  82. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  83. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  84. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  85. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  86. claude_mpm/cli/commands/mpm_init_handler.py +114 -4
  87. claude_mpm/cli/commands/postmortem.py +401 -0
  88. claude_mpm/cli/commands/run.py +252 -167
  89. claude_mpm/cli/commands/search.py +458 -0
  90. claude_mpm/cli/commands/skill_source.py +694 -0
  91. claude_mpm/cli/commands/skills.py +1225 -0
  92. claude_mpm/cli/commands/uninstall.py +176 -0
  93. claude_mpm/cli/commands/upgrade.py +152 -0
  94. claude_mpm/cli/commands/verify.py +119 -0
  95. claude_mpm/cli/executor.py +279 -0
  96. claude_mpm/cli/helpers.py +105 -0
  97. claude_mpm/cli/interactive/__init__.py +21 -0
  98. claude_mpm/cli/interactive/agent_wizard.py +1872 -0
  99. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  100. claude_mpm/cli/parser.py +79 -2
  101. claude_mpm/cli/parsers/__init__.py +7 -1
  102. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  103. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  104. claude_mpm/cli/parsers/agents_parser.py +369 -1
  105. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  106. claude_mpm/cli/parsers/base_parser.py +196 -3
  107. claude_mpm/cli/parsers/config_parser.py +96 -43
  108. claude_mpm/cli/parsers/configure_parser.py +11 -15
  109. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  110. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  111. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  112. claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
  113. claude_mpm/cli/parsers/run_parser.py +5 -0
  114. claude_mpm/cli/parsers/search_parser.py +245 -0
  115. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  116. claude_mpm/cli/parsers/skills_parser.py +282 -0
  117. claude_mpm/cli/parsers/source_parser.py +138 -0
  118. claude_mpm/cli/shared/argument_patterns.py +20 -13
  119. claude_mpm/cli/shared/base_command.py +2 -2
  120. claude_mpm/cli/shared/output_formatters.py +28 -19
  121. claude_mpm/cli/startup.py +994 -0
  122. claude_mpm/cli/startup_display.py +480 -0
  123. claude_mpm/cli/startup_logging.py +179 -13
  124. claude_mpm/cli/utils.py +54 -3
  125. claude_mpm/cli_module/commands.py +1 -1
  126. claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
  127. claude_mpm/commands/mpm-agents-detect.md +177 -0
  128. claude_mpm/commands/mpm-agents-list.md +131 -0
  129. claude_mpm/commands/mpm-agents-recommend.md +223 -0
  130. claude_mpm/commands/mpm-config-view.md +150 -0
  131. claude_mpm/commands/mpm-doctor.md +9 -0
  132. claude_mpm/commands/mpm-help.md +297 -5
  133. claude_mpm/commands/mpm-init.md +401 -17
  134. claude_mpm/commands/mpm-monitor.md +418 -0
  135. claude_mpm/commands/mpm-postmortem.md +123 -0
  136. claude_mpm/commands/mpm-session-resume.md +381 -0
  137. claude_mpm/commands/mpm-status.md +79 -8
  138. claude_mpm/commands/mpm-ticket-organize.md +304 -0
  139. claude_mpm/commands/mpm-ticket-view.md +552 -0
  140. claude_mpm/commands/mpm-version.md +122 -0
  141. claude_mpm/commands/mpm.md +12 -0
  142. claude_mpm/config/agent_config.py +4 -4
  143. claude_mpm/config/agent_presets.py +488 -0
  144. claude_mpm/config/agent_sources.py +325 -0
  145. claude_mpm/config/experimental_features.py +7 -7
  146. claude_mpm/config/model_config.py +428 -0
  147. claude_mpm/config/paths.py +3 -2
  148. claude_mpm/config/skill_presets.py +392 -0
  149. claude_mpm/config/skill_sources.py +590 -0
  150. claude_mpm/config/socketio_config.py +3 -3
  151. claude_mpm/constants.py +28 -1
  152. claude_mpm/core/__init__.py +53 -17
  153. claude_mpm/core/agent_name_normalizer.py +3 -2
  154. claude_mpm/core/agent_registry.py +2 -2
  155. claude_mpm/core/agent_session_manager.py +10 -10
  156. claude_mpm/core/api_validator.py +330 -0
  157. claude_mpm/core/base_service.py +33 -23
  158. claude_mpm/core/cache.py +9 -9
  159. claude_mpm/core/claude_runner.py +24 -42
  160. claude_mpm/core/config.py +101 -8
  161. claude_mpm/core/config_aliases.py +7 -6
  162. claude_mpm/core/constants.py +66 -1
  163. claude_mpm/core/container.py +11 -5
  164. claude_mpm/core/enums.py +452 -0
  165. claude_mpm/core/error_handler.py +623 -0
  166. claude_mpm/core/factories.py +1 -1
  167. claude_mpm/core/file_utils.py +764 -0
  168. claude_mpm/core/framework/__init__.py +25 -0
  169. claude_mpm/core/framework/formatters/__init__.py +11 -0
  170. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  171. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  172. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  173. claude_mpm/core/framework/loaders/__init__.py +13 -0
  174. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  175. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  176. claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
  177. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  178. claude_mpm/core/framework/processors/__init__.py +11 -0
  179. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  180. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  181. claude_mpm/core/framework/processors/template_processor.py +244 -0
  182. claude_mpm/core/framework_loader.py +321 -1631
  183. claude_mpm/core/hook_error_memory.py +381 -0
  184. claude_mpm/core/hook_manager.py +49 -8
  185. claude_mpm/core/injectable_service.py +11 -8
  186. claude_mpm/core/instruction_reinforcement_hook.py +4 -3
  187. claude_mpm/core/interactive_session.py +146 -18
  188. claude_mpm/core/interfaces.py +56 -1
  189. claude_mpm/core/lazy.py +3 -3
  190. claude_mpm/core/log_manager.py +92 -23
  191. claude_mpm/core/logger.py +22 -15
  192. claude_mpm/core/logging_config.py +6 -2
  193. claude_mpm/core/logging_utils.py +520 -0
  194. claude_mpm/core/oneshot_session.py +122 -15
  195. claude_mpm/core/optimized_agent_loader.py +9 -9
  196. claude_mpm/core/optimized_startup.py +1 -1
  197. claude_mpm/core/output_style_manager.py +12 -192
  198. claude_mpm/core/pm_hook_interceptor.py +18 -12
  199. claude_mpm/core/protocols/__init__.py +23 -0
  200. claude_mpm/core/protocols/runner_protocol.py +103 -0
  201. claude_mpm/core/protocols/session_protocol.py +131 -0
  202. claude_mpm/core/service_registry.py +7 -3
  203. claude_mpm/core/session_manager.py +14 -12
  204. claude_mpm/core/shared/config_loader.py +1 -1
  205. claude_mpm/core/shared/singleton_manager.py +11 -4
  206. claude_mpm/core/socketio_pool.py +15 -15
  207. claude_mpm/core/system_context.py +38 -0
  208. claude_mpm/core/tool_access_control.py +3 -2
  209. claude_mpm/core/types.py +4 -11
  210. claude_mpm/core/typing_utils.py +7 -6
  211. claude_mpm/core/unified_agent_registry.py +115 -11
  212. claude_mpm/core/unified_config.py +6 -6
  213. claude_mpm/core/unified_paths.py +23 -20
  214. claude_mpm/dashboard/analysis_runner.py +4 -4
  215. claude_mpm/dashboard/api/simple_directory.py +261 -0
  216. claude_mpm/dashboard/static/css/activity.css +69 -69
  217. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  218. claude_mpm/dashboard/static/css/dashboard.css +600 -18
  219. claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
  220. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
  221. claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
  222. claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
  223. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  224. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  225. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  226. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  227. claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
  228. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  229. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  230. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  231. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
  232. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  233. claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
  234. claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
  235. claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
  236. claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
  237. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
  238. claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
  239. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  240. claude_mpm/dashboard/static/js/dashboard.js +309 -178
  241. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  242. claude_mpm/dashboard/static/js/socket-client.js +183 -139
  243. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  244. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  245. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  246. claude_mpm/dashboard/templates/code_simple.html +153 -0
  247. claude_mpm/dashboard/templates/index.html +125 -122
  248. claude_mpm/experimental/cli_enhancements.py +5 -7
  249. claude_mpm/generators/agent_profile_generator.py +5 -3
  250. claude_mpm/hooks/__init__.py +37 -1
  251. claude_mpm/hooks/base_hook.py +5 -4
  252. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  255. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  256. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  257. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  258. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  259. claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
  260. claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
  261. claude_mpm/hooks/claude_hooks/installer.py +67 -22
  262. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  263. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  271. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  272. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  273. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  274. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  275. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  276. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  277. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  278. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  279. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  280. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  281. claude_mpm/hooks/memory_integration_hook.py +1 -1
  282. claude_mpm/hooks/session_resume_hook.py +121 -0
  283. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  284. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  285. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  286. claude_mpm/hooks/validation_hooks.py +3 -3
  287. claude_mpm/init.py +23 -4
  288. claude_mpm/models/agent_session.py +8 -6
  289. claude_mpm/models/git_repository.py +198 -0
  290. claude_mpm/models/resume_log.py +340 -0
  291. claude_mpm/scripts/claude-hook-handler.sh +35 -9
  292. claude_mpm/scripts/launch_monitor.py +85 -0
  293. claude_mpm/scripts/mcp_server.py +3 -5
  294. claude_mpm/scripts/mpm_doctor.py +3 -2
  295. claude_mpm/scripts/socketio_daemon.py +159 -512
  296. claude_mpm/scripts/start_activity_logging.py +3 -1
  297. claude_mpm/services/__init__.py +144 -160
  298. claude_mpm/services/agents/__init__.py +18 -5
  299. claude_mpm/services/agents/agent_builder.py +56 -18
  300. claude_mpm/services/agents/agent_preset_service.py +238 -0
  301. claude_mpm/services/agents/agent_selection_service.py +484 -0
  302. claude_mpm/services/agents/auto_config_manager.py +796 -0
  303. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  304. claude_mpm/services/agents/cache_git_manager.py +621 -0
  305. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  306. claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
  307. claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
  308. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  309. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  310. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
  311. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  312. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  313. claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
  314. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  315. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  316. claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
  317. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  318. claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
  319. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  320. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  321. claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
  322. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  323. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  324. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  325. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  326. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  327. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  328. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
  329. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  330. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  331. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  332. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  333. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  334. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  335. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
  336. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  337. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  338. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
  339. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  340. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  341. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  342. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  343. claude_mpm/services/agents/git_source_manager.py +629 -0
  344. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  345. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  346. claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
  347. claude_mpm/services/agents/local_template_manager.py +784 -0
  348. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  349. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  350. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  351. claude_mpm/services/agents/memory/content_manager.py +17 -9
  352. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  353. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  354. claude_mpm/services/agents/memory/memory_format_service.py +6 -4
  355. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  356. claude_mpm/services/agents/memory/template_generator.py +3 -3
  357. claude_mpm/services/agents/observers.py +547 -0
  358. claude_mpm/services/agents/recommender.py +615 -0
  359. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  360. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  361. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  362. claude_mpm/services/agents/sources/__init__.py +13 -0
  363. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  364. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  365. claude_mpm/services/agents/startup_sync.py +239 -0
  366. claude_mpm/services/agents/toolchain_detector.py +474 -0
  367. claude_mpm/services/analysis/__init__.py +25 -0
  368. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  369. claude_mpm/services/analysis/postmortem_service.py +765 -0
  370. claude_mpm/services/async_session_logger.py +141 -98
  371. claude_mpm/services/claude_session_logger.py +82 -74
  372. claude_mpm/services/cli/agent_cleanup_service.py +5 -0
  373. claude_mpm/services/cli/agent_listing_service.py +5 -5
  374. claude_mpm/services/cli/agent_validation_service.py +3 -1
  375. claude_mpm/services/cli/memory_crud_service.py +12 -7
  376. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  377. claude_mpm/services/cli/resume_service.py +617 -0
  378. claude_mpm/services/cli/session_manager.py +104 -13
  379. claude_mpm/services/cli/session_pause_manager.py +504 -0
  380. claude_mpm/services/cli/session_resume_helper.py +372 -0
  381. claude_mpm/services/cli/startup_checker.py +13 -10
  382. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  383. claude_mpm/services/command_deployment_service.py +209 -13
  384. claude_mpm/services/command_handler_service.py +11 -5
  385. claude_mpm/services/core/__init__.py +33 -1
  386. claude_mpm/services/core/base.py +31 -11
  387. claude_mpm/services/core/interfaces/__init__.py +88 -3
  388. claude_mpm/services/core/interfaces/agent.py +184 -0
  389. claude_mpm/services/core/interfaces/health.py +169 -0
  390. claude_mpm/services/core/interfaces/model.py +281 -0
  391. claude_mpm/services/core/interfaces/process.py +372 -0
  392. claude_mpm/services/core/interfaces/project.py +121 -0
  393. claude_mpm/services/core/interfaces/restart.py +307 -0
  394. claude_mpm/services/core/interfaces/stability.py +260 -0
  395. claude_mpm/services/core/interfaces.py +56 -1
  396. claude_mpm/services/core/memory_manager.py +92 -47
  397. claude_mpm/services/core/models/__init__.py +70 -0
  398. claude_mpm/services/core/models/agent_config.py +384 -0
  399. claude_mpm/services/core/models/health.py +162 -0
  400. claude_mpm/services/core/models/process.py +239 -0
  401. claude_mpm/services/core/models/restart.py +302 -0
  402. claude_mpm/services/core/models/stability.py +264 -0
  403. claude_mpm/services/core/models/toolchain.py +306 -0
  404. claude_mpm/services/core/path_resolver.py +36 -14
  405. claude_mpm/services/diagnostics/__init__.py +2 -2
  406. claude_mpm/services/diagnostics/checks/__init__.py +8 -2
  407. claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
  408. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  409. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  410. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  411. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  412. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  413. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  414. claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
  415. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
  416. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  417. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
  418. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  419. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  420. claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
  421. claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
  422. claude_mpm/services/diagnostics/models.py +37 -21
  423. claude_mpm/services/event_aggregator.py +5 -3
  424. claude_mpm/services/event_bus/direct_relay.py +11 -7
  425. claude_mpm/services/event_bus/event_bus.py +51 -9
  426. claude_mpm/services/event_bus/relay.py +33 -14
  427. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  428. claude_mpm/services/events/consumers/logging.py +1 -2
  429. claude_mpm/services/events/core.py +5 -6
  430. claude_mpm/services/events/producers/hook.py +6 -6
  431. claude_mpm/services/events/producers/system.py +8 -8
  432. claude_mpm/services/exceptions.py +5 -5
  433. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  434. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  435. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  436. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  437. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  438. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  439. claude_mpm/services/git/__init__.py +21 -0
  440. claude_mpm/services/git/git_operations_service.py +494 -0
  441. claude_mpm/services/github/__init__.py +21 -0
  442. claude_mpm/services/github/github_cli_service.py +397 -0
  443. claude_mpm/services/hook_installer_service.py +506 -0
  444. claude_mpm/services/hook_service.py +5 -6
  445. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  446. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  447. claude_mpm/services/infrastructure/logging.py +2 -2
  448. claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
  449. claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
  450. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  451. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  452. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  453. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  454. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  455. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  456. claude_mpm/services/instructions/__init__.py +9 -0
  457. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  458. claude_mpm/services/local_ops/__init__.py +155 -0
  459. claude_mpm/services/local_ops/crash_detector.py +257 -0
  460. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  461. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  462. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  463. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  464. claude_mpm/services/local_ops/health_manager.py +427 -0
  465. claude_mpm/services/local_ops/log_monitor.py +396 -0
  466. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  467. claude_mpm/services/local_ops/process_manager.py +595 -0
  468. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  469. claude_mpm/services/local_ops/restart_manager.py +401 -0
  470. claude_mpm/services/local_ops/restart_policy.py +387 -0
  471. claude_mpm/services/local_ops/state_manager.py +372 -0
  472. claude_mpm/services/local_ops/unified_manager.py +600 -0
  473. claude_mpm/services/mcp_config_manager.py +1542 -0
  474. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  475. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  476. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  477. claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
  478. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  479. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  480. claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
  481. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  482. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  483. claude_mpm/services/mcp_gateway/main.py +90 -15
  484. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  485. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  486. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
  487. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
  488. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  489. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  490. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  491. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  492. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  493. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  494. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
  495. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  496. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  497. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  498. claude_mpm/services/mcp_service_verifier.py +732 -0
  499. claude_mpm/services/memory/builder.py +9 -8
  500. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  501. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  502. claude_mpm/services/memory/failure_tracker.py +578 -0
  503. claude_mpm/services/memory/indexed_memory.py +8 -8
  504. claude_mpm/services/memory/optimizer.py +8 -9
  505. claude_mpm/services/memory/router.py +3 -3
  506. claude_mpm/services/memory_hook_service.py +165 -4
  507. claude_mpm/services/model/__init__.py +147 -0
  508. claude_mpm/services/model/base_provider.py +365 -0
  509. claude_mpm/services/model/claude_provider.py +412 -0
  510. claude_mpm/services/model/model_router.py +452 -0
  511. claude_mpm/services/model/ollama_provider.py +415 -0
  512. claude_mpm/services/monitor/__init__.py +20 -0
  513. claude_mpm/services/monitor/daemon.py +691 -0
  514. claude_mpm/services/monitor/daemon_manager.py +1040 -0
  515. claude_mpm/services/monitor/event_emitter.py +350 -0
  516. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  517. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  518. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  519. claude_mpm/services/monitor/handlers/file.py +264 -0
  520. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  521. claude_mpm/services/monitor/management/__init__.py +18 -0
  522. claude_mpm/services/monitor/management/health.py +124 -0
  523. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  524. claude_mpm/services/monitor/server.py +817 -0
  525. claude_mpm/services/monitor_build_service.py +2 -2
  526. claude_mpm/services/native_agent_converter.py +356 -0
  527. claude_mpm/services/orphan_detection.py +786 -0
  528. claude_mpm/services/port_manager.py +3 -3
  529. claude_mpm/services/pr/__init__.py +14 -0
  530. claude_mpm/services/pr/pr_template_service.py +329 -0
  531. claude_mpm/services/project/__init__.py +23 -0
  532. claude_mpm/services/project/analyzer.py +3 -3
  533. claude_mpm/services/project/architecture_analyzer.py +5 -5
  534. claude_mpm/services/project/archive_manager.py +1045 -0
  535. claude_mpm/services/project/dependency_analyzer.py +4 -4
  536. claude_mpm/services/project/detection_strategies.py +719 -0
  537. claude_mpm/services/project/documentation_manager.py +554 -0
  538. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  539. claude_mpm/services/project/metrics_collector.py +4 -4
  540. claude_mpm/services/project/project_organizer.py +1005 -0
  541. claude_mpm/services/project/registry.py +13 -7
  542. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  543. claude_mpm/services/project_port_allocator.py +596 -0
  544. claude_mpm/services/response_tracker.py +21 -10
  545. claude_mpm/services/runner_configuration_service.py +17 -3
  546. claude_mpm/services/self_upgrade_service.py +500 -0
  547. claude_mpm/services/session_management_service.py +23 -9
  548. claude_mpm/services/session_manager.py +380 -0
  549. claude_mpm/services/shared/__init__.py +2 -1
  550. claude_mpm/services/shared/async_service_base.py +16 -27
  551. claude_mpm/services/shared/config_service_base.py +17 -14
  552. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  553. claude_mpm/services/shared/service_factory.py +8 -5
  554. claude_mpm/services/skills/__init__.py +18 -0
  555. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  556. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  557. claude_mpm/services/skills_config.py +547 -0
  558. claude_mpm/services/skills_deployer.py +955 -0
  559. claude_mpm/services/socketio/client_proxy.py +60 -5
  560. claude_mpm/services/socketio/dashboard_server.py +361 -0
  561. claude_mpm/services/socketio/event_normalizer.py +10 -6
  562. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  563. claude_mpm/services/socketio/handlers/base.py +2 -2
  564. claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
  565. claude_mpm/services/socketio/handlers/connection.py +22 -41
  566. claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
  567. claude_mpm/services/socketio/handlers/file.py +46 -10
  568. claude_mpm/services/socketio/handlers/git.py +9 -9
  569. claude_mpm/services/socketio/handlers/hook.py +29 -17
  570. claude_mpm/services/socketio/handlers/registry.py +4 -2
  571. claude_mpm/services/socketio/monitor_client.py +364 -0
  572. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  573. claude_mpm/services/socketio/server/connection_manager.py +2 -2
  574. claude_mpm/services/socketio/server/core.py +142 -8
  575. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  576. claude_mpm/services/socketio/server/main.py +24 -24
  577. claude_mpm/services/socketio_client_manager.py +4 -4
  578. claude_mpm/services/subprocess_launcher_service.py +19 -15
  579. claude_mpm/services/system_instructions_service.py +3 -5
  580. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  581. claude_mpm/services/ticket_services/validation_service.py +5 -5
  582. claude_mpm/services/unified/__init__.py +65 -0
  583. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  584. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  585. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  586. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  587. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  588. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  589. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  590. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  591. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  592. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  593. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  594. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  595. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  596. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  597. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  598. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  599. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  600. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  601. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  602. claude_mpm/services/unified/interfaces.py +475 -0
  603. claude_mpm/services/unified/migration.py +509 -0
  604. claude_mpm/services/unified/strategies.py +534 -0
  605. claude_mpm/services/unified/unified_analyzer.py +542 -0
  606. claude_mpm/services/unified/unified_config.py +691 -0
  607. claude_mpm/services/unified/unified_deployment.py +466 -0
  608. claude_mpm/services/utility_service.py +6 -3
  609. claude_mpm/services/version_control/branch_strategy.py +2 -2
  610. claude_mpm/services/version_control/conflict_resolution.py +14 -8
  611. claude_mpm/services/version_control/git_operations.py +26 -24
  612. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  613. claude_mpm/services/version_control/version_parser.py +14 -11
  614. claude_mpm/services/version_service.py +104 -1
  615. claude_mpm/services/visualization/__init__.py +1 -5
  616. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  617. claude_mpm/skills/__init__.py +42 -0
  618. claude_mpm/skills/agent_skills_injector.py +324 -0
  619. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  620. claude_mpm/skills/bundled/__init__.py +6 -0
  621. claude_mpm/skills/bundled/api-documentation.md +393 -0
  622. claude_mpm/skills/bundled/async-testing.md +571 -0
  623. claude_mpm/skills/bundled/code-review.md +143 -0
  624. claude_mpm/skills/bundled/database-migration.md +199 -0
  625. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  626. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  627. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  628. claude_mpm/skills/bundled/git-workflow.md +414 -0
  629. claude_mpm/skills/bundled/imagemagick.md +204 -0
  630. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  631. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  632. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  633. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  634. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  635. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  636. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  637. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  638. claude_mpm/skills/bundled/pdf.md +141 -0
  639. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  640. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  641. claude_mpm/skills/bundled/security-scanning.md +327 -0
  642. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  643. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  644. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  645. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  646. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  647. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  648. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  649. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  650. claude_mpm/skills/bundled/xlsx.md +157 -0
  651. claude_mpm/skills/registry.py +286 -0
  652. claude_mpm/skills/skill_manager.py +310 -0
  653. claude_mpm/skills/skills_registry.py +347 -0
  654. claude_mpm/skills/skills_service.py +739 -0
  655. claude_mpm/storage/state_storage.py +31 -31
  656. claude_mpm/templates/questions/__init__.py +38 -0
  657. claude_mpm/templates/questions/base.py +193 -0
  658. claude_mpm/templates/questions/pr_strategy.py +311 -0
  659. claude_mpm/templates/questions/project_init.py +385 -0
  660. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  661. claude_mpm/tools/__main__.py +9 -9
  662. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  663. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  664. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  665. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  666. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  667. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  668. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  669. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  670. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  671. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  672. claude_mpm/tools/code_tree_builder.py +6 -6
  673. claude_mpm/tools/code_tree_events.py +14 -10
  674. claude_mpm/tools/socketio_debug.py +11 -11
  675. claude_mpm/utils/agent_dependency_loader.py +184 -36
  676. claude_mpm/utils/agent_filters.py +288 -0
  677. claude_mpm/utils/common.py +544 -0
  678. claude_mpm/utils/config_manager.py +12 -6
  679. claude_mpm/utils/database_connector.py +298 -0
  680. claude_mpm/utils/dependency_cache.py +5 -3
  681. claude_mpm/utils/dependency_strategies.py +15 -10
  682. claude_mpm/utils/display_helper.py +260 -0
  683. claude_mpm/utils/environment_context.py +4 -3
  684. claude_mpm/utils/error_handler.py +5 -3
  685. claude_mpm/utils/file_utils.py +13 -14
  686. claude_mpm/utils/git_analyzer.py +407 -0
  687. claude_mpm/utils/gitignore.py +241 -0
  688. claude_mpm/utils/log_cleanup.py +627 -0
  689. claude_mpm/utils/migration.py +372 -0
  690. claude_mpm/utils/path_operations.py +7 -4
  691. claude_mpm/utils/progress.py +387 -0
  692. claude_mpm/utils/robust_installer.py +131 -24
  693. claude_mpm/utils/session_logging.py +2 -2
  694. claude_mpm/utils/structured_questions.py +619 -0
  695. claude_mpm/utils/subprocess_utils.py +9 -8
  696. claude_mpm/validation/agent_validator.py +6 -6
  697. claude_mpm/validation/frontmatter_validator.py +6 -6
  698. claude_mpm-5.0.9.dist-info/METADATA +1028 -0
  699. claude_mpm-5.0.9.dist-info/RECORD +864 -0
  700. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
  701. claude_mpm/agents/INSTRUCTIONS.md +0 -261
  702. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  703. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  704. claude_mpm/agents/templates/agent-manager.json +0 -270
  705. claude_mpm/agents/templates/agent-manager.md +0 -619
  706. claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
  707. claude_mpm/agents/templates/api_qa.json +0 -171
  708. claude_mpm/agents/templates/code_analyzer.json +0 -95
  709. claude_mpm/agents/templates/data_engineer.json +0 -152
  710. claude_mpm/agents/templates/documentation.json +0 -175
  711. claude_mpm/agents/templates/engineer.json +0 -176
  712. claude_mpm/agents/templates/imagemagick.json +0 -261
  713. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  714. claude_mpm/agents/templates/memory_manager.json +0 -155
  715. claude_mpm/agents/templates/ops.json +0 -175
  716. claude_mpm/agents/templates/project_organizer.json +0 -130
  717. claude_mpm/agents/templates/qa.json +0 -223
  718. claude_mpm/agents/templates/refactoring_engineer.json +0 -266
  719. claude_mpm/agents/templates/research.json +0 -163
  720. claude_mpm/agents/templates/security.json +0 -153
  721. claude_mpm/agents/templates/ticketing.json +0 -169
  722. claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
  723. claude_mpm/agents/templates/version_control.json +0 -147
  724. claude_mpm/agents/templates/web_qa.json +0 -254
  725. claude_mpm/agents/templates/web_ui.json +0 -176
  726. claude_mpm/cli/commands/configure_tui.py +0 -1927
  727. claude_mpm/cli/commands/mpm_init.py +0 -594
  728. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  729. claude_mpm/commands/mpm-agents.md +0 -12
  730. claude_mpm/commands/mpm-config.md +0 -18
  731. claude_mpm/commands/mpm-tickets.md +0 -102
  732. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  733. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  734. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  735. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  736. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  737. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  738. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  739. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  740. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  741. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  742. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  743. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  744. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  745. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  746. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  747. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  748. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  749. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  750. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  751. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  752. claude_mpm/dashboard/static/css/code-tree.css +0 -1408
  753. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  754. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  755. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  756. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  757. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  758. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  759. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  760. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  761. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  762. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  763. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  764. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  765. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  766. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  767. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  768. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  769. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  770. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  771. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  772. claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
  773. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
  774. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  775. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  776. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  777. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  778. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  779. claude_mpm/scripts/socketio_server_manager.py +0 -349
  780. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  781. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  782. claude_mpm/services/cli/socketio_manager.py +0 -537
  783. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  784. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  785. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  786. claude_mpm/services/project/analyzer_refactored.py +0 -450
  787. claude_mpm/tools/code_tree_analyzer.py +0 -1693
  788. claude_mpm-4.1.26.dist-info/METADATA +0 -332
  789. claude_mpm-4.1.26.dist-info/RECORD +0 -606
  790. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  791. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  792. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -41,6 +41,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
41
41
  self.logger = get_logger(__name__)
42
42
  self.analysis_runner = None
43
43
  self.code_analyzer = None # For lazy loading operations
44
+ self._emit_tasks: set = set() # Track emit tasks to prevent GC
45
+
46
+ def _create_emit_task(self, coro):
47
+ """Create a tracked emit task to prevent garbage collection."""
48
+ task = asyncio.get_event_loop().create_task(coro)
49
+ self._emit_tasks.add(task)
50
+ task.add_done_callback(self._emit_tasks.discard)
51
+ return task
44
52
 
45
53
  def initialize(self):
46
54
  """Initialize the analysis runner."""
@@ -218,7 +226,7 @@ class CodeAnalysisEventHandler(BaseEventHandler):
218
226
 
219
227
  # SECURITY: Validate the requested path
220
228
  # Allow access to the explicitly chosen working directory and its subdirectories
221
- requested_path = Path(path).absolute()
229
+ Path(path).absolute()
222
230
 
223
231
  # For now, we trust the frontend to send valid paths
224
232
  # In production, you might want to maintain a server-side list of allowed directories
@@ -246,16 +254,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
246
254
  # Special handling for 'info' events - they should be passed through directly
247
255
  if event_type == "info":
248
256
  # INFO events for granular tracking
249
- loop = asyncio.get_event_loop()
250
- loop.create_task(
257
+ self._create_emit_task(
251
258
  self.server.core.sio.emit(
252
259
  "info", {"request_id": request_id, **event_data}
253
260
  )
254
261
  )
255
262
  else:
256
263
  # Regular code analysis events
257
- loop = asyncio.get_event_loop()
258
- loop.create_task(
264
+ self._create_emit_task(
259
265
  self.server.core.sio.emit(
260
266
  event_type, {"request_id": request_id, **event_data}
261
267
  )
@@ -266,7 +272,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
266
272
  emitter.emit = socket_emit
267
273
  # Initialize CodeTreeAnalyzer with emitter keyword argument
268
274
  self.logger.info("Creating CodeTreeAnalyzer")
269
- self.code_analyzer = CodeTreeAnalyzer(emitter=emitter)
275
+ # Pass emit_events=False to prevent duplicate events from the analyzer
276
+ # The emitter will still work but the analyzer won't create its own stdout emitter
277
+ self.code_analyzer = CodeTreeAnalyzer(
278
+ emit_events=False, emitter=emitter
279
+ )
270
280
 
271
281
  # Use the provided path as-is - the frontend sends the absolute path
272
282
  # Make sure we're using an absolute path
@@ -433,16 +443,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
433
443
  # Special handling for 'info' events - they should be passed through directly
434
444
  if event_type == "info":
435
445
  # INFO events for granular tracking
436
- loop = asyncio.get_event_loop()
437
- loop.create_task(
446
+ self._create_emit_task(
438
447
  self.server.core.sio.emit(
439
448
  "info", {"request_id": request_id, **event_data}
440
449
  )
441
450
  )
442
451
  else:
443
452
  # Regular code analysis events
444
- loop = asyncio.get_event_loop()
445
- loop.create_task(
453
+ self._create_emit_task(
446
454
  self.server.core.sio.emit(
447
455
  event_type, {"request_id": request_id, **event_data}
448
456
  )
@@ -452,7 +460,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
452
460
  emitter.emit = socket_emit
453
461
  # Initialize CodeTreeAnalyzer with emitter keyword argument
454
462
  self.logger.info("Creating CodeTreeAnalyzer")
455
- self.code_analyzer = CodeTreeAnalyzer(emitter=emitter)
463
+ # Pass emit_events=False to prevent duplicate events from the analyzer
464
+ # The emitter will still work but the analyzer won't create its own stdout emitter
465
+ self.code_analyzer = CodeTreeAnalyzer(
466
+ emit_events=False, emitter=emitter
467
+ )
456
468
 
457
469
  # Discover directory
458
470
  result = self.code_analyzer.discover_directory(path, ignore_patterns)
@@ -463,14 +475,41 @@ class CodeAnalysisEventHandler(BaseEventHandler):
463
475
  )
464
476
  self.logger.debug(f"Full result: {result}")
465
477
 
478
+ # DEBUG: Log exact children being sent
479
+ children = result.get("children", [])
480
+ if children:
481
+ self.logger.info(
482
+ f"Children being sent: {[child.get('name') for child in children]}"
483
+ )
484
+ self.logger.info(f"Full children data: {children}")
485
+ else:
486
+ self.logger.warning(f"No children found for {path}")
487
+
488
+ # Prepare the response data
489
+ response_data = {
490
+ "request_id": request_id,
491
+ "path": path, # Absolute path as requested
492
+ "name": Path(path).name, # Just the directory name for display
493
+ "type": result.get("type", "directory"),
494
+ "children": children, # Send children array directly
495
+ }
496
+
497
+ # CRITICAL DEBUG: Log exact JSON that will be sent
498
+ import json
499
+
500
+ self.logger.info(
501
+ f"Sending response data (JSON): {json.dumps(response_data, indent=2)}"
502
+ )
503
+ self.logger.info(
504
+ f"Children count in response: {len(response_data.get('children', []))}"
505
+ )
506
+
466
507
  # Send result with correct event name (using colons, not dots!)
508
+ # Include both absolute path and relative name for frontend compatibility
509
+ # IMPORTANT: Don't use **result as it overwrites path and name
467
510
  await self.server.core.sio.emit(
468
511
  "code:directory:discovered",
469
- {
470
- "request_id": request_id,
471
- "path": path,
472
- **result,
473
- },
512
+ response_data,
474
513
  room=sid,
475
514
  )
476
515
 
@@ -497,7 +536,7 @@ class CodeAnalysisEventHandler(BaseEventHandler):
497
536
 
498
537
  path = data.get("path")
499
538
  request_id = data.get("request_id")
500
- show_hidden_files = data.get("show_hidden_files", False)
539
+ data.get("show_hidden_files", False)
501
540
 
502
541
  if not path:
503
542
  await self.server.core.sio.emit(
@@ -556,8 +595,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
556
595
  return
557
596
 
558
597
  try:
598
+ self.logger.info(f"Starting file analysis for: {path}")
599
+
559
600
  # Ensure analyzer exists
560
601
  if not self.code_analyzer:
602
+ self.logger.info("Creating new CodeTreeAnalyzer instance")
561
603
  emitter = CodeTreeEventEmitter(use_stdout=False)
562
604
  # Override emit method to send to Socket.IO
563
605
  original_emit = emitter.emit
@@ -571,16 +613,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
571
613
  # Special handling for 'info' events - they should be passed through directly
572
614
  if event_type == "info":
573
615
  # INFO events for granular tracking
574
- loop = asyncio.get_event_loop()
575
- loop.create_task(
616
+ self._create_emit_task(
576
617
  self.server.core.sio.emit(
577
618
  "info", {"request_id": request_id, **event_data}
578
619
  )
579
620
  )
580
621
  else:
581
622
  # Regular code analysis events
582
- loop = asyncio.get_event_loop()
583
- loop.create_task(
623
+ self._create_emit_task(
584
624
  self.server.core.sio.emit(
585
625
  event_type, {"request_id": request_id, **event_data}
586
626
  )
@@ -590,24 +630,47 @@ class CodeAnalysisEventHandler(BaseEventHandler):
590
630
  emitter.emit = socket_emit
591
631
  # Initialize CodeTreeAnalyzer with emitter keyword argument
592
632
  self.logger.info("Creating CodeTreeAnalyzer")
593
- self.code_analyzer = CodeTreeAnalyzer(emitter=emitter)
633
+ # Pass emit_events=False to prevent duplicate events from the analyzer
634
+ # The emitter will still work but the analyzer won't create its own stdout emitter
635
+ self.code_analyzer = CodeTreeAnalyzer(
636
+ emit_events=False, emitter=emitter
637
+ )
638
+ self.logger.info("CodeTreeAnalyzer created successfully")
594
639
 
595
640
  # Analyze file
641
+ self.logger.info(f"Calling analyze_file for: {path}")
596
642
  result = self.code_analyzer.analyze_file(path)
643
+ self.logger.info(
644
+ f"Analysis complete. Result keys: {list(result.keys()) if result else 'None'}"
645
+ )
646
+
647
+ if result:
648
+ self.logger.info(
649
+ f"Analysis result: elements={len(result.get('elements', []))}, nodes={len(result.get('nodes', []))}"
650
+ )
651
+ else:
652
+ self.logger.warning("Analysis returned None or empty result")
597
653
 
598
654
  # Send result with correct event name (using colons, not dots!)
655
+ response_data = {
656
+ "request_id": request_id,
657
+ "path": path,
658
+ **result,
659
+ }
660
+
661
+ self.logger.info(f"Emitting code:file:analyzed event to {sid}")
599
662
  await self.server.core.sio.emit(
600
663
  "code:file:analyzed",
601
- {
602
- "request_id": request_id,
603
- "path": path,
604
- **result,
605
- },
664
+ response_data,
606
665
  room=sid,
607
666
  )
667
+ self.logger.info("Event emitted successfully")
608
668
 
609
669
  except Exception as e:
610
670
  self.logger.error(f"Error analyzing file {path}: {e}")
671
+ import traceback
672
+
673
+ self.logger.error(f"Full traceback: {traceback.format_exc()}")
611
674
  await self.server.core.sio.emit(
612
675
  "code:analysis:error",
613
676
  {
@@ -8,11 +8,15 @@ from other handlers makes connection management more maintainable.
8
8
  import asyncio
9
9
  import functools
10
10
  import time
11
- from datetime import datetime
11
+ from datetime import datetime, timezone
12
12
  from typing import Any, Callable, Dict, List, Optional
13
13
 
14
+ from claude_mpm.core.logging_utils import get_logger
15
+
14
16
  from .base import BaseEventHandler
15
17
 
18
+ logger = get_logger(__name__)
19
+
16
20
 
17
21
  def timeout_handler(timeout_seconds: float = 5.0):
18
22
  """Decorator to add timeout protection to async handlers.
@@ -39,49 +43,26 @@ def timeout_handler(timeout_seconds: float = 5.0):
39
43
 
40
44
  elapsed = time.time() - start_time
41
45
  if elapsed > timeout_seconds * 0.8: # Warn if close to timeout
42
- # Try to get logger from closure scope or fallback to print
43
- try:
44
- import logging
45
-
46
- logger = logging.getLogger(__name__)
47
- logger.warning(
48
- f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
49
- f"(close to {timeout_seconds}s timeout)"
50
- )
51
- except:
52
- print(
53
- f"⚠️ Handler {handler_name} took {elapsed:.2f}s (close to {timeout_seconds}s timeout)"
54
- )
46
+ logger.warning(
47
+ f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
48
+ f"(close to {timeout_seconds}s timeout)"
49
+ )
55
50
 
56
51
  return result
57
52
 
58
53
  except asyncio.TimeoutError:
59
54
  elapsed = time.time() - start_time
60
- # Try to get logger from closure scope or fallback to print
61
- try:
62
- import logging
63
-
64
- logger = logging.getLogger(__name__)
65
- logger.error(
66
- f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
67
- )
68
- except:
69
- print(f"❌ Handler {handler_name} timed out after {elapsed:.2f}s")
55
+ logger.error(
56
+ f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
57
+ )
70
58
 
71
59
  return None
72
60
 
73
61
  except Exception as e:
74
62
  elapsed = time.time() - start_time
75
- # Try to get logger from closure scope or fallback to print
76
- try:
77
- import logging
78
-
79
- logger = logging.getLogger(__name__)
80
- logger.error(
81
- f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
82
- )
83
- except:
84
- print(f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}")
63
+ logger.error(
64
+ f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
65
+ )
85
66
  raise
86
67
 
87
68
  return wrapper
@@ -274,7 +255,7 @@ class ConnectionEventHandler(BaseEventHandler):
274
255
  # Force disconnect if still connected
275
256
  try:
276
257
  await self.sio.disconnect(sid)
277
- except:
258
+ except Exception:
278
259
  pass # Already disconnected
279
260
 
280
261
  self.logger.info(f"🔌 Cleaned up stale connection: {sid}")
@@ -326,7 +307,7 @@ class ConnectionEventHandler(BaseEventHandler):
326
307
  status_data = {
327
308
  "type": "connection",
328
309
  "subtype": "status",
329
- "timestamp": datetime.utcnow().isoformat() + "Z",
310
+ "timestamp": datetime.now(timezone.utc).isoformat() + "Z",
330
311
  "source": "server",
331
312
  "session_id": self.server.session_id,
332
313
  "data": {
@@ -348,13 +329,13 @@ class ConnectionEventHandler(BaseEventHandler):
348
329
  {
349
330
  "type": "connection",
350
331
  "subtype": "welcome",
351
- "timestamp": datetime.utcnow().isoformat() + "Z",
332
+ "timestamp": datetime.now(timezone.utc).isoformat() + "Z",
352
333
  "source": "server",
353
334
  "session_id": self.server.session_id,
354
335
  "data": {
355
336
  "message": "Connected to Claude MPM Socket.IO server",
356
337
  "client_id": sid,
357
- "server_time": datetime.utcnow().isoformat() + "Z",
338
+ "server_time": datetime.now(timezone.utc).isoformat() + "Z",
358
339
  "build_info": monitor_build_info,
359
340
  },
360
341
  },
@@ -401,7 +382,7 @@ class ConnectionEventHandler(BaseEventHandler):
401
382
  status_data = {
402
383
  "type": "connection",
403
384
  "subtype": "status",
404
- "timestamp": datetime.utcnow().isoformat() + "Z",
385
+ "timestamp": datetime.now(timezone.utc).isoformat() + "Z",
405
386
  "source": "server",
406
387
  "session_id": self.server.session_id,
407
388
  "data": {
@@ -456,7 +437,7 @@ class ConnectionEventHandler(BaseEventHandler):
456
437
  {
457
438
  "type": "connection",
458
439
  "subtype": "subscribed",
459
- "timestamp": datetime.utcnow().isoformat() + "Z",
440
+ "timestamp": datetime.now(timezone.utc).isoformat() + "Z",
460
441
  "source": "server",
461
442
  "data": {"channels": channels},
462
443
  },
@@ -558,7 +539,7 @@ class ConnectionEventHandler(BaseEventHandler):
558
539
  if data and "timestamp" in data:
559
540
  rtt = current_time - data["timestamp"]
560
541
  if rtt < 10: # Reasonable RTT
561
- self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt*1000:.1f}ms")
542
+ self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt * 1000:.1f}ms")
562
543
 
563
544
  def _normalize_event(self, event_data: Dict[str, Any]) -> Dict[str, Any]:
564
545
  """Normalize event format to ensure consistency.
@@ -8,7 +8,7 @@ DESIGN DECISION: Centralized connection event handling ensures consistent
8
8
  state management and provides resilient event delivery across reconnections.
9
9
  """
10
10
 
11
- from datetime import datetime
11
+ from datetime import datetime, timezone
12
12
 
13
13
  from .base import BaseEventHandler
14
14
 
@@ -50,7 +50,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
50
50
  # Store client info
51
51
  self.server.client_info[sid] = {
52
52
  "client_id": conn.client_id,
53
- "connected_at": datetime.now().isoformat(),
53
+ "connected_at": datetime.now(timezone.utc).isoformat(),
54
54
  "user_agent": environ.get("HTTP_USER_AGENT", "unknown"),
55
55
  "remote_addr": environ.get("REMOTE_ADDR", "unknown"),
56
56
  }
@@ -61,7 +61,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
61
61
  {
62
62
  "client_id": conn.client_id,
63
63
  "sid": sid,
64
- "timestamp": datetime.now().isoformat(),
64
+ "timestamp": datetime.now(timezone.utc).isoformat(),
65
65
  "server_version": self.get_server_version(),
66
66
  },
67
67
  room=sid,
@@ -120,7 +120,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
120
120
  self.server.stats["connections_total"] += 1
121
121
 
122
122
  self.server.client_info[sid] = {
123
- "connected_at": datetime.now().isoformat(),
123
+ "connected_at": datetime.now(timezone.utc).isoformat(),
124
124
  "user_agent": environ.get("HTTP_USER_AGENT", "unknown"),
125
125
  "remote_addr": environ.get("REMOTE_ADDR", "unknown"),
126
126
  }
@@ -185,8 +185,8 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
185
185
  await sio.emit(
186
186
  "pong",
187
187
  {
188
- "timestamp": datetime.now().isoformat(),
189
- "server_time": datetime.now().timestamp(),
188
+ "timestamp": datetime.now(timezone.utc).isoformat(),
189
+ "server_time": datetime.now(timezone.utc).timestamp(),
190
190
  },
191
191
  room=sid,
192
192
  )
@@ -210,7 +210,10 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
210
210
  # Optional: Send confirmation
211
211
  await sio.emit(
212
212
  "ack_confirmed",
213
- {"sequence": sequence, "timestamp": datetime.now().isoformat()},
213
+ {
214
+ "sequence": sequence,
215
+ "timestamp": datetime.now(timezone.utc).isoformat(),
216
+ },
214
217
  room=sid,
215
218
  )
216
219
 
@@ -263,7 +266,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
263
266
  """Get connection statistics for debugging."""
264
267
  try:
265
268
  stats = {
266
- "timestamp": datetime.now().isoformat(),
269
+ "timestamp": datetime.now(timezone.utc).isoformat(),
267
270
  "total_connections": len(self.server.connected_clients),
268
271
  "server_stats": self.server.stats,
269
272
  }
@@ -312,7 +315,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
312
315
  if self.server.stats.get("start_time")
313
316
  else None
314
317
  ),
315
- "timestamp": datetime.now().isoformat(),
318
+ "timestamp": datetime.now(timezone.utc).isoformat(),
316
319
  }
317
320
 
318
321
  await self.server.core.sio.emit("server_status", status_data, room=sid)
@@ -326,5 +329,5 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
326
329
  from claude_mpm.services.version_service import VersionService
327
330
 
328
331
  return VersionService().get_version()
329
- except:
332
+ except Exception:
330
333
  return "unknown"
@@ -5,7 +5,6 @@ safely with security checks. Separating file operations improves security
5
5
  auditing and makes it easier to add file-related features.
6
6
  """
7
7
 
8
- import os
9
8
  from pathlib import Path
10
9
  from typing import Any, Dict, Optional
11
10
 
@@ -24,6 +23,12 @@ class FileEventHandler(BaseEventHandler):
24
23
 
25
24
  def register_events(self) -> None:
26
25
  """Register file operation event handlers."""
26
+ self.logger.info(
27
+ "[FileEventHandler] Starting registration of read_file event handler"
28
+ )
29
+
30
+ # Capture self reference to avoid closure issues
31
+ handler_self = self
27
32
 
28
33
  @self.sio.event
29
34
  async def read_file(sid, data):
@@ -33,13 +38,19 @@ class FileEventHandler(BaseEventHandler):
33
38
  click on files, but we must ensure secure file access with
34
39
  proper validation and size limits.
35
40
  """
41
+ handler_self.logger.info(
42
+ f"[FileEventHandler] Received read_file event from {sid} with data: {data}"
43
+ )
36
44
  try:
37
45
  file_path = data.get("file_path")
38
- working_dir = data.get("working_dir", os.getcwd())
46
+ working_dir = data.get("working_dir", Path.cwd())
39
47
  max_size = data.get("max_size", 1024 * 1024) # 1MB default limit
40
48
 
41
49
  if not file_path:
42
- await self.emit_to_client(
50
+ handler_self.logger.warning(
51
+ f"[FileEventHandler] Missing file_path in request from {sid}"
52
+ )
53
+ await handler_self.emit_to_client(
43
54
  sid,
44
55
  "file_content_response",
45
56
  {
@@ -51,14 +62,29 @@ class FileEventHandler(BaseEventHandler):
51
62
  return
52
63
 
53
64
  # Use the shared file reading logic
54
- result = await self._read_file_safely(file_path, working_dir, max_size)
65
+ handler_self.logger.info(
66
+ f"[FileEventHandler] Reading file: {file_path} from working_dir: {working_dir}"
67
+ )
68
+ result = await handler_self._read_file_safely(
69
+ file_path, working_dir, max_size
70
+ )
55
71
 
56
72
  # Send the result back to the client
57
- await self.emit_to_client(sid, "file_content_response", result)
73
+ handler_self.logger.info(
74
+ f"[FileEventHandler] Sending file_content_response to {sid}, success: {result.get('success', False)}"
75
+ )
76
+ await handler_self.emit_to_client(sid, "file_content_response", result)
77
+ handler_self.logger.info(
78
+ f"[FileEventHandler] Response sent successfully to {sid}"
79
+ )
58
80
 
59
81
  except Exception as e:
60
- self.log_error("read_file", e, data)
61
- await self.emit_to_client(
82
+ handler_self.logger.error(
83
+ f"[FileEventHandler] Exception in read_file handler: {e}",
84
+ exc_info=True,
85
+ )
86
+ handler_self.log_error("read_file", e, data)
87
+ await handler_self.emit_to_client(
62
88
  sid,
63
89
  "file_content_response",
64
90
  {
@@ -67,6 +93,14 @@ class FileEventHandler(BaseEventHandler):
67
93
  "file_path": data.get("file_path", "unknown"),
68
94
  },
69
95
  )
96
+ handler_self.logger.info(
97
+ f"[FileEventHandler] Error response sent to {sid}"
98
+ )
99
+
100
+ # Log successful registration
101
+ self.logger.info(
102
+ "[FileEventHandler] read_file event handler registered successfully"
103
+ )
70
104
 
71
105
  async def _read_file_safely(
72
106
  self,
@@ -90,7 +124,7 @@ class FileEventHandler(BaseEventHandler):
90
124
  """
91
125
  try:
92
126
  if working_dir is None:
93
- working_dir = os.getcwd()
127
+ working_dir = Path.cwd()
94
128
 
95
129
  # Resolve absolute path based on working directory
96
130
  file_path_obj = Path(file_path)
@@ -156,7 +190,9 @@ class FileEventHandler(BaseEventHandler):
156
190
 
157
191
  # Read file content
158
192
  try:
159
- with open(real_path, encoding="utf-8") as f:
193
+ with Path(real_path).open(
194
+ encoding="utf-8",
195
+ ) as f:
160
196
  content = f.read()
161
197
 
162
198
  # Get file extension for syntax highlighting hint
@@ -189,7 +225,7 @@ class FileEventHandler(BaseEventHandler):
189
225
  be displayed as text.
190
226
  """
191
227
  try:
192
- with open(real_path, "rb") as f:
228
+ with real_path.open("rb") as f:
193
229
  binary_content = f.read()
194
230
 
195
231
  # Check if it's a text file by looking for common text patterns
@@ -106,7 +106,7 @@ class GitEventHandler(BaseEventHandler):
106
106
  """
107
107
  try:
108
108
  file_path = data.get("file_path")
109
- working_dir = data.get("working_dir", os.getcwd())
109
+ working_dir = data.get("working_dir", Path.cwd())
110
110
 
111
111
  if not file_path:
112
112
  await self.emit_to_client(
@@ -162,7 +162,7 @@ class GitEventHandler(BaseEventHandler):
162
162
  """
163
163
  try:
164
164
  file_path = data.get("file_path")
165
- working_dir = data.get("working_dir", os.getcwd())
165
+ working_dir = data.get("working_dir", Path.cwd())
166
166
 
167
167
  # Debug: check_git_status called
168
168
 
@@ -287,7 +287,7 @@ class GitEventHandler(BaseEventHandler):
287
287
  """
288
288
  try:
289
289
  file_path = data.get("file_path")
290
- working_dir = data.get("working_dir", os.getcwd())
290
+ working_dir = data.get("working_dir", Path.cwd())
291
291
 
292
292
  # Debug: git_add_file called
293
293
 
@@ -389,7 +389,7 @@ class GitEventHandler(BaseEventHandler):
389
389
  if working_dir in invalid_states or (
390
390
  isinstance(working_dir, str) and working_dir.strip() == ""
391
391
  ):
392
- working_dir = os.getcwd()
392
+ working_dir = Path.cwd()
393
393
  self.logger.info(
394
394
  f"[{operation}] working_dir was invalid ({original_working_dir!r}), using cwd: {working_dir}"
395
395
  )
@@ -404,7 +404,7 @@ class GitEventHandler(BaseEventHandler):
404
404
  self.logger.warning(
405
405
  f"[{operation}] working_dir contains null bytes, using cwd instead"
406
406
  )
407
- working_dir = os.getcwd()
407
+ working_dir = Path.cwd()
408
408
 
409
409
  return working_dir
410
410
 
@@ -640,7 +640,7 @@ class GitEventHandler(BaseEventHandler):
640
640
 
641
641
  # Handle case where working_dir is None, empty string, or 'Unknown'
642
642
  if not working_dir or working_dir == "Unknown" or working_dir.strip() == "":
643
- working_dir = os.getcwd()
643
+ working_dir = Path.cwd()
644
644
  # Debug: working_dir was invalid, using cwd
645
645
  else:
646
646
  # Debug: Using provided working_dir
@@ -648,7 +648,7 @@ class GitEventHandler(BaseEventHandler):
648
648
 
649
649
  # For read-only git operations, we can work from any directory
650
650
  # by passing the -C flag to git commands instead of changing directories
651
- original_cwd = os.getcwd()
651
+ original_cwd = Path.cwd()
652
652
  try:
653
653
  # We'll use git -C <working_dir> for all commands instead of chdir
654
654
 
@@ -745,7 +745,7 @@ class GitEventHandler(BaseEventHandler):
745
745
  stdout=asyncio.subprocess.PIPE,
746
746
  stderr=asyncio.subprocess.PIPE,
747
747
  )
748
- diff_output, diff_error = await diff_proc.communicate()
748
+ diff_output, _ = await diff_proc.communicate()
749
749
 
750
750
  if diff_proc.returncode == 0:
751
751
  return {
@@ -792,7 +792,7 @@ class GitEventHandler(BaseEventHandler):
792
792
  stdout=asyncio.subprocess.PIPE,
793
793
  stderr=asyncio.subprocess.PIPE,
794
794
  )
795
- diff_output, diff_error = await diff_proc.communicate()
795
+ diff_output, _diff_error = await diff_proc.communicate()
796
796
 
797
797
  if diff_proc.returncode == 0:
798
798
  return {