claude-mpm 5.4.22__py3-none-any.whl → 5.6.34__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 (487) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_AGENT.md +164 -0
  3. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +374 -1257
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +1 -1
  11. claude_mpm/agents/base_agent.json +31 -0
  12. claude_mpm/agents/frontmatter_validator.py +2 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  14. claude_mpm/cli/__init__.py +5 -1
  15. claude_mpm/cli/commands/agent_state_manager.py +10 -10
  16. claude_mpm/cli/commands/agents.py +11 -13
  17. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  18. claude_mpm/cli/commands/auto_configure.py +4 -4
  19. claude_mpm/cli/commands/autotodos.py +566 -0
  20. claude_mpm/cli/commands/commander.py +216 -0
  21. claude_mpm/cli/commands/configure.py +621 -22
  22. claude_mpm/cli/commands/configure_agent_display.py +12 -0
  23. claude_mpm/cli/commands/hook_errors.py +60 -60
  24. claude_mpm/cli/commands/monitor.py +2 -2
  25. claude_mpm/cli/commands/mpm_init/core.py +72 -0
  26. claude_mpm/cli/commands/postmortem.py +1 -1
  27. claude_mpm/cli/commands/profile.py +276 -0
  28. claude_mpm/cli/commands/run.py +35 -3
  29. claude_mpm/cli/commands/skill_source.py +51 -2
  30. claude_mpm/cli/commands/skills.py +182 -32
  31. claude_mpm/cli/executor.py +130 -16
  32. claude_mpm/cli/interactive/__init__.py +10 -0
  33. claude_mpm/cli/interactive/agent_wizard.py +32 -52
  34. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  35. claude_mpm/cli/interactive/skill_selector.py +481 -0
  36. claude_mpm/cli/parsers/base_parser.py +83 -1
  37. claude_mpm/cli/parsers/commander_parser.py +116 -0
  38. claude_mpm/cli/parsers/profile_parser.py +147 -0
  39. claude_mpm/cli/parsers/run_parser.py +10 -0
  40. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  41. claude_mpm/cli/parsers/skills_parser.py +2 -3
  42. claude_mpm/cli/startup.py +690 -386
  43. claude_mpm/cli/startup_display.py +74 -6
  44. claude_mpm/cli/startup_logging.py +2 -2
  45. claude_mpm/cli/utils.py +7 -3
  46. claude_mpm/commander/__init__.py +78 -0
  47. claude_mpm/commander/adapters/__init__.py +60 -0
  48. claude_mpm/commander/adapters/auggie.py +260 -0
  49. claude_mpm/commander/adapters/base.py +288 -0
  50. claude_mpm/commander/adapters/claude_code.py +392 -0
  51. claude_mpm/commander/adapters/codex.py +237 -0
  52. claude_mpm/commander/adapters/communication.py +366 -0
  53. claude_mpm/commander/adapters/example_usage.py +310 -0
  54. claude_mpm/commander/adapters/mpm.py +389 -0
  55. claude_mpm/commander/adapters/registry.py +204 -0
  56. claude_mpm/commander/api/__init__.py +16 -0
  57. claude_mpm/commander/api/app.py +121 -0
  58. claude_mpm/commander/api/errors.py +133 -0
  59. claude_mpm/commander/api/routes/__init__.py +8 -0
  60. claude_mpm/commander/api/routes/events.py +184 -0
  61. claude_mpm/commander/api/routes/inbox.py +171 -0
  62. claude_mpm/commander/api/routes/messages.py +148 -0
  63. claude_mpm/commander/api/routes/projects.py +271 -0
  64. claude_mpm/commander/api/routes/sessions.py +226 -0
  65. claude_mpm/commander/api/routes/work.py +296 -0
  66. claude_mpm/commander/api/schemas.py +186 -0
  67. claude_mpm/commander/chat/__init__.py +7 -0
  68. claude_mpm/commander/chat/cli.py +146 -0
  69. claude_mpm/commander/chat/commands.py +96 -0
  70. claude_mpm/commander/chat/repl.py +310 -0
  71. claude_mpm/commander/config.py +51 -0
  72. claude_mpm/commander/config_loader.py +115 -0
  73. claude_mpm/commander/core/__init__.py +10 -0
  74. claude_mpm/commander/core/block_manager.py +325 -0
  75. claude_mpm/commander/core/response_manager.py +323 -0
  76. claude_mpm/commander/daemon.py +603 -0
  77. claude_mpm/commander/env_loader.py +59 -0
  78. claude_mpm/commander/events/__init__.py +26 -0
  79. claude_mpm/commander/events/manager.py +332 -0
  80. claude_mpm/commander/frameworks/__init__.py +12 -0
  81. claude_mpm/commander/frameworks/base.py +146 -0
  82. claude_mpm/commander/frameworks/claude_code.py +58 -0
  83. claude_mpm/commander/frameworks/mpm.py +62 -0
  84. claude_mpm/commander/inbox/__init__.py +16 -0
  85. claude_mpm/commander/inbox/dedup.py +128 -0
  86. claude_mpm/commander/inbox/inbox.py +224 -0
  87. claude_mpm/commander/inbox/models.py +70 -0
  88. claude_mpm/commander/instance_manager.py +450 -0
  89. claude_mpm/commander/llm/__init__.py +6 -0
  90. claude_mpm/commander/llm/openrouter_client.py +167 -0
  91. claude_mpm/commander/llm/summarizer.py +70 -0
  92. claude_mpm/commander/memory/__init__.py +45 -0
  93. claude_mpm/commander/memory/compression.py +347 -0
  94. claude_mpm/commander/memory/embeddings.py +230 -0
  95. claude_mpm/commander/memory/entities.py +310 -0
  96. claude_mpm/commander/memory/example_usage.py +290 -0
  97. claude_mpm/commander/memory/integration.py +325 -0
  98. claude_mpm/commander/memory/search.py +381 -0
  99. claude_mpm/commander/memory/store.py +657 -0
  100. claude_mpm/commander/models/__init__.py +18 -0
  101. claude_mpm/commander/models/events.py +121 -0
  102. claude_mpm/commander/models/project.py +162 -0
  103. claude_mpm/commander/models/work.py +214 -0
  104. claude_mpm/commander/parsing/__init__.py +20 -0
  105. claude_mpm/commander/parsing/extractor.py +132 -0
  106. claude_mpm/commander/parsing/output_parser.py +270 -0
  107. claude_mpm/commander/parsing/patterns.py +100 -0
  108. claude_mpm/commander/persistence/__init__.py +11 -0
  109. claude_mpm/commander/persistence/event_store.py +274 -0
  110. claude_mpm/commander/persistence/state_store.py +309 -0
  111. claude_mpm/commander/persistence/work_store.py +164 -0
  112. claude_mpm/commander/polling/__init__.py +13 -0
  113. claude_mpm/commander/polling/event_detector.py +104 -0
  114. claude_mpm/commander/polling/output_buffer.py +49 -0
  115. claude_mpm/commander/polling/output_poller.py +153 -0
  116. claude_mpm/commander/project_session.py +268 -0
  117. claude_mpm/commander/proxy/__init__.py +12 -0
  118. claude_mpm/commander/proxy/formatter.py +89 -0
  119. claude_mpm/commander/proxy/output_handler.py +191 -0
  120. claude_mpm/commander/proxy/relay.py +155 -0
  121. claude_mpm/commander/registry.py +410 -0
  122. claude_mpm/commander/runtime/__init__.py +10 -0
  123. claude_mpm/commander/runtime/executor.py +191 -0
  124. claude_mpm/commander/runtime/monitor.py +346 -0
  125. claude_mpm/commander/session/__init__.py +6 -0
  126. claude_mpm/commander/session/context.py +81 -0
  127. claude_mpm/commander/session/manager.py +59 -0
  128. claude_mpm/commander/tmux_orchestrator.py +361 -0
  129. claude_mpm/commander/web/__init__.py +1 -0
  130. claude_mpm/commander/work/__init__.py +30 -0
  131. claude_mpm/commander/work/executor.py +207 -0
  132. claude_mpm/commander/work/queue.py +405 -0
  133. claude_mpm/commander/workflow/__init__.py +27 -0
  134. claude_mpm/commander/workflow/event_handler.py +241 -0
  135. claude_mpm/commander/workflow/notifier.py +146 -0
  136. claude_mpm/commands/mpm-config.md +20 -249
  137. claude_mpm/commands/mpm-doctor.md +16 -21
  138. claude_mpm/commands/mpm-help.md +12 -205
  139. claude_mpm/commands/mpm-init.md +88 -506
  140. claude_mpm/commands/mpm-monitor.md +22 -401
  141. claude_mpm/commands/mpm-organize.md +70 -442
  142. claude_mpm/commands/mpm-postmortem.md +13 -107
  143. claude_mpm/commands/mpm-session-resume.md +20 -363
  144. claude_mpm/commands/mpm-status.md +13 -69
  145. claude_mpm/commands/mpm-ticket-view.md +60 -495
  146. claude_mpm/commands/mpm-version.md +13 -107
  147. claude_mpm/commands/mpm.md +8 -0
  148. claude_mpm/config/agent_presets.py +8 -7
  149. claude_mpm/config/skill_sources.py +16 -0
  150. claude_mpm/constants.py +1 -0
  151. claude_mpm/core/claude_runner.py +154 -2
  152. claude_mpm/core/config.py +37 -26
  153. claude_mpm/core/config_constants.py +74 -9
  154. claude_mpm/core/constants.py +56 -12
  155. claude_mpm/core/framework/loaders/agent_loader.py +1 -1
  156. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  157. claude_mpm/core/hook_manager.py +51 -3
  158. claude_mpm/core/interactive_session.py +12 -11
  159. claude_mpm/core/logger.py +26 -9
  160. claude_mpm/core/logging_utils.py +39 -13
  161. claude_mpm/core/network_config.py +148 -0
  162. claude_mpm/core/oneshot_session.py +7 -6
  163. claude_mpm/core/optimized_startup.py +61 -0
  164. claude_mpm/core/output_style_manager.py +66 -18
  165. claude_mpm/core/shared/config_loader.py +3 -1
  166. claude_mpm/core/socketio_pool.py +47 -15
  167. claude_mpm/core/unified_agent_registry.py +1 -1
  168. claude_mpm/core/unified_config.py +54 -8
  169. claude_mpm/core/unified_paths.py +95 -90
  170. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  236. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  237. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  238. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  239. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  240. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  241. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  242. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  243. claude_mpm/experimental/cli_enhancements.py +2 -1
  244. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  245. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  246. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  247. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  248. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  249. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  250. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  251. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  252. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  255. claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
  256. claude_mpm/hooks/claude_hooks/hook_handler.py +313 -99
  257. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  258. claude_mpm/hooks/claude_hooks/installer.py +206 -36
  259. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  260. claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
  261. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  262. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +67 -32
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
  271. claude_mpm/hooks/claude_hooks/services/container.py +310 -0
  272. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  273. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  274. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
  275. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  276. claude_mpm/hooks/session_resume_hook.py +89 -1
  277. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  278. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  279. claude_mpm/init.py +276 -0
  280. claude_mpm/models/git_repository.py +3 -3
  281. claude_mpm/scripts/claude-hook-handler.sh +46 -19
  282. claude_mpm/services/agents/agent_builder.py +3 -3
  283. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  284. claude_mpm/services/agents/agent_selection_service.py +2 -2
  285. claude_mpm/services/agents/cache_git_manager.py +7 -7
  286. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  287. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -2
  288. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  289. claude_mpm/services/agents/deployment/agent_template_builder.py +39 -19
  290. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  291. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  292. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  293. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  294. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +169 -26
  295. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +101 -75
  296. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  297. claude_mpm/services/agents/git_source_manager.py +23 -4
  298. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  299. claude_mpm/services/agents/recommender.py +5 -3
  300. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  301. claude_mpm/services/agents/sources/git_source_sync_service.py +121 -10
  302. claude_mpm/services/agents/startup_sync.py +27 -4
  303. claude_mpm/services/cli/__init__.py +3 -0
  304. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  305. claude_mpm/services/cli/session_resume_helper.py +10 -2
  306. claude_mpm/services/command_deployment_service.py +44 -26
  307. claude_mpm/services/delegation_detector.py +175 -0
  308. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  309. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  310. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  311. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  312. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  313. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  314. claude_mpm/services/diagnostics/models.py +14 -1
  315. claude_mpm/services/event_log.py +325 -0
  316. claude_mpm/services/git/git_operations_service.py +8 -8
  317. claude_mpm/services/hook_installer_service.py +77 -8
  318. claude_mpm/services/infrastructure/__init__.py +4 -0
  319. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  320. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  321. claude_mpm/services/monitor/daemon_manager.py +15 -4
  322. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  323. claude_mpm/services/monitor/server.py +571 -11
  324. claude_mpm/services/pm_skills_deployer.py +884 -0
  325. claude_mpm/services/profile_manager.py +337 -0
  326. claude_mpm/services/skills/git_skill_source_manager.py +281 -20
  327. claude_mpm/services/skills/selective_skill_deployer.py +211 -46
  328. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  329. claude_mpm/services/skills_deployer.py +192 -70
  330. claude_mpm/services/socketio/dashboard_server.py +1 -0
  331. claude_mpm/services/socketio/event_normalizer.py +37 -6
  332. claude_mpm/services/socketio/handlers/hook.py +14 -7
  333. claude_mpm/services/socketio/server/core.py +262 -123
  334. claude_mpm/services/socketio/server/main.py +12 -4
  335. claude_mpm/skills/__init__.py +2 -1
  336. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  337. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  338. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  339. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  340. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  341. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  342. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  343. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  344. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  345. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  346. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  347. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  348. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  349. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  350. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  351. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  352. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  353. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  354. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  355. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  356. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  357. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  358. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  359. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  360. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  361. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  362. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  363. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  364. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  365. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  366. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  367. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  368. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  369. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  370. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  371. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  372. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  373. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  374. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  375. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  376. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  377. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  378. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  379. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  380. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  381. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  382. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  383. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  384. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  385. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  386. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  387. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  388. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  389. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  390. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  391. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  392. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  393. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  394. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  395. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  396. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  397. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  398. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  399. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  400. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  401. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  402. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  403. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  404. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  405. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  406. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  407. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  408. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  409. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  410. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  411. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  412. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  413. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  414. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  415. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  416. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  417. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  418. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  419. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  420. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  422. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  423. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  424. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  425. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  426. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  427. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  428. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  429. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  430. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  431. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  432. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  433. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  434. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  435. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  436. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  437. claude_mpm/skills/bundled/security-scanning.md +112 -0
  438. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  439. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  440. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  441. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  442. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  443. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  444. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  445. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  446. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  447. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  448. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  449. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  450. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  451. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  452. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  453. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  454. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  455. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  456. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  457. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  458. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  459. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  460. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  461. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  462. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  463. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  464. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  465. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  467. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  468. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  469. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  470. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  471. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  472. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  473. claude_mpm/skills/registry.py +295 -90
  474. claude_mpm/skills/skill_manager.py +98 -3
  475. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  476. claude_mpm/utils/agent_dependency_loader.py +115 -4
  477. claude_mpm/utils/agent_filters.py +1 -1
  478. claude_mpm/utils/migration.py +4 -4
  479. claude_mpm/utils/robust_installer.py +86 -21
  480. claude_mpm-5.6.34.dist-info/METADATA +393 -0
  481. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +486 -145
  482. claude_mpm-5.4.22.dist-info/METADATA +0 -996
  483. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
  484. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
  485. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
  486. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  487. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
@@ -8,13 +8,21 @@ with their original requests.
8
8
  import json
9
9
  import os
10
10
  import re
11
- import sys
12
11
  from datetime import datetime, timezone
13
12
  from pathlib import Path
14
13
  from typing import Any, Optional
15
14
 
15
+ # Try to import _log from hook_handler, fall back to no-op
16
+ try:
17
+ from claude_mpm.hooks.claude_hooks.hook_handler import _log
18
+ except ImportError:
19
+
20
+ def _log(msg: str) -> None:
21
+ pass # Silent fallback
22
+
23
+
16
24
  # Debug mode
17
- DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
25
+ DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "false").lower() == "true"
18
26
 
19
27
  # Response tracking integration
20
28
  # NOTE: ResponseTracker import moved to _initialize_response_tracking() for lazy loading
@@ -80,10 +88,7 @@ class ResponseTrackingManager:
80
88
 
81
89
  if not (response_tracking_enabled or response_logging_enabled):
82
90
  if DEBUG:
83
- print(
84
- "Response tracking disabled - skipping initialization",
85
- file=sys.stderr,
86
- )
91
+ _log("Response tracking disabled - skipping initialization")
87
92
  return
88
93
 
89
94
  # Initialize response tracker with config
@@ -101,15 +106,11 @@ class ResponseTrackingManager:
101
106
  if self.track_all_interactions
102
107
  else "Task delegations only"
103
108
  )
104
- print(
105
- f"✅ Response tracking initialized (mode: {mode})", file=sys.stderr
106
- )
109
+ _log(f"✅ Response tracking initialized (mode: {mode})")
107
110
 
108
111
  except Exception as e:
109
112
  if DEBUG:
110
- print(
111
- f"❌ Failed to initialize response tracking: {e}", file=sys.stderr
112
- )
113
+ _log(f"❌ Failed to initialize response tracking: {e}")
113
114
  # Don't fail the entire handler - response tracking is optional
114
115
 
115
116
  def track_agent_response(
@@ -130,12 +131,11 @@ class ResponseTrackingManager:
130
131
 
131
132
  try:
132
133
  # Get the original request data stored during pre-tool
133
- request_info = delegation_requests.get(session_id)
134
+ request_info = delegation_requests.get(session_id) # nosec B113 - False positive: dict.get(), not requests library
134
135
  if not request_info:
135
136
  if DEBUG:
136
- print(
137
- f"No request data found for session {session_id}, skipping response tracking",
138
- file=sys.stderr,
137
+ _log(
138
+ f"No request data found for session {session_id}, skipping response tracking"
139
139
  )
140
140
  return
141
141
 
@@ -163,15 +163,11 @@ class ResponseTrackingManager:
163
163
  if json_match:
164
164
  structured_response = json.loads(json_match.group(1))
165
165
  if DEBUG:
166
- print(
167
- f"Extracted structured response from {agent_type} agent",
168
- file=sys.stderr,
169
- )
166
+ _log(f"Extracted structured response from {agent_type} agent")
170
167
  except (json.JSONDecodeError, AttributeError) as e:
171
168
  if DEBUG:
172
- print(
173
- f"No structured JSON response found in {agent_type} agent output: {e}",
174
- file=sys.stderr,
169
+ _log(
170
+ f"No structured JSON response found in {agent_type} agent output: {e}"
175
171
  )
176
172
 
177
173
  # Get the original request (prompt + description)
@@ -220,9 +216,8 @@ class ResponseTrackingManager:
220
216
  if structured_response.get("MEMORIES"):
221
217
  if DEBUG:
222
218
  memories_count = len(structured_response["MEMORIES"])
223
- print(
224
- f"Agent {agent_type} returned MEMORIES field with {memories_count} items",
225
- file=sys.stderr,
219
+ _log(
220
+ f"Agent {agent_type} returned MEMORIES field with {memories_count} items"
226
221
  )
227
222
 
228
223
  # Check if task was completed for logging purposes
@@ -232,9 +227,7 @@ class ResponseTrackingManager:
232
227
  # Log files modified for debugging
233
228
  if DEBUG and structured_response.get("files_modified"):
234
229
  files = [f["file"] for f in structured_response["files_modified"]]
235
- print(
236
- f"Agent {agent_type} modified files: {files}", file=sys.stderr
237
- )
230
+ _log(f"Agent {agent_type} modified files: {files}")
238
231
 
239
232
  # Track the response
240
233
  file_path = self.response_tracker.track_response(
@@ -246,14 +239,12 @@ class ResponseTrackingManager:
246
239
  )
247
240
 
248
241
  if file_path and DEBUG:
249
- print(
250
- f"✅ Tracked response for {agent_type} agent in session {session_id}: {file_path.name}",
251
- file=sys.stderr,
242
+ _log(
243
+ f"✅ Tracked response for {agent_type} agent in session {session_id}: {file_path.name}"
252
244
  )
253
245
  elif DEBUG and not file_path:
254
- print(
255
- f"Response tracking returned None for {agent_type} agent (might be excluded or disabled)",
256
- file=sys.stderr,
246
+ _log(
247
+ f"Response tracking returned None for {agent_type} agent (might be excluded or disabled)"
257
248
  )
258
249
 
259
250
  # Clean up the request data after successful tracking
@@ -261,7 +252,7 @@ class ResponseTrackingManager:
261
252
 
262
253
  except Exception as e:
263
254
  if DEBUG:
264
- print(f"❌ Failed to track agent response: {e}", file=sys.stderr)
255
+ _log(f"❌ Failed to track agent response: {e}")
265
256
  # Don't fail the hook processing - response tracking is optional
266
257
 
267
258
  def track_stop_response(
@@ -286,11 +277,10 @@ class ResponseTrackingManager:
286
277
  prompt_data = pending_prompts.get(session_id)
287
278
 
288
279
  if DEBUG:
289
- print(
290
- f" - output present: {bool(output)} (length: {len(str(output)) if output else 0})",
291
- file=sys.stderr,
280
+ _log(
281
+ f" - output present: {bool(output)} (length: {len(str(output)) if output else 0})"
292
282
  )
293
- print(f" - prompt_data present: {bool(prompt_data)}", file=sys.stderr)
283
+ _log(f" - prompt_data present: {bool(prompt_data)}")
294
284
 
295
285
  if output and prompt_data:
296
286
  # Add prompt timestamp to metadata
@@ -300,12 +290,11 @@ class ResponseTrackingManager:
300
290
  if "stop_reason" in event:
301
291
  metadata["stop_reason"] = event["stop_reason"]
302
292
  if DEBUG:
303
- print(
304
- f" - Captured stop_reason: {event['stop_reason']}",
305
- file=sys.stderr,
306
- )
293
+ _log(f" - Captured stop_reason: {event['stop_reason']}")
307
294
 
308
295
  # Capture Claude API usage data if available
296
+ # NOTE: Usage data is already captured in metadata by handle_stop_fast()
297
+ # which also handles auto-pause triggering (even when response tracking disabled)
309
298
  if "usage" in event:
310
299
  usage_data = event["usage"]
311
300
  metadata["usage"] = {
@@ -322,10 +311,7 @@ class ResponseTrackingManager:
322
311
  total_tokens = usage_data.get(
323
312
  "input_tokens", 0
324
313
  ) + usage_data.get("output_tokens", 0)
325
- print(
326
- f" - Captured usage: {total_tokens} total tokens",
327
- file=sys.stderr,
328
- )
314
+ _log(f" - Captured usage: {total_tokens} total tokens")
329
315
 
330
316
  # Track the main Claude response
331
317
  file_path = self.response_tracker.track_response(
@@ -337,14 +323,14 @@ class ResponseTrackingManager:
337
323
  )
338
324
 
339
325
  if file_path and DEBUG:
340
- print(f" - Response tracked to: {file_path}", file=sys.stderr)
326
+ _log(f" - Response tracked to: {file_path}")
341
327
 
342
328
  # Clean up pending prompt
343
329
  del pending_prompts[session_id]
344
330
 
345
331
  except Exception as e:
346
332
  if DEBUG:
347
- print(f"Error tracking stop response: {e}", file=sys.stderr)
333
+ _log(f"Error tracking stop response: {e}")
348
334
 
349
335
  def track_assistant_response(self, event: dict, pending_prompts: dict):
350
336
  """Handle assistant response events for comprehensive response tracking."""
@@ -359,9 +345,8 @@ class ResponseTrackingManager:
359
345
  prompt_data = pending_prompts.get(session_id)
360
346
  if not prompt_data:
361
347
  if DEBUG:
362
- print(
363
- f"No stored prompt for session {session_id[:8]}..., skipping response tracking",
364
- file=sys.stderr,
348
+ _log(
349
+ f"No stored prompt for session {session_id[:8]}..., skipping response tracking"
365
350
  )
366
351
  return
367
352
 
@@ -375,9 +360,8 @@ class ResponseTrackingManager:
375
360
 
376
361
  if not response_content:
377
362
  if DEBUG:
378
- print(
379
- f"No response content in event for session {session_id[:8]}...",
380
- file=sys.stderr,
363
+ _log(
364
+ f"No response content in event for session {session_id[:8]}..."
381
365
  )
382
366
  return
383
367
 
@@ -399,9 +383,8 @@ class ResponseTrackingManager:
399
383
  )
400
384
 
401
385
  if file_path and DEBUG:
402
- print(
403
- f"✅ Tracked Claude response for session {session_id[:8]}...: {file_path.name}",
404
- file=sys.stderr,
386
+ _log(
387
+ f"✅ Tracked Claude response for session {session_id[:8]}...: {file_path.name}"
405
388
  )
406
389
 
407
390
  # Clean up the stored prompt
@@ -409,4 +392,4 @@ class ResponseTrackingManager:
409
392
 
410
393
  except Exception as e:
411
394
  if DEBUG:
412
- print(f"❌ Failed to track assistant response: {e}", file=sys.stderr)
395
+ _log(f"❌ Failed to track assistant response: {e}")
@@ -3,13 +3,34 @@
3
3
  # Use HTTP-based connection manager for stable dashboard communication
4
4
  # from .connection_manager import ConnectionManagerService # Old SocketIO-based
5
5
  from .connection_manager_http import ConnectionManagerService # New HTTP-based
6
+ from .container import HookServiceContainer, get_container
6
7
  from .duplicate_detector import DuplicateEventDetector
8
+ from .protocols import (
9
+ IAutoPauseHandler,
10
+ IConnectionManager,
11
+ IDuplicateDetector,
12
+ IEventHandlers,
13
+ IMemoryHookManager,
14
+ IResponseTrackingManager,
15
+ IStateManager,
16
+ ISubagentProcessor,
17
+ )
7
18
  from .state_manager import StateManagerService
8
19
  from .subagent_processor import SubagentResponseProcessor
9
20
 
10
21
  __all__ = [
11
22
  "ConnectionManagerService",
12
23
  "DuplicateEventDetector",
24
+ "HookServiceContainer",
25
+ "IAutoPauseHandler",
26
+ "IConnectionManager",
27
+ "IDuplicateDetector",
28
+ "IEventHandlers",
29
+ "IMemoryHookManager",
30
+ "IResponseTrackingManager",
31
+ "IStateManager",
32
+ "ISubagentProcessor",
13
33
  "StateManagerService",
14
34
  "SubagentResponseProcessor",
35
+ "get_container",
15
36
  ]
@@ -20,8 +20,17 @@ import os
20
20
  import sys
21
21
  from datetime import datetime, timezone
22
22
 
23
- # Debug mode is enabled by default for better visibility into hook processing
24
- DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
23
+ # Try to import _log from hook_handler, fall back to no-op
24
+ try:
25
+ from claude_mpm.hooks.claude_hooks.hook_handler import _log
26
+ except ImportError:
27
+
28
+ def _log(msg: str) -> None:
29
+ pass # Silent fallback
30
+
31
+
32
+ # Debug mode - disabled by default to prevent logging overhead in production
33
+ DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "false").lower() == "true"
25
34
 
26
35
  # Import extracted modules with fallback for direct execution
27
36
  try:
@@ -58,7 +67,7 @@ except ImportError:
58
67
  (),
59
68
  {
60
69
  "to_dict": lambda: {
61
- "event": "claude_event",
70
+ "event": "mpm_event",
62
71
  "type": event_data.get("type", "unknown"),
63
72
  "subtype": event_data.get("subtype", "generic"),
64
73
  "timestamp": event_data.get(
@@ -94,13 +103,10 @@ class ConnectionManagerService:
94
103
  try:
95
104
  self.connection_pool = get_connection_pool()
96
105
  if DEBUG:
97
- print("✅ Modern SocketIO connection pool initialized", file=sys.stderr)
106
+ _log("✅ Modern SocketIO connection pool initialized")
98
107
  except Exception as e:
99
108
  if DEBUG:
100
- print(
101
- f"⚠️ Failed to initialize SocketIO connection pool: {e}",
102
- file=sys.stderr,
103
- )
109
+ _log(f"⚠️ Failed to initialize SocketIO connection pool: {e}")
104
110
  self.connection_pool = None
105
111
 
106
112
  def emit_event(self, namespace: str, event: str, data: dict):
@@ -119,13 +125,50 @@ class ConnectionManagerService:
119
125
  tool_call_id = data.get("tool_call_id")
120
126
 
121
127
  # Create event data for normalization
128
+ # Extract session_id (try both camelCase and snake_case)
129
+ session_id = data.get("session_id") or data.get("sessionId")
130
+
131
+ # Extract working directory for project identification
132
+ # Try multiple field names for maximum compatibility
133
+ cwd = (
134
+ data.get("cwd")
135
+ or data.get("working_directory")
136
+ or data.get("workingDirectory")
137
+ )
138
+
139
+ # For hook_execution events, extract the actual hook type from data
140
+ # Otherwise use "hook" as the type
141
+ if event == "hook_execution":
142
+ hook_type = data.get("hook_type", "unknown")
143
+
144
+ # BUGFIX: Validate hook_type is meaningful (not generic/invalid values)
145
+ # Problem: Dashboard shows "hook hook" instead of "PreToolUse", "UserPromptSubmit", etc.
146
+ # Root cause: hook_type defaults to "hook" or "unknown", providing no useful information
147
+ # Solution: Fallback to hook_name, then to descriptive "hook_execution_untyped"
148
+ if hook_type in ("hook", "unknown", "", None):
149
+ # Try fallback to hook_name field (set by _emit_hook_execution_event)
150
+ hook_type = data.get("hook_name", "unknown_hook")
151
+
152
+ # Final fallback if still generic - use descriptive name
153
+ if hook_type in ("hook", "unknown", "", None):
154
+ hook_type = "hook_execution_untyped"
155
+
156
+ # Debug log when we detect invalid hook_type for troubleshooting
157
+ if DEBUG:
158
+ _log(f"⚠️ Invalid hook_type detected, using fallback: {hook_type}")
159
+
160
+ event_type = hook_type
161
+ else:
162
+ event_type = "hook"
163
+
122
164
  raw_event = {
123
- "type": "hook",
124
- "subtype": event, # e.g., "user_prompt", "pre_tool", "subagent_stop"
165
+ "type": event_type, # Use actual hook type for hook_execution, "hook" otherwise
166
+ "subtype": event, # e.g., "user_prompt", "pre_tool", "subagent_stop", "execution"
125
167
  "timestamp": datetime.now(timezone.utc).isoformat(),
126
168
  "data": data,
127
- "source": "claude_hooks", # Identify the source
128
- "session_id": data.get("sessionId"), # Include session if available
169
+ "source": "mpm_hook", # Identify the source as mpm_hook
170
+ "session_id": session_id, # Include session if available (supports both naming conventions)
171
+ "cwd": cwd, # Add working directory at top level for easy frontend access
129
172
  "correlation_id": tool_call_id, # Set from tool_call_id for event correlation
130
173
  }
131
174
 
@@ -137,16 +180,12 @@ class ConnectionManagerService:
137
180
  if DEBUG and event in ["subagent_stop", "pre_tool"]:
138
181
  if event == "subagent_stop":
139
182
  agent_type = data.get("agent_type", "unknown")
140
- print(
141
- f"Hook handler: Publishing SubagentStop for agent '{agent_type}'",
142
- file=sys.stderr,
143
- )
183
+ _log(f"Hook handler: Publishing SubagentStop for agent '{agent_type}'")
144
184
  elif event == "pre_tool" and data.get("tool_name") == "Task":
145
185
  delegation = data.get("delegation_details", {})
146
186
  agent_type = delegation.get("agent_type", "unknown")
147
- print(
148
- f"Hook handler: Publishing Task delegation to agent '{agent_type}'",
149
- file=sys.stderr,
187
+ _log(
188
+ f"Hook handler: Publishing Task delegation to agent '{agent_type}'"
150
189
  )
151
190
 
152
191
  # Emit through direct Socket.IO connection pool (primary path)
@@ -154,13 +193,13 @@ class ConnectionManagerService:
154
193
  if self.connection_pool:
155
194
  try:
156
195
  # Emit to Socket.IO server directly
157
- self.connection_pool.emit("claude_event", claude_event_data)
196
+ self.connection_pool.emit("mpm_event", claude_event_data)
158
197
  if DEBUG:
159
- print(f"✅ Emitted via connection pool: {event}", file=sys.stderr)
198
+ _log(f"✅ Emitted via connection pool: {event}")
160
199
  return # Success - no need for fallback
161
200
  except Exception as e:
162
201
  if DEBUG:
163
- print(f"⚠️ Failed to emit via connection pool: {e}", file=sys.stderr)
202
+ _log(f"⚠️ Failed to emit via connection pool: {e}")
164
203
 
165
204
  # HTTP fallback for cross-process communication (when direct calls fail)
166
205
  # This replaces EventBus for reliability without the complexity
@@ -181,22 +220,18 @@ class ConnectionManagerService:
181
220
 
182
221
  if response.status_code in [200, 204]:
183
222
  if DEBUG:
184
- print("✅ HTTP fallback successful", file=sys.stderr)
223
+ _log("✅ HTTP fallback successful")
185
224
  elif DEBUG:
186
- print(
187
- f"⚠️ HTTP fallback failed: {response.status_code}",
188
- file=sys.stderr,
189
- )
225
+ _log(f"⚠️ HTTP fallback failed: {response.status_code}")
190
226
 
191
227
  except Exception as e:
192
228
  if DEBUG:
193
- print(f"⚠️ HTTP fallback error: {e}", file=sys.stderr)
229
+ _log(f"⚠️ HTTP fallback error: {e}")
194
230
 
195
231
  # Warn if no emission method is available
196
232
  if not self.connection_pool and DEBUG:
197
- print(
198
- f"⚠️ No event emission method available for: {claude_event_data.get('event', 'unknown')}",
199
- file=sys.stderr,
233
+ _log(
234
+ f"⚠️ No event emission method available for: {claude_event_data.get('event', 'unknown')}"
200
235
  )
201
236
 
202
237
  def cleanup(self):
@@ -205,5 +240,5 @@ class ConnectionManagerService:
205
240
  if self.connection_pool:
206
241
  try:
207
242
  self.connection_pool.cleanup()
208
- except Exception:
243
+ except Exception: # nosec B110
209
244
  pass # Ignore cleanup errors during destruction