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
@@ -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