claude-mpm 4.25.10__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 (507) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
  4. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  5. claude_mpm/agents/WORKFLOW.md +4 -4
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent_loader.py +10 -35
  9. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
  10. claude_mpm/agents/templates/context-management-examples.md +544 -0
  11. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  12. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  13. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  14. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  15. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  16. claude_mpm/cli/__init__.py +28 -3
  17. claude_mpm/cli/commands/__init__.py +2 -0
  18. claude_mpm/cli/commands/agent_source.py +774 -0
  19. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  20. claude_mpm/cli/commands/agents.py +959 -36
  21. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  22. claude_mpm/cli/commands/agents_discover.py +338 -0
  23. claude_mpm/cli/commands/auto_configure.py +537 -239
  24. claude_mpm/cli/commands/config.py +7 -4
  25. claude_mpm/cli/commands/configure.py +924 -45
  26. claude_mpm/cli/commands/configure_navigation.py +63 -46
  27. claude_mpm/cli/commands/doctor.py +10 -2
  28. claude_mpm/cli/commands/local_deploy.py +1 -4
  29. claude_mpm/cli/commands/postmortem.py +401 -0
  30. claude_mpm/cli/commands/run.py +1 -39
  31. claude_mpm/cli/commands/skill_source.py +694 -0
  32. claude_mpm/cli/commands/skills.py +322 -19
  33. claude_mpm/cli/executor.py +22 -3
  34. claude_mpm/cli/interactive/agent_wizard.py +1028 -43
  35. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  36. claude_mpm/cli/parsers/agents_parser.py +256 -4
  37. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  38. claude_mpm/cli/parsers/base_parser.py +25 -0
  39. claude_mpm/cli/parsers/config_parser.py +96 -43
  40. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  41. claude_mpm/cli/parsers/skills_parser.py +7 -0
  42. claude_mpm/cli/parsers/source_parser.py +138 -0
  43. claude_mpm/cli/startup.py +456 -103
  44. claude_mpm/cli/startup_display.py +4 -4
  45. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  46. claude_mpm/commands/mpm-agents-detect.md +9 -0
  47. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  48. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  49. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  50. claude_mpm/commands/mpm-doctor.md +9 -0
  51. claude_mpm/commands/mpm-help.md +14 -2
  52. claude_mpm/commands/mpm-init.md +9 -0
  53. claude_mpm/commands/mpm-monitor.md +9 -0
  54. claude_mpm/commands/mpm-postmortem.md +123 -0
  55. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  56. claude_mpm/commands/mpm-status.md +9 -0
  57. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  58. claude_mpm/commands/mpm-ticket-view.md +552 -0
  59. claude_mpm/commands/mpm-version.md +9 -0
  60. claude_mpm/commands/mpm.md +10 -0
  61. claude_mpm/config/agent_presets.py +488 -0
  62. claude_mpm/config/agent_sources.py +325 -0
  63. claude_mpm/config/skill_presets.py +392 -0
  64. claude_mpm/config/skill_sources.py +590 -0
  65. claude_mpm/constants.py +1 -0
  66. claude_mpm/core/claude_runner.py +5 -34
  67. claude_mpm/core/config.py +16 -0
  68. claude_mpm/core/framework/__init__.py +3 -16
  69. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  70. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  71. claude_mpm/core/interactive_session.py +83 -7
  72. claude_mpm/core/oneshot_session.py +71 -8
  73. claude_mpm/core/protocols/__init__.py +23 -0
  74. claude_mpm/core/protocols/runner_protocol.py +103 -0
  75. claude_mpm/core/protocols/session_protocol.py +131 -0
  76. claude_mpm/core/shared/singleton_manager.py +11 -4
  77. claude_mpm/core/system_context.py +38 -0
  78. claude_mpm/core/unified_config.py +22 -0
  79. claude_mpm/experimental/cli_enhancements.py +1 -5
  80. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  87. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  88. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  89. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  92. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  93. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  94. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  95. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  96. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  97. claude_mpm/models/git_repository.py +198 -0
  98. claude_mpm/services/agents/agent_builder.py +45 -9
  99. claude_mpm/services/agents/agent_preset_service.py +238 -0
  100. claude_mpm/services/agents/agent_selection_service.py +484 -0
  101. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  102. claude_mpm/services/agents/cache_git_manager.py +621 -0
  103. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  104. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  105. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  106. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  107. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  108. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  109. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  110. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  111. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  112. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  113. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  114. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  115. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  116. claude_mpm/services/agents/git_source_manager.py +629 -0
  117. claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
  118. claude_mpm/services/agents/local_template_manager.py +47 -9
  119. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  120. claude_mpm/services/agents/sources/__init__.py +13 -0
  121. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  122. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  123. claude_mpm/services/agents/startup_sync.py +239 -0
  124. claude_mpm/services/agents/toolchain_detector.py +474 -0
  125. claude_mpm/services/analysis/__init__.py +25 -0
  126. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  127. claude_mpm/services/analysis/postmortem_service.py +765 -0
  128. claude_mpm/services/command_deployment_service.py +200 -6
  129. claude_mpm/services/core/base.py +7 -2
  130. claude_mpm/services/core/interfaces/__init__.py +1 -3
  131. claude_mpm/services/core/interfaces/health.py +1 -4
  132. claude_mpm/services/core/models/__init__.py +2 -11
  133. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  134. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  135. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  136. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  137. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  138. claude_mpm/services/diagnostics/doctor_reporter.py +34 -6
  139. claude_mpm/services/git/__init__.py +21 -0
  140. claude_mpm/services/git/git_operations_service.py +494 -0
  141. claude_mpm/services/github/__init__.py +21 -0
  142. claude_mpm/services/github/github_cli_service.py +397 -0
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  145. claude_mpm/services/instructions/__init__.py +9 -0
  146. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  147. claude_mpm/services/local_ops/__init__.py +3 -13
  148. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  149. claude_mpm/services/local_ops/health_manager.py +1 -4
  150. claude_mpm/services/mcp_config_manager.py +75 -145
  151. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  152. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  153. claude_mpm/services/mcp_service_verifier.py +6 -3
  154. claude_mpm/services/monitor/daemon.py +28 -8
  155. claude_mpm/services/monitor/daemon_manager.py +96 -19
  156. claude_mpm/services/pr/__init__.py +14 -0
  157. claude_mpm/services/pr/pr_template_service.py +329 -0
  158. claude_mpm/services/project/project_organizer.py +4 -0
  159. claude_mpm/services/runner_configuration_service.py +16 -3
  160. claude_mpm/services/session_management_service.py +16 -4
  161. claude_mpm/services/skills/__init__.py +18 -0
  162. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  163. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  164. claude_mpm/services/socketio/server/core.py +1 -4
  165. claude_mpm/services/socketio/server/main.py +1 -3
  166. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  167. claude_mpm/services/unified/unified_deployment.py +1 -5
  168. claude_mpm/services/visualization/__init__.py +1 -5
  169. claude_mpm/templates/questions/__init__.py +2 -7
  170. claude_mpm/templates/questions/pr_strategy.py +1 -4
  171. claude_mpm/templates/questions/project_init.py +1 -4
  172. claude_mpm/templates/questions/ticket_mgmt.py +1 -4
  173. claude_mpm/utils/agent_dependency_loader.py +77 -10
  174. claude_mpm/utils/agent_filters.py +288 -0
  175. claude_mpm/utils/gitignore.py +3 -0
  176. claude_mpm/utils/migration.py +372 -0
  177. claude_mpm/utils/progress.py +387 -0
  178. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
  179. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
  180. claude_mpm/agents/templates/agent-manager.json +0 -273
  181. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  182. claude_mpm/agents/templates/api_qa.json +0 -183
  183. claude_mpm/agents/templates/clerk-ops.json +0 -235
  184. claude_mpm/agents/templates/code_analyzer.json +0 -101
  185. claude_mpm/agents/templates/content-agent.json +0 -358
  186. claude_mpm/agents/templates/dart_engineer.json +0 -307
  187. claude_mpm/agents/templates/data_engineer.json +0 -225
  188. claude_mpm/agents/templates/documentation.json +0 -238
  189. claude_mpm/agents/templates/engineer.json +0 -210
  190. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  191. claude_mpm/agents/templates/golang_engineer.json +0 -270
  192. claude_mpm/agents/templates/imagemagick.json +0 -264
  193. claude_mpm/agents/templates/java_engineer.json +0 -346
  194. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  195. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  196. claude_mpm/agents/templates/memory_manager.json +0 -158
  197. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  198. claude_mpm/agents/templates/ops.json +0 -185
  199. claude_mpm/agents/templates/php-engineer.json +0 -287
  200. claude_mpm/agents/templates/product_owner.json +0 -338
  201. claude_mpm/agents/templates/project_organizer.json +0 -144
  202. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  203. claude_mpm/agents/templates/python_engineer.json +0 -387
  204. claude_mpm/agents/templates/qa.json +0 -243
  205. claude_mpm/agents/templates/react_engineer.json +0 -239
  206. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  207. claude_mpm/agents/templates/research.json +0 -258
  208. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  209. claude_mpm/agents/templates/rust_engineer.json +0 -275
  210. claude_mpm/agents/templates/security.json +0 -202
  211. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  212. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  213. claude_mpm/agents/templates/ticketing.json +0 -181
  214. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  215. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  216. claude_mpm/agents/templates/version_control.json +0 -159
  217. claude_mpm/agents/templates/web_qa.json +0 -400
  218. claude_mpm/agents/templates/web_ui.json +0 -189
  219. claude_mpm/cli/README.md +0 -253
  220. claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
  221. claude_mpm/cli/commands/mpm_init/README.md +0 -365
  222. claude_mpm/cli_module/refactoring_guide.md +0 -253
  223. claude_mpm/commands/mpm-tickets.md +0 -151
  224. claude_mpm/config/agent_capabilities.yaml +0 -658
  225. claude_mpm/config/async_logging_config.yaml +0 -145
  226. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
  227. claude_mpm/d2/.gitignore +0 -22
  228. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
  229. claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
  230. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
  231. claude_mpm/d2/QUICKSTART.md +0 -186
  232. claude_mpm/d2/README.md +0 -232
  233. claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
  234. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
  235. claude_mpm/d2/TESTING.md +0 -288
  236. claude_mpm/d2/index.html +0 -118
  237. claude_mpm/d2/package.json +0 -19
  238. claude_mpm/d2/src/App.svelte +0 -110
  239. claude_mpm/d2/src/components/Header.svelte +0 -153
  240. claude_mpm/d2/src/components/MainContent.svelte +0 -74
  241. claude_mpm/d2/src/components/Sidebar.svelte +0 -85
  242. claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
  243. claude_mpm/d2/src/lib/socketio.js +0 -144
  244. claude_mpm/d2/src/main.js +0 -7
  245. claude_mpm/d2/src/stores/events.js +0 -114
  246. claude_mpm/d2/src/stores/socket.js +0 -108
  247. claude_mpm/d2/src/stores/theme.js +0 -65
  248. claude_mpm/d2/svelte.config.js +0 -12
  249. claude_mpm/d2/vite.config.js +0 -15
  250. claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
  251. claude_mpm/dashboard/BUILD_NUMBER +0 -1
  252. claude_mpm/dashboard/README.md +0 -121
  253. claude_mpm/dashboard/VERSION +0 -1
  254. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  255. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
  256. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
  257. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  258. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
  259. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  260. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
  261. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  262. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
  263. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
  264. claude_mpm/dashboard/react/entries/events.tsx +0 -165
  265. claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
  266. claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
  267. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  268. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
  269. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  270. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  271. claude_mpm/dashboard/static/built/components/activity-tree.js.map +0 -1
  272. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  273. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  274. claude_mpm/dashboard/static/built/components/agent-inference.js.map +0 -1
  275. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  276. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  277. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  278. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  279. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  280. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  281. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  282. claude_mpm/dashboard/static/built/components/code-tree.js.map +0 -1
  283. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  284. claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
  285. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  286. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  287. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  288. claude_mpm/dashboard/static/built/components/event-processor.js.map +0 -1
  289. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  290. claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
  291. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  292. claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
  293. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  294. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  295. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  296. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +0 -1
  297. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  298. claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
  299. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  300. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
  301. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  302. claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
  303. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  304. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
  305. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  306. claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
  307. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  308. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  309. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  310. claude_mpm/dashboard/static/built/components/session-manager.js.map +0 -1
  311. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  312. claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
  313. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  314. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
  315. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  316. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
  317. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  318. claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
  319. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  320. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  321. claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
  322. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  323. claude_mpm/dashboard/static/built/react/events.js +0 -30
  324. claude_mpm/dashboard/static/built/react/events.js.map +0 -1
  325. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  326. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  327. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  328. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  329. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  330. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  331. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  332. claude_mpm/dashboard/static/built/socket-client.js.map +0 -1
  333. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  334. claude_mpm/dashboard/static/events.html +0 -607
  335. claude_mpm/dashboard/static/index.html +0 -635
  336. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
  337. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  338. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  339. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  340. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  342. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  343. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  344. claude_mpm/dashboard/static/legacy/files.html +0 -747
  345. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  346. claude_mpm/dashboard/static/monitors.html +0 -431
  347. claude_mpm/dashboard/static/navigation-test-results.md +0 -118
  348. claude_mpm/dashboard/static/production/events.html +0 -659
  349. claude_mpm/dashboard/static/production/main.html +0 -698
  350. claude_mpm/dashboard/static/production/monitors.html +0 -483
  351. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  352. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  353. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  354. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  355. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
  356. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
  357. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
  358. claude_mpm/hooks/README.md +0 -143
  359. claude_mpm/hooks/templates/README.md +0 -180
  360. claude_mpm/hooks/templates/settings.json.example +0 -147
  361. claude_mpm/schemas/agent_schema.json +0 -596
  362. claude_mpm/schemas/frontmatter_schema.json +0 -165
  363. claude_mpm/services/event_bus/README.md +0 -244
  364. claude_mpm/services/events/README.md +0 -303
  365. claude_mpm/services/framework_claude_md_generator/README.md +0 -119
  366. claude_mpm/services/mcp_gateway/README.md +0 -185
  367. claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
  368. claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
  369. claude_mpm/services/static/.gitkeep +0 -2
  370. claude_mpm/services/version_control/VERSION +0 -1
  371. claude_mpm/skills/bundled/.gitkeep +0 -2
  372. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  373. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  374. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  375. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  376. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  377. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  378. claude_mpm/skills/bundled/collaboration/git-worktrees.md +0 -317
  379. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  380. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  381. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  382. claude_mpm/skills/bundled/collaboration/stacked-prs.md +0 -251
  383. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  384. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  385. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  386. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  387. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +0 -63
  388. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  389. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  390. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  391. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  392. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  393. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  394. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  395. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  396. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  397. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  398. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  399. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  400. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  401. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  402. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  403. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  404. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  405. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  406. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  407. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +0 -611
  408. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
  409. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
  410. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
  411. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
  412. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
  413. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
  414. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
  415. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
  416. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
  417. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  418. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
  419. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
  420. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  421. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
  422. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  423. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  424. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  425. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  426. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  427. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +0 -202
  428. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  429. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  430. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  431. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  435. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +0 -22
  436. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
  437. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
  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/react/flexlayout-react.md +0 -742
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  459. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +0 -495
  460. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
  461. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
  462. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
  463. claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
  464. claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
  465. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
  466. claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
  467. claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
  468. claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
  469. claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +0 -458
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +0 -202
  490. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  491. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  492. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  493. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  494. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  495. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  496. claude_mpm/templates/questions/EXAMPLES.md +0 -501
  497. claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
  498. claude_mpm/tools/code_tree_analyzer/README.md +0 -64
  499. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  500. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  501. /claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +0 -0
  502. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  503. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  504. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  505. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  506. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  507. {claude_mpm-4.25.10.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
@@ -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__ = [
@@ -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: