claude-mpm 5.0.9__py3-none-any.whl → 5.6.23__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 (614) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +115 -0
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +13 -44
  11. claude_mpm/agents/base_agent.json +1 -1
  12. claude_mpm/agents/frontmatter_validator.py +70 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +457 -62
  14. claude_mpm/cli/__init__.py +5 -2
  15. claude_mpm/cli/__main__.py +4 -0
  16. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  17. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  18. claude_mpm/cli/commands/agents.py +177 -41
  19. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  20. claude_mpm/cli/commands/auto_configure.py +723 -236
  21. claude_mpm/cli/commands/autotodos.py +566 -0
  22. claude_mpm/cli/commands/commander.py +216 -0
  23. claude_mpm/cli/commands/config.py +88 -2
  24. claude_mpm/cli/commands/configure.py +1874 -170
  25. claude_mpm/cli/commands/configure_agent_display.py +27 -6
  26. claude_mpm/cli/commands/hook_errors.py +60 -60
  27. claude_mpm/cli/commands/monitor.py +2 -2
  28. claude_mpm/cli/commands/mpm_init/core.py +232 -46
  29. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  30. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  31. claude_mpm/cli/commands/postmortem.py +1 -1
  32. claude_mpm/cli/commands/profile.py +276 -0
  33. claude_mpm/cli/commands/run.py +35 -3
  34. claude_mpm/cli/commands/skill_source.py +51 -2
  35. claude_mpm/cli/commands/skills.py +379 -204
  36. claude_mpm/cli/commands/summarize.py +413 -0
  37. claude_mpm/cli/executor.py +141 -19
  38. claude_mpm/cli/interactive/__init__.py +10 -0
  39. claude_mpm/cli/interactive/agent_wizard.py +115 -60
  40. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  41. claude_mpm/cli/interactive/skill_selector.py +481 -0
  42. claude_mpm/cli/parsers/agents_parser.py +54 -9
  43. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  44. claude_mpm/cli/parsers/base_parser.py +88 -1
  45. claude_mpm/cli/parsers/commander_parser.py +116 -0
  46. claude_mpm/cli/parsers/config_parser.py +153 -83
  47. claude_mpm/cli/parsers/profile_parser.py +147 -0
  48. claude_mpm/cli/parsers/run_parser.py +10 -0
  49. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  50. claude_mpm/cli/parsers/skills_parser.py +1 -1
  51. claude_mpm/cli/startup.py +1017 -266
  52. claude_mpm/cli/startup_display.py +74 -6
  53. claude_mpm/cli/startup_logging.py +2 -2
  54. claude_mpm/cli/utils.py +7 -3
  55. claude_mpm/commander/__init__.py +78 -0
  56. claude_mpm/commander/adapters/__init__.py +60 -0
  57. claude_mpm/commander/adapters/auggie.py +260 -0
  58. claude_mpm/commander/adapters/base.py +288 -0
  59. claude_mpm/commander/adapters/claude_code.py +392 -0
  60. claude_mpm/commander/adapters/codex.py +237 -0
  61. claude_mpm/commander/adapters/communication.py +366 -0
  62. claude_mpm/commander/adapters/example_usage.py +310 -0
  63. claude_mpm/commander/adapters/mpm.py +389 -0
  64. claude_mpm/commander/adapters/registry.py +204 -0
  65. claude_mpm/commander/api/__init__.py +16 -0
  66. claude_mpm/commander/api/app.py +121 -0
  67. claude_mpm/commander/api/errors.py +133 -0
  68. claude_mpm/commander/api/routes/__init__.py +8 -0
  69. claude_mpm/commander/api/routes/events.py +184 -0
  70. claude_mpm/commander/api/routes/inbox.py +171 -0
  71. claude_mpm/commander/api/routes/messages.py +148 -0
  72. claude_mpm/commander/api/routes/projects.py +271 -0
  73. claude_mpm/commander/api/routes/sessions.py +226 -0
  74. claude_mpm/commander/api/routes/work.py +296 -0
  75. claude_mpm/commander/api/schemas.py +186 -0
  76. claude_mpm/commander/chat/__init__.py +7 -0
  77. claude_mpm/commander/chat/cli.py +146 -0
  78. claude_mpm/commander/chat/commands.py +96 -0
  79. claude_mpm/commander/chat/repl.py +310 -0
  80. claude_mpm/commander/config.py +51 -0
  81. claude_mpm/commander/config_loader.py +115 -0
  82. claude_mpm/commander/core/__init__.py +10 -0
  83. claude_mpm/commander/core/block_manager.py +325 -0
  84. claude_mpm/commander/core/response_manager.py +323 -0
  85. claude_mpm/commander/daemon.py +603 -0
  86. claude_mpm/commander/env_loader.py +59 -0
  87. claude_mpm/commander/events/__init__.py +26 -0
  88. claude_mpm/commander/events/manager.py +332 -0
  89. claude_mpm/commander/frameworks/__init__.py +12 -0
  90. claude_mpm/commander/frameworks/base.py +146 -0
  91. claude_mpm/commander/frameworks/claude_code.py +58 -0
  92. claude_mpm/commander/frameworks/mpm.py +62 -0
  93. claude_mpm/commander/inbox/__init__.py +16 -0
  94. claude_mpm/commander/inbox/dedup.py +128 -0
  95. claude_mpm/commander/inbox/inbox.py +224 -0
  96. claude_mpm/commander/inbox/models.py +70 -0
  97. claude_mpm/commander/instance_manager.py +450 -0
  98. claude_mpm/commander/llm/__init__.py +6 -0
  99. claude_mpm/commander/llm/openrouter_client.py +167 -0
  100. claude_mpm/commander/llm/summarizer.py +70 -0
  101. claude_mpm/commander/memory/__init__.py +45 -0
  102. claude_mpm/commander/memory/compression.py +347 -0
  103. claude_mpm/commander/memory/embeddings.py +230 -0
  104. claude_mpm/commander/memory/entities.py +310 -0
  105. claude_mpm/commander/memory/example_usage.py +290 -0
  106. claude_mpm/commander/memory/integration.py +325 -0
  107. claude_mpm/commander/memory/search.py +381 -0
  108. claude_mpm/commander/memory/store.py +657 -0
  109. claude_mpm/commander/models/__init__.py +18 -0
  110. claude_mpm/commander/models/events.py +121 -0
  111. claude_mpm/commander/models/project.py +162 -0
  112. claude_mpm/commander/models/work.py +214 -0
  113. claude_mpm/commander/parsing/__init__.py +20 -0
  114. claude_mpm/commander/parsing/extractor.py +132 -0
  115. claude_mpm/commander/parsing/output_parser.py +270 -0
  116. claude_mpm/commander/parsing/patterns.py +100 -0
  117. claude_mpm/commander/persistence/__init__.py +11 -0
  118. claude_mpm/commander/persistence/event_store.py +274 -0
  119. claude_mpm/commander/persistence/state_store.py +309 -0
  120. claude_mpm/commander/persistence/work_store.py +164 -0
  121. claude_mpm/commander/polling/__init__.py +13 -0
  122. claude_mpm/commander/polling/event_detector.py +104 -0
  123. claude_mpm/commander/polling/output_buffer.py +49 -0
  124. claude_mpm/commander/polling/output_poller.py +153 -0
  125. claude_mpm/commander/project_session.py +268 -0
  126. claude_mpm/commander/proxy/__init__.py +12 -0
  127. claude_mpm/commander/proxy/formatter.py +89 -0
  128. claude_mpm/commander/proxy/output_handler.py +191 -0
  129. claude_mpm/commander/proxy/relay.py +155 -0
  130. claude_mpm/commander/registry.py +410 -0
  131. claude_mpm/commander/runtime/__init__.py +10 -0
  132. claude_mpm/commander/runtime/executor.py +191 -0
  133. claude_mpm/commander/runtime/monitor.py +346 -0
  134. claude_mpm/commander/session/__init__.py +6 -0
  135. claude_mpm/commander/session/context.py +81 -0
  136. claude_mpm/commander/session/manager.py +59 -0
  137. claude_mpm/commander/tmux_orchestrator.py +361 -0
  138. claude_mpm/commander/web/__init__.py +1 -0
  139. claude_mpm/commander/work/__init__.py +30 -0
  140. claude_mpm/commander/work/executor.py +207 -0
  141. claude_mpm/commander/work/queue.py +405 -0
  142. claude_mpm/commander/workflow/__init__.py +27 -0
  143. claude_mpm/commander/workflow/event_handler.py +241 -0
  144. claude_mpm/commander/workflow/notifier.py +146 -0
  145. claude_mpm/commands/mpm-config.md +36 -0
  146. claude_mpm/commands/mpm-doctor.md +16 -21
  147. claude_mpm/commands/mpm-help.md +12 -286
  148. claude_mpm/commands/mpm-init.md +88 -506
  149. claude_mpm/commands/mpm-monitor.md +22 -401
  150. claude_mpm/commands/mpm-organize.md +128 -0
  151. claude_mpm/commands/mpm-postmortem.md +13 -107
  152. claude_mpm/commands/mpm-session-resume.md +20 -363
  153. claude_mpm/commands/mpm-status.md +13 -69
  154. claude_mpm/commands/mpm-ticket-view.md +60 -495
  155. claude_mpm/commands/mpm-version.md +13 -107
  156. claude_mpm/commands/mpm.md +8 -0
  157. claude_mpm/config/agent_presets.py +8 -7
  158. claude_mpm/config/agent_sources.py +27 -0
  159. claude_mpm/config/skill_sources.py +16 -0
  160. claude_mpm/constants.py +1 -0
  161. claude_mpm/core/claude_runner.py +154 -2
  162. claude_mpm/core/config.py +37 -26
  163. claude_mpm/core/config_constants.py +74 -9
  164. claude_mpm/core/constants.py +56 -12
  165. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  166. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  167. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  168. claude_mpm/core/framework_loader.py +4 -2
  169. claude_mpm/core/hook_manager.py +51 -3
  170. claude_mpm/core/interactive_session.py +12 -11
  171. claude_mpm/core/logger.py +39 -9
  172. claude_mpm/core/logging_utils.py +35 -11
  173. claude_mpm/core/network_config.py +148 -0
  174. claude_mpm/core/oneshot_session.py +7 -6
  175. claude_mpm/core/optimized_startup.py +61 -0
  176. claude_mpm/core/output_style_manager.py +219 -44
  177. claude_mpm/core/shared/config_loader.py +3 -1
  178. claude_mpm/core/socketio_pool.py +16 -8
  179. claude_mpm/core/unified_agent_registry.py +134 -16
  180. claude_mpm/core/unified_config.py +76 -8
  181. claude_mpm/core/unified_paths.py +95 -90
  182. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  236. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  237. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  238. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  239. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  240. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  241. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  242. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  248. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  249. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  250. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  251. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  252. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  253. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  254. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  255. claude_mpm/experimental/cli_enhancements.py +2 -1
  256. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  257. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  258. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  259. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  260. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  261. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  262. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  267. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  268. claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
  269. claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
  270. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  271. claude_mpm/hooks/claude_hooks/installer.py +149 -18
  272. claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
  273. claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
  274. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  275. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  276. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  277. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  278. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  279. claude_mpm/hooks/claude_hooks/services/connection_manager.py +69 -30
  280. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  281. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  282. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
  283. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  284. claude_mpm/hooks/memory_integration_hook.py +46 -1
  285. claude_mpm/hooks/session_resume_hook.py +89 -1
  286. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  287. claude_mpm/init.py +276 -19
  288. claude_mpm/models/agent_definition.py +7 -0
  289. claude_mpm/models/git_repository.py +3 -3
  290. claude_mpm/scripts/claude-hook-handler.sh +87 -20
  291. claude_mpm/scripts/launch_monitor.py +93 -13
  292. claude_mpm/scripts/start_activity_logging.py +0 -0
  293. claude_mpm/services/agents/agent_builder.py +3 -3
  294. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  295. claude_mpm/services/agents/agent_review_service.py +280 -0
  296. claude_mpm/services/agents/agent_selection_service.py +2 -2
  297. claude_mpm/services/agents/cache_git_manager.py +7 -7
  298. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  299. claude_mpm/services/agents/deployment/agent_discovery_service.py +6 -5
  300. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  301. claude_mpm/services/agents/deployment/agent_template_builder.py +42 -20
  302. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  303. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  304. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  305. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  306. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +348 -29
  307. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
  308. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  309. claude_mpm/services/agents/git_source_manager.py +57 -4
  310. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  311. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  312. claude_mpm/services/agents/recommender.py +5 -3
  313. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  314. claude_mpm/services/agents/sources/git_source_sync_service.py +129 -11
  315. claude_mpm/services/agents/startup_sync.py +27 -4
  316. claude_mpm/services/agents/toolchain_detector.py +10 -6
  317. claude_mpm/services/analysis/__init__.py +11 -1
  318. claude_mpm/services/analysis/clone_detector.py +1030 -0
  319. claude_mpm/services/cli/__init__.py +3 -0
  320. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  321. claude_mpm/services/cli/session_resume_helper.py +10 -2
  322. claude_mpm/services/command_deployment_service.py +81 -10
  323. claude_mpm/services/delegation_detector.py +175 -0
  324. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  325. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  326. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  327. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  328. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  329. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  330. claude_mpm/services/diagnostics/models.py +14 -1
  331. claude_mpm/services/event_bus/config.py +3 -1
  332. claude_mpm/services/event_log.py +325 -0
  333. claude_mpm/services/git/git_operations_service.py +101 -16
  334. claude_mpm/services/infrastructure/__init__.py +4 -0
  335. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  336. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  337. claude_mpm/services/monitor/daemon.py +9 -2
  338. claude_mpm/services/monitor/daemon_manager.py +54 -7
  339. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  340. claude_mpm/services/monitor/server.py +796 -30
  341. claude_mpm/services/pm_skills_deployer.py +884 -0
  342. claude_mpm/services/profile_manager.py +337 -0
  343. claude_mpm/services/project/project_organizer.py +4 -0
  344. claude_mpm/services/self_upgrade_service.py +120 -12
  345. claude_mpm/services/skills/__init__.py +3 -0
  346. claude_mpm/services/skills/git_skill_source_manager.py +303 -12
  347. claude_mpm/services/skills/selective_skill_deployer.py +869 -0
  348. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  349. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  350. claude_mpm/services/skills_deployer.py +294 -55
  351. claude_mpm/services/socketio/dashboard_server.py +1 -0
  352. claude_mpm/services/socketio/event_normalizer.py +51 -6
  353. claude_mpm/services/socketio/handlers/hook.py +14 -7
  354. claude_mpm/services/socketio/server/core.py +386 -108
  355. claude_mpm/services/socketio/server/main.py +12 -4
  356. claude_mpm/services/version_control/git_operations.py +103 -0
  357. claude_mpm/skills/__init__.py +2 -1
  358. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  359. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  360. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  361. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  362. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  363. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  364. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  365. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  366. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  367. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  368. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  369. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  370. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  371. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  372. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  373. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  374. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  375. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  376. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  377. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  378. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  379. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  380. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  381. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  382. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  383. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  384. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  385. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  386. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  387. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  388. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  389. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  390. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  391. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  392. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  393. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  394. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  395. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  396. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  397. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  398. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  399. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  400. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  401. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  402. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  403. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  404. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  405. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  406. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  407. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  408. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  409. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  410. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  411. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  412. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  413. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  414. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  415. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  416. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  417. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  418. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  419. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  420. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  422. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  423. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  424. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  425. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  426. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  427. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  428. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  429. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  430. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  431. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  432. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  433. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  434. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  435. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  436. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  437. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  438. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  439. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  440. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  441. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  442. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  443. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  444. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  445. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  446. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  447. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  448. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  449. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  450. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  451. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  459. claude_mpm/skills/bundled/security-scanning.md +112 -0
  460. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  461. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  462. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  463. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  464. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  465. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  466. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  467. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  468. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  469. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  470. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  495. claude_mpm/skills/registry.py +295 -90
  496. claude_mpm/skills/skill_manager.py +98 -3
  497. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  498. claude_mpm/utils/agent_dependency_loader.py +115 -4
  499. claude_mpm/utils/agent_filters.py +17 -44
  500. claude_mpm/utils/gitignore.py +3 -0
  501. claude_mpm/utils/migration.py +4 -4
  502. claude_mpm/utils/robust_installer.py +86 -21
  503. claude_mpm-5.6.23.dist-info/METADATA +393 -0
  504. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
  505. claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
  506. claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
  507. claude_mpm-5.6.23.dist-info/licenses/LICENSE-FAQ.md +153 -0
  508. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  509. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  510. claude_mpm/agents/BASE_OPS.md +0 -219
  511. claude_mpm/agents/BASE_PM.md +0 -480
  512. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  513. claude_mpm/agents/BASE_QA.md +0 -167
  514. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  515. claude_mpm/agents/OUTPUT_STYLE.md +0 -290
  516. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
  517. claude_mpm/agents/base_agent_loader.py +0 -601
  518. claude_mpm/cli/commands/agents_detect.py +0 -380
  519. claude_mpm/cli/commands/agents_recommend.py +0 -309
  520. claude_mpm/cli/ticket_cli.py +0 -35
  521. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  522. claude_mpm/commands/mpm-agents-detect.md +0 -177
  523. claude_mpm/commands/mpm-agents-list.md +0 -131
  524. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  525. claude_mpm/commands/mpm-config-view.md +0 -150
  526. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  527. claude_mpm/dashboard/analysis_runner.py +0 -455
  528. claude_mpm/dashboard/index.html +0 -13
  529. claude_mpm/dashboard/open_dashboard.py +0 -66
  530. claude_mpm/dashboard/static/css/activity.css +0 -1958
  531. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  532. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  533. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  534. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  535. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  536. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  537. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  538. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  539. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  540. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  541. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  542. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  543. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  544. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  545. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  546. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  547. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  548. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  549. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  550. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  551. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  552. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  553. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  554. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  555. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  556. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  557. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  558. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  559. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  560. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  561. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  562. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  563. claude_mpm/dashboard/templates/code_simple.html +0 -153
  564. claude_mpm/dashboard/templates/index.html +0 -606
  565. claude_mpm/dashboard/test_dashboard.html +0 -372
  566. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  567. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  568. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  569. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  570. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  571. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  572. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  573. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  574. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  575. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  576. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  577. claude_mpm/scripts/mcp_server.py +0 -75
  578. claude_mpm/scripts/mcp_wrapper.py +0 -39
  579. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  580. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  581. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  582. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  583. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  584. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  585. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  586. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  587. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  588. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  589. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  590. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  591. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  592. claude_mpm/services/mcp_gateway/main.py +0 -589
  593. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  594. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  595. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  596. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  597. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  598. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  599. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  600. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  601. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  602. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  603. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  604. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  605. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  606. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  607. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  608. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  609. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  610. claude_mpm-5.0.9.dist-info/METADATA +0 -1028
  611. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  612. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  613. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
  614. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
@@ -5,6 +5,7 @@ This module handles:
5
5
  2. Output style extraction from framework instructions
6
6
  3. One-time deployment to Claude Code >= 1.0.83 at startup
7
7
  4. Fallback injection for older versions
8
+ 5. Support for multiple output styles (professional and teaching modes)
8
9
 
9
10
  The output style is set once at startup and not monitored or enforced after that.
10
11
  Users can change it if they want, and the system will respect their choice.
@@ -12,9 +13,9 @@ Users can change it if they want, and the system will respect their choice.
12
13
 
13
14
  import json
14
15
  import re
15
- import subprocess
16
+ import subprocess # nosec B404
16
17
  from pathlib import Path
17
- from typing import Dict, Optional
18
+ from typing import Any, Dict, Literal, Optional, TypedDict, cast
18
19
 
19
20
  from ..utils.imports import safe_import
20
21
 
@@ -25,22 +26,74 @@ get_logger = safe_import("claude_mpm.core.logger", "core.logger", ["get_logger"]
25
26
  _CACHED_CLAUDE_VERSION: Optional[str] = None
26
27
  _VERSION_DETECTED: bool = False
27
28
 
29
+ # Output style types
30
+ OutputStyleType = Literal[
31
+ "professional", "teaching", "research", "founders"
32
+ ] # "founders" is deprecated, use "research"
33
+
34
+
35
+ class StyleConfig(TypedDict):
36
+ """Configuration for an output style."""
37
+
38
+ source: Path
39
+ target: Path
40
+ name: str
41
+
28
42
 
29
43
  class OutputStyleManager:
30
- """Manages output style deployment and version-based handling."""
44
+ """Manages output style deployment and version-based handling.
45
+
46
+ Supports three output styles:
47
+ - professional: Default Claude MPM style (claude-mpm.md)
48
+ - teaching: Adaptive teaching mode (claude-mpm-teacher.md)
49
+ - research: Codebase research mode for founders, PMs, and developers (claude-mpm-research.md)
50
+ """
31
51
 
32
- def __init__(self):
52
+ def __init__(self) -> None:
33
53
  """Initialize the output style manager."""
34
- self.logger = get_logger("output_style_manager")
54
+ self.logger = get_logger("output_style_manager") # type: ignore[misc]
35
55
  self.claude_version = self._detect_claude_version()
56
+
57
+ # Deploy to ~/.claude/output-styles/ directory (official Claude Code location)
36
58
  self.output_style_dir = Path.home() / ".claude" / "output-styles"
37
- self.output_style_path = self.output_style_dir / "claude-mpm.md"
38
59
  self.settings_file = Path.home() / ".claude" / "settings.json"
39
60
 
40
- # Cache the output style content path
41
- self.mpm_output_style_path = (
42
- Path(__file__).parent.parent / "agents" / "OUTPUT_STYLE.md"
43
- )
61
+ # Style definitions
62
+ self.styles: Dict[str, StyleConfig] = {
63
+ "professional": StyleConfig(
64
+ source=Path(__file__).parent.parent
65
+ / "agents"
66
+ / "CLAUDE_MPM_OUTPUT_STYLE.md",
67
+ target=self.output_style_dir / "claude-mpm.md",
68
+ name="Claude MPM",
69
+ ),
70
+ "teaching": StyleConfig(
71
+ source=Path(__file__).parent.parent
72
+ / "agents"
73
+ / "CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md",
74
+ target=self.output_style_dir / "claude-mpm-teacher.md",
75
+ name="Claude MPM Teacher",
76
+ ),
77
+ "research": StyleConfig(
78
+ source=Path(__file__).parent.parent
79
+ / "agents"
80
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
81
+ target=self.output_style_dir / "claude-mpm-research.md",
82
+ name="Claude MPM Research",
83
+ ),
84
+ # Backward compatibility alias (deprecated)
85
+ "founders": StyleConfig(
86
+ source=Path(__file__).parent.parent
87
+ / "agents"
88
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
89
+ target=self.output_style_dir / "claude-mpm-research.md",
90
+ name="Claude MPM Research",
91
+ ),
92
+ }
93
+
94
+ # Default style path (for backward compatibility)
95
+ self.output_style_path = self.styles["professional"]["target"]
96
+ self.mpm_output_style_path = self.styles["professional"]["source"]
44
97
 
45
98
  def _detect_claude_version(self) -> Optional[str]:
46
99
  """
@@ -58,7 +111,7 @@ class OutputStyleManager:
58
111
 
59
112
  try:
60
113
  # Run claude --version command
61
- result = subprocess.run(
114
+ result = subprocess.run( # nosec B603 B607
62
115
  ["claude", "--version"],
63
116
  capture_output=True,
64
117
  text=True,
@@ -158,56 +211,77 @@ class OutputStyleManager:
158
211
  """
159
212
  return not self.supports_output_styles()
160
213
 
161
- def extract_output_style_content(self, framework_loader=None) -> str:
214
+ def extract_output_style_content(
215
+ self, framework_loader: Any = None, style: OutputStyleType = "professional"
216
+ ) -> str:
162
217
  """
163
- Read output style content from OUTPUT_STYLE.md.
218
+ Read output style content from style source file.
164
219
 
165
220
  Args:
166
221
  framework_loader: Optional framework loader (kept for compatibility, not used)
222
+ style: Style type to extract ("professional" or "teaching")
167
223
 
168
224
  Returns:
169
225
  Complete output style content from file
170
226
  """
171
- # Always read from the complete OUTPUT_STYLE.md file
172
- if self.mpm_output_style_path.exists():
173
- content = self.mpm_output_style_path.read_text()
174
- self.logger.info(f"Read OUTPUT_STYLE.md directly ({len(content)} chars)")
227
+ style_config = self.styles[style]
228
+ source_path = style_config["source"]
229
+
230
+ if source_path.exists():
231
+ content = source_path.read_text()
232
+ self.logger.info(
233
+ f"Read {style} style from {source_path.name} ({len(content)} chars)"
234
+ )
175
235
  return content
236
+
176
237
  # Fallback error
177
- error_msg = f"OUTPUT_STYLE.md not found at {self.mpm_output_style_path}"
238
+ error_msg = f"{style} style not found at {source_path}"
178
239
  self.logger.error(error_msg)
179
240
  raise FileNotFoundError(error_msg)
180
241
 
181
- def save_output_style(self, content: str) -> Path:
242
+ def save_output_style(
243
+ self, content: str, style: OutputStyleType = "professional"
244
+ ) -> Path:
182
245
  """
183
- Save output style content to OUTPUT_STYLE.md.
246
+ Save output style content to source file.
184
247
 
185
248
  Args:
186
249
  content: The formatted output style content
250
+ style: Style type to save ("professional" or "teaching")
187
251
 
188
252
  Returns:
189
253
  Path to the saved file
190
254
  """
191
255
  try:
256
+ style_config = self.styles[style]
257
+ source_path = style_config["source"]
258
+
192
259
  # Ensure the parent directory exists
193
- self.mpm_output_style_path.parent.mkdir(parents=True, exist_ok=True)
260
+ source_path.parent.mkdir(parents=True, exist_ok=True)
194
261
 
195
262
  # Write the content
196
- self.mpm_output_style_path.write_text(content, encoding="utf-8")
197
- self.logger.info(f"Saved output style to {self.mpm_output_style_path}")
263
+ source_path.write_text(content, encoding="utf-8")
264
+ self.logger.info(f"Saved {style} style to {source_path}")
198
265
 
199
- return self.mpm_output_style_path
266
+ return source_path
200
267
  except Exception as e:
201
- self.logger.error(f"Failed to save output style: {e}")
268
+ self.logger.error(f"Failed to save {style} style: {e}")
202
269
  raise
203
270
 
204
- def deploy_output_style(self, content: str) -> bool:
271
+ def deploy_output_style(
272
+ self,
273
+ content: Optional[str] = None,
274
+ style: OutputStyleType = "professional",
275
+ activate: bool = True,
276
+ ) -> bool:
205
277
  """
206
278
  Deploy output style to Claude Code if version >= 1.0.83.
207
- Deploys the style file and activates it once.
279
+ Deploys the style file and optionally activates it.
208
280
 
209
281
  Args:
210
- content: The output style content to deploy
282
+ content: The output style content to deploy (if None, reads from source)
283
+ style: Style type to deploy ("professional" or "teaching")
284
+ activate: Whether to activate the style after deployment
211
285
 
212
286
  Returns:
213
287
  True if deployed successfully, False otherwise
@@ -219,26 +293,51 @@ class OutputStyleManager:
219
293
  return False
220
294
 
221
295
  try:
222
- # Ensure output-styles directory exists
296
+ style_config = self.styles[style]
297
+ target_path = style_config["target"]
298
+ style_name = style_config["name"]
299
+
300
+ # Check if this is a fresh install (file doesn't exist yet)
301
+ is_fresh_install = not target_path.exists()
302
+
303
+ # If content not provided, read from source
304
+ if content is None:
305
+ content = self.extract_output_style_content(style=style)
306
+
307
+ # Ensure styles directory exists
223
308
  self.output_style_dir.mkdir(parents=True, exist_ok=True)
224
309
 
225
310
  # Write the output style file
226
- self.output_style_path.write_text(content, encoding="utf-8")
227
- self.logger.info(f"Deployed output style to {self.output_style_path}")
311
+ target_path.write_text(content, encoding="utf-8")
312
+ self.logger.info(f"Deployed {style} style to {target_path}")
228
313
 
229
- # Activate the claude-mpm style
230
- self._activate_output_style()
314
+ # Activate the style if requested
315
+ if activate:
316
+ self._activate_output_style(
317
+ style_name, is_fresh_install=is_fresh_install
318
+ )
231
319
 
232
320
  return True
233
321
 
234
322
  except Exception as e:
235
- self.logger.error(f"Failed to deploy output style: {e}")
323
+ self.logger.error(f"Failed to deploy {style} style: {e}")
236
324
  return False
237
325
 
238
- def _activate_output_style(self) -> bool:
326
+ def _activate_output_style(
327
+ self, style_name: str = "Claude MPM", is_fresh_install: bool = False
328
+ ) -> bool:
239
329
  """
240
- Update Claude Code settings to activate the claude-mpm output style.
241
- Sets activeOutputStyle to "claude-mpm" once at startup.
330
+ Update Claude Code settings to activate a specific output style.
331
+
332
+ Only activates the style if:
333
+ 1. No active style is currently set (first deployment), OR
334
+ 2. This is a fresh install (style file didn't exist before deployment)
335
+
336
+ This preserves user preferences if they've manually changed their active style.
337
+
338
+ Args:
339
+ style_name: Name of the style to activate (e.g., "Claude MPM", "Claude MPM Teacher")
340
+ is_fresh_install: Whether this is a fresh install (style file didn't exist before)
242
341
 
243
342
  Returns:
244
343
  True if activated successfully, False otherwise
@@ -257,9 +356,13 @@ class OutputStyleManager:
257
356
  # Check current active style
258
357
  current_style = settings.get("activeOutputStyle")
259
358
 
260
- # Update active output style to claude-mpm if not already set
261
- if current_style != "claude-mpm":
262
- settings["activeOutputStyle"] = "claude-mpm"
359
+ # Only set activeOutputStyle if:
360
+ # 1. No active style is set (first deployment), OR
361
+ # 2. This is a fresh install (file didn't exist before deployment)
362
+ should_activate = current_style is None or is_fresh_install
363
+
364
+ if should_activate and current_style != style_name:
365
+ settings["activeOutputStyle"] = style_name
263
366
 
264
367
  # Ensure settings directory exists
265
368
  self.settings_file.parent.mkdir(parents=True, exist_ok=True)
@@ -270,10 +373,13 @@ class OutputStyleManager:
270
373
  )
271
374
 
272
375
  self.logger.info(
273
- f"✅ Activated claude-mpm output style (was: {current_style or 'none'})"
376
+ f"✅ Activated {style_name} output style (was: {current_style or 'none'})"
274
377
  )
275
378
  else:
276
- self.logger.debug("Claude MPM output style already active")
379
+ self.logger.debug(
380
+ f"Preserving user preference: {current_style or 'none'} "
381
+ f"(skipping activation of {style_name})"
382
+ )
277
383
 
278
384
  return True
279
385
 
@@ -319,7 +425,9 @@ class OutputStyleManager:
319
425
 
320
426
  return status
321
427
 
322
- def get_injectable_content(self, framework_loader=None) -> str:
428
+ def get_injectable_content(
429
+ self, framework_loader: Any = None, style: OutputStyleType = "professional"
430
+ ) -> str:
323
431
  """
324
432
  Get output style content for injection into instructions (for Claude < 1.0.83).
325
433
 
@@ -328,12 +436,13 @@ class OutputStyleManager:
328
436
 
329
437
  Args:
330
438
  framework_loader: Optional FrameworkLoader instance to reuse loaded content
439
+ style: Style type to extract ("professional" or "teaching")
331
440
 
332
441
  Returns:
333
442
  Simplified output style content for injection
334
443
  """
335
444
  # Extract the same content but without YAML frontmatter
336
- full_content = self.extract_output_style_content(framework_loader)
445
+ full_content = self.extract_output_style_content(framework_loader, style=style)
337
446
 
338
447
  # Remove YAML frontmatter
339
448
  lines = full_content.split("\n")
@@ -351,3 +460,69 @@ class OutputStyleManager:
351
460
 
352
461
  # If no frontmatter found, return as-is
353
462
  return full_content
463
+
464
+ def deploy_all_styles(self, activate_default: bool = True) -> Dict[str, bool]:
465
+ """
466
+ Deploy all available output styles to Claude Code.
467
+
468
+ Args:
469
+ activate_default: Whether to activate the professional style after deployment
470
+
471
+ Returns:
472
+ Dictionary mapping style names to deployment success status
473
+ """
474
+ results: Dict[str, bool] = {}
475
+
476
+ # Check if professional style exists BEFORE deployment
477
+ # This determines if this is a fresh install
478
+ professional_style_existed = self.styles["professional"]["target"].exists()
479
+
480
+ for style_type_key in self.styles:
481
+ # Deploy without activation
482
+ # Cast is safe because we know self.styles keys are OutputStyleType
483
+ style_type = cast("OutputStyleType", style_type_key)
484
+ success = self.deploy_output_style(style=style_type, activate=False)
485
+ results[style_type] = success
486
+
487
+ # Activate the default style if requested AND this is first deployment
488
+ if activate_default and results.get("professional", False):
489
+ self._activate_output_style(
490
+ "Claude MPM", is_fresh_install=not professional_style_existed
491
+ )
492
+
493
+ return results
494
+
495
+ def deploy_teaching_style(self, activate: bool = False) -> bool:
496
+ """
497
+ Deploy the teaching style specifically.
498
+
499
+ Args:
500
+ activate: Whether to activate the teaching style after deployment
501
+
502
+ Returns:
503
+ True if deployed successfully, False otherwise
504
+ """
505
+ return self.deploy_output_style(style="teaching", activate=activate)
506
+
507
+ def list_available_styles(self) -> Dict[str, Dict[str, str]]:
508
+ """
509
+ List all available output styles with their metadata.
510
+
511
+ Returns:
512
+ Dictionary mapping style types to their configuration
513
+ """
514
+ available_styles = {}
515
+
516
+ for style_type, config in self.styles.items():
517
+ source_exists = config["source"].exists()
518
+ target_exists = config["target"].exists()
519
+
520
+ available_styles[style_type] = {
521
+ "name": config["name"],
522
+ "source_path": str(config["source"]),
523
+ "target_path": str(config["target"]),
524
+ "source_exists": str(source_exists),
525
+ "deployed": str(target_exists),
526
+ }
527
+
528
+ return available_styles
@@ -51,7 +51,9 @@ class ConfigLoader:
51
51
  search_paths=[".", ".claude-mpm", "agents"],
52
52
  env_prefix="CLAUDE_MPM_AGENT_",
53
53
  defaults={"timeout": 30, "max_retries": 3, "log_level": "INFO"},
54
- required_keys=["name", "model"],
54
+ required_keys=[
55
+ "name"
56
+ ], # model is optional - defaults to sonnet if not specified
55
57
  )
56
58
 
57
59
  MEMORY_CONFIG = ConfigPattern(
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env python3
2
1
  """Socket.IO connection pool for efficient client connection management.
3
2
 
4
3
  This module provides a connection pool to reuse Socket.IO client connections,
@@ -31,12 +30,21 @@ except ImportError:
31
30
  # Import constants for configuration
32
31
  try:
33
32
  from claude_mpm.core.constants import NetworkConfig
33
+ from claude_mpm.core.network_config import NetworkPorts
34
34
  except ImportError:
35
35
  # Fallback if constants module not available
36
+ class NetworkPorts:
37
+ MONITOR_DEFAULT = 8765
38
+ COMMANDER_DEFAULT = 8766
39
+ DASHBOARD_DEFAULT = 8767
40
+ SOCKETIO_DEFAULT = 8768
41
+ PORT_RANGE_START = 8765
42
+ PORT_RANGE_END = 8785
43
+
36
44
  class NetworkConfig:
37
- DEFAULT_DASHBOARD_PORT = 8765
45
+ DEFAULT_DASHBOARD_PORT = 8767
38
46
  SOCKETIO_PORT_RANGE = (8765, 8785)
39
- DEFAULT_SOCKETIO_PORT = 8765
47
+ DEFAULT_SOCKETIO_PORT = 8768
40
48
 
41
49
  socketio = None
42
50
 
@@ -55,8 +63,8 @@ class CircuitState(Enum):
55
63
  class ConnectionStats:
56
64
  """Connection statistics for monitoring."""
57
65
 
58
- created_at: datetime = field(default_factory=datetime.now)
59
- last_used: datetime = field(default_factory=datetime.now)
66
+ created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
67
+ last_used: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
60
68
  events_sent: int = 0
61
69
  errors: int = 0
62
70
  consecutive_errors: int = 0
@@ -70,7 +78,7 @@ class BatchEvent:
70
78
  namespace: str
71
79
  event: str
72
80
  data: Dict[str, Any]
73
- timestamp: datetime = field(default_factory=datetime.now)
81
+ timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
74
82
 
75
83
 
76
84
  class CircuitBreaker:
@@ -309,7 +317,7 @@ class SocketIOConnectionPool:
309
317
  self.server_url = f"http://localhost:{port}"
310
318
  self.logger.debug(f"Detected Socket.IO server on port {port}")
311
319
  return
312
- except Exception:
320
+ except Exception: # nosec B112 - intentional: skip ports that fail
313
321
  continue
314
322
 
315
323
  # Fall back to default
@@ -579,7 +587,7 @@ class SocketIOConnectionPool:
579
587
  loop.stop()
580
588
  loop.run_until_complete(loop.shutdown_asyncgens())
581
589
  loop.close()
582
- except Exception:
590
+ except Exception: # nosec B110 - intentional: cleanup best-effort
583
591
  pass
584
592
 
585
593
  async def _connect_client(self, client: socketio.AsyncClient):
@@ -84,6 +84,12 @@ class AgentMetadata:
84
84
  version: str = "1.0.0"
85
85
  author: str = ""
86
86
  tags: List[str] = None
87
+ # NEW: Collection-based identification fields
88
+ collection_id: Optional[str] = None # Format: owner/repo-name
89
+ source_path: Optional[str] = None # Relative path in repo
90
+ canonical_id: Optional[str] = (
91
+ None # Format: collection_id:agent_id or legacy:filename
92
+ )
87
93
 
88
94
  def __post_init__(self):
89
95
  """Initialize default values for mutable fields."""
@@ -168,26 +174,16 @@ class UnifiedAgentRegistry:
168
174
  if project_path.exists():
169
175
  self.discovery_paths.append(project_path)
170
176
 
171
- # Also check for local JSON templates in .claude-mpm/agents/
172
- local_project_path = self.path_manager.project_root / ".claude-mpm" / "agents"
173
- if (
174
- local_project_path.exists()
175
- and local_project_path not in self.discovery_paths
176
- ):
177
- self.discovery_paths.append(local_project_path)
178
- logger.debug(f"Added local project templates path: {local_project_path}")
177
+ # NOTE: .claude-mpm/agents/ is deprecated in the simplified architecture
178
+ # Source agents come from ~/.claude-mpm/cache/agents/
179
+ # Deployed agents go to .claude/agents/
179
180
 
180
- # User-level agents
181
+ # User-level agents (deprecated in simplified architecture)
182
+ # Keeping for backward compatibility but not actively used
181
183
  user_path = self.path_manager.get_user_agents_dir()
182
184
  if user_path.exists():
183
185
  self.discovery_paths.append(user_path)
184
186
 
185
- # Also check for user JSON templates in ~/.claude-mpm/agents/
186
- local_user_path = Path.home() / ".claude-mpm" / "agents"
187
- if local_user_path.exists() and local_user_path not in self.discovery_paths:
188
- self.discovery_paths.append(local_user_path)
189
- logger.debug(f"Added local user templates path: {local_user_path}")
190
-
191
187
  # System-level agents (includes templates as a subdirectory)
192
188
  system_path = self.path_manager.get_system_agents_dir()
193
189
  if system_path.exists():
@@ -690,6 +686,111 @@ class UnifiedAgentRegistry:
690
686
  """Get all memory-aware agents."""
691
687
  return self.list_agents(agent_type=AgentType.MEMORY_AWARE)
692
688
 
689
+ def get_agents_by_collection(self, collection_id: str) -> List[AgentMetadata]:
690
+ """Get all agents from a specific collection.
691
+
692
+ NEW: Enables collection-based agent selection.
693
+
694
+ Args:
695
+ collection_id: Collection identifier (e.g., "bobmatnyc/claude-mpm-agents")
696
+
697
+ Returns:
698
+ List of agents from the specified collection
699
+
700
+ Example:
701
+ >>> registry = get_agent_registry()
702
+ >>> agents = registry.get_agents_by_collection("bobmatnyc/claude-mpm-agents")
703
+ >>> len(agents)
704
+ 45
705
+ """
706
+ if not self.registry:
707
+ self.discover_agents()
708
+
709
+ collection_agents = [
710
+ agent
711
+ for agent in self.registry.values()
712
+ if agent.collection_id == collection_id
713
+ ]
714
+
715
+ return sorted(collection_agents, key=lambda a: a.name)
716
+
717
+ def list_collections(self) -> List[Dict[str, Any]]:
718
+ """List all available collections with agent counts.
719
+
720
+ NEW: Provides overview of available collections.
721
+
722
+ Returns:
723
+ List of collection info dictionaries with:
724
+ - collection_id: Collection identifier
725
+ - agent_count: Number of agents in collection
726
+ - agents: List of agent names in collection
727
+
728
+ Example:
729
+ >>> registry = get_agent_registry()
730
+ >>> collections = registry.list_collections()
731
+ >>> collections
732
+ [
733
+ {
734
+ "collection_id": "bobmatnyc/claude-mpm-agents",
735
+ "agent_count": 45,
736
+ "agents": ["pm", "engineer", "qa", ...]
737
+ }
738
+ ]
739
+ """
740
+ if not self.registry:
741
+ self.discover_agents()
742
+
743
+ # Group agents by collection_id
744
+ collections_map: Dict[str, List[str]] = {}
745
+
746
+ for agent in self.registry.values():
747
+ if not agent.collection_id:
748
+ # Skip agents without collection (legacy or local)
749
+ continue
750
+
751
+ if agent.collection_id not in collections_map:
752
+ collections_map[agent.collection_id] = []
753
+
754
+ collections_map[agent.collection_id].append(agent.name)
755
+
756
+ # Convert to list format
757
+ collections = [
758
+ {
759
+ "collection_id": coll_id,
760
+ "agent_count": len(agent_names),
761
+ "agents": sorted(agent_names),
762
+ }
763
+ for coll_id, agent_names in collections_map.items()
764
+ ]
765
+
766
+ return sorted(collections, key=lambda c: c["collection_id"])
767
+
768
+ def get_agent_by_canonical_id(self, canonical_id: str) -> Optional[AgentMetadata]:
769
+ """Get agent by canonical ID (primary matching key).
770
+
771
+ NEW: Primary matching method using canonical_id.
772
+
773
+ Args:
774
+ canonical_id: Canonical identifier (e.g., "bobmatnyc/claude-mpm-agents:pm")
775
+
776
+ Returns:
777
+ AgentMetadata if found, None otherwise
778
+
779
+ Example:
780
+ >>> registry = get_agent_registry()
781
+ >>> agent = registry.get_agent_by_canonical_id("bobmatnyc/claude-mpm-agents:pm")
782
+ >>> agent.name
783
+ 'Project Manager Agent'
784
+ """
785
+ if not self.registry:
786
+ self.discover_agents()
787
+
788
+ for agent in self.registry.values():
789
+ if agent.canonical_id == canonical_id:
790
+ return agent
791
+
792
+ return None
793
+
693
794
  def add_discovery_path(self, path: Union[str, Path]) -> None:
694
795
  """Add a new path for agent discovery."""
695
796
  path = Path(path)
@@ -809,6 +910,21 @@ def get_registry_stats() -> Dict[str, Any]:
809
910
  return get_agent_registry().get_registry_stats()
810
911
 
811
912
 
913
+ def get_agents_by_collection(collection_id: str) -> List[AgentMetadata]:
914
+ """Get all agents from a specific collection."""
915
+ return get_agent_registry().get_agents_by_collection(collection_id)
916
+
917
+
918
+ def list_collections() -> List[Dict[str, Any]]:
919
+ """List all available collections."""
920
+ return get_agent_registry().list_collections()
921
+
922
+
923
+ def get_agent_by_canonical_id(canonical_id: str) -> Optional[AgentMetadata]:
924
+ """Get agent by canonical ID."""
925
+ return get_agent_registry().get_agent_by_canonical_id(canonical_id)
926
+
927
+
812
928
  # Legacy function names for backward compatibility
813
929
  def listAgents() -> List[str]:
814
930
  """Legacy function: Get list of agent names."""
@@ -838,14 +954,16 @@ __all__ = [
838
954
  "discover_agents",
839
955
  "discover_agents_sync",
840
956
  "get_agent",
957
+ "get_agent_by_canonical_id",
841
958
  "get_agent_names",
842
959
  "get_agent_registry",
960
+ "get_agents_by_collection",
843
961
  "get_core_agents",
844
962
  "get_project_agents",
845
963
  "get_registry_stats",
846
964
  "get_specialized_agents",
847
- # Legacy compatibility
848
965
  "listAgents",
849
966
  "list_agents",
850
967
  "list_agents_all",
968
+ "list_collections",
851
969
  ]