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
@@ -3,13 +3,16 @@ Auto-Configuration CLI Command for Claude MPM Framework
3
3
  ========================================================
4
4
 
5
5
  WHY: This module provides a user-friendly CLI interface for the auto-configuration
6
- feature, allowing users to automatically configure agents based on detected toolchain.
6
+ feature, allowing users to automatically configure BOTH agents AND skills based on
7
+ detected toolchain.
7
8
 
8
9
  DESIGN DECISION: Uses rich for beautiful terminal output, implements interactive
9
10
  confirmation, and provides comprehensive error handling. Supports both interactive
10
- and non-interactive modes for flexibility.
11
+ and non-interactive modes for flexibility. Orchestrates both agent auto-config
12
+ (via AutoConfigManagerService) and skill recommendations (via SkillsDeployer).
11
13
 
12
14
  Part of TSK-0054: Auto-Configuration Feature - Phase 5
15
+ Unified Auto-Configure: 1M-502 Phase 2
13
16
  """
14
17
 
15
18
  import json
@@ -18,7 +21,6 @@ from typing import Optional
18
21
 
19
22
  try:
20
23
  from rich.console import Console
21
- from rich.panel import Panel
22
24
  from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn
23
25
  from rich.table import Table
24
26
 
@@ -29,7 +31,6 @@ except ImportError:
29
31
  from ...core.enums import OperationResult
30
32
  from ...services.agents.auto_config_manager import AutoConfigManagerService
31
33
  from ...services.agents.observers import NullObserver
32
- from ...services.core.models.agent_config import ConfigurationResult
33
34
  from ..shared import BaseCommand, CommandResult
34
35
 
35
36
 
@@ -100,7 +101,11 @@ class AutoConfigureCommand(BaseCommand):
100
101
  Handle auto-configuration CLI commands.
101
102
 
102
103
  This command provides a user-friendly interface for automatically configuring
103
- agents based on detected project toolchain.
104
+ BOTH agents AND skills based on detected project toolchain.
105
+
106
+ Orchestrates:
107
+ 1. Agent auto-configuration (via AutoConfigManagerService)
108
+ 2. Skills recommendations and deployment (via SkillsDeployer + agent-skill mapping)
104
109
  """
105
110
 
106
111
  def __init__(self):
@@ -108,6 +113,7 @@ class AutoConfigureCommand(BaseCommand):
108
113
  super().__init__("auto-configure")
109
114
  self.console = Console() if RICH_AVAILABLE else None
110
115
  self._auto_config_manager = None
116
+ self._skills_deployer = None
111
117
 
112
118
  @property
113
119
  def auto_config_manager(self) -> AutoConfigManagerService:
@@ -140,6 +146,15 @@ class AutoConfigureCommand(BaseCommand):
140
146
 
141
147
  return self._auto_config_manager
142
148
 
149
+ @property
150
+ def skills_deployer(self):
151
+ """Get skills deployer instance (lazy loaded)."""
152
+ if self._skills_deployer is None:
153
+ from ...services.skills_deployer import SkillsDeployerService
154
+
155
+ self._skills_deployer = SkillsDeployerService()
156
+ return self._skills_deployer
157
+
143
158
  def validate_args(self, args) -> Optional[str]:
144
159
  """Validate command arguments."""
145
160
  # Validate project path
@@ -191,11 +206,26 @@ class AutoConfigureCommand(BaseCommand):
191
206
  skip_confirmation = args.yes if hasattr(args, "yes") and args.yes else False
192
207
  json_output = args.json if hasattr(args, "json") and args.json else False
193
208
 
209
+ # Determine what to configure (agents, skills, or both)
210
+ configure_agents = not getattr(args, "skills_only", False)
211
+ configure_skills = not getattr(args, "agents_only", False)
212
+
194
213
  # Run preview or full configuration
195
214
  if dry_run or args.preview if hasattr(args, "preview") else False:
196
- return self._run_preview(project_path, min_confidence, json_output)
215
+ return self._run_preview(
216
+ project_path,
217
+ min_confidence,
218
+ json_output,
219
+ configure_agents,
220
+ configure_skills,
221
+ )
197
222
  return self._run_full_configuration(
198
- project_path, min_confidence, skip_confirmation, json_output
223
+ project_path,
224
+ min_confidence,
225
+ skip_confirmation,
226
+ json_output,
227
+ configure_agents,
228
+ configure_skills,
199
229
  )
200
230
 
201
231
  except KeyboardInterrupt:
@@ -215,24 +245,61 @@ class AutoConfigureCommand(BaseCommand):
215
245
  return CommandResult.error_result(error_msg)
216
246
 
217
247
  def _run_preview(
218
- self, project_path: Path, min_confidence: float, json_output: bool
248
+ self,
249
+ project_path: Path,
250
+ min_confidence: float,
251
+ json_output: bool,
252
+ configure_agents: bool = True,
253
+ configure_skills: bool = True,
219
254
  ) -> CommandResult:
220
255
  """Run configuration preview without deploying."""
221
- # Show analysis spinner
222
- if self.console and not json_output:
223
- with self.console.status("[bold green]Analyzing project toolchain..."):
224
- preview = self.auto_config_manager.preview_configuration(
256
+ # Get agent preview
257
+ agent_preview = None
258
+ if configure_agents:
259
+ if self.console and not json_output:
260
+ with self.console.status("[bold green]Analyzing project toolchain..."):
261
+ agent_preview = self.auto_config_manager.preview_configuration(
262
+ project_path, min_confidence
263
+ )
264
+ else:
265
+ agent_preview = self.auto_config_manager.preview_configuration(
225
266
  project_path, min_confidence
226
267
  )
227
- else:
228
- preview = self.auto_config_manager.preview_configuration(
229
- project_path, min_confidence
230
- )
268
+
269
+ # Review existing project agents
270
+ agent_review_results = None
271
+ if configure_agents:
272
+ if self.console and not json_output:
273
+ with self.console.status("[bold green]Reviewing existing agents..."):
274
+ agent_review_results = self._review_project_agents(agent_preview)
275
+ else:
276
+ agent_review_results = self._review_project_agents(agent_preview)
277
+
278
+ # Get skills recommendations
279
+ skills_recommendations = None
280
+ if configure_skills:
281
+ if self.console and not json_output:
282
+ with self.console.status("[bold green]Analyzing skill requirements..."):
283
+ skills_recommendations = self._recommend_skills(agent_preview)
284
+ else:
285
+ skills_recommendations = self._recommend_skills(agent_preview)
231
286
 
232
287
  # Output results
233
288
  if json_output:
234
- return self._output_preview_json(preview)
235
- return self._display_preview(preview)
289
+ return self._output_preview_json(
290
+ agent_preview,
291
+ skills_recommendations,
292
+ configure_agents,
293
+ configure_skills,
294
+ agent_review_results,
295
+ )
296
+ return self._display_preview(
297
+ agent_preview,
298
+ skills_recommendations,
299
+ configure_agents,
300
+ configure_skills,
301
+ agent_review_results,
302
+ )
236
303
 
237
304
  def _run_full_configuration(
238
305
  self,
@@ -240,147 +307,281 @@ class AutoConfigureCommand(BaseCommand):
240
307
  min_confidence: float,
241
308
  skip_confirmation: bool,
242
309
  json_output: bool,
310
+ configure_agents: bool = True,
311
+ configure_skills: bool = True,
243
312
  ) -> CommandResult:
244
313
  """Run full auto-configuration with deployment."""
245
- # Get preview first
246
- if self.console and not json_output:
247
- with self.console.status("[bold green]Analyzing project toolchain..."):
248
- preview = self.auto_config_manager.preview_configuration(
314
+ # Get agent preview
315
+ agent_preview = None
316
+ if configure_agents:
317
+ if self.console and not json_output:
318
+ with self.console.status("[bold green]Analyzing project toolchain..."):
319
+ agent_preview = self.auto_config_manager.preview_configuration(
320
+ project_path, min_confidence
321
+ )
322
+ else:
323
+ agent_preview = self.auto_config_manager.preview_configuration(
249
324
  project_path, min_confidence
250
325
  )
251
- else:
252
- preview = self.auto_config_manager.preview_configuration(
253
- project_path, min_confidence
254
- )
326
+
327
+ # Review existing project agents
328
+ agent_review_results = None
329
+ if configure_agents:
330
+ if self.console and not json_output:
331
+ with self.console.status("[bold green]Reviewing existing agents..."):
332
+ agent_review_results = self._review_project_agents(agent_preview)
333
+ else:
334
+ agent_review_results = self._review_project_agents(agent_preview)
335
+
336
+ # Get skills recommendations
337
+ skills_recommendations = None
338
+ if configure_skills:
339
+ if self.console and not json_output:
340
+ with self.console.status("[bold green]Analyzing skill requirements..."):
341
+ skills_recommendations = self._recommend_skills(agent_preview)
342
+ else:
343
+ skills_recommendations = self._recommend_skills(agent_preview)
255
344
 
256
345
  # Display preview (unless JSON output)
257
346
  if not json_output:
258
- self._display_preview(preview)
347
+ self._display_preview(
348
+ agent_preview,
349
+ skills_recommendations,
350
+ configure_agents,
351
+ configure_skills,
352
+ agent_review_results,
353
+ )
259
354
 
260
355
  # Ask for confirmation (unless skipped)
261
356
  if not skip_confirmation and not json_output:
262
- if not self._confirm_deployment(preview):
357
+ if not self._confirm_deployment(
358
+ agent_preview,
359
+ skills_recommendations,
360
+ configure_agents,
361
+ configure_skills,
362
+ agent_review_results,
363
+ ):
263
364
  if self.console:
264
365
  self.console.print("\nāŒ Operation cancelled by user")
265
366
  else:
266
367
  print("\nOperation cancelled by user")
267
368
  return CommandResult.error_result("Operation cancelled", exit_code=0)
268
369
 
269
- # Execute configuration
270
- import asyncio
271
-
272
- observer = RichProgressObserver(self.console) if self.console else None
273
- result = asyncio.run(
274
- self.auto_config_manager.auto_configure(
275
- project_path,
276
- confirmation_required=False, # Already confirmed above
277
- dry_run=False,
278
- min_confidence=min_confidence,
279
- observer=observer,
370
+ # Archive unused agents (before deploying new ones)
371
+ archive_result = None
372
+ if configure_agents and agent_review_results:
373
+ agents_to_archive = agent_review_results.get("unused", [])
374
+ if agents_to_archive:
375
+ if self.console and not json_output:
376
+ self.console.print(
377
+ "\n[bold yellow]Archiving unused agents...[/bold yellow]\n"
378
+ )
379
+ archive_result = self._archive_agents(agents_to_archive)
380
+
381
+ # Execute agent configuration
382
+ agent_result = None
383
+ if configure_agents and agent_preview:
384
+ import asyncio
385
+
386
+ observer = RichProgressObserver(self.console) if self.console else None
387
+ agent_result = asyncio.run(
388
+ self.auto_config_manager.auto_configure(
389
+ project_path,
390
+ confirmation_required=False, # Already confirmed above
391
+ dry_run=False,
392
+ min_confidence=min_confidence,
393
+ observer=observer,
394
+ )
280
395
  )
281
- )
396
+
397
+ # Deploy skills
398
+ skills_result = None
399
+ if configure_skills and skills_recommendations:
400
+ if self.console and not json_output:
401
+ self.console.print("\n[bold cyan]Deploying skills...[/bold cyan]\n")
402
+ skills_result = self._deploy_skills(skills_recommendations)
282
403
 
283
404
  # Output results
284
405
  if json_output:
285
- return self._output_result_json(result)
286
- return self._display_result(result)
406
+ return self._output_result_json(agent_result, skills_result, archive_result)
407
+ return self._display_result(agent_result, skills_result, archive_result)
287
408
 
288
- def _display_preview(self, preview) -> CommandResult:
409
+ def _display_preview(
410
+ self,
411
+ agent_preview,
412
+ skills_recommendations=None,
413
+ configure_agents=True,
414
+ configure_skills=True,
415
+ agent_review_results=None,
416
+ ) -> CommandResult:
289
417
  """Display configuration preview with Rich formatting."""
290
418
  if not self.console:
291
419
  # Fallback to plain text
292
- return self._display_preview_plain(preview)
420
+ return self._display_preview_plain(
421
+ agent_preview,
422
+ skills_recommendations,
423
+ configure_agents,
424
+ configure_skills,
425
+ agent_review_results,
426
+ )
293
427
 
294
- # Display detected toolchain
295
- self.console.print("\nšŸ“Š Detected Toolchain:", style="bold blue")
296
- if preview.detected_toolchain and preview.detected_toolchain.components:
297
- toolchain_table = Table(show_header=True, header_style="bold")
298
- toolchain_table.add_column("Component", style="cyan")
299
- toolchain_table.add_column("Version", style="yellow")
300
- toolchain_table.add_column("Confidence", style="green")
301
-
302
- for component in preview.detected_toolchain.components:
303
- confidence_pct = int(component.confidence * 100)
304
- bar = "ā–ˆ" * (confidence_pct // 10) + "ā–‘" * (10 - confidence_pct // 10)
305
- confidence_str = f"{bar} {confidence_pct}%"
306
-
307
- toolchain_table.add_row(
308
- (
309
- component.type.value
310
- if hasattr(component.type, "value")
311
- else str(component.type)
312
- ),
313
- component.version or "Unknown",
314
- confidence_str,
315
- )
428
+ # Only show toolchain and agents if configuring agents
429
+ if not configure_agents:
430
+ agent_preview = None
316
431
 
317
- self.console.print(toolchain_table)
318
- else:
319
- self.console.print(" No toolchain detected", style="yellow")
320
-
321
- # Display recommended agents
322
- self.console.print("\nšŸ¤– Recommended Agents:", style="bold blue")
323
- if preview.recommendations:
324
- for rec in preview.recommendations:
325
- confidence_pct = int(rec.confidence * 100)
326
- icon = "āœ“" if rec.confidence >= 0.8 else "ā—‹"
327
- self.console.print(
328
- f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
329
- )
330
- self.console.print(f" Reason: {rec.reasoning}", style="dim")
331
- else:
332
- self.console.print(" No agents recommended", style="yellow")
333
-
334
- # Display validation issues
335
- if preview.validation_result and preview.validation_result.issues:
336
- self.console.print("\nāš ļø Validation Issues:", style="bold yellow")
337
- for issue in preview.validation_result.issues:
338
- severity_icon = {"error": "āŒ", "warning": "āš ļø", "info": "ā„¹ļø"}.get(
339
- (
340
- issue.severity.value
341
- if hasattr(issue.severity, "value")
342
- else str(issue.severity)
343
- ),
344
- "•",
345
- )
346
- self.console.print(f" {severity_icon} {issue.message}", style="yellow")
432
+ # Display detected toolchain
433
+ if configure_agents and agent_preview:
434
+ self.console.print("\nšŸ“Š Detected Toolchain:", style="bold blue")
435
+ if (
436
+ agent_preview.detected_toolchain
437
+ and agent_preview.detected_toolchain.components
438
+ ):
439
+ toolchain_table = Table(show_header=True, header_style="bold")
440
+ toolchain_table.add_column("Component", style="cyan")
441
+ toolchain_table.add_column("Version", style="yellow")
442
+ toolchain_table.add_column("Confidence", style="green")
443
+
444
+ for component in agent_preview.detected_toolchain.components:
445
+ confidence_pct = int(component.confidence * 100)
446
+ bar = "ā–ˆ" * (confidence_pct // 10) + "ā–‘" * (
447
+ 10 - confidence_pct // 10
448
+ )
449
+ confidence_str = f"{bar} {confidence_pct}%"
450
+
451
+ toolchain_table.add_row(
452
+ (
453
+ component.type.value
454
+ if hasattr(component.type, "value")
455
+ else str(component.type)
456
+ ),
457
+ component.version or "Unknown",
458
+ confidence_str,
459
+ )
460
+
461
+ self.console.print(toolchain_table)
462
+ else:
463
+ self.console.print(" No toolchain detected", style="yellow")
464
+
465
+ # Display recommended agents
466
+ self.console.print("\nšŸ¤– Recommended Agents:", style="bold blue")
467
+ if agent_preview.recommendations:
468
+ for rec in agent_preview.recommendations:
469
+ confidence_pct = int(rec.confidence * 100)
470
+ icon = "āœ“" if rec.confidence >= 0.8 else "ā—‹"
471
+ self.console.print(
472
+ f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
473
+ )
474
+ self.console.print(f" Reason: {rec.reasoning}", style="dim")
475
+ else:
476
+ self.console.print(" No agents recommended", style="yellow")
477
+
478
+ # Display validation issues
479
+ if (
480
+ agent_preview.validation_result
481
+ and agent_preview.validation_result.issues
482
+ ):
483
+ self.console.print("\nāš ļø Validation Issues:", style="bold yellow")
484
+ for issue in agent_preview.validation_result.issues:
485
+ severity_icon = {"error": "āŒ", "warning": "āš ļø", "info": "ā„¹ļø"}.get(
486
+ (
487
+ issue.severity.value
488
+ if hasattr(issue.severity, "value")
489
+ else str(issue.severity)
490
+ ),
491
+ "•",
492
+ )
493
+ self.console.print(
494
+ f" {severity_icon} {issue.message}", style="yellow"
495
+ )
496
+
497
+ # Display agent review results
498
+ if configure_agents and agent_review_results:
499
+ self._display_agent_review(agent_review_results)
500
+
501
+ # Display recommended skills
502
+ if configure_skills and skills_recommendations:
503
+ self.console.print("\nšŸŽÆ Recommended Skills:", style="bold blue")
504
+ for skill in skills_recommendations:
505
+ self.console.print(f" āœ“ [bold]{skill}[/bold]")
347
506
 
348
507
  return CommandResult.success_result()
349
508
 
350
- def _display_preview_plain(self, preview) -> CommandResult:
509
+ def _display_preview_plain(
510
+ self,
511
+ agent_preview,
512
+ skills_recommendations=None,
513
+ configure_agents=True,
514
+ configure_skills=True,
515
+ agent_review_results=None,
516
+ ) -> CommandResult:
351
517
  """Display preview in plain text (fallback when Rich not available)."""
352
- print("\nDetected Toolchain:")
353
- if preview.detected_toolchain and preview.detected_toolchain.components:
354
- for component in preview.detected_toolchain.components:
355
- confidence_pct = int(component.confidence * 100)
356
- print(f" - {component.type}: {component.version} ({confidence_pct}%)")
357
- else:
358
- print(" No toolchain detected")
359
-
360
- print("\nRecommended Agents:")
361
- if preview.recommendations:
362
- for rec in preview.recommendations:
363
- confidence_pct = int(rec.confidence * 100)
364
- print(f" - {rec.agent_id} ({confidence_pct}%)")
365
- print(f" Reason: {rec.reasoning}")
366
- else:
367
- print(" No agents recommended")
518
+ if configure_agents and agent_preview:
519
+ print("\nDetected Toolchain:")
520
+ if (
521
+ agent_preview.detected_toolchain
522
+ and agent_preview.detected_toolchain.components
523
+ ):
524
+ for component in agent_preview.detected_toolchain.components:
525
+ confidence_pct = int(component.confidence * 100)
526
+ print(
527
+ f" - {component.type}: {component.version} ({confidence_pct}%)"
528
+ )
529
+ else:
530
+ print(" No toolchain detected")
531
+
532
+ print("\nRecommended Agents:")
533
+ if agent_preview.recommendations:
534
+ for rec in agent_preview.recommendations:
535
+ confidence_pct = int(rec.confidence * 100)
536
+ print(f" - {rec.agent_id} ({confidence_pct}%)")
537
+ print(f" Reason: {rec.reasoning}")
538
+ else:
539
+ print(" No agents recommended")
540
+
541
+ if (
542
+ agent_preview.validation_result
543
+ and agent_preview.validation_result.issues
544
+ ):
545
+ print("\nValidation Issues:")
546
+ for issue in agent_preview.validation_result.issues:
547
+ print(f" - {issue.severity}: {issue.message}")
368
548
 
369
- if preview.validation_result and preview.validation_result.issues:
370
- print("\nValidation Issues:")
371
- for issue in preview.validation_result.issues:
372
- print(f" - {issue.severity}: {issue.message}")
549
+ if configure_skills and skills_recommendations:
550
+ print("\nRecommended Skills:")
551
+ for skill in skills_recommendations:
552
+ print(f" - {skill}")
373
553
 
374
554
  return CommandResult.success_result()
375
555
 
376
- def _confirm_deployment(self, preview) -> bool:
556
+ def _confirm_deployment(
557
+ self,
558
+ agent_preview,
559
+ skills_recommendations=None,
560
+ configure_agents=True,
561
+ configure_skills=True,
562
+ agent_review_results=None,
563
+ ) -> bool:
377
564
  """Ask user to confirm deployment."""
378
- if not preview.recommendations:
565
+ has_agents = (
566
+ configure_agents and agent_preview and agent_preview.recommendations
567
+ )
568
+ has_skills = configure_skills and skills_recommendations
569
+
570
+ if not has_agents and not has_skills:
379
571
  return False
380
572
 
573
+ # Build confirmation message
574
+ items = []
575
+ if has_agents:
576
+ items.append(f"{len(agent_preview.recommendations)} agent(s)")
577
+ if has_skills:
578
+ items.append(f"{len(skills_recommendations)} skill(s)")
579
+
580
+ message = f"Deploy {' and '.join(items)}?"
581
+
381
582
  if self.console:
382
583
  self.console.print("\n" + "=" * 60)
383
- self.console.print("Deploy these agents?", style="bold yellow")
584
+ self.console.print(message, style="bold yellow")
384
585
  self.console.print("=" * 60)
385
586
  response = (
386
587
  self.console.input("\n[bold]Proceed? (y/n/s for select):[/bold] ")
@@ -389,7 +590,7 @@ class AutoConfigureCommand(BaseCommand):
389
590
  )
390
591
  else:
391
592
  print("\n" + "=" * 60)
392
- print("Deploy these agents?")
593
+ print(message)
393
594
  print("=" * 60)
394
595
  response = input("\nProceed? (y/n/s for select): ").strip().lower()
395
596
 
@@ -407,160 +608,446 @@ class AutoConfigureCommand(BaseCommand):
407
608
  return False
408
609
  return False
409
610
 
410
- def _display_result(self, result: ConfigurationResult) -> CommandResult:
611
+ def _display_result(
612
+ self,
613
+ agent_result: Optional = None,
614
+ skills_result: Optional[dict] = None,
615
+ archive_result: Optional[dict] = None,
616
+ ) -> CommandResult:
411
617
  """Display configuration result."""
412
618
  if not self.console:
413
- return self._display_result_plain(result)
414
-
415
- # Display summary
416
- if result.status == OperationResult.SUCCESS:
417
- panel = Panel(
418
- f"āœ… Auto-configuration completed successfully!\n\n"
419
- f"Deployed {len(result.deployed_agents)} agent(s)",
420
- title="Success",
421
- border_style="green",
619
+ return self._display_result_plain(
620
+ agent_result, skills_result, archive_result
422
621
  )
423
- self.console.print(panel)
424
622
 
623
+ # Determine overall success
624
+ agent_success = (
625
+ (agent_result and agent_result.status == OperationResult.SUCCESS)
626
+ if agent_result
627
+ else True
628
+ )
629
+ skills_success = not skills_result or (
630
+ skills_result and not skills_result.get("errors")
631
+ )
632
+ archive_success = not archive_result or not archive_result.get("errors")
633
+ overall_success = agent_success and skills_success and archive_success
634
+
635
+ # Display summary
636
+ if overall_success:
425
637
  # Show deployed agents
426
- if result.deployed_agents:
638
+ if agent_result and agent_result.deployed_agents:
427
639
  self.console.print("\nšŸ“¦ Deployed Agents:", style="bold green")
428
- for agent_id in result.deployed_agents:
640
+ for agent_id in agent_result.deployed_agents:
429
641
  self.console.print(f" āœ“ {agent_id}")
430
642
 
643
+ # Show deployed skills
644
+ if skills_result and skills_result.get("deployed"):
645
+ self.console.print("\nšŸŽÆ Deployed Skills:", style="bold green")
646
+ for skill in skills_result["deployed"]:
647
+ self.console.print(f" āœ“ {skill}")
648
+
649
+ # Show archived agents
650
+ if archive_result and archive_result.get("archived"):
651
+ self.console.print("\nšŸ“ Archived Agents:", style="bold yellow")
652
+ for archived in archive_result["archived"]:
653
+ self.console.print(f" → {archived['name']}")
654
+
655
+ # Show restart notification
656
+ self._show_restart_notification(agent_result, skills_result, archive_result)
657
+
431
658
  return CommandResult.success_result()
432
659
 
433
- if result.status == OperationResult.WARNING:
434
- panel = Panel(
435
- f"āš ļø Auto-configuration partially completed\n\n"
436
- f"Deployed: {len(result.deployed_agents)}\n"
437
- f"Failed: {len(result.failed_agents)}",
438
- title="Partial Success",
439
- border_style="yellow",
440
- )
441
- self.console.print(panel)
660
+ # Partial or complete failure
661
+ has_errors = False
662
+ if agent_result and agent_result.status in [
663
+ OperationResult.WARNING,
664
+ OperationResult.FAILED,
665
+ ]:
666
+ has_errors = True
442
667
 
443
- if result.failed_agents:
668
+ if agent_result.status == OperationResult.WARNING:
669
+ self.console.print(
670
+ "\nāš ļø Agent configuration partially completed", style="yellow"
671
+ )
672
+ else:
673
+ self.console.print("\nāŒ Agent configuration failed", style="red")
674
+
675
+ if agent_result.failed_agents:
444
676
  self.console.print("\nāŒ Failed Agents:", style="bold red")
445
- for agent_id in result.failed_agents:
446
- error = result.errors.get(agent_id, "Unknown error")
677
+ for agent_id in agent_result.failed_agents:
678
+ error = agent_result.errors.get(agent_id, "Unknown error")
447
679
  self.console.print(f" āœ— {agent_id}: {error}")
448
680
 
449
- return CommandResult.error_result("Partial configuration", exit_code=1)
450
-
451
- panel = Panel(
452
- f"āŒ Auto-configuration failed\n\n{result.errors.get('general', 'Unknown error')}",
453
- title="Error",
454
- border_style="red",
681
+ if skills_result and skills_result.get("errors"):
682
+ has_errors = True
683
+ self.console.print("\nāŒ Skill deployment failed", style="red")
684
+ for error in skills_result["errors"]:
685
+ self.console.print(f" āœ— {error}")
686
+
687
+ return (
688
+ CommandResult.error_result(
689
+ "Configuration partially succeeded"
690
+ if (agent_success or skills_success)
691
+ else "Configuration failed",
692
+ exit_code=1,
693
+ )
694
+ if has_errors
695
+ else CommandResult.success_result()
455
696
  )
456
- self.console.print(panel)
457
-
458
- return CommandResult.error_result("Configuration failed", exit_code=1)
459
697
 
460
- def _display_result_plain(self, result: ConfigurationResult) -> CommandResult:
698
+ def _display_result_plain(
699
+ self,
700
+ agent_result: Optional = None,
701
+ skills_result: Optional[dict] = None,
702
+ archive_result: Optional[dict] = None,
703
+ ) -> CommandResult:
461
704
  """Display result in plain text (fallback)."""
462
- if result.status == OperationResult.SUCCESS:
705
+ # Determine overall success
706
+ agent_success = (
707
+ (agent_result and agent_result.status == OperationResult.SUCCESS)
708
+ if agent_result
709
+ else True
710
+ )
711
+ skills_success = not skills_result or not skills_result.get("errors")
712
+ overall_success = agent_success and skills_success
713
+
714
+ if overall_success:
463
715
  print("\nāœ… Auto-configuration completed successfully!")
464
- print(f"Deployed {len(result.deployed_agents)} agent(s)")
465
716
 
466
- if result.deployed_agents:
717
+ if agent_result and agent_result.deployed_agents:
718
+ print(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
467
719
  print("\nDeployed Agents:")
468
- for agent_id in result.deployed_agents:
720
+ for agent_id in agent_result.deployed_agents:
469
721
  print(f" - {agent_id}")
470
722
 
723
+ if skills_result and skills_result.get("deployed"):
724
+ print(f"\nDeployed {len(skills_result['deployed'])} skill(s)")
725
+ print("\nDeployed Skills:")
726
+ for skill in skills_result["deployed"]:
727
+ print(f" - {skill}")
728
+
471
729
  return CommandResult.success_result()
472
730
 
473
- if result.status == OperationResult.WARNING:
474
- print("\nāš ļø Auto-configuration partially completed")
475
- print(f"Deployed: {len(result.deployed_agents)}")
476
- print(f"Failed: {len(result.failed_agents)}")
731
+ # Partial or complete failure
732
+ has_errors = False
733
+ if agent_result and agent_result.status in [
734
+ OperationResult.WARNING,
735
+ OperationResult.FAILED,
736
+ ]:
737
+ has_errors = True
738
+ print(
739
+ "\nāš ļø Agent configuration partially completed"
740
+ if agent_result.status == OperationResult.WARNING
741
+ else "\nāŒ Agent configuration failed"
742
+ )
477
743
 
478
- if result.failed_agents:
744
+ if agent_result.failed_agents:
479
745
  print("\nFailed Agents:")
480
- for agent_id in result.failed_agents:
481
- error = result.errors.get(agent_id, "Unknown error")
746
+ for agent_id in agent_result.failed_agents:
747
+ error = agent_result.errors.get(agent_id, "Unknown error")
482
748
  print(f" - {agent_id}: {error}")
483
749
 
484
- return CommandResult.error_result("Partial configuration", exit_code=1)
485
-
486
- print("\nāŒ Auto-configuration failed")
487
- print(result.errors.get("general", "Unknown error"))
488
-
489
- return CommandResult.error_result("Configuration failed", exit_code=1)
750
+ if skills_result and skills_result.get("errors"):
751
+ has_errors = True
752
+ print("\nāŒ Skill deployment failed")
753
+ for error in skills_result["errors"]:
754
+ print(f" - {error}")
755
+
756
+ return (
757
+ CommandResult.error_result(
758
+ "Configuration partially succeeded"
759
+ if (agent_success or skills_success)
760
+ else "Configuration failed",
761
+ exit_code=1,
762
+ )
763
+ if has_errors
764
+ else CommandResult.success_result()
765
+ )
490
766
 
491
- def _output_preview_json(self, preview) -> CommandResult:
767
+ def _output_preview_json(
768
+ self,
769
+ agent_preview,
770
+ skills_recommendations=None,
771
+ configure_agents=True,
772
+ configure_skills=True,
773
+ agent_review_results=None,
774
+ ) -> CommandResult:
492
775
  """Output preview as JSON."""
493
- output = {
494
- "detected_toolchain": {
495
- "components": (
496
- [
497
- {
498
- "type": (
499
- c.type.value
500
- if hasattr(c.type, "value")
501
- else str(c.type)
502
- ),
503
- "version": c.version,
504
- "confidence": c.confidence,
505
- }
506
- for c in preview.detected_toolchain.components
507
- ]
508
- if preview.detected_toolchain
509
- else []
510
- )
511
- },
512
- "recommendations": [
513
- {
514
- "agent_id": r.agent_id,
515
- "confidence": r.confidence,
516
- "reasoning": r.reasoning,
517
- }
518
- for r in preview.recommendations
519
- ],
520
- "validation": {
521
- "is_valid": (
522
- preview.validation_result.is_valid
523
- if preview.validation_result
524
- else True
525
- ),
526
- "issues": (
527
- [
528
- {
529
- "severity": (
530
- i.severity.value
531
- if hasattr(i.severity, "value")
532
- else str(i.severity)
533
- ),
534
- "message": i.message,
535
- }
536
- for i in preview.validation_result.issues
537
- ]
538
- if preview.validation_result
539
- else []
540
- ),
541
- },
542
- }
776
+ output = {}
777
+
778
+ if configure_agents and agent_preview:
779
+ output["agents"] = {
780
+ "detected_toolchain": {
781
+ "components": (
782
+ [
783
+ {
784
+ "type": (
785
+ c.type.value
786
+ if hasattr(c.type, "value")
787
+ else str(c.type)
788
+ ),
789
+ "version": c.version,
790
+ "confidence": c.confidence,
791
+ }
792
+ for c in agent_preview.detected_toolchain.components
793
+ ]
794
+ if agent_preview.detected_toolchain
795
+ else []
796
+ )
797
+ },
798
+ "recommendations": [
799
+ {
800
+ "agent_id": r.agent_id,
801
+ "confidence": r.confidence,
802
+ "reasoning": r.reasoning,
803
+ }
804
+ for r in agent_preview.recommendations
805
+ ],
806
+ "validation": {
807
+ "is_valid": (
808
+ agent_preview.validation_result.is_valid
809
+ if agent_preview.validation_result
810
+ else True
811
+ ),
812
+ "issues": (
813
+ [
814
+ {
815
+ "severity": (
816
+ i.severity.value
817
+ if hasattr(i.severity, "value")
818
+ else str(i.severity)
819
+ ),
820
+ "message": i.message,
821
+ }
822
+ for i in agent_preview.validation_result.issues
823
+ ]
824
+ if agent_preview.validation_result
825
+ else []
826
+ ),
827
+ },
828
+ }
829
+
830
+ if configure_skills and skills_recommendations:
831
+ output["skills"] = {
832
+ "recommendations": skills_recommendations,
833
+ }
543
834
 
544
835
  print(json.dumps(output, indent=2))
545
836
  return CommandResult.success_result(data=output)
546
837
 
547
- def _output_result_json(self, result: ConfigurationResult) -> CommandResult:
838
+ def _output_result_json(
839
+ self,
840
+ agent_result: Optional = None,
841
+ skills_result: Optional[dict] = None,
842
+ archive_result: Optional[dict] = None,
843
+ ) -> CommandResult:
548
844
  """Output result as JSON."""
549
- output = {
550
- "status": (
551
- result.status.value
552
- if hasattr(result.status, "value")
553
- else str(result.status)
554
- ),
555
- "deployed_agents": result.deployed_agents,
556
- "failed_agents": result.failed_agents,
557
- "errors": result.errors,
558
- }
845
+ output = {}
846
+
847
+ if agent_result:
848
+ output["agents"] = {
849
+ "status": (
850
+ agent_result.status.value
851
+ if hasattr(agent_result.status, "value")
852
+ else str(agent_result.status)
853
+ ),
854
+ "deployed_agents": agent_result.deployed_agents,
855
+ "failed_agents": agent_result.failed_agents,
856
+ "errors": agent_result.errors,
857
+ }
858
+
859
+ if skills_result:
860
+ output["skills"] = skills_result
559
861
 
560
862
  print(json.dumps(output, indent=2))
561
863
 
562
- if result.status == OperationResult.SUCCESS:
864
+ # Determine overall success
865
+ agent_success = (
866
+ agent_result.status == OperationResult.SUCCESS if agent_result else True
867
+ )
868
+ skills_success = not skills_result or not skills_result.get("errors")
869
+ overall_success = agent_success and skills_success
870
+
871
+ if overall_success:
563
872
  return CommandResult.success_result(data=output)
564
873
  return CommandResult.error_result(
565
874
  "Configuration failed or partial", exit_code=1, data=output
566
875
  )
876
+
877
+ def _recommend_skills(self, agent_preview):
878
+ """Recommend skills based on deployed/recommended agents.
879
+
880
+ Args:
881
+ agent_preview: Agent preview result with recommendations
882
+
883
+ Returns:
884
+ List of recommended skill names, or None if no agents recommended
885
+ """
886
+ if not agent_preview or not agent_preview.recommendations:
887
+ return None
888
+
889
+ # Import agent-skill mapping
890
+ from ...cli.interactive.skills_wizard import AGENT_SKILL_MAPPING
891
+
892
+ # Collect recommended skills based on agent types
893
+ recommended_skills = set()
894
+ for rec in agent_preview.recommendations:
895
+ agent_id = rec.agent_id
896
+ # Map agent ID to skill recommendations
897
+ if agent_id in AGENT_SKILL_MAPPING:
898
+ recommended_skills.update(AGENT_SKILL_MAPPING[agent_id])
899
+
900
+ return list(recommended_skills) if recommended_skills else None
901
+
902
+ def _deploy_skills(self, recommended_skills: list[str]) -> dict:
903
+ """Deploy recommended skills.
904
+
905
+ Args:
906
+ recommended_skills: List of skill names to deploy
907
+
908
+ Returns:
909
+ Dict with deployment results: {"deployed": [...], "errors": [...]}
910
+ """
911
+ try:
912
+ return self.skills_deployer.deploy_skills(
913
+ skill_names=recommended_skills, force=False
914
+ )
915
+ except Exception as e:
916
+ self.logger.error(f"Failed to deploy skills: {e}")
917
+ return {"deployed": [], "errors": [str(e)]}
918
+
919
+ def _review_project_agents(self, agent_preview) -> Optional[dict]:
920
+ """Review existing project agents and categorize them.
921
+
922
+ Args:
923
+ agent_preview: Agent preview result with recommendations
924
+
925
+ Returns:
926
+ Dictionary with categorized agents or None if no preview
927
+ """
928
+ if not agent_preview:
929
+ return None
930
+
931
+ from ...services.agents.agent_review_service import AgentReviewService
932
+ from ...services.agents.deployment.remote_agent_discovery_service import (
933
+ RemoteAgentDiscoveryService,
934
+ )
935
+
936
+ # Get managed agents from cache
937
+ agents_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
938
+ if not agents_cache_dir.exists():
939
+ self.logger.debug("No agents cache found")
940
+ return None
941
+
942
+ # Discover managed agents
943
+ discovery_service = RemoteAgentDiscoveryService(agents_cache_dir)
944
+ managed_agents = discovery_service.discover_remote_agents()
945
+
946
+ if not managed_agents:
947
+ self.logger.debug("No managed agents found in cache")
948
+ return None
949
+
950
+ # Get recommended agent IDs
951
+ recommended_ids = set()
952
+ if agent_preview.recommendations:
953
+ recommended_ids = {rec.agent_id for rec in agent_preview.recommendations}
954
+
955
+ # Review project agents
956
+ project_agents_dir = Path.cwd() / ".claude" / "agents"
957
+ review_service = AgentReviewService()
958
+ return review_service.review_project_agents(
959
+ project_agents_dir, managed_agents, recommended_ids
960
+ )
961
+
962
+ def _archive_agents(self, agents_to_archive: list[dict]) -> dict:
963
+ """Archive unused agents by moving them to .claude/agents/unused/.
964
+
965
+ Args:
966
+ agents_to_archive: List of agent dicts to archive
967
+
968
+ Returns:
969
+ Dictionary with archival results
970
+ """
971
+ from ...services.agents.agent_review_service import AgentReviewService
972
+
973
+ project_agents_dir = Path.cwd() / ".claude" / "agents"
974
+ review_service = AgentReviewService()
975
+ return review_service.archive_agents(agents_to_archive, project_agents_dir)
976
+
977
+ def _display_agent_review(self, review_results: dict) -> None:
978
+ """Display agent review results in the preview.
979
+
980
+ Args:
981
+ review_results: Dictionary with categorized agents
982
+ """
983
+ if not self.console:
984
+ return
985
+
986
+ # Count agents to archive
987
+ unused_count = len(review_results.get("unused", []))
988
+ outdated_count = len(review_results.get("outdated", []))
989
+ custom_count = len(review_results.get("custom", []))
990
+
991
+ if unused_count > 0 or outdated_count > 0 or custom_count > 0:
992
+ self.console.print("\nšŸ“‹ Existing Agents Review:", style="bold blue")
993
+
994
+ # Show custom agents (will be preserved)
995
+ if custom_count > 0:
996
+ self.console.print(
997
+ "\n [green]Custom agents (will be preserved):[/green]"
998
+ )
999
+ for agent in review_results["custom"]:
1000
+ self.console.print(f" āœ“ {agent['name']} (v{agent['version']})")
1001
+
1002
+ # Show agents to be archived
1003
+ if unused_count > 0:
1004
+ self.console.print(
1005
+ "\n [yellow]Agents to archive (not needed for this toolchain):[/yellow]"
1006
+ )
1007
+ for agent in review_results["unused"]:
1008
+ reason = (
1009
+ f"outdated (v{agent['current_version']} → v{agent['available_version']})"
1010
+ if "current_version" in agent
1011
+ else "not recommended"
1012
+ )
1013
+ self.console.print(f" → {agent['name']} ({reason})")
1014
+ self.console.print(
1015
+ " [dim]Will be moved to .claude/agents/unused/[/dim]"
1016
+ )
1017
+
1018
+ def _show_restart_notification(
1019
+ self, agent_result=None, skills_result=None, archive_result=None
1020
+ ) -> None:
1021
+ """Show restart notification after configuration is complete.
1022
+
1023
+ Args:
1024
+ agent_result: Agent deployment results
1025
+ skills_result: Skills deployment results
1026
+ archive_result: Agent archival results
1027
+ """
1028
+ if not self.console:
1029
+ return
1030
+
1031
+ # Build summary of changes
1032
+ changes = []
1033
+ if agent_result and agent_result.deployed_agents:
1034
+ changes.append(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
1035
+ if skills_result and skills_result.get("deployed"):
1036
+ changes.append(f"Deployed {len(skills_result['deployed'])} skill(s)")
1037
+ if archive_result and archive_result.get("archived"):
1038
+ changes.append(
1039
+ f"Archived {len(archive_result['archived'])} unused agent(s) to .claude/agents/unused/"
1040
+ )
1041
+
1042
+ if changes:
1043
+ self.console.print("\n" + "=" * 70)
1044
+ self.console.print("āœ… [bold green]Configuration complete![/bold green]")
1045
+ self.console.print(
1046
+ "\nšŸ”„ [bold yellow]Please restart Claude Code to apply changes:[/bold yellow]"
1047
+ )
1048
+ self.console.print(" - Quit Claude Code completely")
1049
+ self.console.print(" - Relaunch Claude Code")
1050
+ self.console.print("\n[bold]Changes applied:[/bold]")
1051
+ for change in changes:
1052
+ self.console.print(f" • {change}")
1053
+ self.console.print("=" * 70 + "\n")