claude-mpm 4.21.0__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 (497) 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 +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -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/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,590 @@
1
+ """Configuration for skill sources (Git repositories).
2
+
3
+ This module manages skill sources configuration, which defines Git repositories
4
+ containing skill files (Markdown with YAML frontmatter). It supports:
5
+ - System repository (bobmatnyc/claude-mpm-skills) with priority 0
6
+ - Official Anthropic repository (anthropics/skills) with priority 1
7
+ - Multiple custom repositories with priority-based resolution
8
+ - YAML persistence for configuration
9
+ - Source management (add, remove, enable, disable)
10
+
11
+ Design Decision: Skill-specific data model separate from agent sources
12
+
13
+ Rationale: While skills and agents both come from Git repositories, they have
14
+ different structures (YAML frontmatter vs. Markdown sections) and different
15
+ resolution requirements. Separating the configuration models allows for
16
+ skill-specific validation and future extensibility.
17
+
18
+ Trade-offs:
19
+ - Maintainability: Clear separation of concerns
20
+ - Code Duplication: Some overlap with agent_sources.py (acceptable for clarity)
21
+ - Flexibility: Easy to extend skills with unique features
22
+
23
+ Example:
24
+ >>> config = SkillSourceConfiguration.load()
25
+ >>> config.add_source(SkillSource(
26
+ ... id="custom",
27
+ ... type="git",
28
+ ... url="https://github.com/owner/skills",
29
+ ... priority=200
30
+ ... ))
31
+ >>> config.save()
32
+ """
33
+
34
+ from dataclasses import dataclass
35
+ from pathlib import Path
36
+ from typing import List, Optional
37
+ from urllib.parse import urlparse
38
+
39
+ import yaml
40
+
41
+ from claude_mpm.core.logging_config import get_logger
42
+
43
+ logger = get_logger(__name__)
44
+
45
+
46
+ @dataclass
47
+ class SkillSource:
48
+ """Represents a single skill source (Git repository).
49
+
50
+ Attributes:
51
+ id: Unique identifier for this source (e.g., "system", "custom")
52
+ type: Source type (currently only "git" supported)
53
+ url: Full Git repository URL
54
+ branch: Git branch to use (default: "main")
55
+ priority: Priority for skill resolution (lower = higher precedence)
56
+ enabled: Whether this source should be synced
57
+
58
+ Priority System:
59
+ - 0: Reserved for system repository (highest precedence)
60
+ - 1-99: High priority custom sources
61
+ - 100-999: Normal priority custom sources
62
+ - 1000+: Low priority custom sources
63
+
64
+ Example:
65
+ >>> source = SkillSource(
66
+ ... id="system",
67
+ ... type="git",
68
+ ... url="https://github.com/bobmatnyc/claude-mpm-skills",
69
+ ... priority=0
70
+ ... )
71
+ >>> source.validate()
72
+ []
73
+ """
74
+
75
+ id: str
76
+ type: str
77
+ url: str
78
+ branch: str = "main"
79
+ priority: int = 100
80
+ enabled: bool = True
81
+
82
+ def __post_init__(self):
83
+ """Validate skill source configuration after initialization.
84
+
85
+ Raises:
86
+ ValueError: If validation fails
87
+ """
88
+ errors = self.validate()
89
+ if errors:
90
+ raise ValueError(f"Invalid skill source configuration: {', '.join(errors)}")
91
+
92
+ def validate(self) -> List[str]:
93
+ """Validate skill source configuration.
94
+
95
+ Returns:
96
+ List of validation error messages (empty if valid)
97
+
98
+ Validation checks:
99
+ - ID is not empty and follows naming rules
100
+ - Type is supported (currently only "git")
101
+ - URL is valid and points to a Git repository
102
+ - Branch name is valid
103
+ - Priority is in valid range (0-1000)
104
+ """
105
+ errors = []
106
+
107
+ # Validate ID
108
+ if not self.id or not self.id.strip():
109
+ errors.append("Source ID cannot be empty")
110
+ elif not self.id.replace("-", "").replace("_", "").isalnum():
111
+ errors.append(
112
+ f"Source ID must be alphanumeric (with hyphens/underscores), got: {self.id}"
113
+ )
114
+
115
+ # Validate type
116
+ if self.type != "git":
117
+ errors.append(f"Only 'git' type is currently supported, got: {self.type}")
118
+
119
+ # Validate URL
120
+ if not self.url or not self.url.strip():
121
+ errors.append("URL cannot be empty")
122
+ else:
123
+ try:
124
+ parsed = urlparse(self.url)
125
+ if parsed.scheme not in ("http", "https"):
126
+ errors.append(
127
+ f"URL must use http:// or https:// protocol, got: {parsed.scheme}"
128
+ )
129
+ if not parsed.netloc.endswith("github.com"):
130
+ errors.append(
131
+ f"URL must be a GitHub repository, got: {parsed.netloc}"
132
+ )
133
+ path_parts = [p for p in parsed.path.strip("/").split("/") if p]
134
+ if len(path_parts) < 2:
135
+ errors.append(
136
+ f"URL must include owner/repo path, got: {parsed.path}"
137
+ )
138
+ except Exception as e:
139
+ errors.append(f"Invalid URL format: {e}")
140
+
141
+ # Validate branch
142
+ if not self.branch or not self.branch.strip():
143
+ errors.append("Branch name cannot be empty")
144
+
145
+ # Validate priority
146
+ if self.priority < 0:
147
+ errors.append("Priority must be non-negative (0 or greater)")
148
+ if self.priority > 1000:
149
+ errors.append(
150
+ f"Priority {self.priority} is unusually high (recommended: 0-1000)"
151
+ )
152
+
153
+ return errors
154
+
155
+ def __repr__(self) -> str:
156
+ """Return string representation of skill source."""
157
+ return (
158
+ f"SkillSource(id='{self.id}', url='{self.url}', "
159
+ f"priority={self.priority}, enabled={self.enabled})"
160
+ )
161
+
162
+
163
+ class SkillSourceConfiguration:
164
+ """Manages skill sources configuration file.
165
+
166
+ Configuration Location:
167
+ ~/.claude-mpm/config/skill_sources.yaml
168
+
169
+ Default Configuration:
170
+ sources:
171
+ - id: system
172
+ type: git
173
+ url: https://github.com/bobmatnyc/claude-mpm-skills
174
+ branch: main
175
+ priority: 0
176
+ enabled: true
177
+ - id: anthropic-official
178
+ type: git
179
+ url: https://github.com/anthropics/skills
180
+ branch: main
181
+ priority: 1
182
+ enabled: true
183
+
184
+ Design Pattern: Configuration as Code
185
+
186
+ This class follows the "configuration as code" pattern, treating YAML files
187
+ as the single source of truth. All modifications are persisted immediately
188
+ to ensure consistency.
189
+
190
+ Example:
191
+ >>> config = SkillSourceConfiguration()
192
+ >>> sources = config.load()
193
+ >>> print(f"Loaded {len(sources)} skill sources")
194
+ """
195
+
196
+ def __init__(self, config_path: Optional[Path] = None):
197
+ """Initialize configuration manager.
198
+
199
+ Args:
200
+ config_path: Path to config file (defaults to ~/.claude-mpm/config/skill_sources.yaml)
201
+ """
202
+ if config_path is None:
203
+ config_path = Path.home() / ".claude-mpm" / "config" / "skill_sources.yaml"
204
+ self.config_path = config_path
205
+ self.logger = get_logger(__name__)
206
+
207
+ @classmethod
208
+ def from_file(cls, config_path: Path) -> "SkillSourceConfiguration":
209
+ """Load configuration from file.
210
+
211
+ Args:
212
+ config_path: Path to configuration file
213
+
214
+ Returns:
215
+ SkillSourceConfiguration instance
216
+ """
217
+ return cls(config_path=config_path)
218
+
219
+ def load(self) -> List[SkillSource]:
220
+ """Load skill sources from configuration file.
221
+
222
+ Returns:
223
+ List of SkillSource instances
224
+
225
+ Behavior:
226
+ - If file doesn't exist, returns default system source
227
+ - If file is empty or invalid, returns default system source
228
+ - Validates all sources during loading
229
+ - Logs warnings for invalid sources (skips them)
230
+
231
+ Example:
232
+ >>> config = SkillSourceConfiguration()
233
+ >>> sources = config.load()
234
+ >>> for source in sources:
235
+ ... print(f"{source.id}: {source.url}")
236
+ """
237
+ # If file doesn't exist, return default sources
238
+ if not self.config_path.exists():
239
+ self.logger.info(
240
+ f"Configuration file not found at {self.config_path}, using defaults"
241
+ )
242
+ return self._get_default_sources()
243
+
244
+ try:
245
+ with open(self.config_path, encoding="utf-8") as f:
246
+ data = yaml.safe_load(f)
247
+
248
+ if not data or "sources" not in data:
249
+ self.logger.warning(
250
+ f"Empty or invalid configuration at {self.config_path}, using defaults"
251
+ )
252
+ return self._get_default_sources()
253
+
254
+ # Parse sources
255
+ sources = []
256
+ for source_data in data["sources"]:
257
+ try:
258
+ source = SkillSource(
259
+ id=source_data["id"],
260
+ type=source_data["type"],
261
+ url=source_data["url"],
262
+ branch=source_data.get("branch", "main"),
263
+ priority=source_data.get("priority", 100),
264
+ enabled=source_data.get("enabled", True),
265
+ )
266
+ sources.append(source)
267
+ except (KeyError, ValueError) as e:
268
+ self.logger.warning(f"Skipping invalid source: {e}")
269
+ continue
270
+
271
+ if not sources:
272
+ self.logger.warning("No valid sources found, using defaults")
273
+ return self._get_default_sources()
274
+
275
+ return sources
276
+
277
+ except Exception as e:
278
+ self.logger.error(
279
+ f"Failed to load configuration from {self.config_path}: {e}"
280
+ )
281
+ self.logger.info("Using default configuration")
282
+ return self._get_default_sources()
283
+
284
+ def save(self, sources: List[SkillSource]) -> None:
285
+ """Save skill sources to configuration file.
286
+
287
+ Args:
288
+ sources: List of SkillSource instances to save
289
+
290
+ Behavior:
291
+ - Creates parent directory if needed
292
+ - Writes YAML atomically
293
+ - Validates sources before saving
294
+ - Logs save operation
295
+
296
+ Raises:
297
+ ValueError: If sources list is empty
298
+ Exception: If file write fails
299
+
300
+ Example:
301
+ >>> config = SkillSourceConfiguration()
302
+ >>> sources = [SkillSource(id="custom", type="git", url="...")]
303
+ >>> config.save(sources)
304
+ """
305
+ if not sources:
306
+ raise ValueError("Cannot save empty sources list")
307
+
308
+ # Validate all sources before saving
309
+ for source in sources:
310
+ errors = source.validate()
311
+ if errors:
312
+ raise ValueError(
313
+ f"Cannot save invalid source '{source.id}': {', '.join(errors)}"
314
+ )
315
+
316
+ # Ensure parent directory exists
317
+ self.config_path.parent.mkdir(parents=True, exist_ok=True)
318
+
319
+ # Build YAML data structure
320
+ data = {
321
+ "sources": [
322
+ {
323
+ "id": source.id,
324
+ "type": source.type,
325
+ "url": source.url,
326
+ "branch": source.branch,
327
+ "priority": source.priority,
328
+ "enabled": source.enabled,
329
+ }
330
+ for source in sources
331
+ ]
332
+ }
333
+
334
+ try:
335
+ # Write atomically: write to temp file, then rename
336
+ temp_path = self.config_path.with_suffix(".yaml.tmp")
337
+ with open(temp_path, "w", encoding="utf-8") as f:
338
+ yaml.safe_dump(data, f, default_flow_style=False, sort_keys=False)
339
+
340
+ # Atomic rename
341
+ temp_path.replace(self.config_path)
342
+
343
+ self.logger.info(
344
+ f"Configuration saved to {self.config_path} ({len(sources)} sources)"
345
+ )
346
+
347
+ except Exception as e:
348
+ self.logger.error(
349
+ f"Failed to save configuration to {self.config_path}: {e}"
350
+ )
351
+ # Clean up temp file if it exists
352
+ if temp_path.exists():
353
+ temp_path.unlink()
354
+ raise
355
+
356
+ def add_source(self, source: SkillSource) -> None:
357
+ """Add a new skill source.
358
+
359
+ Args:
360
+ source: SkillSource to add
361
+
362
+ Raises:
363
+ ValueError: If source ID already exists or priority conflicts
364
+
365
+ Example:
366
+ >>> config = SkillSourceConfiguration()
367
+ >>> source = SkillSource(id="custom", type="git", url="...")
368
+ >>> config.add_source(source)
369
+ """
370
+ sources = self.load()
371
+
372
+ # Check for duplicate IDs
373
+ if any(s.id == source.id for s in sources):
374
+ raise ValueError(f"Source with ID '{source.id}' already exists")
375
+
376
+ # Check for priority conflicts (warn, don't fail)
377
+ conflicts = [s for s in sources if s.priority == source.priority and s.enabled]
378
+ if conflicts:
379
+ self.logger.warning(
380
+ f"Priority {source.priority} conflicts with existing sources: "
381
+ f"{', '.join(s.id for s in conflicts)}"
382
+ )
383
+
384
+ sources.append(source)
385
+ self.save(sources)
386
+ self.logger.info(f"Added skill source: {source.id}")
387
+
388
+ def remove_source(self, source_id: str) -> bool:
389
+ """Remove a skill source by ID.
390
+
391
+ Args:
392
+ source_id: ID of source to remove
393
+
394
+ Returns:
395
+ True if source was removed, False if not found
396
+
397
+ Example:
398
+ >>> config = SkillSourceConfiguration()
399
+ >>> removed = config.remove_source("custom")
400
+ >>> print(removed)
401
+ True
402
+ """
403
+ sources = self.load()
404
+ initial_count = len(sources)
405
+
406
+ sources = [s for s in sources if s.id != source_id]
407
+
408
+ if len(sources) == initial_count:
409
+ self.logger.warning(f"Source not found: {source_id}")
410
+ return False
411
+
412
+ self.save(sources)
413
+ self.logger.info(f"Removed skill source: {source_id}")
414
+ return True
415
+
416
+ def get_source(self, source_id: str) -> Optional[SkillSource]:
417
+ """Get a specific skill source by ID.
418
+
419
+ Args:
420
+ source_id: ID of source to retrieve
421
+
422
+ Returns:
423
+ SkillSource if found, None otherwise
424
+
425
+ Example:
426
+ >>> config = SkillSourceConfiguration()
427
+ >>> source = config.get_source("system")
428
+ >>> if source:
429
+ ... print(source.url)
430
+ """
431
+ sources = self.load()
432
+ for source in sources:
433
+ if source.id == source_id:
434
+ return source
435
+ return None
436
+
437
+ def update_source(self, source_id: str, **updates) -> None:
438
+ """Update an existing skill source.
439
+
440
+ Args:
441
+ source_id: ID of source to update
442
+ **updates: Fields to update (url, branch, priority, enabled)
443
+
444
+ Raises:
445
+ ValueError: If source not found or updates are invalid
446
+
447
+ Example:
448
+ >>> config = SkillSourceConfiguration()
449
+ >>> config.update_source("custom", enabled=False, priority=200)
450
+ """
451
+ sources = self.load()
452
+
453
+ # Find source to update
454
+ source_index = None
455
+ for i, source in enumerate(sources):
456
+ if source.id == source_id:
457
+ source_index = i
458
+ break
459
+
460
+ if source_index is None:
461
+ raise ValueError(f"Source not found: {source_id}")
462
+
463
+ # Apply updates
464
+ source = sources[source_index]
465
+ for key, value in updates.items():
466
+ if hasattr(source, key):
467
+ setattr(source, key, value)
468
+ else:
469
+ raise ValueError(f"Invalid update field: {key}")
470
+
471
+ # Validate updated source
472
+ errors = source.validate()
473
+ if errors:
474
+ raise ValueError(
475
+ f"Invalid updates for source '{source_id}': {', '.join(errors)}"
476
+ )
477
+
478
+ self.save(sources)
479
+ self.logger.info(f"Updated skill source: {source_id}")
480
+
481
+ def get_enabled_sources(self) -> List[SkillSource]:
482
+ """Get all enabled skill sources sorted by priority.
483
+
484
+ Returns:
485
+ List of enabled SkillSource instances, sorted by priority (ascending)
486
+
487
+ Priority Order:
488
+ Lower priority number = higher precedence
489
+ Priority 0 (system) comes first
490
+
491
+ Example:
492
+ >>> config = SkillSourceConfiguration()
493
+ >>> sources = config.get_enabled_sources()
494
+ >>> for source in sources:
495
+ ... print(f"{source.id} (priority: {source.priority})")
496
+ """
497
+ sources = self.load()
498
+ enabled = [s for s in sources if s.enabled]
499
+ return sorted(enabled, key=lambda s: s.priority)
500
+
501
+ def validate_priority_conflicts(self) -> List[str]:
502
+ """Check for priority conflicts between sources.
503
+
504
+ Returns:
505
+ List of warning messages about priority conflicts
506
+
507
+ Behavior:
508
+ - Conflicts occur when multiple enabled sources have same priority
509
+ - Returns warning messages, not errors (conflicts are allowed)
510
+
511
+ Example:
512
+ >>> config = SkillSourceConfiguration()
513
+ >>> warnings = config.validate_priority_conflicts()
514
+ >>> for warning in warnings:
515
+ ... print(warning)
516
+ """
517
+ sources = self.load()
518
+ enabled = [s for s in sources if s.enabled]
519
+
520
+ warnings = []
521
+ priorities = {}
522
+
523
+ for source in enabled:
524
+ if source.priority in priorities:
525
+ priorities[source.priority].append(source.id)
526
+ else:
527
+ priorities[source.priority] = [source.id]
528
+
529
+ for priority, source_ids in priorities.items():
530
+ if len(source_ids) > 1:
531
+ warnings.append(
532
+ f"Priority {priority} used by multiple sources: {', '.join(source_ids)}"
533
+ )
534
+
535
+ return warnings
536
+
537
+ def _get_default_sources(self) -> List[SkillSource]:
538
+ """Get default skill sources (system + official Anthropic).
539
+
540
+ Returns:
541
+ List of default SkillSource instances
542
+
543
+ Design Decision: Multiple default sources
544
+
545
+ Rationale: Provide users with both curated system skills and official
546
+ Anthropic skills out-of-the-box. System repo maintains highest priority
547
+ for custom/override capabilities.
548
+
549
+ Default Sources:
550
+ 1. System repo (priority 0): bobmatnyc/claude-mpm-skills
551
+ 2. Anthropic repo (priority 1): anthropics/skills
552
+ """
553
+ return [
554
+ SkillSource(
555
+ id="system",
556
+ type="git",
557
+ url="https://github.com/bobmatnyc/claude-mpm-skills",
558
+ branch="main",
559
+ priority=0,
560
+ enabled=True,
561
+ ),
562
+ SkillSource(
563
+ id="anthropic-official",
564
+ type="git",
565
+ url="https://github.com/anthropics/skills",
566
+ branch="main",
567
+ priority=1,
568
+ enabled=True,
569
+ ),
570
+ ]
571
+
572
+ def _get_default_system_source(self) -> SkillSource:
573
+ """Get default system skill source (legacy method).
574
+
575
+ Returns:
576
+ SkillSource for system repository
577
+
578
+ Note: Deprecated in favor of _get_default_sources() which includes
579
+ both system and Anthropic sources. Kept for backward compatibility.
580
+ """
581
+ return self._get_default_sources()[0]
582
+
583
+ def __repr__(self) -> str:
584
+ """Return string representation of configuration."""
585
+ sources = self.load()
586
+ enabled_count = len([s for s in sources if s.enabled])
587
+ return (
588
+ f"SkillSourceConfiguration(path='{self.config_path}', "
589
+ f"sources={len(sources)}, enabled={enabled_count})"
590
+ )
claude_mpm/constants.py CHANGED
@@ -168,6 +168,18 @@ class SkillsCommands(str, Enum):
168
168
  UPDATE = "update"
169
169
  INFO = "info"
170
170
  CONFIG = "config"
171
+ # GitHub deployment commands
172
+ DEPLOY_FROM_GITHUB = "deploy-github"
173
+ LIST_AVAILABLE = "list-available"
174
+ CHECK_DEPLOYED = "check-deployed"
175
+ REMOVE = "remove"
176
+ # Collection management commands
177
+ COLLECTION_LIST = "collection-list"
178
+ COLLECTION_ADD = "collection-add"
179
+ COLLECTION_REMOVE = "collection-remove"
180
+ COLLECTION_ENABLE = "collection-enable"
181
+ COLLECTION_DISABLE = "collection-disable"
182
+ COLLECTION_SET_DEFAULT = "collection-set-default"
171
183
 
172
184
 
173
185
  class CLIFlags(str, Enum):
@@ -326,5 +326,5 @@ def validate_api_keys(config: Optional[Dict] = None, strict: bool = True) -> boo
326
326
  ValueError: If strict=True and any validation fails
327
327
  """
328
328
  validator = APIKeyValidator(config)
329
- success, errors, warnings = validator.validate_all_keys(strict=strict)
329
+ success, _errors, _warnings = validator.validate_all_keys(strict=strict)
330
330
  return success
@@ -6,15 +6,9 @@ from typing import Optional
6
6
 
7
7
  # Core imports that don't cause circular dependencies
8
8
  from claude_mpm.core.container import get_container
9
- from claude_mpm.core.interfaces import (
10
- AgentDeploymentInterface,
11
- )
12
- from claude_mpm.core.logging_config import (
13
- get_logger,
14
- )
15
- from claude_mpm.services.core.interfaces import (
16
- RunnerConfigurationInterface,
17
- )
9
+ from claude_mpm.core.interfaces import AgentDeploymentInterface
10
+ from claude_mpm.core.logging_config import get_logger
11
+ from claude_mpm.services.core.interfaces import RunnerConfigurationInterface
18
12
 
19
13
  # Type checking imports to avoid circular dependencies
20
14
 
@@ -42,8 +36,19 @@ class ClaudeRunner:
42
36
  launch_method: str = "exec", # "exec" or "subprocess"
43
37
  enable_websocket: bool = False,
44
38
  websocket_port: int = 8765,
39
+ use_native_agents: bool = False, # Use --agents flag instead of file deployment
45
40
  ):
46
- """Initialize the Claude runner."""
41
+ """Initialize the Claude runner.
42
+
43
+ Args:
44
+ enable_tickets: Enable ticket extraction (deprecated)
45
+ log_level: Logging level
46
+ claude_args: Additional arguments for Claude CLI
47
+ launch_method: "exec" or "subprocess" launch mode
48
+ enable_websocket: Enable WebSocket server
49
+ websocket_port: WebSocket server port
50
+ use_native_agents: Use --agents CLI flag instead of .claude/agents/ deployment
51
+ """
47
52
  self.logger = get_logger(__name__)
48
53
 
49
54
  # Initialize configuration service
@@ -75,6 +80,7 @@ class ClaudeRunner:
75
80
  launch_method=launch_method,
76
81
  enable_websocket=enable_websocket,
77
82
  websocket_port=websocket_port,
83
+ use_native_agents=use_native_agents,
78
84
  )
79
85
 
80
86
  # Set configuration attributes
@@ -84,6 +90,7 @@ class ClaudeRunner:
84
90
  self.launch_method = config_data["launch_method"]
85
91
  self.enable_websocket = config_data["enable_websocket"]
86
92
  self.websocket_port = config_data["websocket_port"]
93
+ self.use_native_agents = config_data.get("use_native_agents", False)
87
94
  self.config = config_data["config"]
88
95
 
89
96
  # Initialize project logger using the service