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
@@ -83,6 +83,9 @@ class AgentDisplay:
83
83
  # Get deployed agent IDs
84
84
  deployed_ids = get_deployed_agent_ids()
85
85
 
86
+ # Track installed count for summary
87
+ installed_count = 0
88
+
86
89
  for idx, agent in enumerate(agents, 1):
87
90
  # Check if agent is deployed to .claude/agents/
88
91
  # Use agent_id (technical ID) for comparison, not display name
@@ -90,6 +93,10 @@ class AgentDisplay:
90
93
  agent_leaf_name = agent_id.split("/")[-1]
91
94
  is_deployed = agent_leaf_name in deployed_ids
92
95
 
96
+ # Increment installed count
97
+ if is_deployed:
98
+ installed_count += 1
99
+
93
100
  # Show "Installed" for deployed agents, "Available" otherwise
94
101
  status = "[green]Installed[/green]" if is_deployed else "Available"
95
102
 
@@ -124,6 +131,11 @@ class AgentDisplay:
124
131
 
125
132
  self.console.print(table)
126
133
 
134
+ # Display summary count
135
+ self.console.print(
136
+ f"\n📊 Agents: {installed_count} Installed / {len(agents)} Total"
137
+ )
138
+
127
139
  def display_agents_with_pending_states(self, agents: List[AgentConfig]) -> None:
128
140
  """Display agents table with pending state indicators.
129
141
 
@@ -57,33 +57,33 @@ def list_errors(format, hook_type):
57
57
 
58
58
  if not errors:
59
59
  if hook_type:
60
- click.echo(f"No errors recorded for hook type: {hook_type}")
60
+ click.echo(f"No errors recorded for hook type: {hook_type}", err=True)
61
61
  else:
62
- click.echo("No errors recorded. Hook system is healthy! ✅")
62
+ click.echo("No errors recorded. Hook system is healthy! ✅", err=True)
63
63
  return
64
64
 
65
65
  if format == "json":
66
66
  # JSON output
67
- click.echo(json.dumps(errors, indent=2))
67
+ click.echo(json.dumps(errors, indent=2), err=True)
68
68
  else:
69
69
  # Table output
70
- click.echo("\n" + "=" * 80)
71
- click.echo("Hook Error Memory Report")
72
- click.echo("=" * 80)
70
+ click.echo("\n" + "=" * 80, err=True)
71
+ click.echo("Hook Error Memory Report", err=True)
72
+ click.echo("=" * 80, err=True)
73
73
 
74
74
  for key, data in errors.items():
75
- click.echo(f"\n🔴 Error: {data['type']}")
76
- click.echo(f" Hook Type: {data['hook_type']}")
77
- click.echo(f" Details: {data['details']}")
78
- click.echo(f" Match: {data['match']}")
79
- click.echo(f" Count: {data['count']} occurrences")
80
- click.echo(f" First Seen: {data['first_seen']}")
81
- click.echo(f" Last Seen: {data['last_seen']}")
75
+ click.echo(f"\n🔴 Error: {data['type']}", err=True)
76
+ click.echo(f" Hook Type: {data['hook_type']}", err=True)
77
+ click.echo(f" Details: {data['details']}", err=True)
78
+ click.echo(f" Match: {data['match']}", err=True)
79
+ click.echo(f" Count: {data['count']} occurrences", err=True)
80
+ click.echo(f" First Seen: {data['first_seen']}", err=True)
81
+ click.echo(f" Last Seen: {data['last_seen']}", err=True)
82
82
 
83
- click.echo("\n" + "=" * 80)
84
- click.echo(f"Total unique errors: {len(errors)}")
85
- click.echo(f"Memory file: {error_memory.memory_file}")
86
- click.echo("\nTo clear errors: claude-mpm hook-errors clear")
83
+ click.echo("\n" + "=" * 80, err=True)
84
+ click.echo(f"Total unique errors: {len(errors)}", err=True)
85
+ click.echo(f"Memory file: {error_memory.memory_file}", err=True)
86
+ click.echo("\nTo clear errors: claude-mpm hook-errors clear", err=True)
87
87
 
88
88
 
89
89
  @hook_errors_group.command(name="summary")
@@ -99,28 +99,28 @@ def show_summary():
99
99
  summary = error_memory.get_error_summary()
100
100
 
101
101
  if summary["total_errors"] == 0:
102
- click.echo("No errors recorded. Hook system is healthy! ✅")
102
+ click.echo("No errors recorded. Hook system is healthy! ✅", err=True)
103
103
  return
104
104
 
105
- click.echo("\n" + "=" * 80)
106
- click.echo("Hook Error Summary")
107
- click.echo("=" * 80)
108
- click.echo("\n📊 Statistics:")
109
- click.echo(f" Total Errors: {summary['total_errors']}")
110
- click.echo(f" Unique Errors: {summary['unique_errors']}")
105
+ click.echo("\n" + "=" * 80, err=True)
106
+ click.echo("Hook Error Summary", err=True)
107
+ click.echo("=" * 80, err=True)
108
+ click.echo("\n📊 Statistics:", err=True)
109
+ click.echo(f" Total Errors: {summary['total_errors']}", err=True)
110
+ click.echo(f" Unique Errors: {summary['unique_errors']}", err=True)
111
111
 
112
112
  if summary["errors_by_type"]:
113
- click.echo("\n🔍 Errors by Type:")
113
+ click.echo("\n🔍 Errors by Type:", err=True)
114
114
  for error_type, count in summary["errors_by_type"].items():
115
- click.echo(f" {error_type}: {count}")
115
+ click.echo(f" {error_type}: {count}", err=True)
116
116
 
117
117
  if summary["errors_by_hook"]:
118
- click.echo("\n🎣 Errors by Hook Type:")
118
+ click.echo("\n🎣 Errors by Hook Type:", err=True)
119
119
  for hook_type, count in summary["errors_by_hook"].items():
120
- click.echo(f" {hook_type}: {count}")
120
+ click.echo(f" {hook_type}: {count}", err=True)
121
121
 
122
- click.echo(f"\n📁 Memory File: {summary['memory_file']}")
123
- click.echo("\nFor detailed list: claude-mpm hook-errors list")
122
+ click.echo(f"\n📁 Memory File: {summary['memory_file']}", err=True)
123
+ click.echo("\nFor detailed list: claude-mpm hook-errors list", err=True)
124
124
 
125
125
 
126
126
  @hook_errors_group.command(name="clear")
@@ -158,21 +158,21 @@ def clear_errors(hook_type, yes):
158
158
  scope = "all hook types"
159
159
 
160
160
  if count == 0:
161
- click.echo(f"No errors to clear {scope}.")
161
+ click.echo(f"No errors to clear {scope}.", err=True)
162
162
  return
163
163
 
164
164
  # Confirm if not using -y flag
165
165
  if not yes:
166
166
  message = f"Clear {count} error(s) {scope}?"
167
167
  if not click.confirm(message):
168
- click.echo("Cancelled.")
168
+ click.echo("Cancelled.", err=True)
169
169
  return
170
170
 
171
171
  # Clear errors
172
172
  error_memory.clear_errors(hook_type)
173
173
 
174
- click.echo(f"✅ Cleared {count} error(s) {scope}.")
175
- click.echo("\nHooks will be retried on next execution.")
174
+ click.echo(f"✅ Cleared {count} error(s) {scope}.", err=True)
175
+ click.echo("\nHooks will be retried on next execution.", err=True)
176
176
 
177
177
 
178
178
  @hook_errors_group.command(name="diagnose")
@@ -201,19 +201,19 @@ def diagnose_errors(hook_type):
201
201
 
202
202
  if not errors:
203
203
  if hook_type:
204
- click.echo(f"No errors to diagnose for hook type: {hook_type}")
204
+ click.echo(f"No errors to diagnose for hook type: {hook_type}", err=True)
205
205
  else:
206
- click.echo("No errors to diagnose. Hook system is healthy! ✅")
206
+ click.echo("No errors to diagnose. Hook system is healthy! ✅", err=True)
207
207
  return
208
208
 
209
- click.echo("\n" + "=" * 80)
210
- click.echo("Hook Error Diagnostics")
211
- click.echo("=" * 80)
209
+ click.echo("\n" + "=" * 80, err=True)
210
+ click.echo("Hook Error Diagnostics", err=True)
211
+ click.echo("=" * 80, err=True)
212
212
 
213
213
  for key, data in errors.items():
214
- click.echo(f"\n🔴 Error: {data['type']}")
215
- click.echo(f" Hook: {data['hook_type']}")
216
- click.echo(f" Count: {data['count']} failures")
214
+ click.echo(f"\n🔴 Error: {data['type']}", err=True)
215
+ click.echo(f" Hook: {data['hook_type']}", err=True)
216
+ click.echo(f" Count: {data['count']} failures", err=True)
217
217
 
218
218
  # Generate and show fix suggestion
219
219
  error_info = {
@@ -223,13 +223,13 @@ def diagnose_errors(hook_type):
223
223
  }
224
224
  suggestion = error_memory.suggest_fix(error_info)
225
225
 
226
- click.echo("\n" + "-" * 80)
227
- click.echo(suggestion)
228
- click.echo("-" * 80)
226
+ click.echo("\n" + "-" * 80, err=True)
227
+ click.echo(suggestion, err=True)
228
+ click.echo("-" * 80, err=True)
229
229
 
230
- click.echo("\n" + "=" * 80)
231
- click.echo("After fixing issues, clear errors to retry:")
232
- click.echo(" claude-mpm hook-errors clear")
230
+ click.echo("\n" + "=" * 80, err=True)
231
+ click.echo("After fixing issues, clear errors to retry:", err=True)
232
+ click.echo(" claude-mpm hook-errors clear", err=True)
233
233
 
234
234
 
235
235
  @hook_errors_group.command(name="status")
@@ -244,27 +244,27 @@ def show_status():
244
244
  error_memory = get_hook_error_memory()
245
245
  summary = error_memory.get_error_summary()
246
246
 
247
- click.echo("\n📊 Hook Error Memory Status")
248
- click.echo("=" * 80)
247
+ click.echo("\n📊 Hook Error Memory Status", err=True)
248
+ click.echo("=" * 80, err=True)
249
249
 
250
250
  if summary["total_errors"] == 0:
251
- click.echo("✅ Status: Healthy (no errors recorded)")
251
+ click.echo("✅ Status: Healthy (no errors recorded)", err=True)
252
252
  else:
253
- click.echo(f"⚠️ Status: {summary['total_errors']} error(s) recorded")
254
- click.echo(f" Unique errors: {summary['unique_errors']}")
253
+ click.echo(f"⚠️ Status: {summary['total_errors']} error(s) recorded", err=True)
254
+ click.echo(f" Unique errors: {summary['unique_errors']}", err=True)
255
255
 
256
256
  # Show which hooks are affected
257
257
  if summary["errors_by_hook"]:
258
258
  affected_hooks = list(summary["errors_by_hook"].keys())
259
- click.echo(f" Affected hooks: {', '.join(affected_hooks)}")
259
+ click.echo(f" Affected hooks: {', '.join(affected_hooks)}", err=True)
260
260
 
261
- click.echo(f"\n📁 Memory file: {summary['memory_file']}")
262
- click.echo(f" Exists: {Path(summary['memory_file']).exists()}")
261
+ click.echo(f"\n📁 Memory file: {summary['memory_file']}", err=True)
262
+ click.echo(f" Exists: {Path(summary['memory_file']).exists()}", err=True)
263
263
 
264
- click.echo("\nCommands:")
265
- click.echo(" claude-mpm hook-errors list # View detailed errors")
266
- click.echo(" claude-mpm hook-errors diagnose # Get fix suggestions")
267
- click.echo(" claude-mpm hook-errors clear # Clear and retry")
264
+ click.echo("\nCommands:", err=True)
265
+ click.echo(" claude-mpm hook-errors list # View detailed errors", err=True)
266
+ click.echo(" claude-mpm hook-errors diagnose # Get fix suggestions", err=True)
267
+ click.echo(" claude-mpm hook-errors clear # Clear and retry", err=True)
268
268
 
269
269
 
270
270
  # Register the command group
@@ -118,7 +118,7 @@ class MonitorCommand(BaseCommand):
118
118
  # Check if it's actually running
119
119
  if not self.daemon.lifecycle.is_running():
120
120
  return CommandResult.error_result(
121
- "Monitor daemon failed to start. Check ~/.claude-mpm/monitor-daemon.log for details."
121
+ "Monitor daemon failed to start. Check ~/.claude-mpm/logs/monitor-daemon-*.log for details."
122
122
  )
123
123
 
124
124
  # Get the actual PID
@@ -146,7 +146,7 @@ class MonitorCommand(BaseCommand):
146
146
  pass
147
147
 
148
148
  return CommandResult.error_result(
149
- "Failed to start unified monitor daemon. Check ~/.claude-mpm/monitor-daemon.log for details."
149
+ "Failed to start unified monitor daemon. Check ~/.claude-mpm/logs/monitor-daemon-*.log for details."
150
150
  )
151
151
 
152
152
  def _stop_monitor(self, args) -> CommandResult:
@@ -203,6 +203,10 @@ class MPMInitCommand:
203
203
  if update_mode and result.get("status") == OperationResult.SUCCESS:
204
204
  self._handle_update_post_processing()
205
205
 
206
+ # Deploy PM skills after successful initialization
207
+ if result.get("status") == OperationResult.SUCCESS:
208
+ self._deploy_pm_skills()
209
+
206
210
  return result
207
211
 
208
212
  except Exception as e:
@@ -683,5 +687,73 @@ class MPMInitCommand:
683
687
  """
684
688
  return len(text) // 4
685
689
 
690
+ def _deploy_pm_skills(self) -> None:
691
+ """Deploy PM skills templates to project .claude directory.
692
+
693
+ Copies PM skills from bundled templates to .claude/skills/
694
+ with version tracking and checksum validation.
695
+ """
696
+ try:
697
+ from rich.progress import (
698
+ BarColumn,
699
+ Progress,
700
+ TaskProgressColumn,
701
+ TextColumn,
702
+ )
703
+
704
+ from claude_mpm.services.pm_skills_deployer import PMSkillsDeployerService
705
+
706
+ deployer = PMSkillsDeployerService()
707
+
708
+ # Use progress bar for deployment
709
+ with Progress(
710
+ TextColumn("[cyan]Deploying PM skills[/cyan]"),
711
+ BarColumn(bar_width=30),
712
+ TaskProgressColumn(),
713
+ TextColumn("[dim]{task.description}[/dim]"),
714
+ console=self.console,
715
+ ) as progress:
716
+ task = progress.add_task("", total=None) # Unknown total initially
717
+
718
+ def update_progress(skill_name: str, current: int, total: int) -> None:
719
+ progress.update(
720
+ task, total=total, completed=current, description=skill_name
721
+ )
722
+
723
+ result = deployer.deploy_pm_skills(
724
+ self.project_path, progress_callback=update_progress
725
+ )
726
+
727
+ if result.success:
728
+ if result.deployed:
729
+ self.console.print(
730
+ f"[green]✓ Deployed {len(result.deployed)} PM skills[/green]"
731
+ )
732
+
733
+ if result.skipped:
734
+ self.console.print(
735
+ f"[dim] Skipped {len(result.skipped)} (already deployed)[/dim]"
736
+ )
737
+
738
+ if result.errors:
739
+ self.console.print(
740
+ f"[yellow]⚠️ {len(result.errors)} errors:[/yellow]"
741
+ )
742
+ for error in result.errors[:3]: # Show first 3 errors
743
+ self.console.print(f" • {error['skill']}: {error['error']}")
744
+ else:
745
+ self.console.print(
746
+ f"[yellow]⚠️ PM skills deployment had errors: {result.message}[/yellow]"
747
+ )
748
+
749
+ except ImportError as e:
750
+ logger.warning(f"PM skills deployer not available: {e}")
751
+ self.console.print(
752
+ "[yellow]⚠️ PM skills deployment skipped (service not available)[/yellow]"
753
+ )
754
+ except Exception as e:
755
+ logger.error(f"Failed to deploy PM skills: {e}")
756
+ self.console.print(f"[yellow]⚠️ PM skills deployment failed: {e}[/yellow]")
757
+
686
758
 
687
759
  __all__ = ["MPMInitCommand"]
@@ -317,7 +317,7 @@ def _create_prs(report, verbose: bool) -> int:
317
317
  print(f"\n🤖 Creating {len(pr_actions)} PR(s) for agent improvements...")
318
318
 
319
319
  # Check if we're in the agent cache git repo
320
- agent_cache_path = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
320
+ agent_cache_path = Path.home() / ".claude-mpm" / "cache" / "agents"
321
321
 
322
322
  if not agent_cache_path.exists():
323
323
  print(f"❌ Agent cache not found at: {agent_cache_path}")
@@ -0,0 +1,276 @@
1
+ """
2
+ Profile management commands for claude-mpm CLI.
3
+
4
+ WHY: Users need a simple way to manage deployment profiles from the command
5
+ line. Profiles control which agents and skills are deployed, reducing context
6
+ usage by limiting available agents to only what's needed.
7
+
8
+ DESIGN DECISIONS:
9
+ - Use BaseCommand for consistent CLI patterns
10
+ - Provide clear, actionable output with standardized error handling
11
+ - Support profile listing, activation, and status reporting
12
+ - Integrate with ConfigLoader for profile persistence
13
+ """
14
+
15
+ from pathlib import Path
16
+
17
+ import yaml
18
+ from rich.table import Table
19
+
20
+ from ...core.shared.config_loader import ConfigLoader
21
+ from ...services.profile_manager import ProfileManager
22
+ from ...utils.console import console
23
+ from ..shared import BaseCommand, CommandResult
24
+
25
+
26
+ class ProfileCommand(BaseCommand):
27
+ """Profile management command for agents and skills filtering."""
28
+
29
+ def __init__(self):
30
+ super().__init__("profile")
31
+ # ProfileManager will auto-detect project directory
32
+ self.profile_manager = ProfileManager()
33
+ self.config_loader = ConfigLoader()
34
+
35
+ def validate_args(self, args) -> str:
36
+ """Validate command arguments."""
37
+ if not hasattr(args, "profile_command") or not args.profile_command:
38
+ return "Profile command required. Use: list, set, status, or show"
39
+
40
+ valid_commands = ["list", "set", "status", "show"]
41
+ if args.profile_command not in valid_commands:
42
+ return (
43
+ f"Unknown profile command: {args.profile_command}. "
44
+ f"Valid commands: {', '.join(valid_commands)}"
45
+ )
46
+
47
+ # Validate set command has profile name
48
+ if args.profile_command == "set":
49
+ if not hasattr(args, "profile_name") or not args.profile_name:
50
+ return "Profile name required for 'set' command"
51
+
52
+ # Validate show command has profile name
53
+ if args.profile_command == "show":
54
+ if not hasattr(args, "profile_name") or not args.profile_name:
55
+ return "Profile name required for 'show' command"
56
+
57
+ return None
58
+
59
+ def run(self, args) -> CommandResult:
60
+ """Execute the profile command."""
61
+ try:
62
+ if args.profile_command == "list":
63
+ return self._list_profiles(args)
64
+ if args.profile_command == "set":
65
+ return self._set_profile(args)
66
+ if args.profile_command == "status":
67
+ return self._show_status(args)
68
+ if args.profile_command == "show":
69
+ return self._show_profile(args)
70
+ return CommandResult.error_result(
71
+ f"Unknown profile command: {args.profile_command}"
72
+ )
73
+ except Exception as e:
74
+ return CommandResult.error_result(f"Profile command failed: {e}")
75
+
76
+ def _list_profiles(self, args) -> CommandResult:
77
+ """List all available profiles."""
78
+ profiles = self.profile_manager.list_available_profiles()
79
+
80
+ if not profiles:
81
+ console.print("[yellow]No profiles found in .claude-mpm/profiles/[/yellow]")
82
+ return CommandResult.success_result("No profiles available")
83
+
84
+ # Load current active profile
85
+ main_config = self.config_loader.load_main_config()
86
+ active_profile = main_config.get("active_profile")
87
+
88
+ # Create table
89
+ table = Table(title="Available Deployment Profiles")
90
+ table.add_column("Profile", style="cyan", no_wrap=True)
91
+ table.add_column("Description", style="white")
92
+ table.add_column("Status", style="green")
93
+
94
+ for profile_name in profiles:
95
+ description = self.profile_manager.get_profile_description(profile_name)
96
+ status = "✓ Active" if profile_name == active_profile else ""
97
+
98
+ table.add_row(
99
+ profile_name, description or "(no description)", status or "-"
100
+ )
101
+
102
+ console.print(table)
103
+
104
+ return CommandResult.success_result(
105
+ f"Found {len(profiles)} profile(s)", {"profiles": profiles}
106
+ )
107
+
108
+ def _set_profile(self, args) -> CommandResult:
109
+ """Set active profile."""
110
+ profile_name = args.profile_name
111
+
112
+ # Validate profile exists
113
+ available_profiles = self.profile_manager.list_available_profiles()
114
+ if profile_name not in available_profiles:
115
+ return CommandResult.error_result(
116
+ f"Profile '{profile_name}' not found. "
117
+ f"Available profiles: {', '.join(available_profiles)}"
118
+ )
119
+
120
+ # Load profile to validate it
121
+ success = self.profile_manager.load_profile(profile_name)
122
+ if not success:
123
+ return CommandResult.error_result(
124
+ f"Failed to load profile '{profile_name}'"
125
+ )
126
+
127
+ # Update configuration.yaml
128
+ config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
129
+ if not config_path.exists():
130
+ # Create configuration.yaml if it doesn't exist
131
+ config_path.parent.mkdir(parents=True, exist_ok=True)
132
+ config_data = {"active_profile": profile_name}
133
+ else:
134
+ # Load existing configuration
135
+ with config_path.open("r") as f:
136
+ config_data = yaml.safe_load(f) or {}
137
+ config_data["active_profile"] = profile_name
138
+
139
+ # Save configuration
140
+ with config_path.open("w") as f:
141
+ yaml.safe_dump(config_data, f, default_flow_style=False, sort_keys=False)
142
+
143
+ # Show summary
144
+ summary = self.profile_manager.get_filtering_summary()
145
+ console.print(
146
+ f"[green]✓[/green] Active profile set to: [cyan]{profile_name}[/cyan]"
147
+ )
148
+ console.print(
149
+ f" Agents enabled: [cyan]{summary['enabled_agents_count']}[/cyan]"
150
+ )
151
+ console.print(
152
+ f" Skills enabled: [cyan]{summary['enabled_skills_count']}[/cyan]"
153
+ )
154
+ console.print(
155
+ f" Skill patterns disabled: [cyan]{summary['disabled_patterns_count']}[/cyan]"
156
+ )
157
+ console.print(
158
+ "\n[yellow]Note:[/yellow] Restart Claude Code or run [cyan]claude-mpm init[/cyan] "
159
+ "to apply profile filtering."
160
+ )
161
+
162
+ return CommandResult.success_result(
163
+ f"Profile '{profile_name}' activated",
164
+ {"profile": profile_name, "summary": summary},
165
+ )
166
+
167
+ def _show_status(self, args) -> CommandResult:
168
+ """Show current profile status."""
169
+ # Load current active profile
170
+ main_config = self.config_loader.load_main_config()
171
+ active_profile = main_config.get("active_profile")
172
+
173
+ if not active_profile:
174
+ console.print(
175
+ "[yellow]No active profile[/yellow] - All agents and skills enabled"
176
+ )
177
+ return CommandResult.success_result(
178
+ "No active profile", {"active_profile": None}
179
+ )
180
+
181
+ # Load profile
182
+ success = self.profile_manager.load_profile(active_profile)
183
+ if not success:
184
+ return CommandResult.error_result(
185
+ f"Failed to load active profile '{active_profile}'"
186
+ )
187
+
188
+ # Get summary
189
+ summary = self.profile_manager.get_filtering_summary()
190
+
191
+ # Display status
192
+ console.print(f"[green]Active Profile:[/green] [cyan]{active_profile}[/cyan]")
193
+ console.print()
194
+
195
+ # Agents section
196
+ console.print("[bold]Agents:[/bold]")
197
+ console.print(f" Enabled: [cyan]{summary['enabled_agents_count']}[/cyan]")
198
+ console.print(f" Disabled: [cyan]{summary['disabled_agents_count']}[/cyan]")
199
+
200
+ # Skills section
201
+ console.print()
202
+ console.print("[bold]Skills:[/bold]")
203
+ console.print(f" Enabled: [cyan]{summary['enabled_skills_count']}[/cyan]")
204
+ console.print(
205
+ f" Disabled patterns: [cyan]{summary['disabled_patterns_count']}[/cyan]"
206
+ )
207
+
208
+ return CommandResult.success_result(
209
+ f"Profile '{active_profile}' status",
210
+ {"active_profile": active_profile, "summary": summary},
211
+ )
212
+
213
+ def _show_profile(self, args) -> CommandResult:
214
+ """Show detailed profile configuration."""
215
+ profile_name = args.profile_name
216
+
217
+ # Validate profile exists
218
+ available_profiles = self.profile_manager.list_available_profiles()
219
+ if profile_name not in available_profiles:
220
+ return CommandResult.error_result(
221
+ f"Profile '{profile_name}' not found. "
222
+ f"Available profiles: {', '.join(available_profiles)}"
223
+ )
224
+
225
+ # Load profile
226
+ success = self.profile_manager.load_profile(profile_name)
227
+ if not success:
228
+ return CommandResult.error_result(
229
+ f"Failed to load profile '{profile_name}'"
230
+ )
231
+
232
+ # Display profile details
233
+ console.print(f"[bold]Profile:[/bold] [cyan]{profile_name}[/cyan]")
234
+ console.print()
235
+
236
+ # Show enabled agents
237
+ enabled_agents = self.profile_manager.get_enabled_agents()
238
+ if enabled_agents:
239
+ console.print("[bold]Enabled Agents:[/bold]")
240
+ for agent in sorted(enabled_agents):
241
+ console.print(f" • {agent}")
242
+ console.print()
243
+
244
+ # Show disabled agents
245
+ disabled_agents = self.profile_manager.get_disabled_agents()
246
+ if disabled_agents:
247
+ console.print("[bold]Disabled Agents:[/bold]")
248
+ for agent in sorted(disabled_agents):
249
+ console.print(f" • {agent}")
250
+ console.print()
251
+
252
+ # Show enabled skills
253
+ enabled_skills = self.profile_manager.get_enabled_skills()
254
+ if enabled_skills:
255
+ console.print("[bold]Enabled Skills:[/bold]")
256
+ for skill in sorted(enabled_skills):
257
+ console.print(f" • {skill}")
258
+ console.print()
259
+
260
+ # Show disabled skill patterns
261
+ disabled_patterns = self.profile_manager.get_disabled_skill_patterns()
262
+ if disabled_patterns:
263
+ console.print("[bold]Disabled Skill Patterns:[/bold]")
264
+ for pattern in disabled_patterns:
265
+ console.print(f" • {pattern}")
266
+
267
+ return CommandResult.success_result(
268
+ f"Profile '{profile_name}' details",
269
+ {
270
+ "profile": profile_name,
271
+ "enabled_agents": list(enabled_agents),
272
+ "disabled_agents": list(disabled_agents),
273
+ "enabled_skills": list(enabled_skills),
274
+ "disabled_patterns": disabled_patterns,
275
+ },
276
+ )