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
@@ -18,7 +18,7 @@ ARCHITECTURE:
18
18
  """
19
19
 
20
20
  import os
21
- import subprocess
21
+ import subprocess # nosec B404
22
22
  from typing import Optional
23
23
 
24
24
  from rich.console import Console
@@ -84,6 +84,7 @@ class SkillsManagementCommand(BaseCommand):
84
84
  SkillsCommands.INFO.value: self._show_skill_info,
85
85
  SkillsCommands.CONFIG.value: self._manage_config,
86
86
  SkillsCommands.CONFIGURE.value: self._configure_skills,
87
+ SkillsCommands.SELECT.value: self._select_skills_interactive,
87
88
  # GitHub deployment commands
88
89
  SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
89
90
  SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
@@ -504,7 +505,7 @@ class SkillsManagementCommand(BaseCommand):
504
505
  # Open in editor
505
506
  editor = os.environ.get("EDITOR", "nano")
506
507
  try:
507
- subprocess.run([editor, str(config_path)], check=True)
508
+ subprocess.run([editor, str(config_path)], check=True) # nosec B603
508
509
  console.print(
509
510
  f"\n[green]Configuration saved to {config_path}[/green]\n"
510
511
  )
@@ -537,7 +538,7 @@ class SkillsManagementCommand(BaseCommand):
537
538
  toolchain = getattr(args, "toolchain", None)
538
539
  categories = getattr(args, "categories", None)
539
540
  force = getattr(args, "force", False)
540
- all_skills = getattr(args, "all", False)
541
+ deploy_all = getattr(args, "all", False)
541
542
 
542
543
  if collection:
543
544
  console.print(
@@ -548,23 +549,30 @@ class SkillsManagementCommand(BaseCommand):
548
549
  "\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
549
550
  )
550
551
 
551
- # Auto-detect toolchain if not specified and not deploying all
552
- if not toolchain and not all_skills:
553
- console.print(
554
- "[yellow]No toolchain specified. Use --toolchain to filter by language,[/yellow]"
555
- )
556
- console.print(
557
- "[yellow]or --all to deploy all available skills.[/yellow]\n"
558
- )
559
-
552
+ # Use selective deployment unless --all flag is provided
553
+ # Selective mode deploys only agent-referenced skills
554
+ # --all mode deploys all available skills from the collection
560
555
  result = self.skills_deployer.deploy_skills(
561
556
  collection=collection,
562
557
  toolchain=toolchain,
563
558
  categories=categories,
564
559
  force=force,
560
+ selective=not deploy_all,
565
561
  )
566
562
 
567
563
  # Display results
564
+ # Show selective mode summary
565
+ if result.get("selective_mode"):
566
+ total_available = result.get("total_available", 0)
567
+ deployed_count = result["deployed_count"]
568
+ console.print(
569
+ f"[cyan]📌 Selective deployment: {deployed_count} agent-referenced skills "
570
+ f"(out of {total_available} available)[/cyan]"
571
+ )
572
+ console.print(
573
+ "[dim]Use 'claude-mpm skills configure' to manually select skills[/dim]\n"
574
+ )
575
+
568
576
  if result["deployed_count"] > 0:
569
577
  console.print(
570
578
  f"[green]✓ Deployed {result['deployed_count']} skill(s):[/green]"
@@ -587,6 +595,16 @@ class SkillsManagementCommand(BaseCommand):
587
595
  console.print(f" • {error}")
588
596
  console.print()
589
597
 
598
+ # Show cleanup results
599
+ cleanup = result.get("cleanup", {})
600
+ if cleanup.get("removed_count", 0) > 0:
601
+ console.print(
602
+ f"[yellow]🧹 Removed {cleanup['removed_count']} orphaned skill(s):[/yellow]"
603
+ )
604
+ for skill in cleanup.get("removed_skills", []):
605
+ console.print(f" • {skill}")
606
+ console.print()
607
+
590
608
  # Show restart instructions
591
609
  if result["restart_instructions"]:
592
610
  console.print(
@@ -658,33 +676,91 @@ class SkillsManagementCommand(BaseCommand):
658
676
  def _check_deployed_skills(self, args) -> CommandResult:
659
677
  """Check currently deployed skills in ~/.claude/skills/."""
660
678
  try:
661
- result = self.skills_deployer.check_deployed_skills()
679
+ # Get deployed skills
680
+ deployed_result = self.skills_deployer.check_deployed_skills()
681
+ deployed_names = {skill["name"] for skill in deployed_result["skills"]}
662
682
 
663
683
  console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
664
- console.print(f"[dim]Directory: {result['claude_skills_dir']}[/dim]\n")
684
+ console.print(
685
+ f"[dim]Directory: {deployed_result['claude_skills_dir']}[/dim]\n"
686
+ )
687
+
688
+ # Fetch available skills from GitHub to get full list
689
+ try:
690
+ available_result = self.skills_deployer.list_available_skills()
691
+ all_skills = available_result.get("skills", [])
692
+ except Exception as e:
693
+ console.print(
694
+ f"[yellow]Warning: Could not fetch available skills: {e}[/yellow]\n"
695
+ )
696
+ all_skills = []
697
+
698
+ # Combine deployed and available skills
699
+ skill_map = {}
700
+
701
+ # Add available skills
702
+ for skill in all_skills:
703
+ skill_name = skill.get("name", "")
704
+ if skill_name:
705
+ skill_map[skill_name] = {
706
+ "name": skill.get("display_name")
707
+ or skill_name.replace("-", " ").title(),
708
+ "skill_id": skill_name,
709
+ "source": "MPM Skills",
710
+ "is_deployed": skill_name in deployed_names,
711
+ }
665
712
 
666
- if result["deployed_count"] == 0:
667
- console.print("[yellow]No skills currently deployed.[/yellow]")
713
+ # Add any deployed skills not in available list (local/custom skills)
714
+ for skill in deployed_result["skills"]:
715
+ skill_name = skill["name"]
716
+ if skill_name not in skill_map:
717
+ skill_map[skill_name] = {
718
+ "name": skill_name.replace("-", " ").title(),
719
+ "skill_id": skill_name,
720
+ "source": "Local",
721
+ "is_deployed": True,
722
+ }
723
+
724
+ if not skill_map:
725
+ console.print("[yellow]No skills available.[/yellow]")
668
726
  console.print(
669
727
  "[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
670
728
  )
671
729
  return CommandResult(success=True, exit_code=0)
672
730
 
673
- console.print(
674
- f"[green]{result['deployed_count']} skill(s) deployed:[/green]\n"
731
+ # Create table matching agent management format
732
+ table = Table(show_header=True, header_style="bold cyan")
733
+ table.add_column("#", style="bright_black", width=6, no_wrap=True)
734
+ table.add_column(
735
+ "Skill ID", style="bright_black", no_wrap=True, overflow="ellipsis"
675
736
  )
737
+ table.add_column(
738
+ "Name", style="bright_cyan", no_wrap=True, overflow="ellipsis"
739
+ )
740
+ table.add_column("Source", style="bright_yellow", no_wrap=True)
741
+ table.add_column("Status", style="bright_black", no_wrap=True)
676
742
 
677
- # Create table for deployed skills
678
- table = Table(show_header=True, header_style="bold cyan")
679
- table.add_column("Skill Name", style="green")
680
- table.add_column("Path", style="dim")
743
+ # Sort skills by name for consistent display
744
+ sorted_skills = sorted(skill_map.values(), key=lambda s: s["skill_id"])
681
745
 
682
- for skill in sorted(result["skills"], key=lambda s: s["name"]):
683
- table.add_row(skill["name"], skill["path"])
746
+ for idx, skill in enumerate(sorted_skills, 1):
747
+ status = (
748
+ "[green]Installed[/green]" if skill["is_deployed"] else "Available"
749
+ )
750
+ table.add_row(
751
+ str(idx), skill["skill_id"], skill["name"], skill["source"], status
752
+ )
684
753
 
685
754
  console.print(table)
686
755
  console.print()
687
756
 
757
+ # Show summary
758
+ deployed_count = sum(1 for s in skill_map.values() if s["is_deployed"])
759
+ console.print(
760
+ f"[dim]Showing {len(skill_map)} skills ({deployed_count} installed, "
761
+ f"{len(skill_map) - deployed_count} available)[/dim]\n"
762
+ )
763
+
688
764
  return CommandResult(success=True, exit_code=0)
689
765
 
690
766
  except Exception as e:
@@ -953,23 +1029,37 @@ class SkillsManagementCommand(BaseCommand):
953
1029
  console.print(f"[red]Unexpected error: {e}[/red]")
954
1030
 
955
1031
  def _configure_skills(self, args) -> CommandResult:
956
- """Interactive skills configuration with checkbox selection.
1032
+ """Interactive skills configuration using configuration.yaml.
957
1033
 
958
1034
  Provides checkbox-based selection interface matching agents configure UX:
959
- - Status column showing Installed/Available
960
- - Pre-selection for installed skills
961
- - Apply/Adjust/Cancel menu
962
- - While loop for adjustment
963
- - Simplified labels (checkbox state only)
964
-
965
- This is Option 3 (Hybrid approach): Separate command for interactive mode
966
- while keeping deploy-github for CLI automation.
1035
+ - Shows current mode (user_defined vs agent_referenced)
1036
+ - If agent mode: shows agent-scanned skills
1037
+ - Allows switching to user_defined mode and selecting skills
1038
+ - Can reset to agent mode (clears user_defined)
1039
+ - Saves selections to configuration.yaml
1040
+
1041
+ Configuration structure:
1042
+ ```yaml
1043
+ skills:
1044
+ agent_referenced: # Auto-populated from agent scan (read-only)
1045
+ - systematic-debugging
1046
+ - typescript-core
1047
+ user_defined: # User override - if set, ONLY these are deployed
1048
+ [] # Empty = use agent_referenced
1049
+ ```
967
1050
  """
968
1051
  try:
1052
+ from pathlib import Path
1053
+
969
1054
  import questionary
1055
+ import yaml
970
1056
  from questionary import Choice, Style
971
1057
  from rich.prompt import Prompt
972
1058
 
1059
+ from ...services.skills.selective_skill_deployer import (
1060
+ get_skills_to_deploy,
1061
+ )
1062
+
973
1063
  # Questionary style (matching agents configure)
974
1064
  QUESTIONARY_STYLE = Style(
975
1065
  [
@@ -994,213 +1084,298 @@ class SkillsManagementCommand(BaseCommand):
994
1084
  ]
995
1085
  )
996
1086
 
997
- console.print("\n[bold cyan]Interactive Skills Configuration[/bold cyan]\n")
1087
+ console.print("\n[bold cyan]Skills Configuration Manager[/bold cyan]\n")
1088
+
1089
+ # Load current configuration
1090
+ project_config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
1091
+ skills_to_deploy, current_mode = get_skills_to_deploy(project_config_path)
1092
+
1093
+ # Display current mode and skill count
1094
+ console.print(f"[bold]Current Mode:[/bold] [cyan]{current_mode}[/cyan]")
998
1095
  console.print(
999
- "[dim]Select skills to install/uninstall using checkboxes[/dim]"
1096
+ f"[bold]Active Skills:[/bold] {len(skills_to_deploy)} skills\n"
1000
1097
  )
1001
- console.print("[dim]● = Installed, ○ = Available[/dim]\n")
1002
1098
 
1003
- # Get deployed skills for status detection
1004
- deployed_result = self.skills_deployer.check_deployed_skills()
1005
- deployed_skills = {
1006
- skill["name"] for skill in deployed_result.get("skills", [])
1007
- }
1099
+ if current_mode == "agent_referenced":
1100
+ console.print(
1101
+ "[dim]Agent mode: Skills are auto-detected from deployed agents[/dim]"
1102
+ )
1103
+ console.print(
1104
+ "[dim]Switch to user mode to manually select skills[/dim]\n"
1105
+ )
1106
+ else:
1107
+ console.print(
1108
+ "[dim]User mode: You've manually selected which skills to deploy[/dim]"
1109
+ )
1110
+ console.print("[dim]Reset to agent mode to use auto-detection[/dim]\n")
1111
+
1112
+ # Offer mode switching
1113
+ action_choices = [
1114
+ Choice("View current skills", value="view"),
1115
+ Choice("Switch to user mode (manual selection)", value="switch_user"),
1116
+ Choice("Reset to agent mode (auto-detection)", value="reset_agent"),
1117
+ Choice("Cancel", value="cancel"),
1118
+ ]
1119
+
1120
+ action = questionary.select(
1121
+ "What would you like to do?",
1122
+ choices=action_choices,
1123
+ style=QUESTIONARY_STYLE,
1124
+ ).ask()
1125
+
1126
+ if action == "cancel" or action is None:
1127
+ console.print("[yellow]Configuration cancelled[/yellow]")
1128
+ return CommandResult(success=True, exit_code=0)
1008
1129
 
1009
- # Get available skills from GitHub
1010
- console.print("[dim]Fetching available skills from GitHub...[/dim]\n")
1011
- available_result = self.skills_deployer.list_available_skills()
1130
+ if action == "view":
1131
+ # Display current skills
1132
+ console.print("\n[bold]Current Skills:[/bold]\n")
1133
+ for skill in sorted(skills_to_deploy):
1134
+ console.print(f" • {skill}")
1135
+ console.print()
1136
+ Prompt.ask("\nPress Enter to continue")
1137
+ return CommandResult(success=True, exit_code=0)
1012
1138
 
1013
- if available_result.get("error"):
1014
- console.print(f"[red]Error: {available_result['error']}[/red]")
1015
- return CommandResult(
1016
- success=False, message=available_result["error"], exit_code=1
1139
+ if action == "reset_agent":
1140
+ # Reset to agent mode by clearing user_defined
1141
+ with open(project_config_path, encoding="utf-8") as f:
1142
+ config = yaml.safe_load(f) or {}
1143
+
1144
+ if "skills" not in config:
1145
+ config["skills"] = {}
1146
+
1147
+ config["skills"]["user_defined"] = []
1148
+
1149
+ with open(project_config_path, "w", encoding="utf-8") as f:
1150
+ yaml.dump(config, f, default_flow_style=False, sort_keys=False)
1151
+
1152
+ console.print(
1153
+ "\n[green]✓ Reset to agent mode - skills will be auto-detected from agents[/green]\n"
1017
1154
  )
1155
+ Prompt.ask("\nPress Enter to continue")
1156
+ return CommandResult(success=True, exit_code=0)
1018
1157
 
1019
- # Flatten skills by category
1020
- all_skills = []
1021
- for category, skills in available_result.get("by_category", {}).items():
1022
- for skill in skills:
1023
- skill_info = {
1024
- "name": skill.get("name", "unknown"),
1025
- "category": category,
1026
- "is_deployed": skill.get("name", "unknown") in deployed_skills,
1027
- }
1028
- all_skills.append(skill_info)
1158
+ # Switch to user mode - manual skill selection
1159
+ if action == "switch_user":
1160
+ console.print(
1161
+ "\n[bold cyan]Switching to User Mode - Manual Skill Selection[/bold cyan]\n"
1162
+ )
1163
+ console.print("[dim]Fetching available skills from GitHub...[/dim]\n")
1029
1164
 
1030
- # Sort by deployed status (deployed first), then by name
1031
- all_skills.sort(key=lambda s: (not s["is_deployed"], s["name"]))
1165
+ # Get available skills
1166
+ available_result = self.skills_deployer.list_available_skills()
1032
1167
 
1033
- # Build checkbox choices with pre-selection
1034
- # Loop to allow adjusting selection
1035
- while True:
1036
- skill_choices = []
1037
- skill_map = {} # For lookup after selection
1168
+ if available_result.get("error"):
1169
+ console.print(f"[red]Error: {available_result['error']}[/red]")
1170
+ return CommandResult(
1171
+ success=False, message=available_result["error"], exit_code=1
1172
+ )
1038
1173
 
1039
- for skill in all_skills:
1040
- skill_name = skill["name"]
1041
- category = skill["category"]
1042
- is_deployed = skill["is_deployed"]
1174
+ # Flatten skills by category
1175
+ all_skills = []
1176
+ for category, skills in available_result.get("by_category", {}).items():
1177
+ for skill in skills:
1178
+ skill_name = skill.get("name", "unknown")
1179
+ is_currently_selected = skill_name in skills_to_deploy
1180
+ skill_info = {
1181
+ "name": skill_name,
1182
+ "category": category,
1183
+ "is_selected": is_currently_selected,
1184
+ }
1185
+ all_skills.append(skill_info)
1186
+
1187
+ # Sort by selection status (selected first), then by name
1188
+ all_skills.sort(key=lambda s: (not s["is_selected"], s["name"]))
1189
+
1190
+ # Build checkbox choices
1191
+ while True:
1192
+ skill_choices = []
1193
+
1194
+ for skill in all_skills:
1195
+ skill_name = skill["name"]
1196
+ category = skill["category"]
1197
+ is_selected = skill["is_selected"]
1198
+
1199
+ # Format: "skill-name (category)"
1200
+ choice_text = f"{skill_name} ({category})"
1201
+
1202
+ # Pre-select if currently in skills_to_deploy
1203
+ choice = Choice(
1204
+ title=choice_text, value=skill_name, checked=is_selected
1205
+ )
1043
1206
 
1044
- # Simple format: "skill-name (category)"
1045
- # Checkbox state (checked/unchecked) indicates installed status
1046
- choice_text = f"{skill_name} ({category})"
1207
+ skill_choices.append(choice)
1208
+
1209
+ # Display checkbox selection
1210
+ selected_skills = questionary.checkbox(
1211
+ "Select skills (Space to toggle, Enter to confirm):",
1212
+ choices=skill_choices,
1213
+ style=QUESTIONARY_STYLE,
1214
+ ).ask()
1215
+
1216
+ if selected_skills is None:
1217
+ # User cancelled (Ctrl+C)
1218
+ console.print("[yellow]Skills configuration cancelled[/yellow]")
1219
+ return CommandResult(success=True, exit_code=0)
1220
+
1221
+ # Show summary
1222
+ console.print("\n[bold]Selected Skills:[/bold]")
1223
+ console.print(f" {len(selected_skills)} skills selected\n")
1224
+
1225
+ if selected_skills:
1226
+ for skill in sorted(selected_skills):
1227
+ console.print(f" • {skill}")
1228
+ console.print()
1229
+
1230
+ # Ask user to confirm, adjust, or cancel
1231
+ confirm_action = questionary.select(
1232
+ "\nWhat would you like to do?",
1233
+ choices=[
1234
+ Choice("Save to configuration", value="apply"),
1235
+ Choice("Adjust selection", value="adjust"),
1236
+ Choice("Cancel", value="cancel"),
1237
+ ],
1238
+ default="apply",
1239
+ style=QUESTIONARY_STYLE,
1240
+ ).ask()
1241
+
1242
+ if confirm_action == "cancel":
1243
+ console.print("[yellow]Configuration cancelled[/yellow]")
1244
+ Prompt.ask("\nPress Enter to continue")
1245
+ return CommandResult(success=True, exit_code=0)
1246
+
1247
+ if confirm_action == "adjust":
1248
+ # Update selection state and loop back
1249
+ for skill in all_skills:
1250
+ skill["is_selected"] = skill["name"] in selected_skills
1251
+ console.print("\n[dim]Adjusting selection...[/dim]\n")
1252
+ continue
1253
+
1254
+ # Save to configuration.yaml
1255
+ with open(project_config_path, encoding="utf-8") as f:
1256
+ config = yaml.safe_load(f) or {}
1257
+
1258
+ if "skills" not in config:
1259
+ config["skills"] = {}
1260
+
1261
+ config["skills"]["user_defined"] = sorted(selected_skills)
1262
+
1263
+ with open(project_config_path, "w", encoding="utf-8") as f:
1264
+ yaml.dump(config, f, default_flow_style=False, sort_keys=False)
1047
1265
 
1048
- # Pre-select if deployed
1049
- choice = Choice(
1050
- title=choice_text, value=skill_name, checked=is_deployed
1266
+ console.print(
1267
+ f"\n[green]✓ Saved {len(selected_skills)} skills to user_defined mode[/green]"
1268
+ )
1269
+ console.print(
1270
+ "[yellow]⚠️ Important:[/yellow] Run [cyan]claude-mpm init[/cyan] to deploy these skills\n"
1051
1271
  )
1272
+ Prompt.ask("\nPress Enter to continue")
1052
1273
 
1053
- skill_choices.append(choice)
1054
- skill_map[skill_name] = skill
1274
+ # Exit the loop after successful save
1275
+ break
1055
1276
 
1056
- # Display checkbox selection
1057
- selected_skills = questionary.checkbox(
1058
- "Select skills (Space to toggle, Enter to confirm):",
1059
- choices=skill_choices,
1060
- style=QUESTIONARY_STYLE,
1061
- ).ask()
1277
+ return CommandResult(success=True, exit_code=0)
1062
1278
 
1063
- if selected_skills is None:
1064
- # User cancelled (Ctrl+C)
1065
- console.print("[yellow]Skills configuration cancelled[/yellow]")
1066
- return CommandResult(success=True, exit_code=0)
1279
+ except Exception as e:
1280
+ console.print(f"[red]Error in skills configuration: {e}[/red]")
1281
+ import traceback
1282
+
1283
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
1284
+ return CommandResult(success=False, message=str(e), exit_code=1)
1067
1285
 
1068
- # Determine changes
1069
- to_install = []
1070
- to_remove = []
1286
+ def _select_skills_interactive(self, args) -> CommandResult:
1287
+ """Interactive skill selection with topic grouping.
1071
1288
 
1072
- for skill in all_skills:
1073
- skill_name = skill["name"]
1074
- is_deployed = skill["is_deployed"]
1075
- is_selected = skill_name in selected_skills
1289
+ This command provides a two-tier selection interface:
1290
+ 1. Select topic groups (toolchains) to explore
1291
+ 2. Multi-select skills within each topic group
1076
1292
 
1077
- if is_selected and not is_deployed:
1078
- to_install.append(skill_name)
1079
- elif not is_selected and is_deployed:
1080
- to_remove.append(skill_name)
1293
+ Features:
1294
+ - Groups skills by toolchain (universal, python, typescript, etc.)
1295
+ - Shows skills auto-included by agent dependencies
1296
+ - Displays token counts for each skill
1297
+ - Updates config and runs reconciliation
1081
1298
 
1082
- # Show summary of changes
1083
- console.print("\n[bold]Changes to apply:[/bold]")
1084
- if to_install:
1085
- console.print(
1086
- f"\n[green]✓ Install ({len(to_install)} skills):[/green]"
1087
- )
1088
- for skill in to_install:
1089
- console.print(f" • {skill}")
1299
+ Returns:
1300
+ CommandResult with success/failure status
1301
+ """
1302
+ try:
1303
+ from ...cli.interactive.skill_selector import run_skill_selector
1304
+ from ...core.unified_config import UnifiedConfig
1305
+ from ...services.agents.deployment.deployment_reconciler import (
1306
+ DeploymentReconciler,
1307
+ )
1090
1308
 
1091
- if to_remove:
1309
+ console.print("\n[bold cyan]Interactive Skill Selector[/bold cyan]\n")
1310
+
1311
+ # Run skill selector
1312
+ selected_skills = run_skill_selector()
1313
+
1314
+ if selected_skills is None:
1315
+ console.print("\n[yellow]Skill selection cancelled[/yellow]")
1316
+ return CommandResult(success=True, exit_code=0)
1317
+
1318
+ # Update config with selected skills
1319
+ config = UnifiedConfig()
1320
+ config.skills.enabled = selected_skills
1321
+
1322
+ # Save config
1323
+ try:
1324
+ config.save()
1325
+ console.print(
1326
+ f"\n[green]✓ Saved {len(selected_skills)} skills to configuration[/green]"
1327
+ )
1328
+ except Exception as e:
1329
+ console.print(f"\n[red]Failed to save configuration: {e}[/red]")
1330
+ return CommandResult(success=False, message=str(e), exit_code=1)
1331
+
1332
+ # Run reconciliation to deploy skills
1333
+ console.print("\n[cyan]Running skill reconciliation...[/cyan]")
1334
+ reconciler = DeploymentReconciler(config)
1335
+
1336
+ try:
1337
+ from pathlib import Path
1338
+
1339
+ project_path = Path.cwd()
1340
+ result = reconciler.reconcile_skills(project_path)
1341
+
1342
+ if result.deployed:
1092
1343
  console.print(
1093
- f"\n[yellow] Remove ({len(to_remove)} skills):[/yellow]"
1344
+ f" [green] Deployed: {', '.join(result.deployed)}[/green]"
1094
1345
  )
1095
- for skill in to_remove:
1096
- console.print(f" • {skill}")
1097
-
1098
- if not to_install and not to_remove:
1346
+ if result.removed:
1099
1347
  console.print(
1100
- "\n[dim]No changes (selection matches current deployment)[/dim]"
1348
+ f" [yellow] Removed: {', '.join(result.removed)}[/yellow]"
1101
1349
  )
1350
+ if result.errors:
1351
+ for error in result.errors:
1352
+ console.print(f" [red]✗ {error}[/red]")
1102
1353
 
1103
- console.print()
1104
-
1105
- # Ask user to confirm, adjust, or cancel
1106
- action = questionary.select(
1107
- "\nWhat would you like to do?",
1108
- choices=[
1109
- Choice("Apply these changes", value="apply"),
1110
- Choice("Adjust selection", value="adjust"),
1111
- Choice("Cancel", value="cancel"),
1112
- ],
1113
- default="apply",
1114
- style=QUESTIONARY_STYLE,
1115
- ).ask()
1116
-
1117
- if action == "cancel":
1118
- console.print("[yellow]Changes cancelled[/yellow]")
1119
- Prompt.ask("\nPress Enter to continue")
1120
- return CommandResult(success=True, exit_code=0)
1121
- if action == "adjust":
1122
- # Loop back to skill selection
1123
- console.print("\n[dim]Adjusting selection...[/dim]\n")
1124
- continue
1125
-
1126
- # Apply changes
1127
- success = True
1128
- errors = []
1129
-
1130
- # Install skills
1131
- if to_install:
1132
- console.print("\n[bold cyan]Installing skills...[/bold cyan]\n")
1133
- for skill_name in to_install:
1134
- try:
1135
- # Deploy single skill
1136
- result = self.skills_deployer.deploy_skills(
1137
- skill_names=[skill_name], force=False
1138
- )
1139
-
1140
- if result.get("errors"):
1141
- errors.extend(result["errors"])
1142
- success = False
1143
- else:
1144
- console.print(
1145
- f"[green]✓ Installed: {skill_name}[/green]"
1146
- )
1147
- except Exception as e:
1148
- errors.append(f"Failed to install {skill_name}: {e}")
1149
- success = False
1150
-
1151
- # Remove skills
1152
- if to_remove:
1153
- console.print("\n[bold yellow]Removing skills...[/bold yellow]\n")
1154
- for skill_name in to_remove:
1155
- try:
1156
- # Remove single skill
1157
- result = self.skills_deployer.remove_skills(
1158
- skill_names=[skill_name]
1159
- )
1160
-
1161
- if result.get("errors"):
1162
- errors.extend(result["errors"])
1163
- success = False
1164
- else:
1165
- console.print(
1166
- f"[yellow]✗ Removed: {skill_name}[/yellow]"
1167
- )
1168
- except Exception as e:
1169
- errors.append(f"Failed to remove {skill_name}: {e}")
1170
- success = False
1171
-
1172
- # Show errors if any
1173
- if errors:
1174
- console.print(f"\n[red]✗ {len(errors)} error(s):[/red]")
1175
- for error in errors:
1176
- console.print(f" • {error}")
1177
-
1178
- # Show restart instructions
1179
- if success and (to_install or to_remove):
1354
+ if result.success:
1180
1355
  console.print(
1181
- "\n[bold green]✓ Changes applied successfully![/bold green]"
1356
+ "\n[bold green]✓ Skill deployment complete![/bold green]"
1182
1357
  )
1183
- console.print("\n[yellow]⚠️ Important:[/yellow]")
1184
- console.print(" Restart Claude Code for changes to take effect")
1185
-
1186
- console.print()
1187
- Prompt.ask("\nPress Enter to continue")
1188
-
1189
- # Exit the loop after successful execution
1190
- break
1358
+ return CommandResult(success=True, exit_code=0)
1359
+ console.print(
1360
+ f"\n[yellow]⚠ Deployment had {len(result.errors)} errors[/yellow]"
1361
+ )
1362
+ return CommandResult(
1363
+ success=False,
1364
+ message=f"{len(result.errors)} deployment errors",
1365
+ exit_code=1,
1366
+ )
1191
1367
 
1192
- exit_code = 0 if success else 1
1193
- return CommandResult(success=success, exit_code=exit_code)
1368
+ except Exception as e:
1369
+ console.print(f"\n[red]Reconciliation failed: {e}[/red]")
1370
+ return CommandResult(success=False, message=str(e), exit_code=1)
1194
1371
 
1195
1372
  except Exception as e:
1196
- console.print(f"[red]Error in skills configuration: {e}[/red]")
1373
+ console.print(f"[red]Skill selection error: {e}[/red]")
1197
1374
  import traceback
1198
1375
 
1199
1376
  console.print(f"[dim]{traceback.format_exc()}[/dim]")
1200
1377
  return CommandResult(success=False, message=str(e), exit_code=1)
1201
1378
 
1202
- return CommandResult(success=False, message=str(e), exit_code=1)
1203
-
1204
1379
 
1205
1380
  def manage_skills(args) -> int:
1206
1381
  """