claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__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 (484) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +11 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +10 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/interfaces/__init__.py +1 -3
  162. claude_mpm/services/core/interfaces/health.py +1 -4
  163. claude_mpm/services/core/models/__init__.py +2 -11
  164. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  165. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  166. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  167. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  168. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  169. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  171. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  172. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  173. claude_mpm/services/event_bus/direct_relay.py +3 -3
  174. claude_mpm/services/event_bus/event_bus.py +36 -3
  175. claude_mpm/services/events/consumers/logging.py +1 -2
  176. claude_mpm/services/git/__init__.py +21 -0
  177. claude_mpm/services/git/git_operations_service.py +494 -0
  178. claude_mpm/services/github/__init__.py +21 -0
  179. claude_mpm/services/github/github_cli_service.py +397 -0
  180. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  181. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  182. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  183. claude_mpm/services/instructions/__init__.py +9 -0
  184. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  185. claude_mpm/services/local_ops/__init__.py +3 -13
  186. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  187. claude_mpm/services/local_ops/health_manager.py +1 -4
  188. claude_mpm/services/local_ops/process_manager.py +1 -1
  189. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  190. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  191. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  192. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  193. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  194. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  195. claude_mpm/services/memory/optimizer.py +1 -1
  196. claude_mpm/services/model/model_router.py +8 -9
  197. claude_mpm/services/monitor/daemon.py +1 -1
  198. claude_mpm/services/monitor/server.py +2 -2
  199. claude_mpm/services/native_agent_converter.py +356 -0
  200. claude_mpm/services/port_manager.py +1 -1
  201. claude_mpm/services/pr/__init__.py +14 -0
  202. claude_mpm/services/pr/pr_template_service.py +329 -0
  203. claude_mpm/services/project/documentation_manager.py +2 -1
  204. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  205. claude_mpm/services/runner_configuration_service.py +1 -0
  206. claude_mpm/services/self_upgrade_service.py +165 -7
  207. claude_mpm/services/skills/__init__.py +18 -0
  208. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  209. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  210. claude_mpm/services/skills_config.py +547 -0
  211. claude_mpm/services/skills_deployer.py +955 -0
  212. claude_mpm/services/socketio/handlers/connection.py +1 -1
  213. claude_mpm/services/socketio/handlers/git.py +2 -2
  214. claude_mpm/services/socketio/server/core.py +1 -4
  215. claude_mpm/services/socketio/server/main.py +1 -3
  216. claude_mpm/services/system_instructions_service.py +1 -3
  217. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  218. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  219. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  220. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  221. claude_mpm/services/unified/unified_deployment.py +1 -5
  222. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  223. claude_mpm/services/visualization/__init__.py +1 -5
  224. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  225. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  226. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  227. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  228. claude_mpm/skills/skills_registry.py +0 -1
  229. claude_mpm/templates/questions/__init__.py +38 -0
  230. claude_mpm/templates/questions/base.py +193 -0
  231. claude_mpm/templates/questions/pr_strategy.py +311 -0
  232. claude_mpm/templates/questions/project_init.py +385 -0
  233. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  234. claude_mpm/tools/__main__.py +8 -8
  235. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  236. claude_mpm/utils/agent_dependency_loader.py +80 -13
  237. claude_mpm/utils/dependency_cache.py +3 -1
  238. claude_mpm/utils/gitignore.py +241 -0
  239. claude_mpm/utils/log_cleanup.py +3 -3
  240. claude_mpm/utils/progress.py +383 -0
  241. claude_mpm/utils/robust_installer.py +3 -5
  242. claude_mpm/utils/structured_questions.py +619 -0
  243. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  244. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
  245. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  246. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  247. claude_mpm/agents/templates/agent-manager.json +0 -273
  248. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  249. claude_mpm/agents/templates/api_qa.json +0 -180
  250. claude_mpm/agents/templates/clerk-ops.json +0 -235
  251. claude_mpm/agents/templates/code_analyzer.json +0 -101
  252. claude_mpm/agents/templates/content-agent.json +0 -358
  253. claude_mpm/agents/templates/dart_engineer.json +0 -307
  254. claude_mpm/agents/templates/data_engineer.json +0 -225
  255. claude_mpm/agents/templates/documentation.json +0 -211
  256. claude_mpm/agents/templates/engineer.json +0 -210
  257. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  258. claude_mpm/agents/templates/golang_engineer.json +0 -270
  259. claude_mpm/agents/templates/imagemagick.json +0 -264
  260. claude_mpm/agents/templates/java_engineer.json +0 -346
  261. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  262. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  263. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  264. claude_mpm/agents/templates/memory_manager.json +0 -158
  265. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  266. claude_mpm/agents/templates/ops.json +0 -185
  267. claude_mpm/agents/templates/php-engineer.json +0 -287
  268. claude_mpm/agents/templates/product_owner.json +0 -338
  269. claude_mpm/agents/templates/project_organizer.json +0 -140
  270. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  271. claude_mpm/agents/templates/python_engineer.json +0 -387
  272. claude_mpm/agents/templates/qa.json +0 -242
  273. claude_mpm/agents/templates/react_engineer.json +0 -238
  274. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  275. claude_mpm/agents/templates/research.json +0 -188
  276. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  277. claude_mpm/agents/templates/rust_engineer.json +0 -275
  278. claude_mpm/agents/templates/security.json +0 -202
  279. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  280. claude_mpm/agents/templates/ticketing.json +0 -177
  281. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  282. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  283. claude_mpm/agents/templates/version_control.json +0 -157
  284. claude_mpm/agents/templates/web_qa.json +0 -399
  285. claude_mpm/agents/templates/web_ui.json +0 -189
  286. claude_mpm/commands/mpm-tickets.md +0 -102
  287. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  288. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  289. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  290. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  291. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  292. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  293. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  294. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  295. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  296. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  297. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  298. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  299. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  300. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  301. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  302. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  303. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  304. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  305. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  306. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  307. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  308. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  309. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  310. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  311. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  312. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  313. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  314. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  315. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  316. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  317. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  318. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  319. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  320. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  321. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  322. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  323. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  324. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  325. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  326. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  327. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  328. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  329. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  330. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  332. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  333. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  334. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  335. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  337. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  338. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  339. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  340. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  341. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  342. claude_mpm/dashboard/static/built/react/events.js +0 -30
  343. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  344. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  345. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  346. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  347. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  348. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  349. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  350. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  351. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  352. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  353. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  354. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  355. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  356. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  357. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  358. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  359. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  370. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  371. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  372. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  373. claude_mpm/dashboard/static/events.html +0 -607
  374. claude_mpm/dashboard/static/index.html +0 -635
  375. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  376. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  377. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  378. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  379. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  380. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  381. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  382. claude_mpm/dashboard/static/legacy/files.html +0 -747
  383. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  384. claude_mpm/dashboard/static/monitors.html +0 -431
  385. claude_mpm/dashboard/static/production/events.html +0 -659
  386. claude_mpm/dashboard/static/production/main.html +0 -698
  387. claude_mpm/dashboard/static/production/monitors.html +0 -483
  388. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  389. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  390. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  391. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  392. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  393. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  394. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  395. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  396. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  397. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  398. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  399. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  400. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  401. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  402. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  403. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  404. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  405. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  406. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  407. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  408. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  409. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  410. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  411. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  412. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  413. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  414. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  415. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  416. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  417. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  418. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  419. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  420. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  421. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  422. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  423. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  424. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  425. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  426. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  427. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  428. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  429. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  430. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  431. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  435. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  436. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  437. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  452. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  458. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  459. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  460. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  461. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  462. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  463. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  464. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  465. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  467. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  468. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  469. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  470. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  471. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  472. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  473. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  474. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  475. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  476. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  477. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  478. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  479. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  480. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  481. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  482. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  483. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  484. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -3,13 +3,18 @@ Skills command implementation for claude-mpm.
3
3
 
4
4
  WHY: This module provides CLI commands for managing Claude Code skills,
5
5
  exposing SkillsService functionality for skill discovery, deployment, validation,
6
- updates, and configuration.
6
+ updates, and configuration. Also provides GitHub skills deployment via SkillsDeployer.
7
7
 
8
8
  DESIGN DECISIONS:
9
9
  - Use BaseCommand pattern for consistency with other CLI commands
10
10
  - Rich output formatting for user-friendly display
11
11
  - Graceful error handling with informative messages
12
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
13
18
  """
14
19
 
15
20
  import os
@@ -19,8 +24,10 @@ from typing import Optional
19
24
  from rich.console import Console
20
25
  from rich.markdown import Markdown
21
26
  from rich.panel import Panel
27
+ from rich.table import Table
22
28
 
23
29
  from ...constants import SkillsCommands
30
+ from ...services.skills_deployer import SkillsDeployerService
24
31
  from ...skills.skills_service import SkillsService
25
32
  from ..shared import BaseCommand, CommandResult
26
33
 
@@ -33,6 +40,7 @@ class SkillsManagementCommand(BaseCommand):
33
40
  def __init__(self):
34
41
  super().__init__("skills")
35
42
  self._skills_service = None
43
+ self._skills_deployer = None
36
44
 
37
45
  @property
38
46
  def skills_service(self) -> SkillsService:
@@ -41,6 +49,13 @@ class SkillsManagementCommand(BaseCommand):
41
49
  self._skills_service = SkillsService()
42
50
  return self._skills_service
43
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
+
44
59
  def validate_args(self, args) -> Optional[str]:
45
60
  """Validate command arguments."""
46
61
  # Most skills commands are optional, basic validation
@@ -68,6 +83,18 @@ class SkillsManagementCommand(BaseCommand):
68
83
  SkillsCommands.UPDATE.value: self._update_skills,
69
84
  SkillsCommands.INFO.value: self._show_skill_info,
70
85
  SkillsCommands.CONFIG.value: self._manage_config,
86
+ # GitHub deployment commands
87
+ SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
88
+ SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
89
+ SkillsCommands.CHECK_DEPLOYED.value: self._check_deployed_skills,
90
+ SkillsCommands.REMOVE.value: self._remove_skills,
91
+ # Collection management commands
92
+ SkillsCommands.COLLECTION_LIST.value: self._collection_list,
93
+ SkillsCommands.COLLECTION_ADD.value: self._collection_add,
94
+ SkillsCommands.COLLECTION_REMOVE.value: self._collection_remove,
95
+ SkillsCommands.COLLECTION_ENABLE.value: self._collection_enable,
96
+ SkillsCommands.COLLECTION_DISABLE.value: self._collection_disable,
97
+ SkillsCommands.COLLECTION_SET_DEFAULT.value: self._collection_set_default,
71
98
  }
72
99
 
73
100
  handler = command_map.get(args.skills_command)
@@ -448,6 +475,209 @@ class SkillsManagementCommand(BaseCommand):
448
475
  console.print(f"[red]Error managing configuration: {e}[/red]")
449
476
  return CommandResult(success=False, message=str(e), exit_code=1)
450
477
 
478
+ def _deploy_from_github(self, args) -> CommandResult:
479
+ """Deploy skills from GitHub repository."""
480
+ try:
481
+ collection = getattr(args, "collection", None)
482
+ toolchain = getattr(args, "toolchain", None)
483
+ categories = getattr(args, "categories", None)
484
+ force = getattr(args, "force", False)
485
+ all_skills = getattr(args, "all", False)
486
+
487
+ if collection:
488
+ console.print(
489
+ f"\n[bold cyan]Deploying skills from collection '{collection}'...[/bold cyan]\n"
490
+ )
491
+ else:
492
+ console.print(
493
+ "\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
494
+ )
495
+
496
+ # Auto-detect toolchain if not specified and not deploying all
497
+ if not toolchain and not all_skills:
498
+ console.print(
499
+ "[yellow]No toolchain specified. Use --toolchain to filter by language,[/yellow]"
500
+ )
501
+ console.print(
502
+ "[yellow]or --all to deploy all available skills.[/yellow]\n"
503
+ )
504
+
505
+ result = self.skills_deployer.deploy_skills(
506
+ collection=collection,
507
+ toolchain=toolchain,
508
+ categories=categories,
509
+ force=force,
510
+ )
511
+
512
+ # Display results
513
+ if result["deployed_count"] > 0:
514
+ console.print(
515
+ f"[green]✓ Deployed {result['deployed_count']} skill(s):[/green]"
516
+ )
517
+ for skill in result["deployed_skills"]:
518
+ console.print(f" • {skill}")
519
+ console.print()
520
+
521
+ if result["skipped_count"] > 0:
522
+ console.print(
523
+ f"[yellow]⊘ Skipped {result['skipped_count']} skill(s) (already deployed):[/yellow]"
524
+ )
525
+ for skill in result["skipped_skills"]:
526
+ console.print(f" • {skill}")
527
+ console.print("[dim]Use --force to redeploy[/dim]\n")
528
+
529
+ if result["errors"]:
530
+ console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
531
+ for error in result["errors"]:
532
+ console.print(f" • {error}")
533
+ console.print()
534
+
535
+ # Show restart instructions
536
+ if result["restart_instructions"]:
537
+ console.print(
538
+ Panel(
539
+ result["restart_instructions"],
540
+ title="⚠️ Important",
541
+ border_style="yellow",
542
+ )
543
+ )
544
+ console.print()
545
+
546
+ exit_code = 1 if result["errors"] else 0
547
+ return CommandResult(success=not result["errors"], exit_code=exit_code)
548
+
549
+ except Exception as e:
550
+ console.print(f"[red]Error deploying from GitHub: {e}[/red]")
551
+ return CommandResult(success=False, message=str(e), exit_code=1)
552
+
553
+ def _list_available_github_skills(self, args) -> CommandResult:
554
+ """List available skills from GitHub repository."""
555
+ try:
556
+ collection = getattr(args, "collection", None)
557
+
558
+ if collection:
559
+ console.print(
560
+ f"\n[bold cyan]Fetching skills from collection '{collection}'...[/bold cyan]\n"
561
+ )
562
+ else:
563
+ console.print(
564
+ "\n[bold cyan]Fetching skills from default collection...[/bold cyan]\n"
565
+ )
566
+
567
+ result = self.skills_deployer.list_available_skills(collection=collection)
568
+
569
+ if result.get("error"):
570
+ console.print(f"[red]Error: {result['error']}[/red]")
571
+ return CommandResult(
572
+ success=False, message=result["error"], exit_code=1
573
+ )
574
+
575
+ console.print(
576
+ f"[green]Found {result['total_skills']} available skills[/green]\n"
577
+ )
578
+
579
+ # Display by category
580
+ console.print("[bold yellow]By Category:[/bold yellow]\n")
581
+ for category, skills in sorted(result["by_category"].items()):
582
+ console.print(f" [cyan]{category}[/cyan] ({len(skills)} skills)")
583
+ if hasattr(args, "verbose") and args.verbose:
584
+ for skill in sorted(skills, key=lambda s: s.get("name", "")):
585
+ console.print(f" • {skill.get('name', 'unknown')}")
586
+ console.print()
587
+
588
+ # Display by toolchain
589
+ console.print("[bold yellow]By Toolchain:[/bold yellow]\n")
590
+ for toolchain, skills in sorted(result["by_toolchain"].items()):
591
+ console.print(f" [cyan]{toolchain}[/cyan] ({len(skills)} skills)")
592
+ if hasattr(args, "verbose") and args.verbose:
593
+ for skill in sorted(skills, key=lambda s: s.get("name", "")):
594
+ console.print(f" • {skill.get('name', 'unknown')}")
595
+ console.print()
596
+
597
+ return CommandResult(success=True, exit_code=0)
598
+
599
+ except Exception as e:
600
+ console.print(f"[red]Error listing available skills: {e}[/red]")
601
+ return CommandResult(success=False, message=str(e), exit_code=1)
602
+
603
+ def _check_deployed_skills(self, args) -> CommandResult:
604
+ """Check currently deployed skills in ~/.claude/skills/."""
605
+ try:
606
+ result = self.skills_deployer.check_deployed_skills()
607
+
608
+ console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
609
+ console.print(f"[dim]Directory: {result['claude_skills_dir']}[/dim]\n")
610
+
611
+ if result["deployed_count"] == 0:
612
+ console.print("[yellow]No skills currently deployed.[/yellow]")
613
+ console.print(
614
+ "[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
615
+ )
616
+ return CommandResult(success=True, exit_code=0)
617
+
618
+ console.print(
619
+ f"[green]{result['deployed_count']} skill(s) deployed:[/green]\n"
620
+ )
621
+
622
+ # Create table for deployed skills
623
+ table = Table(show_header=True, header_style="bold cyan")
624
+ table.add_column("Skill Name", style="green")
625
+ table.add_column("Path", style="dim")
626
+
627
+ for skill in sorted(result["skills"], key=lambda s: s["name"]):
628
+ table.add_row(skill["name"], skill["path"])
629
+
630
+ console.print(table)
631
+ console.print()
632
+
633
+ return CommandResult(success=True, exit_code=0)
634
+
635
+ except Exception as e:
636
+ console.print(f"[red]Error checking deployed skills: {e}[/red]")
637
+ return CommandResult(success=False, message=str(e), exit_code=1)
638
+
639
+ def _remove_skills(self, args) -> CommandResult:
640
+ """Remove deployed skills."""
641
+ try:
642
+ skill_names = getattr(args, "skill_names", None)
643
+ remove_all = getattr(args, "all", False)
644
+
645
+ if remove_all:
646
+ skill_names = None
647
+ console.print(
648
+ "\n[bold yellow]Removing ALL deployed skills...[/bold yellow]\n"
649
+ )
650
+ elif skill_names:
651
+ console.print(
652
+ f"\n[bold cyan]Removing {len(skill_names)} skill(s)...[/bold cyan]\n"
653
+ )
654
+ else:
655
+ console.print("[red]Error: Specify skill names or use --all[/red]")
656
+ return CommandResult(success=False, exit_code=1)
657
+
658
+ result = self.skills_deployer.remove_skills(skill_names)
659
+
660
+ if result["removed_count"] > 0:
661
+ console.print(
662
+ f"[green]✓ Removed {result['removed_count']} skill(s):[/green]"
663
+ )
664
+ for skill in result["removed_skills"]:
665
+ console.print(f" • {skill}")
666
+ console.print()
667
+
668
+ if result["errors"]:
669
+ console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
670
+ for error in result["errors"]:
671
+ console.print(f" • {error}")
672
+ console.print()
673
+
674
+ exit_code = 1 if result["errors"] else 0
675
+ return CommandResult(success=not result["errors"], exit_code=exit_code)
676
+
677
+ except Exception as e:
678
+ console.print(f"[red]Error removing skills: {e}[/red]")
679
+ return CommandResult(success=False, message=str(e), exit_code=1)
680
+
451
681
  def _get_skill_metadata(self, skill_name: str) -> Optional[dict]:
452
682
  """Get skill metadata from SKILL.md file."""
453
683
  try:
@@ -464,6 +694,210 @@ class SkillsManagementCommand(BaseCommand):
464
694
  except Exception:
465
695
  return None
466
696
 
697
+ # === Collection Management Commands ===
698
+
699
+ def _collection_list(self, args) -> CommandResult:
700
+ """List all configured skill collections."""
701
+ try:
702
+ result = self.skills_deployer.list_collections()
703
+
704
+ console.print("\n[bold cyan]Skill Collections:[/bold cyan]\n")
705
+ console.print(
706
+ f"[dim]Default collection: {result['default_collection']}[/dim]"
707
+ )
708
+ console.print(
709
+ f"[dim]Enabled: {result['enabled_count']} / {result['total_count']}[/dim]\n"
710
+ )
711
+
712
+ if not result["collections"]:
713
+ console.print("[yellow]No collections configured.[/yellow]")
714
+ console.print(
715
+ "[dim]Use 'claude-mpm skills collection-add' to add a collection.[/dim]\n"
716
+ )
717
+ return CommandResult(success=True, exit_code=0)
718
+
719
+ # Create table for collections
720
+ table = Table(show_header=True, header_style="bold cyan")
721
+ table.add_column("Name", style="green")
722
+ table.add_column("URL", style="white")
723
+ table.add_column("Priority", justify="center")
724
+ table.add_column("Enabled", justify="center")
725
+ table.add_column("Last Update", style="dim")
726
+ table.add_column("Default", justify="center")
727
+
728
+ # Sort by priority
729
+ sorted_collections = sorted(
730
+ result["collections"].items(), key=lambda x: x[1].get("priority", 999)
731
+ )
732
+
733
+ for name, config in sorted_collections:
734
+ enabled_icon = "✓" if config.get("enabled", True) else "✗"
735
+ default_icon = "⭐" if name == result["default_collection"] else ""
736
+ last_update = config.get("last_update") or "Never"
737
+
738
+ table.add_row(
739
+ name,
740
+ config["url"],
741
+ str(config.get("priority", "N/A")),
742
+ enabled_icon,
743
+ last_update,
744
+ default_icon,
745
+ )
746
+
747
+ console.print(table)
748
+ console.print()
749
+
750
+ return CommandResult(success=True, exit_code=0)
751
+
752
+ except Exception as e:
753
+ console.print(f"[red]Error listing collections: {e}[/red]")
754
+ return CommandResult(success=False, message=str(e), exit_code=1)
755
+
756
+ def _collection_add(self, args) -> CommandResult:
757
+ """Add a new skill collection."""
758
+ try:
759
+ name = getattr(args, "collection_name", None)
760
+ url = getattr(args, "collection_url", None)
761
+ priority = getattr(args, "priority", 99)
762
+
763
+ if not name or not url:
764
+ console.print("[red]Error: Collection name and URL are required[/red]")
765
+ console.print(
766
+ "[dim]Usage: claude-mpm skills collection-add NAME URL [--priority N][/dim]"
767
+ )
768
+ return CommandResult(success=False, exit_code=1)
769
+
770
+ console.print(f"\n[bold cyan]Adding collection '{name}'...[/bold cyan]\n")
771
+
772
+ result = self.skills_deployer.add_collection(name, url, priority)
773
+
774
+ console.print(f"[green]✓ {result['message']}[/green]")
775
+ console.print(f" [dim]URL: {url}[/dim]")
776
+ console.print(f" [dim]Priority: {priority}[/dim]\n")
777
+
778
+ return CommandResult(success=True, exit_code=0)
779
+
780
+ except ValueError as e:
781
+ console.print(f"[red]Error: {e}[/red]")
782
+ return CommandResult(success=False, message=str(e), exit_code=1)
783
+ except Exception as e:
784
+ console.print(f"[red]Unexpected error: {e}[/red]")
785
+ return CommandResult(success=False, message=str(e), exit_code=1)
786
+
787
+ def _collection_remove(self, args) -> CommandResult:
788
+ """Remove a skill collection."""
789
+ try:
790
+ name = getattr(args, "collection_name", None)
791
+
792
+ if not name:
793
+ console.print("[red]Error: Collection name is required[/red]")
794
+ console.print(
795
+ "[dim]Usage: claude-mpm skills collection-remove NAME[/dim]"
796
+ )
797
+ return CommandResult(success=False, exit_code=1)
798
+
799
+ console.print(
800
+ f"\n[bold yellow]Removing collection '{name}'...[/bold yellow]\n"
801
+ )
802
+
803
+ result = self.skills_deployer.remove_collection(name)
804
+
805
+ console.print(f"[green]✓ {result['message']}[/green]")
806
+ if result.get("directory_removed"):
807
+ console.print(" [dim]Collection directory removed[/dim]")
808
+ elif result.get("directory_error"):
809
+ console.print(
810
+ f" [yellow]Warning: {result['directory_error']}[/yellow]"
811
+ )
812
+ console.print()
813
+
814
+ return CommandResult(success=True, exit_code=0)
815
+
816
+ except ValueError as e:
817
+ console.print(f"[red]Error: {e}[/red]")
818
+ return CommandResult(success=False, message=str(e), exit_code=1)
819
+ except Exception as e:
820
+ console.print(f"[red]Unexpected error: {e}[/red]")
821
+ return CommandResult(success=False, message=str(e), exit_code=1)
822
+
823
+ def _collection_enable(self, args) -> CommandResult:
824
+ """Enable a disabled collection."""
825
+ try:
826
+ name = getattr(args, "collection_name", None)
827
+
828
+ if not name:
829
+ console.print("[red]Error: Collection name is required[/red]")
830
+ console.print(
831
+ "[dim]Usage: claude-mpm skills collection-enable NAME[/dim]"
832
+ )
833
+ return CommandResult(success=False, exit_code=1)
834
+
835
+ result = self.skills_deployer.enable_collection(name)
836
+
837
+ console.print(f"\n[green]✓ {result['message']}[/green]\n")
838
+
839
+ return CommandResult(success=True, exit_code=0)
840
+
841
+ except ValueError as e:
842
+ console.print(f"[red]Error: {e}[/red]")
843
+ return CommandResult(success=False, message=str(e), exit_code=1)
844
+ except Exception as e:
845
+ console.print(f"[red]Unexpected error: {e}[/red]")
846
+ return CommandResult(success=False, message=str(e), exit_code=1)
847
+
848
+ def _collection_disable(self, args) -> CommandResult:
849
+ """Disable a collection."""
850
+ try:
851
+ name = getattr(args, "collection_name", None)
852
+
853
+ if not name:
854
+ console.print("[red]Error: Collection name is required[/red]")
855
+ console.print(
856
+ "[dim]Usage: claude-mpm skills collection-disable NAME[/dim]"
857
+ )
858
+ return CommandResult(success=False, exit_code=1)
859
+
860
+ result = self.skills_deployer.disable_collection(name)
861
+
862
+ console.print(f"\n[green]✓ {result['message']}[/green]\n")
863
+
864
+ return CommandResult(success=True, exit_code=0)
865
+
866
+ except ValueError as e:
867
+ console.print(f"[red]Error: {e}[/red]")
868
+ return CommandResult(success=False, message=str(e), exit_code=1)
869
+ except Exception as e:
870
+ console.print(f"[red]Unexpected error: {e}[/red]")
871
+ return CommandResult(success=False, message=str(e), exit_code=1)
872
+
873
+ def _collection_set_default(self, args) -> CommandResult:
874
+ """Set the default collection."""
875
+ try:
876
+ name = getattr(args, "collection_name", None)
877
+
878
+ if not name:
879
+ console.print("[red]Error: Collection name is required[/red]")
880
+ console.print(
881
+ "[dim]Usage: claude-mpm skills collection-set-default NAME[/dim]"
882
+ )
883
+ return CommandResult(success=False, exit_code=1)
884
+
885
+ result = self.skills_deployer.set_default_collection(name)
886
+
887
+ console.print(f"\n[green]✓ {result['message']}[/green]")
888
+ if result.get("previous_default"):
889
+ console.print(f" [dim]Previous: {result['previous_default']}[/dim]")
890
+ console.print()
891
+
892
+ return CommandResult(success=True, exit_code=0)
893
+
894
+ except ValueError as e:
895
+ console.print(f"[red]Error: {e}[/red]")
896
+ return CommandResult(success=False, message=str(e), exit_code=1)
897
+ except Exception as e:
898
+ console.print(f"[red]Unexpected error: {e}[/red]")
899
+ return CommandResult(success=False, message=str(e), exit_code=1)
900
+
467
901
 
468
902
  def manage_skills(args) -> int:
469
903
  """
@@ -13,7 +13,6 @@ from .commands import (
13
13
  cleanup_memory,
14
14
  manage_agent_manager,
15
15
  manage_agents,
16
- manage_config,
17
16
  manage_configure,
18
17
  manage_debug,
19
18
  manage_mcp,
@@ -126,6 +125,22 @@ def execute_command(command: str, args) -> int:
126
125
  result = handle_verify(args)
127
126
  return result if result is not None else 0
128
127
 
128
+ # Handle skill-source command with lazy import
129
+ if command == "skill-source":
130
+ # Lazy import to avoid loading unless needed
131
+ from .commands.skill_source import skill_source_command
132
+
133
+ result = skill_source_command(args)
134
+ return result if result is not None else 0
135
+
136
+ # Handle agent-source command with lazy import
137
+ if command == "agent-source":
138
+ # Lazy import to avoid loading unless needed
139
+ from .commands.agent_source import agent_source_command
140
+
141
+ result = agent_source_command(args)
142
+ return result if result is not None else 0
143
+
129
144
  # Handle auto-configure command with lazy import
130
145
  if command == "auto-configure":
131
146
  # Lazy import to avoid loading unless needed
@@ -146,6 +161,62 @@ def execute_command(command: str, args) -> int:
146
161
  # Convert CommandResult to exit code
147
162
  return result.exit_code if result else 0
148
163
 
164
+ # Handle hook-errors command with lazy import
165
+ if command == "hook-errors":
166
+ # Lazy import to avoid loading unless needed
167
+ from .commands.hook_errors import (
168
+ clear_errors,
169
+ diagnose_errors,
170
+ list_errors,
171
+ show_status,
172
+ show_summary,
173
+ )
174
+
175
+ # Get subcommand
176
+ subcommand = getattr(args, "hook_errors_command", "status")
177
+ if not subcommand:
178
+ subcommand = "status"
179
+
180
+ # Map subcommands to functions
181
+ handlers = {
182
+ "list": list_errors,
183
+ "summary": show_summary,
184
+ "clear": clear_errors,
185
+ "diagnose": diagnose_errors,
186
+ "status": show_status,
187
+ }
188
+
189
+ # Get handler and invoke
190
+ handler = handlers.get(subcommand)
191
+ if handler:
192
+ # Build Click context programmatically
193
+ import click
194
+
195
+ ctx = click.Context(command=handler)
196
+
197
+ # Prepare keyword arguments from args
198
+ kwargs = {}
199
+ if hasattr(args, "format"):
200
+ kwargs["format"] = args.format
201
+ if hasattr(args, "hook_type"):
202
+ kwargs["hook_type"] = args.hook_type
203
+ if hasattr(args, "yes"):
204
+ kwargs["yes"] = args.yes
205
+
206
+ try:
207
+ # Invoke handler with arguments
208
+ with ctx:
209
+ handler.invoke(ctx, **kwargs)
210
+ return 0
211
+ except SystemExit as e:
212
+ return e.code if e.code is not None else 0
213
+ except Exception as e:
214
+ print(f"Error: {e}")
215
+ return 1
216
+ else:
217
+ print(f"Unknown hook-errors subcommand: {subcommand}")
218
+ return 1
219
+
149
220
  # Map stable commands to their implementations
150
221
  command_map = {
151
222
  CLICommands.RUN.value: run_session,
@@ -157,8 +228,10 @@ def execute_command(command: str, args) -> int:
157
228
  CLICommands.MEMORY.value: manage_memory,
158
229
  CLICommands.MONITOR.value: manage_monitor,
159
230
  CLICommands.DASHBOARD.value: manage_dashboard,
160
- CLICommands.CONFIG.value: manage_config,
161
- CLICommands.CONFIGURE.value: manage_configure,
231
+ # Configuration management commands (synonymous)
232
+ # Both 'config' and 'configure' launch the interactive configuration TUI
233
+ CLICommands.CONFIG.value: manage_configure, # Alias to configure
234
+ CLICommands.CONFIGURE.value: manage_configure, # Interactive configuration TUI
162
235
  CLICommands.AGGREGATE.value: aggregate_command,
163
236
  CLICommands.ANALYZE_CODE.value: manage_analyze_code,
164
237
  CLICommands.CLEANUP.value: cleanup_memory,
@@ -193,6 +266,8 @@ def execute_command(command: str, args) -> int:
193
266
  "verify",
194
267
  "auto-configure",
195
268
  "local-deploy",
269
+ "skill-source",
270
+ "agent-source",
196
271
  ]
197
272
 
198
273
  suggestion = suggest_similar_commands(command, all_commands)