claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (792) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +432 -158
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/OUTPUT_STYLE.md +254 -29
  13. claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -191
  16. claude_mpm/agents/__init__.py +6 -0
  17. claude_mpm/agents/agent_loader.py +41 -14
  18. claude_mpm/agents/agent_loader_integration.py +3 -2
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent.json +6 -3
  21. claude_mpm/agents/base_agent_loader.py +21 -44
  22. claude_mpm/agents/frontmatter_validator.py +292 -252
  23. claude_mpm/agents/system_agent_config.py +3 -2
  24. claude_mpm/agents/templates/README.md +465 -0
  25. claude_mpm/agents/templates/circuit-breakers.md +1005 -0
  26. claude_mpm/agents/templates/context-management-examples.md +544 -0
  27. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  28. claude_mpm/agents/templates/pm-examples.md +474 -0
  29. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  30. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  31. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  32. claude_mpm/agents/templates/response-format.md +583 -0
  33. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  34. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  35. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  36. claude_mpm/agents/templates/validation-templates.md +312 -0
  37. claude_mpm/cli/__init__.py +72 -376
  38. claude_mpm/cli/commands/__init__.py +4 -0
  39. claude_mpm/cli/commands/agent_manager.py +675 -20
  40. claude_mpm/cli/commands/agent_source.py +774 -0
  41. claude_mpm/cli/commands/agent_state_manager.py +344 -0
  42. claude_mpm/cli/commands/agents.py +1673 -178
  43. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  44. claude_mpm/cli/commands/agents_detect.py +380 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_recommend.py +309 -0
  47. claude_mpm/cli/commands/aggregate.py +11 -7
  48. claude_mpm/cli/commands/analyze.py +18 -13
  49. claude_mpm/cli/commands/analyze_code.py +8 -4
  50. claude_mpm/cli/commands/auto_configure.py +566 -0
  51. claude_mpm/cli/commands/cleanup.py +12 -12
  52. claude_mpm/cli/commands/config.py +54 -17
  53. claude_mpm/cli/commands/configure.py +1184 -1055
  54. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  55. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  56. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  57. claude_mpm/cli/commands/configure_models.py +18 -0
  58. claude_mpm/cli/commands/configure_navigation.py +184 -0
  59. claude_mpm/cli/commands/configure_paths.py +104 -0
  60. claude_mpm/cli/commands/configure_persistence.py +254 -0
  61. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  62. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  63. claude_mpm/cli/commands/configure_validators.py +73 -0
  64. claude_mpm/cli/commands/dashboard.py +50 -52
  65. claude_mpm/cli/commands/debug.py +19 -19
  66. claude_mpm/cli/commands/doctor.py +51 -7
  67. claude_mpm/cli/commands/hook_errors.py +277 -0
  68. claude_mpm/cli/commands/info.py +3 -4
  69. claude_mpm/cli/commands/local_deploy.py +534 -0
  70. claude_mpm/cli/commands/mcp.py +17 -10
  71. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  72. claude_mpm/cli/commands/mcp_config.py +154 -0
  73. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  74. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  75. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  76. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  77. claude_mpm/cli/commands/memory.py +55 -21
  78. claude_mpm/cli/commands/monitor.py +160 -70
  79. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  80. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  81. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  82. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  83. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  84. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  85. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  86. claude_mpm/cli/commands/mpm_init_handler.py +114 -4
  87. claude_mpm/cli/commands/postmortem.py +401 -0
  88. claude_mpm/cli/commands/run.py +252 -167
  89. claude_mpm/cli/commands/search.py +458 -0
  90. claude_mpm/cli/commands/skill_source.py +694 -0
  91. claude_mpm/cli/commands/skills.py +1225 -0
  92. claude_mpm/cli/commands/uninstall.py +176 -0
  93. claude_mpm/cli/commands/upgrade.py +152 -0
  94. claude_mpm/cli/commands/verify.py +119 -0
  95. claude_mpm/cli/executor.py +279 -0
  96. claude_mpm/cli/helpers.py +105 -0
  97. claude_mpm/cli/interactive/__init__.py +21 -0
  98. claude_mpm/cli/interactive/agent_wizard.py +1872 -0
  99. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  100. claude_mpm/cli/parser.py +79 -2
  101. claude_mpm/cli/parsers/__init__.py +7 -1
  102. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  103. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  104. claude_mpm/cli/parsers/agents_parser.py +369 -1
  105. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  106. claude_mpm/cli/parsers/base_parser.py +196 -3
  107. claude_mpm/cli/parsers/config_parser.py +96 -43
  108. claude_mpm/cli/parsers/configure_parser.py +11 -15
  109. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  110. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  111. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  112. claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
  113. claude_mpm/cli/parsers/run_parser.py +5 -0
  114. claude_mpm/cli/parsers/search_parser.py +245 -0
  115. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  116. claude_mpm/cli/parsers/skills_parser.py +282 -0
  117. claude_mpm/cli/parsers/source_parser.py +138 -0
  118. claude_mpm/cli/shared/argument_patterns.py +20 -13
  119. claude_mpm/cli/shared/base_command.py +2 -2
  120. claude_mpm/cli/shared/output_formatters.py +28 -19
  121. claude_mpm/cli/startup.py +994 -0
  122. claude_mpm/cli/startup_display.py +480 -0
  123. claude_mpm/cli/startup_logging.py +179 -13
  124. claude_mpm/cli/utils.py +54 -3
  125. claude_mpm/cli_module/commands.py +1 -1
  126. claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
  127. claude_mpm/commands/mpm-agents-detect.md +177 -0
  128. claude_mpm/commands/mpm-agents-list.md +131 -0
  129. claude_mpm/commands/mpm-agents-recommend.md +223 -0
  130. claude_mpm/commands/mpm-config-view.md +150 -0
  131. claude_mpm/commands/mpm-doctor.md +9 -0
  132. claude_mpm/commands/mpm-help.md +297 -5
  133. claude_mpm/commands/mpm-init.md +401 -17
  134. claude_mpm/commands/mpm-monitor.md +418 -0
  135. claude_mpm/commands/mpm-postmortem.md +123 -0
  136. claude_mpm/commands/mpm-session-resume.md +381 -0
  137. claude_mpm/commands/mpm-status.md +79 -8
  138. claude_mpm/commands/mpm-ticket-organize.md +304 -0
  139. claude_mpm/commands/mpm-ticket-view.md +552 -0
  140. claude_mpm/commands/mpm-version.md +122 -0
  141. claude_mpm/commands/mpm.md +12 -0
  142. claude_mpm/config/agent_config.py +4 -4
  143. claude_mpm/config/agent_presets.py +488 -0
  144. claude_mpm/config/agent_sources.py +325 -0
  145. claude_mpm/config/experimental_features.py +7 -7
  146. claude_mpm/config/model_config.py +428 -0
  147. claude_mpm/config/paths.py +3 -2
  148. claude_mpm/config/skill_presets.py +392 -0
  149. claude_mpm/config/skill_sources.py +590 -0
  150. claude_mpm/config/socketio_config.py +3 -3
  151. claude_mpm/constants.py +28 -1
  152. claude_mpm/core/__init__.py +53 -17
  153. claude_mpm/core/agent_name_normalizer.py +3 -2
  154. claude_mpm/core/agent_registry.py +2 -2
  155. claude_mpm/core/agent_session_manager.py +10 -10
  156. claude_mpm/core/api_validator.py +330 -0
  157. claude_mpm/core/base_service.py +33 -23
  158. claude_mpm/core/cache.py +9 -9
  159. claude_mpm/core/claude_runner.py +24 -42
  160. claude_mpm/core/config.py +101 -8
  161. claude_mpm/core/config_aliases.py +7 -6
  162. claude_mpm/core/constants.py +66 -1
  163. claude_mpm/core/container.py +11 -5
  164. claude_mpm/core/enums.py +452 -0
  165. claude_mpm/core/error_handler.py +623 -0
  166. claude_mpm/core/factories.py +1 -1
  167. claude_mpm/core/file_utils.py +764 -0
  168. claude_mpm/core/framework/__init__.py +25 -0
  169. claude_mpm/core/framework/formatters/__init__.py +11 -0
  170. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  171. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  172. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  173. claude_mpm/core/framework/loaders/__init__.py +13 -0
  174. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  175. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  176. claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
  177. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  178. claude_mpm/core/framework/processors/__init__.py +11 -0
  179. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  180. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  181. claude_mpm/core/framework/processors/template_processor.py +244 -0
  182. claude_mpm/core/framework_loader.py +321 -1631
  183. claude_mpm/core/hook_error_memory.py +381 -0
  184. claude_mpm/core/hook_manager.py +49 -8
  185. claude_mpm/core/injectable_service.py +11 -8
  186. claude_mpm/core/instruction_reinforcement_hook.py +4 -3
  187. claude_mpm/core/interactive_session.py +146 -18
  188. claude_mpm/core/interfaces.py +56 -1
  189. claude_mpm/core/lazy.py +3 -3
  190. claude_mpm/core/log_manager.py +92 -23
  191. claude_mpm/core/logger.py +22 -15
  192. claude_mpm/core/logging_config.py +6 -2
  193. claude_mpm/core/logging_utils.py +520 -0
  194. claude_mpm/core/oneshot_session.py +122 -15
  195. claude_mpm/core/optimized_agent_loader.py +9 -9
  196. claude_mpm/core/optimized_startup.py +1 -1
  197. claude_mpm/core/output_style_manager.py +12 -192
  198. claude_mpm/core/pm_hook_interceptor.py +18 -12
  199. claude_mpm/core/protocols/__init__.py +23 -0
  200. claude_mpm/core/protocols/runner_protocol.py +103 -0
  201. claude_mpm/core/protocols/session_protocol.py +131 -0
  202. claude_mpm/core/service_registry.py +7 -3
  203. claude_mpm/core/session_manager.py +14 -12
  204. claude_mpm/core/shared/config_loader.py +1 -1
  205. claude_mpm/core/shared/singleton_manager.py +11 -4
  206. claude_mpm/core/socketio_pool.py +15 -15
  207. claude_mpm/core/system_context.py +38 -0
  208. claude_mpm/core/tool_access_control.py +3 -2
  209. claude_mpm/core/types.py +4 -11
  210. claude_mpm/core/typing_utils.py +7 -6
  211. claude_mpm/core/unified_agent_registry.py +115 -11
  212. claude_mpm/core/unified_config.py +6 -6
  213. claude_mpm/core/unified_paths.py +23 -20
  214. claude_mpm/dashboard/analysis_runner.py +4 -4
  215. claude_mpm/dashboard/api/simple_directory.py +261 -0
  216. claude_mpm/dashboard/static/css/activity.css +69 -69
  217. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  218. claude_mpm/dashboard/static/css/dashboard.css +600 -18
  219. claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
  220. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
  221. claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
  222. claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
  223. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  224. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  225. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  226. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  227. claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
  228. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  229. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  230. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  231. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
  232. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  233. claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
  234. claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
  235. claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
  236. claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
  237. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
  238. claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
  239. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  240. claude_mpm/dashboard/static/js/dashboard.js +309 -178
  241. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  242. claude_mpm/dashboard/static/js/socket-client.js +183 -139
  243. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  244. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  245. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  246. claude_mpm/dashboard/templates/code_simple.html +153 -0
  247. claude_mpm/dashboard/templates/index.html +125 -122
  248. claude_mpm/experimental/cli_enhancements.py +5 -7
  249. claude_mpm/generators/agent_profile_generator.py +5 -3
  250. claude_mpm/hooks/__init__.py +37 -1
  251. claude_mpm/hooks/base_hook.py +5 -4
  252. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  255. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  256. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  257. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  258. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  259. claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
  260. claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
  261. claude_mpm/hooks/claude_hooks/installer.py +67 -22
  262. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  263. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  271. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  272. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  273. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  274. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  275. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  276. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  277. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  278. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  279. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  280. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  281. claude_mpm/hooks/memory_integration_hook.py +1 -1
  282. claude_mpm/hooks/session_resume_hook.py +121 -0
  283. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  284. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  285. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  286. claude_mpm/hooks/validation_hooks.py +3 -3
  287. claude_mpm/init.py +23 -4
  288. claude_mpm/models/agent_session.py +8 -6
  289. claude_mpm/models/git_repository.py +198 -0
  290. claude_mpm/models/resume_log.py +340 -0
  291. claude_mpm/scripts/claude-hook-handler.sh +35 -9
  292. claude_mpm/scripts/launch_monitor.py +85 -0
  293. claude_mpm/scripts/mcp_server.py +3 -5
  294. claude_mpm/scripts/mpm_doctor.py +3 -2
  295. claude_mpm/scripts/socketio_daemon.py +159 -512
  296. claude_mpm/scripts/start_activity_logging.py +3 -1
  297. claude_mpm/services/__init__.py +144 -160
  298. claude_mpm/services/agents/__init__.py +18 -5
  299. claude_mpm/services/agents/agent_builder.py +56 -18
  300. claude_mpm/services/agents/agent_preset_service.py +238 -0
  301. claude_mpm/services/agents/agent_selection_service.py +484 -0
  302. claude_mpm/services/agents/auto_config_manager.py +796 -0
  303. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  304. claude_mpm/services/agents/cache_git_manager.py +621 -0
  305. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  306. claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
  307. claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
  308. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  309. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  310. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
  311. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  312. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  313. claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
  314. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  315. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  316. claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
  317. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  318. claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
  319. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  320. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  321. claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
  322. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  323. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  324. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  325. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  326. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  327. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  328. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
  329. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  330. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  331. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  332. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  333. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  334. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  335. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
  336. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  337. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  338. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
  339. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  340. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  341. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  342. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  343. claude_mpm/services/agents/git_source_manager.py +629 -0
  344. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  345. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  346. claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
  347. claude_mpm/services/agents/local_template_manager.py +784 -0
  348. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  349. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  350. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  351. claude_mpm/services/agents/memory/content_manager.py +17 -9
  352. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  353. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  354. claude_mpm/services/agents/memory/memory_format_service.py +6 -4
  355. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  356. claude_mpm/services/agents/memory/template_generator.py +3 -3
  357. claude_mpm/services/agents/observers.py +547 -0
  358. claude_mpm/services/agents/recommender.py +615 -0
  359. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  360. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  361. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  362. claude_mpm/services/agents/sources/__init__.py +13 -0
  363. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  364. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  365. claude_mpm/services/agents/startup_sync.py +239 -0
  366. claude_mpm/services/agents/toolchain_detector.py +474 -0
  367. claude_mpm/services/analysis/__init__.py +25 -0
  368. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  369. claude_mpm/services/analysis/postmortem_service.py +765 -0
  370. claude_mpm/services/async_session_logger.py +141 -98
  371. claude_mpm/services/claude_session_logger.py +82 -74
  372. claude_mpm/services/cli/agent_cleanup_service.py +5 -0
  373. claude_mpm/services/cli/agent_listing_service.py +5 -5
  374. claude_mpm/services/cli/agent_validation_service.py +3 -1
  375. claude_mpm/services/cli/memory_crud_service.py +12 -7
  376. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  377. claude_mpm/services/cli/resume_service.py +617 -0
  378. claude_mpm/services/cli/session_manager.py +104 -13
  379. claude_mpm/services/cli/session_pause_manager.py +504 -0
  380. claude_mpm/services/cli/session_resume_helper.py +372 -0
  381. claude_mpm/services/cli/startup_checker.py +13 -10
  382. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  383. claude_mpm/services/command_deployment_service.py +209 -13
  384. claude_mpm/services/command_handler_service.py +11 -5
  385. claude_mpm/services/core/__init__.py +33 -1
  386. claude_mpm/services/core/base.py +31 -11
  387. claude_mpm/services/core/interfaces/__init__.py +88 -3
  388. claude_mpm/services/core/interfaces/agent.py +184 -0
  389. claude_mpm/services/core/interfaces/health.py +169 -0
  390. claude_mpm/services/core/interfaces/model.py +281 -0
  391. claude_mpm/services/core/interfaces/process.py +372 -0
  392. claude_mpm/services/core/interfaces/project.py +121 -0
  393. claude_mpm/services/core/interfaces/restart.py +307 -0
  394. claude_mpm/services/core/interfaces/stability.py +260 -0
  395. claude_mpm/services/core/interfaces.py +56 -1
  396. claude_mpm/services/core/memory_manager.py +92 -47
  397. claude_mpm/services/core/models/__init__.py +70 -0
  398. claude_mpm/services/core/models/agent_config.py +384 -0
  399. claude_mpm/services/core/models/health.py +162 -0
  400. claude_mpm/services/core/models/process.py +239 -0
  401. claude_mpm/services/core/models/restart.py +302 -0
  402. claude_mpm/services/core/models/stability.py +264 -0
  403. claude_mpm/services/core/models/toolchain.py +306 -0
  404. claude_mpm/services/core/path_resolver.py +36 -14
  405. claude_mpm/services/diagnostics/__init__.py +2 -2
  406. claude_mpm/services/diagnostics/checks/__init__.py +8 -2
  407. claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
  408. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  409. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  410. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  411. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  412. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  413. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  414. claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
  415. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
  416. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  417. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
  418. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  419. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  420. claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
  421. claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
  422. claude_mpm/services/diagnostics/models.py +37 -21
  423. claude_mpm/services/event_aggregator.py +5 -3
  424. claude_mpm/services/event_bus/direct_relay.py +11 -7
  425. claude_mpm/services/event_bus/event_bus.py +51 -9
  426. claude_mpm/services/event_bus/relay.py +33 -14
  427. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  428. claude_mpm/services/events/consumers/logging.py +1 -2
  429. claude_mpm/services/events/core.py +5 -6
  430. claude_mpm/services/events/producers/hook.py +6 -6
  431. claude_mpm/services/events/producers/system.py +8 -8
  432. claude_mpm/services/exceptions.py +5 -5
  433. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  434. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  435. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  436. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  437. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  438. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  439. claude_mpm/services/git/__init__.py +21 -0
  440. claude_mpm/services/git/git_operations_service.py +494 -0
  441. claude_mpm/services/github/__init__.py +21 -0
  442. claude_mpm/services/github/github_cli_service.py +397 -0
  443. claude_mpm/services/hook_installer_service.py +506 -0
  444. claude_mpm/services/hook_service.py +5 -6
  445. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  446. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  447. claude_mpm/services/infrastructure/logging.py +2 -2
  448. claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
  449. claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
  450. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  451. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  452. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  453. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  454. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  455. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  456. claude_mpm/services/instructions/__init__.py +9 -0
  457. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  458. claude_mpm/services/local_ops/__init__.py +155 -0
  459. claude_mpm/services/local_ops/crash_detector.py +257 -0
  460. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  461. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  462. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  463. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  464. claude_mpm/services/local_ops/health_manager.py +427 -0
  465. claude_mpm/services/local_ops/log_monitor.py +396 -0
  466. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  467. claude_mpm/services/local_ops/process_manager.py +595 -0
  468. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  469. claude_mpm/services/local_ops/restart_manager.py +401 -0
  470. claude_mpm/services/local_ops/restart_policy.py +387 -0
  471. claude_mpm/services/local_ops/state_manager.py +372 -0
  472. claude_mpm/services/local_ops/unified_manager.py +600 -0
  473. claude_mpm/services/mcp_config_manager.py +1542 -0
  474. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  475. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  476. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  477. claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
  478. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  479. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  480. claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
  481. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  482. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  483. claude_mpm/services/mcp_gateway/main.py +90 -15
  484. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  485. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  486. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
  487. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
  488. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  489. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  490. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  491. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  492. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  493. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  494. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
  495. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  496. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  497. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  498. claude_mpm/services/mcp_service_verifier.py +732 -0
  499. claude_mpm/services/memory/builder.py +9 -8
  500. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  501. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  502. claude_mpm/services/memory/failure_tracker.py +578 -0
  503. claude_mpm/services/memory/indexed_memory.py +8 -8
  504. claude_mpm/services/memory/optimizer.py +8 -9
  505. claude_mpm/services/memory/router.py +3 -3
  506. claude_mpm/services/memory_hook_service.py +165 -4
  507. claude_mpm/services/model/__init__.py +147 -0
  508. claude_mpm/services/model/base_provider.py +365 -0
  509. claude_mpm/services/model/claude_provider.py +412 -0
  510. claude_mpm/services/model/model_router.py +452 -0
  511. claude_mpm/services/model/ollama_provider.py +415 -0
  512. claude_mpm/services/monitor/__init__.py +20 -0
  513. claude_mpm/services/monitor/daemon.py +691 -0
  514. claude_mpm/services/monitor/daemon_manager.py +1040 -0
  515. claude_mpm/services/monitor/event_emitter.py +350 -0
  516. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  517. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  518. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  519. claude_mpm/services/monitor/handlers/file.py +264 -0
  520. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  521. claude_mpm/services/monitor/management/__init__.py +18 -0
  522. claude_mpm/services/monitor/management/health.py +124 -0
  523. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  524. claude_mpm/services/monitor/server.py +817 -0
  525. claude_mpm/services/monitor_build_service.py +2 -2
  526. claude_mpm/services/native_agent_converter.py +356 -0
  527. claude_mpm/services/orphan_detection.py +786 -0
  528. claude_mpm/services/port_manager.py +3 -3
  529. claude_mpm/services/pr/__init__.py +14 -0
  530. claude_mpm/services/pr/pr_template_service.py +329 -0
  531. claude_mpm/services/project/__init__.py +23 -0
  532. claude_mpm/services/project/analyzer.py +3 -3
  533. claude_mpm/services/project/architecture_analyzer.py +5 -5
  534. claude_mpm/services/project/archive_manager.py +1045 -0
  535. claude_mpm/services/project/dependency_analyzer.py +4 -4
  536. claude_mpm/services/project/detection_strategies.py +719 -0
  537. claude_mpm/services/project/documentation_manager.py +554 -0
  538. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  539. claude_mpm/services/project/metrics_collector.py +4 -4
  540. claude_mpm/services/project/project_organizer.py +1005 -0
  541. claude_mpm/services/project/registry.py +13 -7
  542. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  543. claude_mpm/services/project_port_allocator.py +596 -0
  544. claude_mpm/services/response_tracker.py +21 -10
  545. claude_mpm/services/runner_configuration_service.py +17 -3
  546. claude_mpm/services/self_upgrade_service.py +500 -0
  547. claude_mpm/services/session_management_service.py +23 -9
  548. claude_mpm/services/session_manager.py +380 -0
  549. claude_mpm/services/shared/__init__.py +2 -1
  550. claude_mpm/services/shared/async_service_base.py +16 -27
  551. claude_mpm/services/shared/config_service_base.py +17 -14
  552. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  553. claude_mpm/services/shared/service_factory.py +8 -5
  554. claude_mpm/services/skills/__init__.py +18 -0
  555. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  556. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  557. claude_mpm/services/skills_config.py +547 -0
  558. claude_mpm/services/skills_deployer.py +955 -0
  559. claude_mpm/services/socketio/client_proxy.py +60 -5
  560. claude_mpm/services/socketio/dashboard_server.py +361 -0
  561. claude_mpm/services/socketio/event_normalizer.py +10 -6
  562. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  563. claude_mpm/services/socketio/handlers/base.py +2 -2
  564. claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
  565. claude_mpm/services/socketio/handlers/connection.py +22 -41
  566. claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
  567. claude_mpm/services/socketio/handlers/file.py +46 -10
  568. claude_mpm/services/socketio/handlers/git.py +9 -9
  569. claude_mpm/services/socketio/handlers/hook.py +29 -17
  570. claude_mpm/services/socketio/handlers/registry.py +4 -2
  571. claude_mpm/services/socketio/monitor_client.py +364 -0
  572. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  573. claude_mpm/services/socketio/server/connection_manager.py +2 -2
  574. claude_mpm/services/socketio/server/core.py +142 -8
  575. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  576. claude_mpm/services/socketio/server/main.py +24 -24
  577. claude_mpm/services/socketio_client_manager.py +4 -4
  578. claude_mpm/services/subprocess_launcher_service.py +19 -15
  579. claude_mpm/services/system_instructions_service.py +3 -5
  580. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  581. claude_mpm/services/ticket_services/validation_service.py +5 -5
  582. claude_mpm/services/unified/__init__.py +65 -0
  583. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  584. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  585. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  586. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  587. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  588. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  589. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  590. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  591. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  592. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  593. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  594. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  595. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  596. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  597. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  598. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  599. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  600. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  601. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  602. claude_mpm/services/unified/interfaces.py +475 -0
  603. claude_mpm/services/unified/migration.py +509 -0
  604. claude_mpm/services/unified/strategies.py +534 -0
  605. claude_mpm/services/unified/unified_analyzer.py +542 -0
  606. claude_mpm/services/unified/unified_config.py +691 -0
  607. claude_mpm/services/unified/unified_deployment.py +466 -0
  608. claude_mpm/services/utility_service.py +6 -3
  609. claude_mpm/services/version_control/branch_strategy.py +2 -2
  610. claude_mpm/services/version_control/conflict_resolution.py +14 -8
  611. claude_mpm/services/version_control/git_operations.py +26 -24
  612. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  613. claude_mpm/services/version_control/version_parser.py +14 -11
  614. claude_mpm/services/version_service.py +104 -1
  615. claude_mpm/services/visualization/__init__.py +1 -5
  616. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  617. claude_mpm/skills/__init__.py +42 -0
  618. claude_mpm/skills/agent_skills_injector.py +324 -0
  619. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  620. claude_mpm/skills/bundled/__init__.py +6 -0
  621. claude_mpm/skills/bundled/api-documentation.md +393 -0
  622. claude_mpm/skills/bundled/async-testing.md +571 -0
  623. claude_mpm/skills/bundled/code-review.md +143 -0
  624. claude_mpm/skills/bundled/database-migration.md +199 -0
  625. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  626. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  627. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  628. claude_mpm/skills/bundled/git-workflow.md +414 -0
  629. claude_mpm/skills/bundled/imagemagick.md +204 -0
  630. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  631. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  632. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  633. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  634. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  635. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  636. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  637. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  638. claude_mpm/skills/bundled/pdf.md +141 -0
  639. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  640. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  641. claude_mpm/skills/bundled/security-scanning.md +327 -0
  642. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  643. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  644. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  645. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  646. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  647. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  648. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  649. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  650. claude_mpm/skills/bundled/xlsx.md +157 -0
  651. claude_mpm/skills/registry.py +286 -0
  652. claude_mpm/skills/skill_manager.py +310 -0
  653. claude_mpm/skills/skills_registry.py +347 -0
  654. claude_mpm/skills/skills_service.py +739 -0
  655. claude_mpm/storage/state_storage.py +31 -31
  656. claude_mpm/templates/questions/__init__.py +38 -0
  657. claude_mpm/templates/questions/base.py +193 -0
  658. claude_mpm/templates/questions/pr_strategy.py +311 -0
  659. claude_mpm/templates/questions/project_init.py +385 -0
  660. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  661. claude_mpm/tools/__main__.py +9 -9
  662. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  663. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  664. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  665. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  666. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  667. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  668. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  669. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  670. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  671. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  672. claude_mpm/tools/code_tree_builder.py +6 -6
  673. claude_mpm/tools/code_tree_events.py +14 -10
  674. claude_mpm/tools/socketio_debug.py +11 -11
  675. claude_mpm/utils/agent_dependency_loader.py +184 -36
  676. claude_mpm/utils/agent_filters.py +288 -0
  677. claude_mpm/utils/common.py +544 -0
  678. claude_mpm/utils/config_manager.py +12 -6
  679. claude_mpm/utils/database_connector.py +298 -0
  680. claude_mpm/utils/dependency_cache.py +5 -3
  681. claude_mpm/utils/dependency_strategies.py +15 -10
  682. claude_mpm/utils/display_helper.py +260 -0
  683. claude_mpm/utils/environment_context.py +4 -3
  684. claude_mpm/utils/error_handler.py +5 -3
  685. claude_mpm/utils/file_utils.py +13 -14
  686. claude_mpm/utils/git_analyzer.py +407 -0
  687. claude_mpm/utils/gitignore.py +241 -0
  688. claude_mpm/utils/log_cleanup.py +627 -0
  689. claude_mpm/utils/migration.py +372 -0
  690. claude_mpm/utils/path_operations.py +7 -4
  691. claude_mpm/utils/progress.py +387 -0
  692. claude_mpm/utils/robust_installer.py +131 -24
  693. claude_mpm/utils/session_logging.py +2 -2
  694. claude_mpm/utils/structured_questions.py +619 -0
  695. claude_mpm/utils/subprocess_utils.py +9 -8
  696. claude_mpm/validation/agent_validator.py +6 -6
  697. claude_mpm/validation/frontmatter_validator.py +6 -6
  698. claude_mpm-5.0.9.dist-info/METADATA +1028 -0
  699. claude_mpm-5.0.9.dist-info/RECORD +864 -0
  700. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
  701. claude_mpm/agents/INSTRUCTIONS.md +0 -261
  702. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  703. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  704. claude_mpm/agents/templates/agent-manager.json +0 -270
  705. claude_mpm/agents/templates/agent-manager.md +0 -619
  706. claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
  707. claude_mpm/agents/templates/api_qa.json +0 -171
  708. claude_mpm/agents/templates/code_analyzer.json +0 -95
  709. claude_mpm/agents/templates/data_engineer.json +0 -152
  710. claude_mpm/agents/templates/documentation.json +0 -175
  711. claude_mpm/agents/templates/engineer.json +0 -176
  712. claude_mpm/agents/templates/imagemagick.json +0 -261
  713. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  714. claude_mpm/agents/templates/memory_manager.json +0 -155
  715. claude_mpm/agents/templates/ops.json +0 -175
  716. claude_mpm/agents/templates/project_organizer.json +0 -130
  717. claude_mpm/agents/templates/qa.json +0 -223
  718. claude_mpm/agents/templates/refactoring_engineer.json +0 -266
  719. claude_mpm/agents/templates/research.json +0 -163
  720. claude_mpm/agents/templates/security.json +0 -153
  721. claude_mpm/agents/templates/ticketing.json +0 -169
  722. claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
  723. claude_mpm/agents/templates/version_control.json +0 -147
  724. claude_mpm/agents/templates/web_qa.json +0 -254
  725. claude_mpm/agents/templates/web_ui.json +0 -176
  726. claude_mpm/cli/commands/configure_tui.py +0 -1927
  727. claude_mpm/cli/commands/mpm_init.py +0 -594
  728. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  729. claude_mpm/commands/mpm-agents.md +0 -12
  730. claude_mpm/commands/mpm-config.md +0 -18
  731. claude_mpm/commands/mpm-tickets.md +0 -102
  732. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  733. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  734. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  735. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  736. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  737. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  738. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  739. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  740. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  741. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  742. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  743. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  744. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  745. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  746. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  747. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  748. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  749. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  750. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  751. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  752. claude_mpm/dashboard/static/css/code-tree.css +0 -1408
  753. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  754. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  755. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  756. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  757. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  758. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  759. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  760. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  761. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  762. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  763. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  764. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  765. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  766. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  767. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  768. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  769. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  770. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  771. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  772. claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
  773. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
  774. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  775. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  776. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  777. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  778. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  779. claude_mpm/scripts/socketio_server_manager.py +0 -349
  780. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  781. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  782. claude_mpm/services/cli/socketio_manager.py +0 -537
  783. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  784. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  785. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  786. claude_mpm/services/project/analyzer_refactored.py +0 -450
  787. claude_mpm/tools/code_tree_analyzer.py +0 -1693
  788. claude_mpm-4.1.26.dist-info/METADATA +0 -332
  789. claude_mpm-4.1.26.dist-info/RECORD +0 -606
  790. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  791. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  792. {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.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)
@@ -369,12 +484,18 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
369
484
  else "single"
370
485
  )
371
486
 
487
+ # When using multi-source deployment, we've already determined which
488
+ # agents need updates. Don't re-check versions in single_agent_deployer.
489
+ # This prevents the issue where multi-source says "deploying 9 agents"
490
+ # but then all get skipped due to redundant version checks.
491
+ skip_version_check = use_multi_source and not force_rebuild
492
+
372
493
  self.single_agent_deployer.deploy_single_agent(
373
494
  template_file=template_file_path,
374
495
  agents_dir=agents_dir,
375
496
  base_agent_data=base_agent_data,
376
497
  base_agent_version=base_agent_version,
377
- force_rebuild=force_rebuild,
498
+ force_rebuild=force_rebuild or skip_version_check,
378
499
  deployment_mode=deployment_mode,
379
500
  results=results,
380
501
  source_info=source_info,
@@ -683,7 +804,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
683
804
 
684
805
  def _get_filtered_templates(self, excluded_agents: list, config: Config) -> list:
685
806
  """Get and filter template files based on exclusion rules."""
686
- return self.discovery_service.get_filtered_templates(excluded_agents, config)
807
+ filter_non_mpm = config.get("agent_deployment.filter_non_mpm_agents", True)
808
+ return self.discovery_service.get_filtered_templates(
809
+ excluded_agents, config, filter_non_mpm
810
+ )
687
811
 
688
812
  def _validate_and_repair_existing_agents(self, agents_dir: Path) -> Dict[str, Any]:
689
813
  """Validate and repair broken frontmatter in existing agent files."""
@@ -745,19 +869,28 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
745
869
  project_agents_dir = potential_project_dir
746
870
  self.logger.info(f"Found project agents at: {project_agents_dir}")
747
871
 
748
- # Check for user agents
872
+ # Check for user agents (DEPRECATED)
749
873
  user_home = Path.home()
750
874
  potential_user_dir = user_home / ".claude-mpm" / "agents"
751
875
  if potential_user_dir.exists():
752
876
  user_agents_dir = potential_user_dir
753
877
  self.logger.info(f"Found user agents at: {user_agents_dir}")
754
878
 
755
- # 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)
756
888
  agents_to_deploy, agent_sources, cleanup_results = (
757
889
  self.multi_source_service.get_agents_for_deployment(
758
890
  system_templates_dir=system_templates_dir,
759
891
  project_agents_dir=project_agents_dir,
760
892
  user_agents_dir=user_agents_dir,
893
+ remote_agents_dir=remote_agents_dir, # NEW: 4th tier
761
894
  working_directory=self.working_directory,
762
895
  excluded_agents=excluded_agents,
763
896
  config=config,
@@ -773,16 +906,6 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
773
906
  agent_sources=agent_sources,
774
907
  )
775
908
 
776
- # Log version upgrades and source changes
777
- if comparison_results.get("version_upgrades"):
778
- self.logger.info(
779
- f"Version upgrades available for {len(comparison_results['version_upgrades'])} agents"
780
- )
781
- if comparison_results.get("source_changes"):
782
- self.logger.info(
783
- f"Source changes for {len(comparison_results['source_changes'])} agents"
784
- )
785
-
786
909
  # Filter agents based on comparison results (unless force_rebuild is set)
787
910
  if not force_rebuild:
788
911
  # Only deploy agents that need updates or are new
@@ -801,11 +924,35 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
801
924
  for name, path in agents_to_deploy.items()
802
925
  if name in agents_needing_update
803
926
  }
927
+
928
+ # Only log upgrade messages if we're actually going to deploy them
929
+ if filtered_agents and comparison_results.get("version_upgrades"):
930
+ # Filter upgrades to only those actually being deployed
931
+ deployed_upgrades = [
932
+ upgrade
933
+ for upgrade in comparison_results["version_upgrades"]
934
+ if upgrade["name"] in filtered_agents
935
+ ]
936
+
937
+ if deployed_upgrades:
938
+ self.logger.info(
939
+ f"Deploying {len(deployed_upgrades)} agent upgrade(s):"
940
+ )
941
+ for upgrade in deployed_upgrades:
942
+ self.logger.info(
943
+ f" Upgrading: {upgrade['name']} "
944
+ f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
945
+ f"(from {upgrade['source']})"
946
+ )
947
+
804
948
  agents_to_deploy = filtered_agents
805
949
 
806
- self.logger.info(
807
- f"Filtered to {len(agents_to_deploy)} agents needing deployment"
808
- )
950
+ # Don't log this redundant message - we already logged the upgrades above
951
+ # The "Deploying X agent upgrade(s)" message is sufficient
952
+ if not agents_to_deploy:
953
+ self.logger.debug(
954
+ f"All {len(comparison_results.get('up_to_date', []))} agents are up to date"
955
+ )
809
956
 
810
957
  # Convert to list of Path objects
811
958
  template_files = list(agents_to_deploy.values())
@@ -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:
@@ -85,7 +86,10 @@ class AgentDiscoveryService:
85
86
  return agents
86
87
 
87
88
  def get_filtered_templates(
88
- self, excluded_agents: List[str], config: Optional[Config] = None
89
+ self,
90
+ excluded_agents: List[str],
91
+ config: Optional[Config] = None,
92
+ filter_non_mpm: bool = False,
89
93
  ) -> List[Path]:
90
94
  """
91
95
  Get filtered list of template files based on configuration.
@@ -93,6 +97,7 @@ class AgentDiscoveryService:
93
97
  Args:
94
98
  excluded_agents: List of agent names to exclude
95
99
  config: Configuration object for additional filtering
100
+ filter_non_mpm: Whether to filter out non-MPM agents
96
101
 
97
102
  Returns:
98
103
  List of template file paths to deploy
@@ -101,8 +106,8 @@ class AgentDiscoveryService:
101
106
  self.logger.error(f"Templates directory not found: {self.templates_dir}")
102
107
  return []
103
108
 
104
- # Get all template files
105
- template_files = list(self.templates_dir.glob("*.json"))
109
+ # Get all markdown template files
110
+ template_files = list(self.templates_dir.glob("*.md"))
106
111
 
107
112
  if not template_files:
108
113
  self.logger.warning(f"No agent templates found in {self.templates_dir}")
@@ -111,6 +116,7 @@ class AgentDiscoveryService:
111
116
  # Apply exclusion filtering
112
117
  filtered_files = []
113
118
  excluded_count = 0
119
+ non_mpm_count = 0
114
120
 
115
121
  for template_file in template_files:
116
122
  agent_name = template_file.stem
@@ -121,14 +127,24 @@ class AgentDiscoveryService:
121
127
  self.logger.debug(f"Excluding agent: {agent_name}")
122
128
  continue
123
129
 
130
+ # Check if we should filter non-MPM agents
131
+ if filter_non_mpm and not self._is_mpm_agent(template_file):
132
+ non_mpm_count += 1
133
+ self.logger.debug(f"Filtering non-MPM agent: {agent_name}")
134
+ continue
135
+
124
136
  # Validate template file
125
137
  if self._validate_template_file(template_file):
126
138
  filtered_files.append(template_file)
127
139
  else:
128
140
  self.logger.warning(f"Invalid template file: {template_file.name}")
129
141
 
142
+ # Log filtering results
143
+ if filter_non_mpm and non_mpm_count > 0:
144
+ self.logger.info(f"Filtered out {non_mpm_count} non-MPM agents")
145
+
130
146
  self.logger.info(
131
- f"Found {len(template_files)} templates, excluded {excluded_count}, deploying {len(filtered_files)}"
147
+ f"Found {len(template_files)} templates, excluded {excluded_count}, filtered {non_mpm_count} non-MPM, deploying {len(filtered_files)}"
132
148
  )
133
149
  return filtered_files
134
150
 
@@ -142,7 +158,7 @@ class AgentDiscoveryService:
142
158
  Returns:
143
159
  Path to template file if found, None otherwise
144
160
  """
145
- template_file = self.templates_dir / f"{agent_name}.json"
161
+ template_file = self.templates_dir / f"{agent_name}.md"
146
162
 
147
163
  if template_file.exists():
148
164
  if self._validate_template_file(template_file):
@@ -184,40 +200,45 @@ class AgentDiscoveryService:
184
200
 
185
201
  def _extract_agent_metadata(self, template_file: Path) -> Optional[Dict[str, Any]]:
186
202
  """
187
- Extract metadata from an agent template file.
203
+ Extract metadata from an agent template file with YAML frontmatter.
188
204
 
189
205
  Args:
190
- template_file: Path to the template file
206
+ template_file: Path to the markdown template file
191
207
 
192
208
  Returns:
193
209
  Dictionary with agent metadata or None if extraction fails
194
210
  """
195
211
  try:
196
- # Read and parse template file
212
+ # Read template file content
197
213
  template_content = template_file.read_text()
198
- template_data = json.loads(template_content)
199
214
 
200
- # Extract basic metadata from the metadata section (per agent schema)
201
- metadata = template_data.get("metadata", {})
202
- capabilities = template_data.get("capabilities", {})
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
203
222
 
223
+ # Extract metadata directly from frontmatter (flat structure)
224
+ # Markdown templates use flat YAML structure, not nested "metadata" section
204
225
  agent_info = {
205
- "name": metadata.get("name", template_file.stem),
206
- "description": metadata.get("description", "No description available"),
207
- "version": template_data.get(
208
- "agent_version",
209
- template_data.get("version", metadata.get("version", "1.0.0")),
226
+ "name": frontmatter.get("name", template_file.stem),
227
+ "description": frontmatter.get(
228
+ "description", "No description available"
229
+ ),
230
+ "type": frontmatter.get(
231
+ "agent_type", frontmatter.get("category", "agent")
210
232
  ),
211
- "tools": capabilities.get("tools", []),
212
- "specializations": metadata.get(
213
- "tags", []
214
- ), # Use tags as specializations
233
+ "version": frontmatter.get("version", "1.0.0"),
234
+ "tools": frontmatter.get("tools", []),
235
+ "specializations": frontmatter.get("tags", []),
215
236
  "file": template_file.name,
216
237
  "path": str(template_file),
217
238
  "file_path": str(template_file), # Keep for backward compatibility
218
239
  "size": template_file.stat().st_size,
219
- "model": capabilities.get("model", "sonnet"),
220
- "author": metadata.get("author", "unknown"),
240
+ "model": frontmatter.get("model", "sonnet"),
241
+ "author": frontmatter.get("author", "unknown"),
221
242
  }
222
243
 
223
244
  # Validate required fields
@@ -227,8 +248,8 @@ class AgentDiscoveryService:
227
248
 
228
249
  return agent_info
229
250
 
230
- except json.JSONDecodeError as e:
231
- 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}")
232
253
  return None
233
254
  except Exception as e:
234
255
  self.logger.error(
@@ -236,6 +257,82 @@ class AgentDiscoveryService:
236
257
  )
237
258
  return None
238
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
+
293
+ def _is_mpm_agent(self, template_file: Path) -> bool:
294
+ """Check if agent is authored by Claude MPM team.
295
+
296
+ MPM agents must have:
297
+ - An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
298
+ - A valid version field
299
+
300
+ Args:
301
+ template_file: Path to the agent template markdown file
302
+
303
+ Returns:
304
+ True if this is an MPM agent, False otherwise
305
+ """
306
+ try:
307
+ # Extract YAML frontmatter
308
+ content = template_file.read_text()
309
+ frontmatter = self._extract_yaml_frontmatter(content)
310
+ if not frontmatter:
311
+ return False
312
+
313
+ # Check for author field
314
+ author = frontmatter.get("author", "").lower()
315
+ has_valid_author = any(
316
+ pattern in author
317
+ for pattern in ["claude mpm", "claude-mpm", "anthropic"]
318
+ )
319
+
320
+ # Check for version field
321
+ has_version = bool(frontmatter.get("version"))
322
+
323
+ if not has_valid_author or not has_version:
324
+ self.logger.debug(
325
+ f"Filtered non-MPM agent {template_file.name}: "
326
+ f"author='{frontmatter.get('author', 'missing')}', "
327
+ f"version={'present' if has_version else 'missing'}"
328
+ )
329
+
330
+ return has_valid_author and has_version
331
+
332
+ except Exception as e:
333
+ self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
334
+ return False # Treat invalid templates as non-MPM
335
+
239
336
  def _is_agent_excluded(
240
337
  self,
241
338
  agent_name: str,
@@ -292,10 +389,10 @@ class AgentDiscoveryService:
292
389
 
293
390
  def _validate_template_file(self, template_file: Path) -> bool:
294
391
  """
295
- Validate that a template file is properly formatted.
392
+ Validate that a template file is properly formatted with YAML frontmatter.
296
393
 
297
394
  Args:
298
- template_file: Path to template file to validate
395
+ template_file: Path to markdown template file to validate
299
396
 
300
397
  Returns:
301
398
  True if template is valid, False otherwise
@@ -305,23 +402,27 @@ class AgentDiscoveryService:
305
402
  if not template_file.exists():
306
403
  return False
307
404
 
308
- # Parse JSON content
405
+ # Read and parse YAML frontmatter
309
406
  content = template_file.read_text()
310
- 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
311
413
 
312
- # Check required fields in metadata section (per agent schema)
313
- metadata = template_data.get("metadata", {})
414
+ # Check required fields (flat structure in markdown templates)
314
415
  required_fields = ["name", "description"]
315
416
  for field in required_fields:
316
- if field not in metadata:
417
+ if field not in frontmatter:
317
418
  self.logger.warning(
318
- f"Template {template_file.name} missing required field in metadata: {field}"
419
+ f"Template {template_file.name} missing required field: {field}"
319
420
  )
320
421
  return False
321
422
 
322
423
  # Validate agent ID format (Claude Code requirements)
323
424
  # Use agent_id for validation, not the display name
324
- agent_id = template_data.get("agent_id", "")
425
+ agent_id = frontmatter.get("agent_id", "")
325
426
  if not self._is_valid_agent_name(agent_id):
326
427
  self.logger.warning(
327
428
  f"Invalid agent ID format in {template_file.name}: {agent_id}"
@@ -330,8 +431,10 @@ class AgentDiscoveryService:
330
431
 
331
432
  return True
332
433
 
333
- except json.JSONDecodeError:
334
- 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
+ )
335
438
  return False
336
439
  except Exception as e:
337
440
  self.logger.error(
@@ -357,6 +460,53 @@ class AgentDiscoveryService:
357
460
 
358
461
  return bool(re.match(pattern, agent_name))
359
462
 
463
+ def _is_mpm_agent_with_config(
464
+ self, template_file: Path, config: Optional[Config] = None
465
+ ) -> bool:
466
+ """Check if agent is authored by Claude MPM team with configurable patterns.
467
+
468
+ MPM agents must have:
469
+ - An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
470
+ - A valid version field
471
+
472
+ Args:
473
+ template_file: Path to the agent template markdown file
474
+ config: Configuration object for MPM patterns
475
+
476
+ Returns:
477
+ True if this is an MPM agent, False otherwise
478
+ """
479
+ try:
480
+ # Extract YAML frontmatter
481
+ content = template_file.read_text()
482
+ frontmatter = self._extract_yaml_frontmatter(content)
483
+ if not frontmatter:
484
+ return False
485
+
486
+ # Get MPM author patterns from config
487
+ if config:
488
+ mpm_patterns = config.get(
489
+ "agent_deployment.mpm_author_patterns",
490
+ ["claude mpm", "claude-mpm", "anthropic"],
491
+ )
492
+ else:
493
+ mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
494
+
495
+ # Check for author field
496
+ author = frontmatter.get("author", "").lower()
497
+ has_valid_author = any(
498
+ pattern.lower() in author for pattern in mpm_patterns
499
+ )
500
+
501
+ # Check for version field
502
+ has_version = bool(frontmatter.get("version"))
503
+
504
+ return has_valid_author and has_version
505
+
506
+ except Exception as e:
507
+ self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
508
+ return False # Treat invalid templates as non-MPM
509
+
360
510
  def get_discovery_stats(self) -> Dict[str, Any]:
361
511
  """
362
512
  Get statistics about agent discovery.
@@ -376,8 +526,8 @@ class AgentDiscoveryService:
376
526
  if not self.templates_dir.exists():
377
527
  return stats
378
528
 
379
- # Count template files
380
- template_files = list(self.templates_dir.glob("*.json"))
529
+ # Count markdown template files
530
+ template_files = list(self.templates_dir.glob("*.md"))
381
531
  stats["total_templates"] = len(template_files)
382
532
 
383
533
  # Validate each template
@@ -183,9 +183,9 @@ class AgentFileSystemManager:
183
183
  try:
184
184
  # Generate backup directory name if not provided
185
185
  if not backup_dir:
186
- import datetime
186
+ from datetime import datetime, timezone
187
187
 
188
- timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
188
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
189
189
  backup_dir = agents_dir.parent / f"agents_backup_{timestamp}"
190
190
 
191
191
  # Create backup
@@ -324,7 +324,7 @@ class AgentFileSystemManager:
324
324
 
325
325
  def _convert_yaml_to_markdown(self, yaml_content: str, agent_name: str) -> str:
326
326
  """Convert YAML agent content to Markdown format with frontmatter."""
327
- from datetime import datetime
327
+ from datetime import datetime, timezone
328
328
 
329
329
  # Extract YAML fields (simplified parsing)
330
330
  name = self._extract_yaml_field(yaml_content, "name") or agent_name
@@ -356,8 +356,8 @@ name: {name}
356
356
  description: "{description}"
357
357
  version: "{version}"
358
358
  author: "claude-mpm@anthropic.com"
359
- created: "{datetime.now().isoformat()}Z"
360
- updated: "{datetime.now().isoformat()}Z"
359
+ created: "{datetime.now(timezone.utc).isoformat()}Z"
360
+ updated: "{datetime.now(timezone.utc).isoformat()}Z"
361
361
  tags: ["{agent_name}", "mpm-framework"]
362
362
  tools: {tools_list}
363
363
  model: "sonnet"