claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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.
Files changed (1062) hide show
  1. claude_mpm/BUILD_NUMBER +1 -0
  2. claude_mpm/VERSION +1 -0
  3. claude_mpm/__init__.py +50 -12
  4. claude_mpm/__main__.py +7 -2
  5. claude_mpm/agents/BASE_AGENT.md +164 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  8. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
  9. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  10. claude_mpm/agents/MEMORY.md +72 -0
  11. claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
  12. claude_mpm/agents/WORKFLOW.md +111 -0
  13. claude_mpm/agents/__init__.py +92 -80
  14. claude_mpm/agents/agent-template.yaml +83 -0
  15. claude_mpm/agents/agent_loader.py +560 -745
  16. claude_mpm/agents/agent_loader_integration.py +53 -55
  17. claude_mpm/agents/agents_metadata.py +186 -27
  18. claude_mpm/agents/async_agent_loader.py +436 -0
  19. claude_mpm/agents/base_agent.json +8 -4
  20. claude_mpm/agents/frontmatter_validator.py +754 -0
  21. claude_mpm/agents/system_agent_config.py +222 -155
  22. claude_mpm/agents/templates/README.md +465 -0
  23. claude_mpm/agents/templates/__init__.py +17 -13
  24. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  25. claude_mpm/agents/templates/context-management-examples.md +544 -0
  26. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  27. claude_mpm/agents/templates/pm-examples.md +474 -0
  28. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  29. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  30. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  31. claude_mpm/agents/templates/response-format.md +583 -0
  32. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  33. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  34. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  35. claude_mpm/agents/templates/validation-templates.md +312 -0
  36. claude_mpm/cli/__init__.py +94 -128
  37. claude_mpm/cli/__main__.py +33 -0
  38. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  39. claude_mpm/cli/commands/__init__.py +36 -12
  40. claude_mpm/cli/commands/agent_manager.py +1403 -0
  41. claude_mpm/cli/commands/agent_source.py +774 -0
  42. claude_mpm/cli/commands/agent_state_manager.py +335 -0
  43. claude_mpm/cli/commands/agents.py +2501 -168
  44. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  47. claude_mpm/cli/commands/aggregate.py +540 -0
  48. claude_mpm/cli/commands/analyze.py +553 -0
  49. claude_mpm/cli/commands/analyze_code.py +528 -0
  50. claude_mpm/cli/commands/auto_configure.py +1053 -0
  51. claude_mpm/cli/commands/cleanup.py +588 -0
  52. claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
  53. claude_mpm/cli/commands/config.py +586 -0
  54. claude_mpm/cli/commands/configure.py +3253 -0
  55. claude_mpm/cli/commands/configure_agent_display.py +282 -0
  56. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  57. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  58. claude_mpm/cli/commands/configure_models.py +18 -0
  59. claude_mpm/cli/commands/configure_navigation.py +184 -0
  60. claude_mpm/cli/commands/configure_paths.py +104 -0
  61. claude_mpm/cli/commands/configure_persistence.py +254 -0
  62. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  63. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  64. claude_mpm/cli/commands/configure_validators.py +73 -0
  65. claude_mpm/cli/commands/dashboard.py +286 -0
  66. claude_mpm/cli/commands/debug.py +1386 -0
  67. claude_mpm/cli/commands/doctor.py +243 -0
  68. claude_mpm/cli/commands/hook_errors.py +277 -0
  69. claude_mpm/cli/commands/info.py +195 -74
  70. claude_mpm/cli/commands/local_deploy.py +534 -0
  71. claude_mpm/cli/commands/mcp.py +205 -0
  72. claude_mpm/cli/commands/mcp_command_router.py +161 -0
  73. claude_mpm/cli/commands/mcp_config.py +154 -0
  74. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  75. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  76. claude_mpm/cli/commands/mcp_install_commands.py +346 -0
  77. claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
  78. claude_mpm/cli/commands/mcp_server_commands.py +155 -0
  79. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  80. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  81. claude_mpm/cli/commands/memory.py +585 -846
  82. claude_mpm/cli/commands/monitor.py +228 -310
  83. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  84. claude_mpm/cli/commands/mpm_init/core.py +759 -0
  85. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  86. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  87. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  88. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  89. claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
  90. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  91. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  92. claude_mpm/cli/commands/postmortem.py +401 -0
  93. claude_mpm/cli/commands/profile.py +276 -0
  94. claude_mpm/cli/commands/run.py +910 -488
  95. claude_mpm/cli/commands/search.py +458 -0
  96. claude_mpm/cli/commands/skill_source.py +694 -0
  97. claude_mpm/cli/commands/skills.py +1398 -0
  98. claude_mpm/cli/commands/summarize.py +413 -0
  99. claude_mpm/cli/commands/tickets.py +536 -53
  100. claude_mpm/cli/commands/uninstall.py +176 -0
  101. claude_mpm/cli/commands/upgrade.py +152 -0
  102. claude_mpm/cli/commands/verify.py +119 -0
  103. claude_mpm/cli/executor.py +298 -0
  104. claude_mpm/cli/helpers.py +105 -0
  105. claude_mpm/cli/interactive/__init__.py +31 -0
  106. claude_mpm/cli/interactive/agent_wizard.py +1927 -0
  107. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  108. claude_mpm/cli/interactive/skill_selector.py +481 -0
  109. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  110. claude_mpm/cli/parser.py +87 -563
  111. claude_mpm/cli/parsers/__init__.py +35 -0
  112. claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
  113. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  114. claude_mpm/cli/parsers/agents_parser.py +575 -0
  115. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  116. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  117. claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
  118. claude_mpm/cli/parsers/base_parser.py +649 -0
  119. claude_mpm/cli/parsers/config_parser.py +208 -0
  120. claude_mpm/cli/parsers/configure_parser.py +138 -0
  121. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  122. claude_mpm/cli/parsers/debug_parser.py +319 -0
  123. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  124. claude_mpm/cli/parsers/mcp_parser.py +195 -0
  125. claude_mpm/cli/parsers/memory_parser.py +138 -0
  126. claude_mpm/cli/parsers/monitor_parser.py +142 -0
  127. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  128. claude_mpm/cli/parsers/profile_parser.py +147 -0
  129. claude_mpm/cli/parsers/run_parser.py +157 -0
  130. claude_mpm/cli/parsers/search_parser.py +245 -0
  131. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  132. claude_mpm/cli/parsers/skills_parser.py +277 -0
  133. claude_mpm/cli/parsers/source_parser.py +138 -0
  134. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  135. claude_mpm/cli/shared/__init__.py +40 -0
  136. claude_mpm/cli/shared/argument_patterns.py +205 -0
  137. claude_mpm/cli/shared/base_command.py +242 -0
  138. claude_mpm/cli/shared/error_handling.py +242 -0
  139. claude_mpm/cli/shared/output_formatters.py +241 -0
  140. claude_mpm/cli/startup.py +1578 -0
  141. claude_mpm/cli/startup_display.py +480 -0
  142. claude_mpm/cli/startup_logging.py +839 -0
  143. claude_mpm/cli/utils.py +136 -47
  144. claude_mpm/cli_module/__init__.py +6 -6
  145. claude_mpm/cli_module/args.py +188 -140
  146. claude_mpm/cli_module/commands.py +79 -70
  147. claude_mpm/cli_module/migration_example.py +42 -64
  148. claude_mpm/commands/__init__.py +14 -0
  149. claude_mpm/commands/mpm-config.md +28 -0
  150. claude_mpm/commands/mpm-doctor.md +20 -0
  151. claude_mpm/commands/mpm-help.md +20 -0
  152. claude_mpm/commands/mpm-init.md +120 -0
  153. claude_mpm/commands/mpm-monitor.md +31 -0
  154. claude_mpm/commands/mpm-organize.md +120 -0
  155. claude_mpm/commands/mpm-postmortem.md +21 -0
  156. claude_mpm/commands/mpm-session-resume.md +30 -0
  157. claude_mpm/commands/mpm-status.md +20 -0
  158. claude_mpm/commands/mpm-ticket-view.md +109 -0
  159. claude_mpm/commands/mpm-version.md +20 -0
  160. claude_mpm/commands/mpm.md +31 -0
  161. claude_mpm/config/__init__.py +42 -2
  162. claude_mpm/config/agent_config.py +402 -0
  163. claude_mpm/config/agent_presets.py +488 -0
  164. claude_mpm/config/agent_sources.py +352 -0
  165. claude_mpm/config/experimental_features.py +217 -0
  166. claude_mpm/config/model_config.py +428 -0
  167. claude_mpm/config/paths.py +258 -0
  168. claude_mpm/config/skill_presets.py +392 -0
  169. claude_mpm/config/skill_sources.py +590 -0
  170. claude_mpm/config/socketio_config.py +125 -83
  171. claude_mpm/constants.py +133 -22
  172. claude_mpm/core/__init__.py +62 -36
  173. claude_mpm/core/agent_name_normalizer.py +71 -73
  174. claude_mpm/core/agent_registry.py +385 -492
  175. claude_mpm/core/agent_session_manager.py +81 -70
  176. claude_mpm/core/api_validator.py +330 -0
  177. claude_mpm/core/base_service.py +159 -122
  178. claude_mpm/core/cache.py +560 -0
  179. claude_mpm/core/claude_runner.py +696 -916
  180. claude_mpm/core/config.py +613 -122
  181. claude_mpm/core/config_aliases.py +74 -73
  182. claude_mpm/core/config_constants.py +314 -0
  183. claude_mpm/core/constants.py +361 -0
  184. claude_mpm/core/container.py +646 -104
  185. claude_mpm/core/enums.py +452 -0
  186. claude_mpm/core/error_handler.py +623 -0
  187. claude_mpm/core/exceptions.py +536 -0
  188. claude_mpm/core/factories.py +105 -109
  189. claude_mpm/core/file_utils.py +764 -0
  190. claude_mpm/core/framework/__init__.py +25 -0
  191. claude_mpm/core/framework/formatters/__init__.py +11 -0
  192. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  193. claude_mpm/core/framework/formatters/content_formatter.py +278 -0
  194. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  195. claude_mpm/core/framework/loaders/__init__.py +13 -0
  196. claude_mpm/core/framework/loaders/agent_loader.py +213 -0
  197. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  198. claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
  199. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  200. claude_mpm/core/framework/processors/__init__.py +11 -0
  201. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  202. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  203. claude_mpm/core/framework/processors/template_processor.py +244 -0
  204. claude_mpm/core/framework_loader.py +485 -414
  205. claude_mpm/core/hook_error_memory.py +381 -0
  206. claude_mpm/core/hook_manager.py +246 -86
  207. claude_mpm/core/hook_performance_config.py +147 -0
  208. claude_mpm/core/injectable_service.py +72 -63
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +670 -0
  211. claude_mpm/core/interfaces.py +570 -164
  212. claude_mpm/core/lazy.py +467 -0
  213. claude_mpm/core/log_manager.py +707 -0
  214. claude_mpm/core/logger.py +295 -134
  215. claude_mpm/core/logging_config.py +474 -0
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/minimal_framework_loader.py +24 -22
  218. claude_mpm/core/mixins.py +30 -29
  219. claude_mpm/core/oneshot_session.py +594 -0
  220. claude_mpm/core/optimized_agent_loader.py +479 -0
  221. claude_mpm/core/optimized_startup.py +554 -0
  222. claude_mpm/core/output_style_manager.py +491 -0
  223. claude_mpm/core/pm_hook_interceptor.py +197 -82
  224. claude_mpm/core/protocols/__init__.py +23 -0
  225. claude_mpm/core/protocols/runner_protocol.py +103 -0
  226. claude_mpm/core/protocols/session_protocol.py +131 -0
  227. claude_mpm/core/service_registry.py +153 -116
  228. claude_mpm/core/session_manager.py +179 -64
  229. claude_mpm/core/shared/__init__.py +17 -0
  230. claude_mpm/core/shared/config_loader.py +326 -0
  231. claude_mpm/core/shared/path_resolver.py +281 -0
  232. claude_mpm/core/shared/singleton_manager.py +221 -0
  233. claude_mpm/core/socketio_pool.py +400 -137
  234. claude_mpm/core/system_context.py +38 -0
  235. claude_mpm/core/tool_access_control.py +64 -57
  236. claude_mpm/core/types.py +307 -0
  237. claude_mpm/core/typing_utils.py +553 -0
  238. claude_mpm/core/unified_agent_registry.py +969 -0
  239. claude_mpm/core/unified_config.py +612 -0
  240. claude_mpm/core/unified_paths.py +958 -0
  241. claude_mpm/dashboard/__init__.py +12 -0
  242. claude_mpm/dashboard/api/simple_directory.py +261 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  249. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  250. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  251. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  252. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  253. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  254. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  255. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  256. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  257. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  258. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  259. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  260. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  261. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  262. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  263. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  264. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  265. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  266. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  267. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  268. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  269. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  270. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  271. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  272. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  273. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  274. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  275. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  276. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  277. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  278. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  279. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  280. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  281. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  282. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  283. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  284. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  285. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  286. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  287. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  288. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  289. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  290. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  291. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  292. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  293. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  303. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  305. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
  306. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  307. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  308. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  309. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  310. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  311. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  312. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  313. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  314. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  315. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  316. claude_mpm/experimental/__init__.py +10 -0
  317. claude_mpm/experimental/cli_enhancements.py +104 -89
  318. claude_mpm/generators/__init__.py +1 -1
  319. claude_mpm/generators/agent_profile_generator.py +76 -66
  320. claude_mpm/hooks/__init__.py +37 -1
  321. claude_mpm/hooks/base_hook.py +37 -32
  322. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  323. claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
  324. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  325. claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
  326. claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
  327. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
  328. claude_mpm/hooks/claude_hooks/installer.py +806 -0
  329. claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
  330. claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
  331. claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
  332. claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
  333. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
  334. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  335. claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
  336. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  337. claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
  338. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  339. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  340. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  341. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  342. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  343. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  344. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  345. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  346. claude_mpm/hooks/memory_integration_hook.py +201 -107
  347. claude_mpm/hooks/session_resume_hook.py +121 -0
  348. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  349. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  350. claude_mpm/hooks/tool_call_interceptor.py +92 -76
  351. claude_mpm/hooks/validation_hooks.py +62 -54
  352. claude_mpm/init.py +518 -83
  353. claude_mpm/models/__init__.py +9 -9
  354. claude_mpm/models/agent_definition.py +40 -23
  355. claude_mpm/models/agent_session.py +538 -0
  356. claude_mpm/models/git_repository.py +198 -0
  357. claude_mpm/models/resume_log.py +340 -0
  358. claude_mpm/schemas/__init__.py +12 -0
  359. claude_mpm/scripts/__init__.py +15 -0
  360. claude_mpm/scripts/claude-hook-handler.sh +227 -0
  361. claude_mpm/scripts/launch_monitor.py +165 -0
  362. claude_mpm/scripts/mpm_doctor.py +322 -0
  363. claude_mpm/scripts/socketio_daemon.py +189 -200
  364. claude_mpm/scripts/start_activity_logging.py +91 -0
  365. claude_mpm/services/__init__.py +208 -39
  366. claude_mpm/services/agent_capabilities_service.py +266 -0
  367. claude_mpm/services/agents/__init__.py +89 -0
  368. claude_mpm/services/agents/agent_builder.py +514 -0
  369. claude_mpm/services/agents/agent_preset_service.py +238 -0
  370. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  371. claude_mpm/services/agents/agent_review_service.py +280 -0
  372. claude_mpm/services/agents/agent_selection_service.py +484 -0
  373. claude_mpm/services/agents/auto_config_manager.py +796 -0
  374. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  375. claude_mpm/services/agents/cache_git_manager.py +621 -0
  376. claude_mpm/services/agents/deployment/__init__.py +21 -0
  377. claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
  378. claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
  379. claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
  380. claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
  381. claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
  382. claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
  383. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
  384. claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
  385. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
  386. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
  387. claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
  388. claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
  389. claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
  390. claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
  391. claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
  392. claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
  393. claude_mpm/services/agents/deployment/agent_validator.py +376 -0
  394. claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
  395. claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
  396. claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
  397. claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
  398. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  399. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  400. claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
  401. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  402. claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
  403. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  404. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  405. claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
  406. claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
  407. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  408. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  409. claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
  410. claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
  411. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  412. claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
  413. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  414. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  415. claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
  416. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
  417. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  418. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  419. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
  420. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  421. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  422. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
  423. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
  424. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
  425. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
  426. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
  427. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  428. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
  429. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  430. claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
  431. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
  432. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
  433. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  434. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  435. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  436. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  437. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  438. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  439. claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
  440. claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
  441. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  442. claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
  443. claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
  444. claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
  445. claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
  446. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  447. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  448. claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
  449. claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
  450. claude_mpm/services/agents/git_source_manager.py +682 -0
  451. claude_mpm/services/agents/loading/__init__.py +11 -0
  452. claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
  453. claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
  454. claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
  455. claude_mpm/services/agents/local_template_manager.py +784 -0
  456. claude_mpm/services/agents/management/__init__.py +9 -0
  457. claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
  458. claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
  459. claude_mpm/services/agents/memory/__init__.py +22 -0
  460. claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
  461. claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
  462. claude_mpm/services/agents/memory/content_manager.py +470 -0
  463. claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
  464. claude_mpm/services/agents/memory/memory_file_service.py +129 -0
  465. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  466. claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
  467. claude_mpm/services/agents/memory/template_generator.py +83 -0
  468. claude_mpm/services/agents/observers.py +547 -0
  469. claude_mpm/services/agents/recommender.py +617 -0
  470. claude_mpm/services/agents/registry/__init__.py +30 -0
  471. claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
  472. claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
  473. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  474. claude_mpm/services/agents/sources/__init__.py +13 -0
  475. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  476. claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
  477. claude_mpm/services/agents/startup_sync.py +262 -0
  478. claude_mpm/services/agents/toolchain_detector.py +478 -0
  479. claude_mpm/services/analysis/__init__.py +35 -0
  480. claude_mpm/services/analysis/clone_detector.py +1030 -0
  481. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  482. claude_mpm/services/analysis/postmortem_service.py +765 -0
  483. claude_mpm/services/async_session_logger.py +665 -0
  484. claude_mpm/services/claude_session_logger.py +321 -0
  485. claude_mpm/services/cli/__init__.py +18 -0
  486. claude_mpm/services/cli/agent_cleanup_service.py +408 -0
  487. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  488. claude_mpm/services/cli/agent_listing_service.py +463 -0
  489. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  490. claude_mpm/services/cli/agent_validation_service.py +590 -0
  491. claude_mpm/services/cli/memory_crud_service.py +622 -0
  492. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  493. claude_mpm/services/cli/resume_service.py +617 -0
  494. claude_mpm/services/cli/session_manager.py +604 -0
  495. claude_mpm/services/cli/session_pause_manager.py +504 -0
  496. claude_mpm/services/cli/session_resume_helper.py +372 -0
  497. claude_mpm/services/cli/startup_checker.py +362 -0
  498. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  499. claude_mpm/services/command_deployment_service.py +446 -0
  500. claude_mpm/services/command_handler_service.py +221 -0
  501. claude_mpm/services/communication/__init__.py +22 -0
  502. claude_mpm/services/core/__init__.py +108 -0
  503. claude_mpm/services/core/base.py +269 -0
  504. claude_mpm/services/core/cache_manager.py +309 -0
  505. claude_mpm/services/core/interfaces/__init__.py +273 -0
  506. claude_mpm/services/core/interfaces/agent.py +514 -0
  507. claude_mpm/services/core/interfaces/communication.py +316 -0
  508. claude_mpm/services/core/interfaces/health.py +169 -0
  509. claude_mpm/services/core/interfaces/infrastructure.py +357 -0
  510. claude_mpm/services/core/interfaces/model.py +281 -0
  511. claude_mpm/services/core/interfaces/process.py +372 -0
  512. claude_mpm/services/core/interfaces/project.py +121 -0
  513. claude_mpm/services/core/interfaces/restart.py +307 -0
  514. claude_mpm/services/core/interfaces/service.py +405 -0
  515. claude_mpm/services/core/interfaces/stability.py +260 -0
  516. claude_mpm/services/core/interfaces.py +81 -0
  517. claude_mpm/services/core/memory_manager.py +682 -0
  518. claude_mpm/services/core/models/__init__.py +70 -0
  519. claude_mpm/services/core/models/agent_config.py +384 -0
  520. claude_mpm/services/core/models/health.py +162 -0
  521. claude_mpm/services/core/models/process.py +239 -0
  522. claude_mpm/services/core/models/restart.py +302 -0
  523. claude_mpm/services/core/models/stability.py +264 -0
  524. claude_mpm/services/core/models/toolchain.py +306 -0
  525. claude_mpm/services/core/path_resolver.py +517 -0
  526. claude_mpm/services/core/service_container.py +520 -0
  527. claude_mpm/services/core/service_interfaces.py +436 -0
  528. claude_mpm/services/diagnostics/__init__.py +18 -0
  529. claude_mpm/services/diagnostics/checks/__init__.py +38 -0
  530. claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
  531. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  532. claude_mpm/services/diagnostics/checks/base_check.py +60 -0
  533. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  534. claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
  535. claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
  536. claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
  537. claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
  538. claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
  539. claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
  540. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  541. claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
  542. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  543. claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
  544. claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
  545. claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
  546. claude_mpm/services/diagnostics/models.py +138 -0
  547. claude_mpm/services/event_aggregator.py +582 -0
  548. claude_mpm/services/event_bus/__init__.py +18 -0
  549. claude_mpm/services/event_bus/config.py +186 -0
  550. claude_mpm/services/event_bus/direct_relay.py +312 -0
  551. claude_mpm/services/event_bus/event_bus.py +396 -0
  552. claude_mpm/services/event_bus/relay.py +326 -0
  553. claude_mpm/services/events/__init__.py +44 -0
  554. claude_mpm/services/events/consumers/__init__.py +18 -0
  555. claude_mpm/services/events/consumers/dead_letter.py +306 -0
  556. claude_mpm/services/events/consumers/logging.py +184 -0
  557. claude_mpm/services/events/consumers/metrics.py +241 -0
  558. claude_mpm/services/events/consumers/socketio.py +377 -0
  559. claude_mpm/services/events/core.py +480 -0
  560. claude_mpm/services/events/interfaces.py +214 -0
  561. claude_mpm/services/events/producers/__init__.py +14 -0
  562. claude_mpm/services/events/producers/hook.py +269 -0
  563. claude_mpm/services/events/producers/system.py +329 -0
  564. claude_mpm/services/exceptions.py +433 -353
  565. claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
  566. claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
  567. claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
  568. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
  569. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
  570. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
  571. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
  572. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
  573. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  574. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  575. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  576. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  577. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
  578. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  579. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  580. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
  581. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
  582. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  583. claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
  584. claude_mpm/services/git/__init__.py +21 -0
  585. claude_mpm/services/git/git_operations_service.py +579 -0
  586. claude_mpm/services/github/__init__.py +21 -0
  587. claude_mpm/services/github/github_cli_service.py +397 -0
  588. claude_mpm/services/hook_installer_service.py +506 -0
  589. claude_mpm/services/hook_service.py +159 -111
  590. claude_mpm/services/infrastructure/__init__.py +52 -0
  591. claude_mpm/services/infrastructure/context_preservation.py +569 -0
  592. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  593. claude_mpm/services/infrastructure/logging.py +209 -0
  594. claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
  595. claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
  596. claude_mpm/services/infrastructure/monitoring/base.py +122 -0
  597. claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
  598. claude_mpm/services/infrastructure/monitoring/network.py +219 -0
  599. claude_mpm/services/infrastructure/monitoring/process.py +343 -0
  600. claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
  601. claude_mpm/services/infrastructure/monitoring/service.py +368 -0
  602. claude_mpm/services/infrastructure/monitoring.py +71 -0
  603. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  604. claude_mpm/services/instructions/__init__.py +9 -0
  605. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  606. claude_mpm/services/local_ops/__init__.py +155 -0
  607. claude_mpm/services/local_ops/crash_detector.py +257 -0
  608. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  609. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  610. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  611. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  612. claude_mpm/services/local_ops/health_manager.py +427 -0
  613. claude_mpm/services/local_ops/log_monitor.py +396 -0
  614. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  615. claude_mpm/services/local_ops/process_manager.py +595 -0
  616. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  617. claude_mpm/services/local_ops/restart_manager.py +401 -0
  618. claude_mpm/services/local_ops/restart_policy.py +387 -0
  619. claude_mpm/services/local_ops/state_manager.py +372 -0
  620. claude_mpm/services/local_ops/unified_manager.py +600 -0
  621. claude_mpm/services/mcp_config_manager.py +1542 -0
  622. claude_mpm/services/mcp_service_verifier.py +732 -0
  623. claude_mpm/services/memory/__init__.py +19 -0
  624. claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
  625. claude_mpm/services/memory/cache/__init__.py +14 -0
  626. claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
  627. claude_mpm/services/memory/cache/simple_cache.py +331 -0
  628. claude_mpm/services/memory/failure_tracker.py +578 -0
  629. claude_mpm/services/memory/indexed_memory.py +648 -0
  630. claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
  631. claude_mpm/services/memory/router.py +951 -0
  632. claude_mpm/services/memory_hook_service.py +470 -0
  633. claude_mpm/services/model/__init__.py +147 -0
  634. claude_mpm/services/model/base_provider.py +365 -0
  635. claude_mpm/services/model/claude_provider.py +412 -0
  636. claude_mpm/services/model/model_router.py +452 -0
  637. claude_mpm/services/model/ollama_provider.py +415 -0
  638. claude_mpm/services/monitor/__init__.py +20 -0
  639. claude_mpm/services/monitor/daemon.py +698 -0
  640. claude_mpm/services/monitor/daemon_manager.py +1076 -0
  641. claude_mpm/services/monitor/event_emitter.py +350 -0
  642. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  643. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  644. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  645. claude_mpm/services/monitor/handlers/file.py +264 -0
  646. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  647. claude_mpm/services/monitor/management/__init__.py +18 -0
  648. claude_mpm/services/monitor/management/health.py +124 -0
  649. claude_mpm/services/monitor/management/lifecycle.py +730 -0
  650. claude_mpm/services/monitor/server.py +1493 -0
  651. claude_mpm/services/monitor_build_service.py +349 -0
  652. claude_mpm/services/native_agent_converter.py +356 -0
  653. claude_mpm/services/orphan_detection.py +786 -0
  654. claude_mpm/services/pm_skills_deployer.py +711 -0
  655. claude_mpm/services/port_manager.py +597 -0
  656. claude_mpm/services/pr/__init__.py +14 -0
  657. claude_mpm/services/pr/pr_template_service.py +329 -0
  658. claude_mpm/services/profile_manager.py +337 -0
  659. claude_mpm/services/project/__init__.py +44 -0
  660. claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
  661. claude_mpm/services/project/analyzer_v2.py +566 -0
  662. claude_mpm/services/project/architecture_analyzer.py +461 -0
  663. claude_mpm/services/project/archive_manager.py +1045 -0
  664. claude_mpm/services/project/dependency_analyzer.py +462 -0
  665. claude_mpm/services/project/detection_strategies.py +719 -0
  666. claude_mpm/services/project/documentation_manager.py +554 -0
  667. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  668. claude_mpm/services/project/language_analyzer.py +265 -0
  669. claude_mpm/services/project/metrics_collector.py +407 -0
  670. claude_mpm/services/project/project_organizer.py +1009 -0
  671. claude_mpm/services/project/registry.py +636 -0
  672. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  673. claude_mpm/services/project_port_allocator.py +596 -0
  674. claude_mpm/services/recovery_manager.py +293 -240
  675. claude_mpm/services/response_tracker.py +267 -0
  676. claude_mpm/services/runner_configuration_service.py +605 -0
  677. claude_mpm/services/self_upgrade_service.py +608 -0
  678. claude_mpm/services/session_management_service.py +314 -0
  679. claude_mpm/services/session_manager.py +380 -0
  680. claude_mpm/services/shared/__init__.py +21 -0
  681. claude_mpm/services/shared/async_service_base.py +216 -0
  682. claude_mpm/services/shared/config_service_base.py +301 -0
  683. claude_mpm/services/shared/lifecycle_service_base.py +308 -0
  684. claude_mpm/services/shared/manager_base.py +315 -0
  685. claude_mpm/services/shared/service_factory.py +309 -0
  686. claude_mpm/services/skills/__init__.py +21 -0
  687. claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
  688. claude_mpm/services/skills/selective_skill_deployer.py +743 -0
  689. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  690. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  691. claude_mpm/services/skills_config.py +547 -0
  692. claude_mpm/services/skills_deployer.py +1168 -0
  693. claude_mpm/services/socketio/__init__.py +25 -0
  694. claude_mpm/services/socketio/client_proxy.py +229 -0
  695. claude_mpm/services/socketio/dashboard_server.py +362 -0
  696. claude_mpm/services/socketio/event_normalizer.py +798 -0
  697. claude_mpm/services/socketio/handlers/__init__.py +30 -0
  698. claude_mpm/services/socketio/handlers/base.py +136 -0
  699. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  700. claude_mpm/services/socketio/handlers/connection.py +643 -0
  701. claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
  702. claude_mpm/services/socketio/handlers/file.py +263 -0
  703. claude_mpm/services/socketio/handlers/git.py +962 -0
  704. claude_mpm/services/socketio/handlers/hook.py +211 -0
  705. claude_mpm/services/socketio/handlers/memory.py +26 -0
  706. claude_mpm/services/socketio/handlers/project.py +24 -0
  707. claude_mpm/services/socketio/handlers/registry.py +214 -0
  708. claude_mpm/services/socketio/migration_utils.py +343 -0
  709. claude_mpm/services/socketio/monitor_client.py +364 -0
  710. claude_mpm/services/socketio/server/__init__.py +18 -0
  711. claude_mpm/services/socketio/server/broadcaster.py +569 -0
  712. claude_mpm/services/socketio/server/connection_manager.py +579 -0
  713. claude_mpm/services/socketio/server/core.py +1079 -0
  714. claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
  715. claude_mpm/services/socketio/server/main.py +501 -0
  716. claude_mpm/services/socketio_client_manager.py +173 -143
  717. claude_mpm/services/socketio_server.py +38 -1657
  718. claude_mpm/services/subprocess_launcher_service.py +322 -0
  719. claude_mpm/services/system_instructions_service.py +270 -0
  720. claude_mpm/services/ticket_manager.py +25 -209
  721. claude_mpm/services/ticket_services/__init__.py +26 -0
  722. claude_mpm/services/ticket_services/crud_service.py +328 -0
  723. claude_mpm/services/ticket_services/formatter_service.py +290 -0
  724. claude_mpm/services/ticket_services/search_service.py +324 -0
  725. claude_mpm/services/ticket_services/validation_service.py +303 -0
  726. claude_mpm/services/ticket_services/workflow_service.py +244 -0
  727. claude_mpm/services/unified/__init__.py +65 -0
  728. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  729. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  730. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  731. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  732. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  733. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  734. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  735. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  736. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  737. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  738. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  739. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  740. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  741. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  742. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  743. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  744. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  745. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  746. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  747. claude_mpm/services/unified/interfaces.py +475 -0
  748. claude_mpm/services/unified/migration.py +509 -0
  749. claude_mpm/services/unified/strategies.py +534 -0
  750. claude_mpm/services/unified/unified_analyzer.py +542 -0
  751. claude_mpm/services/unified/unified_config.py +691 -0
  752. claude_mpm/services/unified/unified_deployment.py +466 -0
  753. claude_mpm/services/utility_service.py +280 -0
  754. claude_mpm/services/version_control/__init__.py +34 -37
  755. claude_mpm/services/version_control/branch_strategy.py +26 -17
  756. claude_mpm/services/version_control/conflict_resolution.py +52 -36
  757. claude_mpm/services/version_control/git_operations.py +183 -49
  758. claude_mpm/services/version_control/semantic_versioning.py +172 -61
  759. claude_mpm/services/version_control/version_parser.py +546 -0
  760. claude_mpm/services/version_service.py +379 -0
  761. claude_mpm/services/visualization/__init__.py +15 -0
  762. claude_mpm/services/visualization/mermaid_generator.py +937 -0
  763. claude_mpm/skills/__init__.py +42 -0
  764. claude_mpm/skills/agent_skills_injector.py +324 -0
  765. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  766. claude_mpm/skills/bundled/__init__.py +6 -0
  767. claude_mpm/skills/bundled/api-documentation.md +393 -0
  768. claude_mpm/skills/bundled/async-testing.md +571 -0
  769. claude_mpm/skills/bundled/code-review.md +143 -0
  770. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  771. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  772. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  773. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  774. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  775. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  776. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  777. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  778. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  779. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  780. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  781. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  782. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  783. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  784. claude_mpm/skills/bundled/database-migration.md +199 -0
  785. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  786. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  787. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  788. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  789. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  790. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  791. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  792. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  793. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  794. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  795. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  796. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  797. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  798. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  799. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  800. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  801. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  802. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  803. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  804. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  805. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  806. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  807. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  808. claude_mpm/skills/bundled/git-workflow.md +414 -0
  809. claude_mpm/skills/bundled/imagemagick.md +204 -0
  810. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  811. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  812. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  813. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  814. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  815. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  816. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  817. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  818. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  819. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  820. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  821. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  822. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  823. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  824. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  825. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  826. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  827. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  828. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  829. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  830. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  831. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  832. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  833. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  834. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  835. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  836. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  837. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  838. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  839. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  840. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  841. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  842. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  843. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  844. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  845. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  846. claude_mpm/skills/bundled/pdf.md +141 -0
  847. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  848. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  849. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  850. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  851. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  852. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  853. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  854. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  855. claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
  856. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  857. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  858. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  859. claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
  860. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  861. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  862. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  863. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  864. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  865. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  866. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  867. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  868. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  869. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  870. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  871. claude_mpm/skills/bundled/security-scanning.md +439 -0
  872. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  873. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  874. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  875. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  876. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  877. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  878. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  879. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  880. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  881. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  882. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  883. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  884. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  885. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  886. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  887. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  888. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  889. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  890. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  891. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  892. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  893. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  894. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  895. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  896. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  897. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  898. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  899. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  900. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  901. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  902. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  903. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  904. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  905. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  906. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  907. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  908. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  909. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  910. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  911. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  912. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  913. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  914. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  915. claude_mpm/skills/bundled/xlsx.md +157 -0
  916. claude_mpm/skills/registry.py +286 -0
  917. claude_mpm/skills/skill_manager.py +405 -0
  918. claude_mpm/skills/skills_registry.py +347 -0
  919. claude_mpm/skills/skills_service.py +739 -0
  920. claude_mpm/storage/__init__.py +9 -0
  921. claude_mpm/storage/state_storage.py +546 -0
  922. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  923. claude_mpm/templates/questions/__init__.py +38 -0
  924. claude_mpm/templates/questions/base.py +193 -0
  925. claude_mpm/templates/questions/pr_strategy.py +311 -0
  926. claude_mpm/templates/questions/project_init.py +385 -0
  927. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  928. claude_mpm/ticket_wrapper.py +2 -2
  929. claude_mpm/tools/__init__.py +10 -0
  930. claude_mpm/tools/__main__.py +208 -0
  931. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  932. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  933. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  934. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  935. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  936. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  937. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  938. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  939. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  940. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  941. claude_mpm/tools/code_tree_builder.py +631 -0
  942. claude_mpm/tools/code_tree_events.py +420 -0
  943. claude_mpm/tools/socketio_debug.py +671 -0
  944. claude_mpm/utils/__init__.py +8 -8
  945. claude_mpm/utils/agent_dependency_loader.py +1189 -0
  946. claude_mpm/utils/agent_filters.py +261 -0
  947. claude_mpm/utils/common.py +544 -0
  948. claude_mpm/utils/config_manager.py +168 -126
  949. claude_mpm/utils/console.py +11 -0
  950. claude_mpm/utils/database_connector.py +298 -0
  951. claude_mpm/utils/dependency_cache.py +373 -0
  952. claude_mpm/utils/dependency_manager.py +60 -59
  953. claude_mpm/utils/dependency_strategies.py +381 -0
  954. claude_mpm/utils/display_helper.py +260 -0
  955. claude_mpm/utils/environment_context.py +313 -0
  956. claude_mpm/utils/error_handler.py +78 -66
  957. claude_mpm/utils/file_utils.py +305 -0
  958. claude_mpm/utils/framework_detection.py +12 -11
  959. claude_mpm/utils/git_analyzer.py +407 -0
  960. claude_mpm/utils/gitignore.py +244 -0
  961. claude_mpm/utils/import_migration_example.py +12 -60
  962. claude_mpm/utils/imports.py +48 -45
  963. claude_mpm/utils/log_cleanup.py +627 -0
  964. claude_mpm/utils/migration.py +372 -0
  965. claude_mpm/utils/path_operations.py +110 -104
  966. claude_mpm/utils/progress.py +387 -0
  967. claude_mpm/utils/robust_installer.py +844 -0
  968. claude_mpm/utils/session_logging.py +121 -0
  969. claude_mpm/utils/structured_questions.py +619 -0
  970. claude_mpm/utils/subprocess_utils.py +343 -0
  971. claude_mpm/validation/__init__.py +1 -1
  972. claude_mpm/validation/agent_validator.py +214 -108
  973. claude_mpm/validation/frontmatter_validator.py +252 -0
  974. claude_mpm-5.4.85.dist-info/METADATA +1023 -0
  975. claude_mpm-5.4.85.dist-info/RECORD +980 -0
  976. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
  977. claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
  978. claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
  979. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
  980. claude_mpm/agents/INSTRUCTIONS.md +0 -352
  981. claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
  982. claude_mpm/agents/base_agent_loader.py +0 -529
  983. claude_mpm/agents/schema/agent_schema.json +0 -314
  984. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
  985. claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
  986. claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
  987. claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
  988. claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
  989. claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
  990. claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
  991. claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
  992. claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
  993. claude_mpm/agents/templates/data_engineer.json +0 -110
  994. claude_mpm/agents/templates/documentation.json +0 -109
  995. claude_mpm/agents/templates/engineer.json +0 -113
  996. claude_mpm/agents/templates/ops.json +0 -109
  997. claude_mpm/agents/templates/pm.json +0 -25
  998. claude_mpm/agents/templates/qa.json +0 -111
  999. claude_mpm/agents/templates/research.json +0 -65
  1000. claude_mpm/agents/templates/security.json +0 -113
  1001. claude_mpm/agents/templates/test_integration.json +0 -112
  1002. claude_mpm/agents/templates/version_control.json +0 -107
  1003. claude_mpm/cli/commands/ui.py +0 -57
  1004. claude_mpm/core/simple_runner.py +0 -1046
  1005. claude_mpm/dashboard/open_dashboard.py +0 -34
  1006. claude_mpm/deployment_paths.py +0 -261
  1007. claude_mpm/hooks/builtin/__init__.py +0 -1
  1008. claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
  1009. claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
  1010. claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
  1011. claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
  1012. claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
  1013. claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
  1014. claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
  1015. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
  1016. claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
  1017. claude_mpm/orchestration/__init__.py +0 -6
  1018. claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
  1019. claude_mpm/orchestration/archive/factory.py +0 -215
  1020. claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
  1021. claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
  1022. claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
  1023. claude_mpm/orchestration/archive/orchestrator.py +0 -501
  1024. claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
  1025. claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
  1026. claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
  1027. claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
  1028. claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
  1029. claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
  1030. claude_mpm/schemas/workflow_validator.py +0 -411
  1031. claude_mpm/services/agent_deployment.py +0 -1534
  1032. claude_mpm/services/agent_lifecycle_manager.py +0 -1169
  1033. claude_mpm/services/agent_memory_manager.py +0 -1415
  1034. claude_mpm/services/agent_registry.py +0 -676
  1035. claude_mpm/services/deployed_agent_discovery.py +0 -226
  1036. claude_mpm/services/framework_agent_loader.py +0 -337
  1037. claude_mpm/services/framework_claude_md_generator.py +0 -621
  1038. claude_mpm/services/health_monitor.py +0 -892
  1039. claude_mpm/services/memory_router.py +0 -538
  1040. claude_mpm/services/parent_directory_manager/__init__.py +0 -577
  1041. claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
  1042. claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
  1043. claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
  1044. claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
  1045. claude_mpm/services/parent_directory_manager/operations.py +0 -186
  1046. claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
  1047. claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
  1048. claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
  1049. claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
  1050. claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
  1051. claude_mpm/services/standalone_socketio_server.py +0 -1300
  1052. claude_mpm/services/ticket_manager_di.py +0 -318
  1053. claude_mpm/services/ticketing_service_original.py +0 -508
  1054. claude_mpm/ui/__init__.py +0 -1
  1055. claude_mpm/ui/rich_terminal_ui.py +0 -295
  1056. claude_mpm/ui/terminal_ui.py +0 -328
  1057. claude_mpm/utils/paths.py +0 -289
  1058. claude_mpm-3.4.10.dist-info/METADATA +0 -183
  1059. claude_mpm-3.4.10.dist-info/RECORD +0 -201
  1060. claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
  1061. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
  1062. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1398 @@
1
+ """
2
+ Skills command implementation for claude-mpm.
3
+
4
+ WHY: This module provides CLI commands for managing Claude Code skills,
5
+ exposing SkillsService functionality for skill discovery, deployment, validation,
6
+ updates, and configuration. Also provides GitHub skills deployment via SkillsDeployer.
7
+
8
+ DESIGN DECISIONS:
9
+ - Use BaseCommand pattern for consistency with other CLI commands
10
+ - Rich output formatting for user-friendly display
11
+ - Graceful error handling with informative messages
12
+ - Support for verbose output and structured formats
13
+ - Dual service approach: SkillsService for bundled, SkillsDeployer for GitHub
14
+
15
+ ARCHITECTURE:
16
+ - SkillsService: Manages bundled skills (in project .claude/skills/)
17
+ - SkillsDeployer: Downloads from GitHub to ~/.claude/skills/ for Claude Code
18
+ """
19
+
20
+ import os
21
+ import subprocess # nosec B404
22
+ from typing import Optional
23
+
24
+ from rich.console import Console
25
+ from rich.markdown import Markdown
26
+ from rich.panel import Panel
27
+ from rich.table import Table
28
+
29
+ from ...constants import SkillsCommands
30
+ from ...services.skills_deployer import SkillsDeployerService
31
+ from ...skills.skills_service import SkillsService
32
+ from ..shared import BaseCommand, CommandResult
33
+
34
+ console = Console()
35
+
36
+
37
+ class SkillsManagementCommand(BaseCommand):
38
+ """Skills management command for Claude Code skills."""
39
+
40
+ def __init__(self):
41
+ super().__init__("skills")
42
+ self._skills_service = None
43
+ self._skills_deployer = None
44
+
45
+ @property
46
+ def skills_service(self) -> SkillsService:
47
+ """Get skills service instance (lazy loaded)."""
48
+ if self._skills_service is None:
49
+ self._skills_service = SkillsService()
50
+ return self._skills_service
51
+
52
+ @property
53
+ def skills_deployer(self) -> SkillsDeployerService:
54
+ """Get skills deployer instance (lazy loaded)."""
55
+ if self._skills_deployer is None:
56
+ self._skills_deployer = SkillsDeployerService()
57
+ return self._skills_deployer
58
+
59
+ def validate_args(self, args) -> Optional[str]:
60
+ """Validate command arguments."""
61
+ # Most skills commands are optional, basic validation
62
+ if hasattr(args, "skills_command") and args.skills_command:
63
+ if args.skills_command == SkillsCommands.VALIDATE.value:
64
+ if not hasattr(args, "skill_name") or not args.skill_name:
65
+ return "Validate command requires a skill name"
66
+ elif args.skills_command == SkillsCommands.INFO.value:
67
+ if not hasattr(args, "skill_name") or not args.skill_name:
68
+ return "Info command requires a skill name"
69
+ return None
70
+
71
+ def run(self, args) -> CommandResult:
72
+ """Execute the skills command."""
73
+ try:
74
+ # Handle default case (no subcommand) - show list
75
+ if not hasattr(args, "skills_command") or not args.skills_command:
76
+ return self._list_skills(args)
77
+
78
+ # Route to appropriate subcommand
79
+ command_map = {
80
+ SkillsCommands.LIST.value: self._list_skills,
81
+ SkillsCommands.DEPLOY.value: self._deploy_skills,
82
+ SkillsCommands.VALIDATE.value: self._validate_skill,
83
+ SkillsCommands.UPDATE.value: self._update_skills,
84
+ SkillsCommands.INFO.value: self._show_skill_info,
85
+ SkillsCommands.CONFIG.value: self._manage_config,
86
+ SkillsCommands.CONFIGURE.value: self._configure_skills,
87
+ SkillsCommands.SELECT.value: self._select_skills_interactive,
88
+ # GitHub deployment commands
89
+ SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
90
+ SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
91
+ SkillsCommands.CHECK_DEPLOYED.value: self._check_deployed_skills,
92
+ SkillsCommands.REMOVE.value: self._remove_skills,
93
+ # Collection management commands
94
+ SkillsCommands.COLLECTION_LIST.value: self._collection_list,
95
+ SkillsCommands.COLLECTION_ADD.value: self._collection_add,
96
+ SkillsCommands.COLLECTION_REMOVE.value: self._collection_remove,
97
+ SkillsCommands.COLLECTION_ENABLE.value: self._collection_enable,
98
+ SkillsCommands.COLLECTION_DISABLE.value: self._collection_disable,
99
+ SkillsCommands.COLLECTION_SET_DEFAULT.value: self._collection_set_default,
100
+ }
101
+
102
+ handler = command_map.get(args.skills_command)
103
+ if handler:
104
+ return handler(args)
105
+ return CommandResult(
106
+ success=False,
107
+ message=f"Unknown skills command: {args.skills_command}",
108
+ exit_code=1,
109
+ )
110
+
111
+ except Exception as e:
112
+ self.logger.error(f"Skills command failed: {e}")
113
+ if hasattr(args, "debug") and args.debug:
114
+ import traceback
115
+
116
+ traceback.print_exc()
117
+ return CommandResult(
118
+ success=False, message=f"Skills command failed: {e}", exit_code=1
119
+ )
120
+
121
+ def _list_skills(self, args) -> CommandResult:
122
+ """List available skills."""
123
+ try:
124
+ # Get skills based on filter
125
+ if hasattr(args, "agent") and args.agent:
126
+ skills = self.skills_service.get_skills_for_agent(args.agent)
127
+ console.print(
128
+ f"\n[bold cyan]Skills for agent '{args.agent}':[/bold cyan]\n"
129
+ )
130
+
131
+ if not skills:
132
+ console.print(
133
+ f"[yellow]No skills found for agent '{args.agent}'[/yellow]"
134
+ )
135
+ return CommandResult(success=True, exit_code=0)
136
+
137
+ for skill_name in skills:
138
+ # Get skill metadata
139
+ skill_info = self._get_skill_metadata(skill_name)
140
+ if skill_info:
141
+ console.print(f" [green]•[/green] {skill_name}")
142
+ if (
143
+ hasattr(args, "verbose")
144
+ and args.verbose
145
+ and skill_info.get("description")
146
+ ):
147
+ console.print(f" {skill_info['description']}")
148
+ else:
149
+ console.print(f" [green]•[/green] {skill_name}")
150
+
151
+ else:
152
+ # Discover all bundled skills
153
+ skills = self.skills_service.discover_bundled_skills()
154
+
155
+ # Filter by category if specified
156
+ if hasattr(args, "category") and args.category:
157
+ skills = [s for s in skills if s.get("category") == args.category]
158
+ console.print(
159
+ f"\n[bold cyan]Skills in category '{args.category}':[/bold cyan]\n"
160
+ )
161
+ else:
162
+ console.print("\n[bold cyan]Available Skills:[/bold cyan]\n")
163
+
164
+ if not skills:
165
+ console.print("[yellow]No skills found[/yellow]")
166
+ return CommandResult(success=True, exit_code=0)
167
+
168
+ # Group by category
169
+ by_category = {}
170
+ for skill in skills:
171
+ category = skill.get("category", "uncategorized")
172
+ if category not in by_category:
173
+ by_category[category] = []
174
+ by_category[category].append(skill)
175
+
176
+ # Display by category
177
+ for category, category_skills in sorted(by_category.items()):
178
+ console.print(f"[bold yellow]{category}[/bold yellow]")
179
+ for skill in sorted(
180
+ category_skills, key=lambda s: s.get("name", "")
181
+ ):
182
+ name = skill.get("name", "unknown")
183
+ console.print(f" [green]•[/green] {name}")
184
+
185
+ if hasattr(args, "verbose") and args.verbose:
186
+ metadata = skill.get("metadata", {})
187
+ if desc := metadata.get("description"):
188
+ console.print(f" {desc}")
189
+ if version := metadata.get("version"):
190
+ console.print(f" [dim]Version: {version}[/dim]")
191
+ console.print()
192
+
193
+ return CommandResult(success=True, exit_code=0)
194
+
195
+ except Exception as e:
196
+ console.print(f"[red]Error listing skills: {e}[/red]")
197
+ return CommandResult(success=False, message=str(e), exit_code=1)
198
+
199
+ def _deploy_skills(self, args) -> CommandResult:
200
+ """Deploy skills using two-phase sync: cache → deploy.
201
+
202
+ Phase 3 Integration (1M-486): Uses Git skill source manager for deployment.
203
+ - Phase 1: Sync skills to ~/.claude-mpm/cache/skills/ (if needed)
204
+ - Phase 2: Deploy from cache to project .claude-mpm/skills/
205
+
206
+ This replaces bundled skill deployment with a multi-project
207
+ architecture where one cache serves multiple project deployments.
208
+ """
209
+ try:
210
+ from pathlib import Path
211
+
212
+ from ...config.skill_sources import SkillSourceConfiguration
213
+ from ...services.skills.git_skill_source_manager import (
214
+ GitSkillSourceManager,
215
+ )
216
+
217
+ force = getattr(args, "force", False)
218
+ specific_skills = getattr(args, "skills", None)
219
+
220
+ console.print("\n[bold cyan]Deploying skills...[/bold cyan]\n")
221
+
222
+ # Initialize git skill source manager
223
+ config = SkillSourceConfiguration.load()
224
+ git_skill_manager = GitSkillSourceManager(config)
225
+ project_dir = Path.cwd()
226
+
227
+ # Phase 1: Sync skills to cache
228
+ console.print("[dim]Phase 1: Syncing skills to cache...[/dim]")
229
+ sync_results = git_skill_manager.sync_all_sources(force=force)
230
+
231
+ synced_count = sum(
232
+ 1 for result in sync_results.values() if result.get("synced")
233
+ )
234
+ console.print(f"[dim]Synced {synced_count} skill source(s)[/dim]\n")
235
+
236
+ # Phase 2: Deploy from cache to project
237
+ console.print("[dim]Phase 2: Deploying from cache to project...[/dim]\n")
238
+ deploy_result = git_skill_manager.deploy_skills_to_project(
239
+ project_dir=project_dir,
240
+ skill_list=specific_skills,
241
+ force=force,
242
+ )
243
+
244
+ # Display results
245
+ if deploy_result["deployed"]:
246
+ console.print(
247
+ f"[green]✓ Deployed {len(deploy_result['deployed'])} skill(s):[/green]"
248
+ )
249
+ for skill in deploy_result["deployed"]:
250
+ console.print(f" • {skill}")
251
+ console.print()
252
+
253
+ if deploy_result["updated"]:
254
+ console.print(
255
+ f"[green]⟳ Updated {len(deploy_result['updated'])} skill(s):[/green]"
256
+ )
257
+ for skill in deploy_result["updated"]:
258
+ console.print(f" • {skill}")
259
+ console.print()
260
+
261
+ if deploy_result["skipped"]:
262
+ console.print(
263
+ f"[yellow]⊘ Skipped {len(deploy_result['skipped'])} skill(s) (already up-to-date):[/yellow]"
264
+ )
265
+ for skill in deploy_result["skipped"]:
266
+ console.print(f" • {skill}")
267
+ console.print("[dim]Use --force to redeploy[/dim]\n")
268
+
269
+ if deploy_result["failed"]:
270
+ console.print(
271
+ f"[red]✗ Failed to deploy {len(deploy_result['failed'])} skill(s):[/red]"
272
+ )
273
+ for skill in deploy_result["failed"]:
274
+ console.print(f" • {skill}")
275
+ console.print()
276
+
277
+ # Summary
278
+ success_count = len(deploy_result["deployed"]) + len(
279
+ deploy_result["updated"]
280
+ )
281
+ total = (
282
+ success_count
283
+ + len(deploy_result["skipped"])
284
+ + len(deploy_result["failed"])
285
+ )
286
+ console.print(
287
+ f"[bold]Summary:[/bold] {success_count} deployed/updated, "
288
+ f"{len(deploy_result['skipped'])} skipped, "
289
+ f"{len(deploy_result['failed'])} errors (Total: {total})\n"
290
+ )
291
+
292
+ console.print(
293
+ f"[dim]Deployment directory: {deploy_result['deployment_dir']}[/dim]\n"
294
+ )
295
+
296
+ # Exit with error if any deployments failed
297
+ exit_code = 1 if deploy_result["failed"] else 0
298
+ return CommandResult(
299
+ success=not deploy_result["failed"],
300
+ message=f"Deployed {success_count} skills from cache",
301
+ exit_code=exit_code,
302
+ )
303
+
304
+ except Exception as e:
305
+ console.print(f"[red]Error deploying skills: {e}[/red]")
306
+ return CommandResult(success=False, message=str(e), exit_code=1)
307
+
308
+ def _validate_skill(self, args) -> CommandResult:
309
+ """Validate skill structure and metadata."""
310
+ try:
311
+ skill_name = args.skill_name
312
+ strict = getattr(args, "strict", False)
313
+
314
+ console.print(
315
+ f"\n[bold cyan]Validating skill '{skill_name}'...[/bold cyan]\n"
316
+ )
317
+
318
+ result = self.skills_service.validate_skill(skill_name)
319
+
320
+ if result["valid"]:
321
+ console.print(f"[green]✓ {skill_name} is valid[/green]\n")
322
+
323
+ if result.get("warnings"):
324
+ console.print(
325
+ f"[yellow]Warnings ({len(result['warnings'])}):[/yellow]"
326
+ )
327
+ for warning in result["warnings"]:
328
+ console.print(f" • {warning}")
329
+ console.print()
330
+
331
+ # Treat warnings as errors in strict mode
332
+ if strict:
333
+ console.print(
334
+ "[red]Strict mode: treating warnings as errors[/red]"
335
+ )
336
+ return CommandResult(success=False, exit_code=1)
337
+
338
+ return CommandResult(success=True, exit_code=0)
339
+ console.print(f"[red]✗ {skill_name} has validation errors:[/red]")
340
+ for error in result.get("errors", []):
341
+ console.print(f" • {error}")
342
+ console.print()
343
+
344
+ if result.get("warnings"):
345
+ console.print("[yellow]Warnings:[/yellow]")
346
+ for warning in result["warnings"]:
347
+ console.print(f" • {warning}")
348
+ console.print()
349
+
350
+ return CommandResult(success=False, exit_code=1)
351
+
352
+ except Exception as e:
353
+ console.print(f"[red]Error validating skill: {e}[/red]")
354
+ return CommandResult(success=False, message=str(e), exit_code=1)
355
+
356
+ def _update_skills(self, args) -> CommandResult:
357
+ """Check for and install skill updates."""
358
+ try:
359
+ skill_names = getattr(args, "skill_names", [])
360
+ check_only = getattr(args, "check_only", False)
361
+ force = getattr(args, "force", False)
362
+
363
+ action = "Checking" if check_only else "Updating"
364
+ console.print(f"\n[bold cyan]{action} skills...[/bold cyan]\n")
365
+
366
+ result = self.skills_service.check_for_updates(skill_names)
367
+
368
+ if not result.get("updates_available"):
369
+ console.print("[green]All skills are up to date[/green]\n")
370
+ return CommandResult(success=True, exit_code=0)
371
+
372
+ # Display available updates
373
+ console.print(
374
+ f"[yellow]Updates available for {len(result['updates_available'])} skill(s):[/yellow]"
375
+ )
376
+ for update_info in result["updates_available"]:
377
+ skill_name = update_info["skill"]
378
+ current = update_info["current_version"]
379
+ latest = update_info["latest_version"]
380
+ console.print(f" • {skill_name}: {current} → {latest}")
381
+ console.print()
382
+
383
+ if check_only:
384
+ console.print(
385
+ "[dim]Run without --check-only to install updates[/dim]\n"
386
+ )
387
+ return CommandResult(success=True, exit_code=0)
388
+
389
+ # Install updates
390
+ console.print("[bold cyan]Installing updates...[/bold cyan]\n")
391
+ install_result = self.skills_service.install_updates(
392
+ result["updates_available"], force=force
393
+ )
394
+
395
+ if install_result["updated"]:
396
+ console.print(
397
+ f"[green]✓ Updated {len(install_result['updated'])} skill(s)[/green]\n"
398
+ )
399
+
400
+ if install_result.get("errors"):
401
+ console.print(
402
+ f"[red]✗ Failed to update {len(install_result['errors'])} skill(s)[/red]"
403
+ )
404
+ for skill, error in install_result["errors"].items():
405
+ console.print(f" • {skill}: {error}")
406
+ console.print()
407
+
408
+ exit_code = 1 if install_result.get("errors") else 0
409
+ return CommandResult(
410
+ success=not install_result.get("errors"), exit_code=exit_code
411
+ )
412
+
413
+ except Exception as e:
414
+ console.print(f"[red]Error updating skills: {e}[/red]")
415
+ return CommandResult(success=False, message=str(e), exit_code=1)
416
+
417
+ def _show_skill_info(self, args) -> CommandResult:
418
+ """Show detailed skill information."""
419
+ try:
420
+ skill_name = args.skill_name
421
+ show_content = getattr(args, "show_content", False)
422
+
423
+ skill_info = self._get_skill_metadata(skill_name)
424
+
425
+ if not skill_info:
426
+ console.print(f"[red]Skill '{skill_name}' not found[/red]")
427
+ return CommandResult(success=False, exit_code=1)
428
+
429
+ # Display skill info in a panel
430
+ info_text = f"[bold cyan]{skill_name}[/bold cyan]\n\n"
431
+
432
+ if desc := skill_info.get("description"):
433
+ info_text += f"{desc}\n\n"
434
+
435
+ if category := skill_info.get("category"):
436
+ info_text += f"[bold]Category:[/bold] {category}\n"
437
+
438
+ if version := skill_info.get("version"):
439
+ info_text += f"[bold]Version:[/bold] {version}\n"
440
+
441
+ if source := skill_info.get("source"):
442
+ info_text += f"[bold]Source:[/bold] {source}\n"
443
+
444
+ # Show agents using this skill
445
+ agents_using = self.skills_service.get_agents_for_skill(skill_name)
446
+ if agents_using:
447
+ info_text += (
448
+ f"\n[bold]Used by agents:[/bold] {', '.join(agents_using)}\n"
449
+ )
450
+
451
+ console.print(
452
+ Panel(info_text, title="Skill Information", border_style="cyan")
453
+ )
454
+
455
+ # Show content if requested
456
+ if show_content:
457
+ skill_path = self.skills_service.get_skill_path(skill_name)
458
+ skill_md = skill_path / "SKILL.md"
459
+
460
+ if skill_md.exists():
461
+ console.print("\n[bold cyan]Skill Content:[/bold cyan]\n")
462
+ content = skill_md.read_text()
463
+ console.print(Markdown(content))
464
+ else:
465
+ console.print(
466
+ f"\n[yellow]SKILL.md not found at {skill_md}[/yellow]"
467
+ )
468
+
469
+ return CommandResult(success=True, exit_code=0)
470
+
471
+ except Exception as e:
472
+ console.print(f"[red]Error showing skill info: {e}[/red]")
473
+ return CommandResult(success=False, message=str(e), exit_code=1)
474
+
475
+ def _manage_config(self, args) -> CommandResult:
476
+ """View or edit skills configuration."""
477
+ try:
478
+ scope = getattr(args, "scope", "project")
479
+ edit = getattr(args, "edit", False)
480
+ show_path = getattr(args, "path", False)
481
+
482
+ config_path = self.skills_service.get_config_path(scope)
483
+
484
+ if show_path:
485
+ console.print(
486
+ f"\n[cyan]Configuration path ({scope}):[/cyan] {config_path}\n"
487
+ )
488
+ return CommandResult(success=True, exit_code=0)
489
+
490
+ if not config_path.exists():
491
+ console.print(
492
+ f"\n[yellow]Configuration file does not exist: {config_path}[/yellow]"
493
+ )
494
+ console.print("[dim]Would you like to create it? (y/n):[/dim] ", end="")
495
+
496
+ if input().lower() == "y":
497
+ self.skills_service.create_default_config(scope)
498
+ console.print(
499
+ f"[green]Created default configuration at {config_path}[/green]\n"
500
+ )
501
+ else:
502
+ return CommandResult(success=False, exit_code=1)
503
+
504
+ if edit:
505
+ # Open in editor
506
+ editor = os.environ.get("EDITOR", "nano")
507
+ try:
508
+ subprocess.run([editor, str(config_path)], check=True) # nosec B603
509
+ console.print(
510
+ f"\n[green]Configuration saved to {config_path}[/green]\n"
511
+ )
512
+ return CommandResult(success=True, exit_code=0)
513
+ except subprocess.CalledProcessError as e:
514
+ console.print(f"[red]Error opening editor: {e}[/red]")
515
+ return CommandResult(success=False, exit_code=1)
516
+ else:
517
+ # Display config
518
+ console.print(
519
+ f"\n[bold cyan]Skills Configuration ({scope}):[/bold cyan]\n"
520
+ )
521
+ console.print(f"[dim]Path: {config_path}[/dim]\n")
522
+
523
+ import yaml
524
+
525
+ config = yaml.safe_load(config_path.read_text())
526
+ console.print(yaml.dump(config, default_flow_style=False))
527
+
528
+ return CommandResult(success=True, exit_code=0)
529
+
530
+ except Exception as e:
531
+ console.print(f"[red]Error managing configuration: {e}[/red]")
532
+ return CommandResult(success=False, message=str(e), exit_code=1)
533
+
534
+ def _deploy_from_github(self, args) -> CommandResult:
535
+ """Deploy skills from GitHub repository."""
536
+ try:
537
+ collection = getattr(args, "collection", None)
538
+ toolchain = getattr(args, "toolchain", None)
539
+ categories = getattr(args, "categories", None)
540
+ force = getattr(args, "force", False)
541
+
542
+ if collection:
543
+ console.print(
544
+ f"\n[bold cyan]Deploying skills from collection '{collection}'...[/bold cyan]\n"
545
+ )
546
+ else:
547
+ console.print(
548
+ "\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
549
+ )
550
+
551
+ # Selective deployment is ALWAYS enabled (deploy only agent-referenced skills)
552
+ # This ensures only skills linked to deployed agents are deployed
553
+ result = self.skills_deployer.deploy_skills(
554
+ collection=collection,
555
+ toolchain=toolchain,
556
+ categories=categories,
557
+ force=force,
558
+ selective=True, # Always use selective deployment
559
+ )
560
+
561
+ # Display results
562
+ # Show selective mode summary
563
+ if result.get("selective_mode"):
564
+ total_available = result.get("total_available", 0)
565
+ deployed_count = result["deployed_count"]
566
+ console.print(
567
+ f"[cyan]📌 Selective deployment: {deployed_count} agent-referenced skills "
568
+ f"(out of {total_available} available)[/cyan]"
569
+ )
570
+ console.print(
571
+ "[dim]Use 'claude-mpm skills configure' to manually select skills[/dim]\n"
572
+ )
573
+
574
+ if result["deployed_count"] > 0:
575
+ console.print(
576
+ f"[green]✓ Deployed {result['deployed_count']} skill(s):[/green]"
577
+ )
578
+ for skill in result["deployed_skills"]:
579
+ console.print(f" • {skill}")
580
+ console.print()
581
+
582
+ if result["skipped_count"] > 0:
583
+ console.print(
584
+ f"[yellow]⊘ Skipped {result['skipped_count']} skill(s) (already deployed):[/yellow]"
585
+ )
586
+ for skill in result["skipped_skills"]:
587
+ console.print(f" • {skill}")
588
+ console.print("[dim]Use --force to redeploy[/dim]\n")
589
+
590
+ if result["errors"]:
591
+ console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
592
+ for error in result["errors"]:
593
+ console.print(f" • {error}")
594
+ console.print()
595
+
596
+ # Show cleanup results
597
+ cleanup = result.get("cleanup", {})
598
+ if cleanup.get("removed_count", 0) > 0:
599
+ console.print(
600
+ f"[yellow]🧹 Removed {cleanup['removed_count']} orphaned skill(s):[/yellow]"
601
+ )
602
+ for skill in cleanup.get("removed_skills", []):
603
+ console.print(f" • {skill}")
604
+ console.print()
605
+
606
+ # Show restart instructions
607
+ if result["restart_instructions"]:
608
+ console.print(
609
+ Panel(
610
+ result["restart_instructions"],
611
+ title="⚠️ Important",
612
+ border_style="yellow",
613
+ )
614
+ )
615
+ console.print()
616
+
617
+ exit_code = 1 if result["errors"] else 0
618
+ return CommandResult(success=not result["errors"], exit_code=exit_code)
619
+
620
+ except Exception as e:
621
+ console.print(f"[red]Error deploying from GitHub: {e}[/red]")
622
+ return CommandResult(success=False, message=str(e), exit_code=1)
623
+
624
+ def _list_available_github_skills(self, args) -> CommandResult:
625
+ """List available skills from GitHub repository."""
626
+ try:
627
+ collection = getattr(args, "collection", None)
628
+
629
+ if collection:
630
+ console.print(
631
+ f"\n[bold cyan]Fetching skills from collection '{collection}'...[/bold cyan]\n"
632
+ )
633
+ else:
634
+ console.print(
635
+ "\n[bold cyan]Fetching skills from default collection...[/bold cyan]\n"
636
+ )
637
+
638
+ result = self.skills_deployer.list_available_skills(collection=collection)
639
+
640
+ if result.get("error"):
641
+ console.print(f"[red]Error: {result['error']}[/red]")
642
+ return CommandResult(
643
+ success=False, message=result["error"], exit_code=1
644
+ )
645
+
646
+ console.print(
647
+ f"[green]Found {result['total_skills']} available skills[/green]\n"
648
+ )
649
+
650
+ # Display by category
651
+ console.print("[bold yellow]By Category:[/bold yellow]\n")
652
+ for category, skills in sorted(result["by_category"].items()):
653
+ console.print(f" [cyan]{category}[/cyan] ({len(skills)} skills)")
654
+ if hasattr(args, "verbose") and args.verbose:
655
+ for skill in sorted(skills, key=lambda s: s.get("name", "")):
656
+ console.print(f" • {skill.get('name', 'unknown')}")
657
+ console.print()
658
+
659
+ # Display by toolchain
660
+ console.print("[bold yellow]By Toolchain:[/bold yellow]\n")
661
+ for toolchain, skills in sorted(result["by_toolchain"].items()):
662
+ console.print(f" [cyan]{toolchain}[/cyan] ({len(skills)} skills)")
663
+ if hasattr(args, "verbose") and args.verbose:
664
+ for skill in sorted(skills, key=lambda s: s.get("name", "")):
665
+ console.print(f" • {skill.get('name', 'unknown')}")
666
+ console.print()
667
+
668
+ return CommandResult(success=True, exit_code=0)
669
+
670
+ except Exception as e:
671
+ console.print(f"[red]Error listing available skills: {e}[/red]")
672
+ return CommandResult(success=False, message=str(e), exit_code=1)
673
+
674
+ def _check_deployed_skills(self, args) -> CommandResult:
675
+ """Check currently deployed skills in ~/.claude/skills/."""
676
+ try:
677
+ # Get deployed skills
678
+ deployed_result = self.skills_deployer.check_deployed_skills()
679
+ deployed_names = {skill["name"] for skill in deployed_result["skills"]}
680
+
681
+ console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
682
+ console.print(
683
+ f"[dim]Directory: {deployed_result['claude_skills_dir']}[/dim]\n"
684
+ )
685
+
686
+ # Fetch available skills from GitHub to get full list
687
+ try:
688
+ available_result = self.skills_deployer.list_available_skills()
689
+ all_skills = available_result.get("skills", [])
690
+ except Exception as e:
691
+ console.print(
692
+ f"[yellow]Warning: Could not fetch available skills: {e}[/yellow]\n"
693
+ )
694
+ all_skills = []
695
+
696
+ # Combine deployed and available skills
697
+ skill_map = {}
698
+
699
+ # Add available skills
700
+ for skill in all_skills:
701
+ skill_name = skill.get("name", "")
702
+ if skill_name:
703
+ skill_map[skill_name] = {
704
+ "name": skill.get("display_name")
705
+ or skill_name.replace("-", " ").title(),
706
+ "skill_id": skill_name,
707
+ "source": "MPM Skills",
708
+ "is_deployed": skill_name in deployed_names,
709
+ }
710
+
711
+ # Add any deployed skills not in available list (local/custom skills)
712
+ for skill in deployed_result["skills"]:
713
+ skill_name = skill["name"]
714
+ if skill_name not in skill_map:
715
+ skill_map[skill_name] = {
716
+ "name": skill_name.replace("-", " ").title(),
717
+ "skill_id": skill_name,
718
+ "source": "Local",
719
+ "is_deployed": True,
720
+ }
721
+
722
+ if not skill_map:
723
+ console.print("[yellow]No skills available.[/yellow]")
724
+ console.print(
725
+ "[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
726
+ )
727
+ return CommandResult(success=True, exit_code=0)
728
+
729
+ # Create table matching agent management format
730
+ table = Table(show_header=True, header_style="bold cyan")
731
+ table.add_column("#", style="bright_black", width=6, no_wrap=True)
732
+ table.add_column(
733
+ "Skill ID", style="bright_black", no_wrap=True, overflow="ellipsis"
734
+ )
735
+ table.add_column(
736
+ "Name", style="bright_cyan", no_wrap=True, overflow="ellipsis"
737
+ )
738
+ table.add_column("Source", style="bright_yellow", no_wrap=True)
739
+ table.add_column("Status", style="bright_black", no_wrap=True)
740
+
741
+ # Sort skills by name for consistent display
742
+ sorted_skills = sorted(skill_map.values(), key=lambda s: s["skill_id"])
743
+
744
+ for idx, skill in enumerate(sorted_skills, 1):
745
+ status = (
746
+ "[green]Installed[/green]" if skill["is_deployed"] else "Available"
747
+ )
748
+ table.add_row(
749
+ str(idx), skill["skill_id"], skill["name"], skill["source"], status
750
+ )
751
+
752
+ console.print(table)
753
+ console.print()
754
+
755
+ # Show summary
756
+ deployed_count = sum(1 for s in skill_map.values() if s["is_deployed"])
757
+ console.print(
758
+ f"[dim]Showing {len(skill_map)} skills ({deployed_count} installed, "
759
+ f"{len(skill_map) - deployed_count} available)[/dim]\n"
760
+ )
761
+
762
+ return CommandResult(success=True, exit_code=0)
763
+
764
+ except Exception as e:
765
+ console.print(f"[red]Error checking deployed skills: {e}[/red]")
766
+ return CommandResult(success=False, message=str(e), exit_code=1)
767
+
768
+ def _remove_skills(self, args) -> CommandResult:
769
+ """Remove deployed skills."""
770
+ try:
771
+ skill_names = getattr(args, "skill_names", None)
772
+ remove_all = getattr(args, "all", False)
773
+
774
+ if remove_all:
775
+ skill_names = None
776
+ console.print(
777
+ "\n[bold yellow]Removing ALL deployed skills...[/bold yellow]\n"
778
+ )
779
+ elif skill_names:
780
+ console.print(
781
+ f"\n[bold cyan]Removing {len(skill_names)} skill(s)...[/bold cyan]\n"
782
+ )
783
+ else:
784
+ console.print("[red]Error: Specify skill names or use --all[/red]")
785
+ return CommandResult(success=False, exit_code=1)
786
+
787
+ result = self.skills_deployer.remove_skills(skill_names)
788
+
789
+ if result["removed_count"] > 0:
790
+ console.print(
791
+ f"[green]✓ Removed {result['removed_count']} skill(s):[/green]"
792
+ )
793
+ for skill in result["removed_skills"]:
794
+ console.print(f" • {skill}")
795
+ console.print()
796
+
797
+ if result["errors"]:
798
+ console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
799
+ for error in result["errors"]:
800
+ console.print(f" • {error}")
801
+ console.print()
802
+
803
+ exit_code = 1 if result["errors"] else 0
804
+ return CommandResult(success=not result["errors"], exit_code=exit_code)
805
+
806
+ except Exception as e:
807
+ console.print(f"[red]Error removing skills: {e}[/red]")
808
+ return CommandResult(success=False, message=str(e), exit_code=1)
809
+
810
+ def _get_skill_metadata(self, skill_name: str) -> Optional[dict]:
811
+ """Get skill metadata from SKILL.md file."""
812
+ try:
813
+ skill_path = self.skills_service.get_skill_path(skill_name)
814
+ skill_md = skill_path / "SKILL.md"
815
+
816
+ if not skill_md.exists():
817
+ return None
818
+
819
+ # Parse SKILL.md metadata
820
+ content = skill_md.read_text()
821
+ return self.skills_service.parse_skill_metadata(content)
822
+
823
+ except Exception:
824
+ return None
825
+
826
+ # === Collection Management Commands ===
827
+
828
+ def _collection_list(self, args) -> CommandResult:
829
+ """List all configured skill collections."""
830
+ try:
831
+ result = self.skills_deployer.list_collections()
832
+
833
+ console.print("\n[bold cyan]Skill Collections:[/bold cyan]\n")
834
+ console.print(
835
+ f"[dim]Default collection: {result['default_collection']}[/dim]"
836
+ )
837
+ console.print(
838
+ f"[dim]Enabled: {result['enabled_count']} / {result['total_count']}[/dim]\n"
839
+ )
840
+
841
+ if not result["collections"]:
842
+ console.print("[yellow]No collections configured.[/yellow]")
843
+ console.print(
844
+ "[dim]Use 'claude-mpm skills collection-add' to add a collection.[/dim]\n"
845
+ )
846
+ return CommandResult(success=True, exit_code=0)
847
+
848
+ # Create table for collections
849
+ table = Table(show_header=True, header_style="bold cyan")
850
+ table.add_column("Name", style="green")
851
+ table.add_column("URL", style="white")
852
+ table.add_column("Priority", justify="center")
853
+ table.add_column("Enabled", justify="center")
854
+ table.add_column("Last Update", style="dim")
855
+ table.add_column("Default", justify="center")
856
+
857
+ # Sort by priority
858
+ sorted_collections = sorted(
859
+ result["collections"].items(), key=lambda x: x[1].get("priority", 999)
860
+ )
861
+
862
+ for name, config in sorted_collections:
863
+ enabled_icon = "✓" if config.get("enabled", True) else "✗"
864
+ default_icon = "⭐" if name == result["default_collection"] else ""
865
+ last_update = config.get("last_update") or "Never"
866
+
867
+ table.add_row(
868
+ name,
869
+ config["url"],
870
+ str(config.get("priority", "N/A")),
871
+ enabled_icon,
872
+ last_update,
873
+ default_icon,
874
+ )
875
+
876
+ console.print(table)
877
+ console.print()
878
+
879
+ return CommandResult(success=True, exit_code=0)
880
+
881
+ except Exception as e:
882
+ console.print(f"[red]Error listing collections: {e}[/red]")
883
+ return CommandResult(success=False, message=str(e), exit_code=1)
884
+
885
+ def _collection_add(self, args) -> CommandResult:
886
+ """Add a new skill collection."""
887
+ try:
888
+ name = getattr(args, "collection_name", None)
889
+ url = getattr(args, "collection_url", None)
890
+ priority = getattr(args, "priority", 99)
891
+
892
+ if not name or not url:
893
+ console.print("[red]Error: Collection name and URL are required[/red]")
894
+ console.print(
895
+ "[dim]Usage: claude-mpm skills collection-add NAME URL [--priority N][/dim]"
896
+ )
897
+ return CommandResult(success=False, exit_code=1)
898
+
899
+ console.print(f"\n[bold cyan]Adding collection '{name}'...[/bold cyan]\n")
900
+
901
+ result = self.skills_deployer.add_collection(name, url, priority)
902
+
903
+ console.print(f"[green]✓ {result['message']}[/green]")
904
+ console.print(f" [dim]URL: {url}[/dim]")
905
+ console.print(f" [dim]Priority: {priority}[/dim]\n")
906
+
907
+ return CommandResult(success=True, exit_code=0)
908
+
909
+ except ValueError as e:
910
+ console.print(f"[red]Error: {e}[/red]")
911
+ return CommandResult(success=False, message=str(e), exit_code=1)
912
+ except Exception as e:
913
+ console.print(f"[red]Unexpected error: {e}[/red]")
914
+ return CommandResult(success=False, message=str(e), exit_code=1)
915
+
916
+ def _collection_remove(self, args) -> CommandResult:
917
+ """Remove a skill collection."""
918
+ try:
919
+ name = getattr(args, "collection_name", None)
920
+
921
+ if not name:
922
+ console.print("[red]Error: Collection name is required[/red]")
923
+ console.print(
924
+ "[dim]Usage: claude-mpm skills collection-remove NAME[/dim]"
925
+ )
926
+ return CommandResult(success=False, exit_code=1)
927
+
928
+ console.print(
929
+ f"\n[bold yellow]Removing collection '{name}'...[/bold yellow]\n"
930
+ )
931
+
932
+ result = self.skills_deployer.remove_collection(name)
933
+
934
+ console.print(f"[green]✓ {result['message']}[/green]")
935
+ if result.get("directory_removed"):
936
+ console.print(" [dim]Collection directory removed[/dim]")
937
+ elif result.get("directory_error"):
938
+ console.print(
939
+ f" [yellow]Warning: {result['directory_error']}[/yellow]"
940
+ )
941
+ console.print()
942
+
943
+ return CommandResult(success=True, exit_code=0)
944
+
945
+ except ValueError as e:
946
+ console.print(f"[red]Error: {e}[/red]")
947
+ return CommandResult(success=False, message=str(e), exit_code=1)
948
+ except Exception as e:
949
+ console.print(f"[red]Unexpected error: {e}[/red]")
950
+ return CommandResult(success=False, message=str(e), exit_code=1)
951
+
952
+ def _collection_enable(self, args) -> CommandResult:
953
+ """Enable a disabled collection."""
954
+ try:
955
+ name = getattr(args, "collection_name", None)
956
+
957
+ if not name:
958
+ console.print("[red]Error: Collection name is required[/red]")
959
+ console.print(
960
+ "[dim]Usage: claude-mpm skills collection-enable NAME[/dim]"
961
+ )
962
+ return CommandResult(success=False, exit_code=1)
963
+
964
+ result = self.skills_deployer.enable_collection(name)
965
+
966
+ console.print(f"\n[green]✓ {result['message']}[/green]\n")
967
+
968
+ return CommandResult(success=True, exit_code=0)
969
+
970
+ except ValueError as e:
971
+ console.print(f"[red]Error: {e}[/red]")
972
+ return CommandResult(success=False, message=str(e), exit_code=1)
973
+ except Exception as e:
974
+ console.print(f"[red]Unexpected error: {e}[/red]")
975
+ return CommandResult(success=False, message=str(e), exit_code=1)
976
+
977
+ def _collection_disable(self, args) -> CommandResult:
978
+ """Disable a collection."""
979
+ try:
980
+ name = getattr(args, "collection_name", None)
981
+
982
+ if not name:
983
+ console.print("[red]Error: Collection name is required[/red]")
984
+ console.print(
985
+ "[dim]Usage: claude-mpm skills collection-disable NAME[/dim]"
986
+ )
987
+ return CommandResult(success=False, exit_code=1)
988
+
989
+ result = self.skills_deployer.disable_collection(name)
990
+
991
+ console.print(f"\n[green]✓ {result['message']}[/green]\n")
992
+
993
+ return CommandResult(success=True, exit_code=0)
994
+
995
+ except ValueError as e:
996
+ console.print(f"[red]Error: {e}[/red]")
997
+ return CommandResult(success=False, message=str(e), exit_code=1)
998
+ except Exception as e:
999
+ console.print(f"[red]Unexpected error: {e}[/red]")
1000
+ return CommandResult(success=False, message=str(e), exit_code=1)
1001
+
1002
+ def _collection_set_default(self, args) -> CommandResult:
1003
+ """Set the default collection."""
1004
+ try:
1005
+ name = getattr(args, "collection_name", None)
1006
+
1007
+ if not name:
1008
+ console.print("[red]Error: Collection name is required[/red]")
1009
+ console.print(
1010
+ "[dim]Usage: claude-mpm skills collection-set-default NAME[/dim]"
1011
+ )
1012
+ return CommandResult(success=False, exit_code=1)
1013
+
1014
+ result = self.skills_deployer.set_default_collection(name)
1015
+
1016
+ console.print(f"\n[green]✓ {result['message']}[/green]")
1017
+ if result.get("previous_default"):
1018
+ console.print(f" [dim]Previous: {result['previous_default']}[/dim]")
1019
+ console.print()
1020
+
1021
+ return CommandResult(success=True, exit_code=0)
1022
+
1023
+ except ValueError as e:
1024
+ console.print(f"[red]Error: {e}[/red]")
1025
+ return CommandResult(success=False, message=str(e), exit_code=1)
1026
+ except Exception as e:
1027
+ console.print(f"[red]Unexpected error: {e}[/red]")
1028
+
1029
+ def _configure_skills(self, args) -> CommandResult:
1030
+ """Interactive skills configuration using configuration.yaml.
1031
+
1032
+ Provides checkbox-based selection interface matching agents configure UX:
1033
+ - Shows current mode (user_defined vs agent_referenced)
1034
+ - If agent mode: shows agent-scanned skills
1035
+ - Allows switching to user_defined mode and selecting skills
1036
+ - Can reset to agent mode (clears user_defined)
1037
+ - Saves selections to configuration.yaml
1038
+
1039
+ Configuration structure:
1040
+ ```yaml
1041
+ skills:
1042
+ agent_referenced: # Auto-populated from agent scan (read-only)
1043
+ - systematic-debugging
1044
+ - typescript-core
1045
+ user_defined: # User override - if set, ONLY these are deployed
1046
+ [] # Empty = use agent_referenced
1047
+ ```
1048
+ """
1049
+ try:
1050
+ from pathlib import Path
1051
+
1052
+ import questionary
1053
+ import yaml
1054
+ from questionary import Choice, Style
1055
+ from rich.prompt import Prompt
1056
+
1057
+ from ...services.skills.selective_skill_deployer import (
1058
+ get_skills_to_deploy,
1059
+ )
1060
+
1061
+ # Questionary style (matching agents configure)
1062
+ QUESTIONARY_STYLE = Style(
1063
+ [
1064
+ (
1065
+ "selected",
1066
+ "fg:#e0e0e0 bold",
1067
+ ), # Light gray - excellent readability
1068
+ (
1069
+ "pointer",
1070
+ "fg:#ffd700 bold",
1071
+ ), # Gold/yellow - highly visible pointer
1072
+ ("highlighted", "fg:#e0e0e0"), # Light gray - clear hover state
1073
+ (
1074
+ "question",
1075
+ "fg:#e0e0e0 bold",
1076
+ ), # Light gray bold - prominent questions
1077
+ ("checkbox", "fg:#00ff00"), # Green - for checked boxes
1078
+ (
1079
+ "checkbox-selected",
1080
+ "fg:#00ff00 bold",
1081
+ ), # Green bold - for checked selected boxes
1082
+ ]
1083
+ )
1084
+
1085
+ console.print("\n[bold cyan]Skills Configuration Manager[/bold cyan]\n")
1086
+
1087
+ # Load current configuration
1088
+ project_config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
1089
+ skills_to_deploy, current_mode = get_skills_to_deploy(project_config_path)
1090
+
1091
+ # Display current mode and skill count
1092
+ console.print(f"[bold]Current Mode:[/bold] [cyan]{current_mode}[/cyan]")
1093
+ console.print(
1094
+ f"[bold]Active Skills:[/bold] {len(skills_to_deploy)} skills\n"
1095
+ )
1096
+
1097
+ if current_mode == "agent_referenced":
1098
+ console.print(
1099
+ "[dim]Agent mode: Skills are auto-detected from deployed agents[/dim]"
1100
+ )
1101
+ console.print(
1102
+ "[dim]Switch to user mode to manually select skills[/dim]\n"
1103
+ )
1104
+ else:
1105
+ console.print(
1106
+ "[dim]User mode: You've manually selected which skills to deploy[/dim]"
1107
+ )
1108
+ console.print("[dim]Reset to agent mode to use auto-detection[/dim]\n")
1109
+
1110
+ # Offer mode switching
1111
+ action_choices = [
1112
+ Choice("View current skills", value="view"),
1113
+ Choice("Switch to user mode (manual selection)", value="switch_user"),
1114
+ Choice("Reset to agent mode (auto-detection)", value="reset_agent"),
1115
+ Choice("Cancel", value="cancel"),
1116
+ ]
1117
+
1118
+ action = questionary.select(
1119
+ "What would you like to do?",
1120
+ choices=action_choices,
1121
+ style=QUESTIONARY_STYLE,
1122
+ ).ask()
1123
+
1124
+ if action == "cancel" or action is None:
1125
+ console.print("[yellow]Configuration cancelled[/yellow]")
1126
+ return CommandResult(success=True, exit_code=0)
1127
+
1128
+ if action == "view":
1129
+ # Display current skills
1130
+ console.print("\n[bold]Current Skills:[/bold]\n")
1131
+ for skill in sorted(skills_to_deploy):
1132
+ console.print(f" • {skill}")
1133
+ console.print()
1134
+ Prompt.ask("\nPress Enter to continue")
1135
+ return CommandResult(success=True, exit_code=0)
1136
+
1137
+ if action == "reset_agent":
1138
+ # Reset to agent mode by clearing user_defined
1139
+ with open(project_config_path, encoding="utf-8") as f:
1140
+ config = yaml.safe_load(f) or {}
1141
+
1142
+ if "skills" not in config:
1143
+ config["skills"] = {}
1144
+
1145
+ config["skills"]["user_defined"] = []
1146
+
1147
+ with open(project_config_path, "w", encoding="utf-8") as f:
1148
+ yaml.dump(config, f, default_flow_style=False, sort_keys=False)
1149
+
1150
+ console.print(
1151
+ "\n[green]✓ Reset to agent mode - skills will be auto-detected from agents[/green]\n"
1152
+ )
1153
+ Prompt.ask("\nPress Enter to continue")
1154
+ return CommandResult(success=True, exit_code=0)
1155
+
1156
+ # Switch to user mode - manual skill selection
1157
+ if action == "switch_user":
1158
+ console.print(
1159
+ "\n[bold cyan]Switching to User Mode - Manual Skill Selection[/bold cyan]\n"
1160
+ )
1161
+ console.print("[dim]Fetching available skills from GitHub...[/dim]\n")
1162
+
1163
+ # Get available skills
1164
+ available_result = self.skills_deployer.list_available_skills()
1165
+
1166
+ if available_result.get("error"):
1167
+ console.print(f"[red]Error: {available_result['error']}[/red]")
1168
+ return CommandResult(
1169
+ success=False, message=available_result["error"], exit_code=1
1170
+ )
1171
+
1172
+ # Flatten skills by category
1173
+ all_skills = []
1174
+ for category, skills in available_result.get("by_category", {}).items():
1175
+ for skill in skills:
1176
+ skill_name = skill.get("name", "unknown")
1177
+ is_currently_selected = skill_name in skills_to_deploy
1178
+ skill_info = {
1179
+ "name": skill_name,
1180
+ "category": category,
1181
+ "is_selected": is_currently_selected,
1182
+ }
1183
+ all_skills.append(skill_info)
1184
+
1185
+ # Sort by selection status (selected first), then by name
1186
+ all_skills.sort(key=lambda s: (not s["is_selected"], s["name"]))
1187
+
1188
+ # Build checkbox choices
1189
+ while True:
1190
+ skill_choices = []
1191
+
1192
+ for skill in all_skills:
1193
+ skill_name = skill["name"]
1194
+ category = skill["category"]
1195
+ is_selected = skill["is_selected"]
1196
+
1197
+ # Format: "skill-name (category)"
1198
+ choice_text = f"{skill_name} ({category})"
1199
+
1200
+ # Pre-select if currently in skills_to_deploy
1201
+ choice = Choice(
1202
+ title=choice_text, value=skill_name, checked=is_selected
1203
+ )
1204
+
1205
+ skill_choices.append(choice)
1206
+
1207
+ # Display checkbox selection
1208
+ selected_skills = questionary.checkbox(
1209
+ "Select skills (Space to toggle, Enter to confirm):",
1210
+ choices=skill_choices,
1211
+ style=QUESTIONARY_STYLE,
1212
+ ).ask()
1213
+
1214
+ if selected_skills is None:
1215
+ # User cancelled (Ctrl+C)
1216
+ console.print("[yellow]Skills configuration cancelled[/yellow]")
1217
+ return CommandResult(success=True, exit_code=0)
1218
+
1219
+ # Show summary
1220
+ console.print("\n[bold]Selected Skills:[/bold]")
1221
+ console.print(f" {len(selected_skills)} skills selected\n")
1222
+
1223
+ if selected_skills:
1224
+ for skill in sorted(selected_skills):
1225
+ console.print(f" • {skill}")
1226
+ console.print()
1227
+
1228
+ # Ask user to confirm, adjust, or cancel
1229
+ confirm_action = questionary.select(
1230
+ "\nWhat would you like to do?",
1231
+ choices=[
1232
+ Choice("Save to configuration", value="apply"),
1233
+ Choice("Adjust selection", value="adjust"),
1234
+ Choice("Cancel", value="cancel"),
1235
+ ],
1236
+ default="apply",
1237
+ style=QUESTIONARY_STYLE,
1238
+ ).ask()
1239
+
1240
+ if confirm_action == "cancel":
1241
+ console.print("[yellow]Configuration cancelled[/yellow]")
1242
+ Prompt.ask("\nPress Enter to continue")
1243
+ return CommandResult(success=True, exit_code=0)
1244
+
1245
+ if confirm_action == "adjust":
1246
+ # Update selection state and loop back
1247
+ for skill in all_skills:
1248
+ skill["is_selected"] = skill["name"] in selected_skills
1249
+ console.print("\n[dim]Adjusting selection...[/dim]\n")
1250
+ continue
1251
+
1252
+ # Save to configuration.yaml
1253
+ with open(project_config_path, encoding="utf-8") as f:
1254
+ config = yaml.safe_load(f) or {}
1255
+
1256
+ if "skills" not in config:
1257
+ config["skills"] = {}
1258
+
1259
+ config["skills"]["user_defined"] = sorted(selected_skills)
1260
+
1261
+ with open(project_config_path, "w", encoding="utf-8") as f:
1262
+ yaml.dump(config, f, default_flow_style=False, sort_keys=False)
1263
+
1264
+ console.print(
1265
+ f"\n[green]✓ Saved {len(selected_skills)} skills to user_defined mode[/green]"
1266
+ )
1267
+ console.print(
1268
+ "[yellow]⚠️ Important:[/yellow] Run [cyan]claude-mpm init[/cyan] to deploy these skills\n"
1269
+ )
1270
+ Prompt.ask("\nPress Enter to continue")
1271
+
1272
+ # Exit the loop after successful save
1273
+ break
1274
+
1275
+ return CommandResult(success=True, exit_code=0)
1276
+
1277
+ except Exception as e:
1278
+ console.print(f"[red]Error in skills configuration: {e}[/red]")
1279
+ import traceback
1280
+
1281
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
1282
+ return CommandResult(success=False, message=str(e), exit_code=1)
1283
+
1284
+ def _select_skills_interactive(self, args) -> CommandResult:
1285
+ """Interactive skill selection with topic grouping.
1286
+
1287
+ This command provides a two-tier selection interface:
1288
+ 1. Select topic groups (toolchains) to explore
1289
+ 2. Multi-select skills within each topic group
1290
+
1291
+ Features:
1292
+ - Groups skills by toolchain (universal, python, typescript, etc.)
1293
+ - Shows skills auto-included by agent dependencies
1294
+ - Displays token counts for each skill
1295
+ - Updates config and runs reconciliation
1296
+
1297
+ Returns:
1298
+ CommandResult with success/failure status
1299
+ """
1300
+ try:
1301
+ from ...cli.interactive.skill_selector import run_skill_selector
1302
+ from ...core.unified_config import UnifiedConfig
1303
+ from ...services.agents.deployment.deployment_reconciler import (
1304
+ DeploymentReconciler,
1305
+ )
1306
+
1307
+ console.print("\n[bold cyan]Interactive Skill Selector[/bold cyan]\n")
1308
+
1309
+ # Run skill selector
1310
+ selected_skills = run_skill_selector()
1311
+
1312
+ if selected_skills is None:
1313
+ console.print("\n[yellow]Skill selection cancelled[/yellow]")
1314
+ return CommandResult(success=True, exit_code=0)
1315
+
1316
+ # Update config with selected skills
1317
+ config = UnifiedConfig()
1318
+ config.skills.enabled = selected_skills
1319
+
1320
+ # Save config
1321
+ try:
1322
+ config.save()
1323
+ console.print(
1324
+ f"\n[green]✓ Saved {len(selected_skills)} skills to configuration[/green]"
1325
+ )
1326
+ except Exception as e:
1327
+ console.print(f"\n[red]Failed to save configuration: {e}[/red]")
1328
+ return CommandResult(success=False, message=str(e), exit_code=1)
1329
+
1330
+ # Run reconciliation to deploy skills
1331
+ console.print("\n[cyan]Running skill reconciliation...[/cyan]")
1332
+ reconciler = DeploymentReconciler(config)
1333
+
1334
+ try:
1335
+ from pathlib import Path
1336
+
1337
+ project_path = Path.cwd()
1338
+ result = reconciler.reconcile_skills(project_path)
1339
+
1340
+ if result.deployed:
1341
+ console.print(
1342
+ f" [green]✓ Deployed: {', '.join(result.deployed)}[/green]"
1343
+ )
1344
+ if result.removed:
1345
+ console.print(
1346
+ f" [yellow]✓ Removed: {', '.join(result.removed)}[/yellow]"
1347
+ )
1348
+ if result.errors:
1349
+ for error in result.errors:
1350
+ console.print(f" [red]✗ {error}[/red]")
1351
+
1352
+ if result.success:
1353
+ console.print(
1354
+ "\n[bold green]✓ Skill deployment complete![/bold green]"
1355
+ )
1356
+ return CommandResult(success=True, exit_code=0)
1357
+ console.print(
1358
+ f"\n[yellow]⚠ Deployment had {len(result.errors)} errors[/yellow]"
1359
+ )
1360
+ return CommandResult(
1361
+ success=False,
1362
+ message=f"{len(result.errors)} deployment errors",
1363
+ exit_code=1,
1364
+ )
1365
+
1366
+ except Exception as e:
1367
+ console.print(f"\n[red]Reconciliation failed: {e}[/red]")
1368
+ return CommandResult(success=False, message=str(e), exit_code=1)
1369
+
1370
+ except Exception as e:
1371
+ console.print(f"[red]Skill selection error: {e}[/red]")
1372
+ import traceback
1373
+
1374
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
1375
+ return CommandResult(success=False, message=str(e), exit_code=1)
1376
+
1377
+
1378
+ def manage_skills(args) -> int:
1379
+ """
1380
+ Main entry point for skills command.
1381
+
1382
+ Args:
1383
+ args: Parsed command-line arguments
1384
+
1385
+ Returns:
1386
+ Exit code (0 for success, non-zero for failure)
1387
+ """
1388
+ command = SkillsManagementCommand()
1389
+
1390
+ # Validate arguments
1391
+ error = command.validate_args(args)
1392
+ if error:
1393
+ console.print(f"[red]Error: {error}[/red]")
1394
+ return 1
1395
+
1396
+ # Run command
1397
+ result = command.run(args)
1398
+ return result.exit_code