claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -31,6 +31,7 @@ import time
31
31
  from pathlib import Path
32
32
  from typing import Any, Dict, List, Optional, Tuple
33
33
 
34
+ from claude_mpm.config.agent_sources import AgentSourceConfiguration
34
35
  from claude_mpm.config.paths import paths
35
36
  from claude_mpm.constants import Paths
36
37
  from claude_mpm.core.config import Config
@@ -38,6 +39,8 @@ from claude_mpm.core.exceptions import AgentDeploymentError
38
39
  from claude_mpm.core.interfaces import AgentDeploymentInterface
39
40
  from claude_mpm.services.shared import ConfigServiceBase
40
41
 
42
+ # Import git source management for remote agent sync
43
+ from ..git_source_manager import GitSourceManager
41
44
  from .agent_configuration_manager import AgentConfigurationManager
42
45
  from .agent_discovery_service import AgentDiscoveryService
43
46
  from .agent_environment_manager import AgentEnvironmentManager
@@ -184,9 +187,110 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
184
187
  # Initialize format converter service
185
188
  self.format_converter = AgentFormatConverter()
186
189
 
190
+ # Initialize git source manager for remote agent sync
191
+ self.git_source_manager = GitSourceManager()
192
+ self.agent_source_config = AgentSourceConfiguration.load()
193
+
187
194
  self.logger.info(f"Templates directory: {self.templates_dir}")
188
195
  self.logger.info(f"Base agent path: {self.base_agent_path}")
189
196
 
197
+ def _sync_remote_agent_sources(self, timeout_seconds: int = 30) -> Dict[str, Any]:
198
+ """Sync git-based agent sources before deployment.
199
+
200
+ This method follows the skills system pattern: sync configured git repositories
201
+ to cache before discovery. Network failures are logged but don't block deployment.
202
+
203
+ Args:
204
+ timeout_seconds: Timeout for git operations (default: 30 seconds)
205
+
206
+ Returns:
207
+ Dictionary with sync results:
208
+ {
209
+ "synced_count": int,
210
+ "failed_count": int,
211
+ "repositories": Dict[str, Dict], # repo_id -> sync result
212
+ "duration_ms": float
213
+ }
214
+
215
+ Error Handling:
216
+ - Network failures: Logged as warnings, sync continues
217
+ - Invalid repos: Logged as errors, sync continues
218
+ - Timeout: Individual repo timeouts don't stop overall sync
219
+ - Missing cache dir: Created automatically
220
+ """
221
+ import time
222
+
223
+ start_time = time.time()
224
+
225
+ results = {
226
+ "synced_count": 0,
227
+ "failed_count": 0,
228
+ "repositories": {},
229
+ "duration_ms": 0,
230
+ }
231
+
232
+ # Load agent sources configuration
233
+ try:
234
+ config = AgentSourceConfiguration.load()
235
+ enabled_repos = [r for r in config.repositories if r.enabled]
236
+
237
+ if not enabled_repos:
238
+ self.logger.debug("No enabled agent sources configured")
239
+ return results
240
+
241
+ self.logger.info(f"Syncing {len(enabled_repos)} agent git sources...")
242
+
243
+ # Sync each enabled repository
244
+ for repo in enabled_repos:
245
+ repo_id = repo.identifier
246
+ try:
247
+ # Sync with timeout (individual repo sync)
248
+ # NOTE: show_progress=False to avoid duplicate progress bars
249
+ # (startup sync already showed progress to user)
250
+ sync_result = self.git_source_manager.sync_repository(
251
+ repo,
252
+ force=False, # Use ETag-based caching
253
+ show_progress=False, # Suppress progress (startup already synced)
254
+ )
255
+
256
+ results["repositories"][repo_id] = sync_result
257
+
258
+ if sync_result.get("synced"):
259
+ results["synced_count"] += 1
260
+ agents_discovered = sync_result.get("agents_discovered", [])
261
+ self.logger.info(
262
+ f"Synced {repo_id}: {sync_result.get('files_updated', 0)} files, "
263
+ f"{len(agents_discovered)} agents"
264
+ )
265
+ else:
266
+ results["failed_count"] += 1
267
+ error = sync_result.get("error", "Unknown error")
268
+ self.logger.warning(f"Failed to sync {repo_id}: {error}")
269
+
270
+ except Exception as e:
271
+ # Don't let individual repo failures stop deployment
272
+ results["failed_count"] += 1
273
+ results["repositories"][repo_id] = {
274
+ "synced": False,
275
+ "error": str(e),
276
+ }
277
+ self.logger.warning(f"Exception syncing {repo_id}: {e}")
278
+
279
+ except Exception as e:
280
+ # Configuration loading failure - log but don't crash
281
+ self.logger.warning(f"Failed to load agent sources config: {e}")
282
+ results["failed_count"] = -1 # Indicates config failure
283
+
284
+ results["duration_ms"] = (time.time() - start_time) * 1000
285
+
286
+ if results["synced_count"] > 0:
287
+ self.logger.info(
288
+ f"Agent source sync complete: {results['synced_count']} succeeded, "
289
+ f"{results['failed_count']} failed ({results['duration_ms']:.0f}ms)"
290
+ )
291
+
292
+ return results
293
+
190
294
  def deploy_agents(
191
295
  self,
192
296
  target_dir: Optional[Path] = None,
@@ -267,6 +371,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
267
371
  # METRICS: Record deployment start time for performance tracking
268
372
  deployment_start_time = time.time()
269
373
 
374
+ # PHASE 2 (1M-442): Sync git-based agent sources before deployment
375
+ # This ensures remote agents from configured sources are cached and discoverable
376
+ sync_results = self._sync_remote_agent_sources()
377
+
270
378
  # Try async deployment for better performance if requested
271
379
  if use_async:
272
380
  async_results = self._try_async_deployment(
@@ -292,6 +400,13 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
292
400
  agents_dir, deployment_start_time
293
401
  )
294
402
 
403
+ # Add git source sync results to deployment results
404
+ if (
405
+ sync_results.get("synced_count", 0) > 0
406
+ or sync_results.get("failed_count", 0) > 0
407
+ ):
408
+ results["remote_sources"] = sync_results
409
+
295
410
  try:
296
411
  # Create agents directory if needed
297
412
  agents_dir.mkdir(parents=True, exist_ok=True)
@@ -754,19 +869,28 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
754
869
  project_agents_dir = potential_project_dir
755
870
  self.logger.info(f"Found project agents at: {project_agents_dir}")
756
871
 
757
- # Check for user agents
872
+ # Check for user agents (DEPRECATED)
758
873
  user_home = Path.home()
759
874
  potential_user_dir = user_home / ".claude-mpm" / "agents"
760
875
  if potential_user_dir.exists():
761
876
  user_agents_dir = potential_user_dir
762
877
  self.logger.info(f"Found user agents at: {user_agents_dir}")
763
878
 
764
- # Get agents with version comparison and cleanup
879
+ # Check for remote agents (cached from GitHub)
880
+ remote_agents_dir = None
881
+ cache_dir = user_home / ".claude-mpm" / "cache"
882
+ potential_remote_dir = cache_dir / "remote-agents"
883
+ if potential_remote_dir.exists():
884
+ remote_agents_dir = potential_remote_dir
885
+ self.logger.info(f"Found remote agents cache at: {remote_agents_dir}")
886
+
887
+ # Get agents with version comparison and cleanup (4-tier discovery)
765
888
  agents_to_deploy, agent_sources, cleanup_results = (
766
889
  self.multi_source_service.get_agents_for_deployment(
767
890
  system_templates_dir=system_templates_dir,
768
891
  project_agents_dir=project_agents_dir,
769
892
  user_agents_dir=user_agents_dir,
893
+ remote_agents_dir=remote_agents_dir, # NEW: 4th tier
770
894
  working_directory=self.working_directory,
771
895
  excluded_agents=excluded_agents,
772
896
  config=config,
@@ -7,10 +7,11 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import json
11
10
  from pathlib import Path
12
11
  from typing import Any, Dict, List, Optional
13
12
 
13
+ import yaml
14
+
14
15
  from claude_mpm.core.config import Config
15
16
  from claude_mpm.core.logging_config import get_logger
16
17
 
@@ -59,8 +60,8 @@ class AgentDiscoveryService:
59
60
  )
60
61
  return agents
61
62
 
62
- # Find all JSON template files
63
- template_files = list(self.templates_dir.glob("*.json"))
63
+ # Find all markdown template files with YAML frontmatter
64
+ template_files = list(self.templates_dir.glob("*.md"))
64
65
 
65
66
  for template_file in template_files:
66
67
  try:
@@ -105,8 +106,8 @@ class AgentDiscoveryService:
105
106
  self.logger.error(f"Templates directory not found: {self.templates_dir}")
106
107
  return []
107
108
 
108
- # Get all template files
109
- template_files = list(self.templates_dir.glob("*.json"))
109
+ # Get all markdown template files
110
+ template_files = list(self.templates_dir.glob("*.md"))
110
111
 
111
112
  if not template_files:
112
113
  self.logger.warning(f"No agent templates found in {self.templates_dir}")
@@ -157,7 +158,7 @@ class AgentDiscoveryService:
157
158
  Returns:
158
159
  Path to template file if found, None otherwise
159
160
  """
160
- template_file = self.templates_dir / f"{agent_name}.json"
161
+ template_file = self.templates_dir / f"{agent_name}.md"
161
162
 
162
163
  if template_file.exists():
163
164
  if self._validate_template_file(template_file):
@@ -199,59 +200,45 @@ class AgentDiscoveryService:
199
200
 
200
201
  def _extract_agent_metadata(self, template_file: Path) -> Optional[Dict[str, Any]]:
201
202
  """
202
- Extract metadata from an agent template file.
203
+ Extract metadata from an agent template file with YAML frontmatter.
203
204
 
204
205
  Args:
205
- template_file: Path to the template file
206
+ template_file: Path to the markdown template file
206
207
 
207
208
  Returns:
208
209
  Dictionary with agent metadata or None if extraction fails
209
210
  """
210
211
  try:
211
- # Read and parse template file
212
+ # Read template file content
212
213
  template_content = template_file.read_text()
213
- template_data = json.loads(template_content)
214
-
215
- # Extract basic metadata from the metadata section (per agent schema)
216
- metadata = template_data.get("metadata", {})
217
- capabilities = template_data.get("capabilities", {})
218
-
219
- # Handle capabilities as either dict or list
220
- if isinstance(capabilities, list):
221
- # If capabilities is a list (like in php-engineer.json), treat it as capabilities list
222
- tools_list = template_data.get(
223
- "tools", []
224
- ) # Look for tools at root level
225
- model_value = template_data.get("model", "sonnet")
226
- else:
227
- # If capabilities is a dict, extract tools and model from it
228
- tools_list = capabilities.get("tools", [])
229
- model_value = capabilities.get("model", "sonnet")
230
214
 
215
+ # Extract YAML frontmatter
216
+ frontmatter = self._extract_yaml_frontmatter(template_content)
217
+ if not frontmatter:
218
+ self.logger.warning(
219
+ f"No valid YAML frontmatter in {template_file.name}"
220
+ )
221
+ return None
222
+
223
+ # Extract metadata directly from frontmatter (flat structure)
224
+ # Markdown templates use flat YAML structure, not nested "metadata" section
231
225
  agent_info = {
232
- "name": metadata.get("name", template_file.stem),
233
- "description": metadata.get(
234
- "description",
235
- template_data.get("description", "No description available"),
226
+ "name": frontmatter.get("name", template_file.stem),
227
+ "description": frontmatter.get(
228
+ "description", "No description available"
236
229
  ),
237
- "type": template_data.get(
238
- "agent_type",
239
- metadata.get("category", template_data.get("category", "agent")),
240
- ), # Extract agent type
241
- "version": template_data.get(
242
- "agent_version",
243
- template_data.get("version", metadata.get("version", "1.0.0")),
230
+ "type": frontmatter.get(
231
+ "agent_type", frontmatter.get("category", "agent")
244
232
  ),
245
- "tools": tools_list,
246
- "specializations": metadata.get(
247
- "tags", template_data.get("tags", [])
248
- ), # Use tags as specializations, fallback to root-level tags
233
+ "version": frontmatter.get("version", "1.0.0"),
234
+ "tools": frontmatter.get("tools", []),
235
+ "specializations": frontmatter.get("tags", []),
249
236
  "file": template_file.name,
250
237
  "path": str(template_file),
251
238
  "file_path": str(template_file), # Keep for backward compatibility
252
239
  "size": template_file.stat().st_size,
253
- "model": model_value,
254
- "author": metadata.get("author", "unknown"),
240
+ "model": frontmatter.get("model", "sonnet"),
241
+ "author": frontmatter.get("author", "unknown"),
255
242
  }
256
243
 
257
244
  # Validate required fields
@@ -261,8 +248,8 @@ class AgentDiscoveryService:
261
248
 
262
249
  return agent_info
263
250
 
264
- except json.JSONDecodeError as e:
265
- self.logger.error(f"Invalid JSON in template {template_file.name}: {e}")
251
+ except yaml.YAMLError as e:
252
+ self.logger.error(f"Invalid YAML frontmatter in {template_file.name}: {e}")
266
253
  return None
267
254
  except Exception as e:
268
255
  self.logger.error(
@@ -270,37 +257,73 @@ class AgentDiscoveryService:
270
257
  )
271
258
  return None
272
259
 
260
+ def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
261
+ """
262
+ Extract and parse YAML frontmatter from markdown.
263
+
264
+ Frontmatter must be at the start of the file, delimited by '---'.
265
+ Example:
266
+ ---
267
+ name: agent_name
268
+ description: Agent description
269
+ version: 1.0.0
270
+ ---
271
+ # Agent content...
272
+
273
+ Args:
274
+ content: File content to parse
275
+
276
+ Returns:
277
+ Parsed YAML frontmatter as dict, or None if not found/invalid
278
+ """
279
+ if not content.strip().startswith("---"):
280
+ return None
281
+
282
+ # Split on --- delimiters
283
+ parts = content.split("---", 2)
284
+ if len(parts) < 3:
285
+ return None
286
+
287
+ try:
288
+ return yaml.safe_load(parts[1])
289
+ except yaml.YAMLError as e:
290
+ self.logger.warning(f"Failed to parse YAML frontmatter: {e}")
291
+ return None
292
+
273
293
  def _is_mpm_agent(self, template_file: Path) -> bool:
274
294
  """Check if agent is authored by Claude MPM team.
275
295
 
276
296
  MPM agents must have:
277
297
  - An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
278
- - A valid agent_version field
298
+ - A valid version field
279
299
 
280
300
  Args:
281
- template_file: Path to the agent template JSON file
301
+ template_file: Path to the agent template markdown file
282
302
 
283
303
  Returns:
284
304
  True if this is an MPM agent, False otherwise
285
305
  """
286
306
  try:
287
- template_data = json.loads(template_file.read_text())
288
- metadata = template_data.get("metadata", {})
307
+ # Extract YAML frontmatter
308
+ content = template_file.read_text()
309
+ frontmatter = self._extract_yaml_frontmatter(content)
310
+ if not frontmatter:
311
+ return False
289
312
 
290
313
  # Check for author field
291
- author = metadata.get("author", "").lower()
314
+ author = frontmatter.get("author", "").lower()
292
315
  has_valid_author = any(
293
316
  pattern in author
294
317
  for pattern in ["claude mpm", "claude-mpm", "anthropic"]
295
318
  )
296
319
 
297
320
  # Check for version field
298
- has_version = bool(template_data.get("agent_version"))
321
+ has_version = bool(frontmatter.get("version"))
299
322
 
300
323
  if not has_valid_author or not has_version:
301
324
  self.logger.debug(
302
325
  f"Filtered non-MPM agent {template_file.name}: "
303
- f"author='{metadata.get('author', 'missing')}', "
326
+ f"author='{frontmatter.get('author', 'missing')}', "
304
327
  f"version={'present' if has_version else 'missing'}"
305
328
  )
306
329
 
@@ -366,10 +389,10 @@ class AgentDiscoveryService:
366
389
 
367
390
  def _validate_template_file(self, template_file: Path) -> bool:
368
391
  """
369
- Validate that a template file is properly formatted.
392
+ Validate that a template file is properly formatted with YAML frontmatter.
370
393
 
371
394
  Args:
372
- template_file: Path to template file to validate
395
+ template_file: Path to markdown template file to validate
373
396
 
374
397
  Returns:
375
398
  True if template is valid, False otherwise
@@ -379,23 +402,27 @@ class AgentDiscoveryService:
379
402
  if not template_file.exists():
380
403
  return False
381
404
 
382
- # Parse JSON content
405
+ # Read and parse YAML frontmatter
383
406
  content = template_file.read_text()
384
- template_data = json.loads(content)
407
+ frontmatter = self._extract_yaml_frontmatter(content)
408
+ if not frontmatter:
409
+ self.logger.warning(
410
+ f"Template {template_file.name} has no valid YAML frontmatter"
411
+ )
412
+ return False
385
413
 
386
- # Check required fields in metadata section (per agent schema)
387
- metadata = template_data.get("metadata", {})
414
+ # Check required fields (flat structure in markdown templates)
388
415
  required_fields = ["name", "description"]
389
416
  for field in required_fields:
390
- if field not in metadata:
417
+ if field not in frontmatter:
391
418
  self.logger.warning(
392
- f"Template {template_file.name} missing required field in metadata: {field}"
419
+ f"Template {template_file.name} missing required field: {field}"
393
420
  )
394
421
  return False
395
422
 
396
423
  # Validate agent ID format (Claude Code requirements)
397
424
  # Use agent_id for validation, not the display name
398
- agent_id = template_data.get("agent_id", "")
425
+ agent_id = frontmatter.get("agent_id", "")
399
426
  if not self._is_valid_agent_name(agent_id):
400
427
  self.logger.warning(
401
428
  f"Invalid agent ID format in {template_file.name}: {agent_id}"
@@ -404,8 +431,10 @@ class AgentDiscoveryService:
404
431
 
405
432
  return True
406
433
 
407
- except json.JSONDecodeError:
408
- self.logger.error(f"Invalid JSON in template: {template_file.name}")
434
+ except yaml.YAMLError:
435
+ self.logger.error(
436
+ f"Invalid YAML frontmatter in template: {template_file.name}"
437
+ )
409
438
  return False
410
439
  except Exception as e:
411
440
  self.logger.error(
@@ -431,25 +460,28 @@ class AgentDiscoveryService:
431
460
 
432
461
  return bool(re.match(pattern, agent_name))
433
462
 
434
- def _is_mpm_agent(
463
+ def _is_mpm_agent_with_config(
435
464
  self, template_file: Path, config: Optional[Config] = None
436
465
  ) -> bool:
437
- """Check if agent is authored by Claude MPM team.
466
+ """Check if agent is authored by Claude MPM team with configurable patterns.
438
467
 
439
468
  MPM agents must have:
440
469
  - An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
441
- - A valid agent_version field
470
+ - A valid version field
442
471
 
443
472
  Args:
444
- template_file: Path to the agent template JSON file
473
+ template_file: Path to the agent template markdown file
445
474
  config: Configuration object for MPM patterns
446
475
 
447
476
  Returns:
448
477
  True if this is an MPM agent, False otherwise
449
478
  """
450
479
  try:
451
- template_data = json.loads(template_file.read_text())
452
- metadata = template_data.get("metadata", {})
480
+ # Extract YAML frontmatter
481
+ content = template_file.read_text()
482
+ frontmatter = self._extract_yaml_frontmatter(content)
483
+ if not frontmatter:
484
+ return False
453
485
 
454
486
  # Get MPM author patterns from config
455
487
  if config:
@@ -461,13 +493,13 @@ class AgentDiscoveryService:
461
493
  mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
462
494
 
463
495
  # Check for author field
464
- author = metadata.get("author", "").lower()
496
+ author = frontmatter.get("author", "").lower()
465
497
  has_valid_author = any(
466
498
  pattern.lower() in author for pattern in mpm_patterns
467
499
  )
468
500
 
469
501
  # Check for version field
470
- has_version = bool(template_data.get("agent_version"))
502
+ has_version = bool(frontmatter.get("version"))
471
503
 
472
504
  return has_valid_author and has_version
473
505
 
@@ -494,8 +526,8 @@ class AgentDiscoveryService:
494
526
  if not self.templates_dir.exists():
495
527
  return stats
496
528
 
497
- # Count template files
498
- template_files = list(self.templates_dir.glob("*.json"))
529
+ # Count markdown template files
530
+ template_files = list(self.templates_dir.glob("*.md"))
499
531
  stats["total_templates"] = len(template_files)
500
532
 
501
533
  # Validate each template
@@ -166,7 +166,7 @@ class AgentFormatConverter:
166
166
 
167
167
  <example>
168
168
  Context: When you need specialized assistance from the {name} agent.
169
- user: "I need help with {agent_name.replace('_', ' ').replace('-', ' ')} tasks"
169
+ user: "I need help with {agent_name.replace("_", " ").replace("-", " ")} tasks"
170
170
  assistant: "I'll use the {name} agent to provide specialized assistance."
171
171
  </example>"""
172
172
 
@@ -63,11 +63,7 @@ from .agent_operation_service import (
63
63
  LifecycleOperationResult,
64
64
  )
65
65
  from .agent_record_service import AgentRecordService
66
- from .agent_state_service import (
67
- AgentLifecycleRecord,
68
- AgentStateService,
69
- LifecycleState,
70
- )
66
+ from .agent_state_service import AgentLifecycleRecord, AgentStateService, LifecycleState
71
67
 
72
68
  # Re-export for backward compatibility
73
69
  __all__ = [
@@ -176,9 +176,9 @@ class AgentMetricsCollector:
176
176
  agent_name: Name of the agent being validated
177
177
  validation_time_ms: Validation time in milliseconds
178
178
  """
179
- self._deployment_metrics["template_validation_times"][
180
- agent_name
181
- ] = validation_time_ms
179
+ self._deployment_metrics["template_validation_times"][agent_name] = (
180
+ validation_time_ms
181
+ )
182
182
 
183
183
  def get_performance_summary(self) -> Dict[str, Any]:
184
184
  """
@@ -10,10 +10,7 @@ from typing import TYPE_CHECKING, Optional
10
10
  from claude_mpm.core.path_ops import path_ops
11
11
 
12
12
  if TYPE_CHECKING:
13
- from .agent_lifecycle_manager import (
14
- AgentLifecycleManager,
15
- LifecycleOperationResult,
16
- )
13
+ from .agent_lifecycle_manager import AgentLifecycleManager, LifecycleOperationResult
17
14
 
18
15
 
19
16
  class AgentRestoreHandler: