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
@@ -21,19 +21,29 @@ from claude_mpm.core.logging_config import get_logger
21
21
 
22
22
  from .agent_discovery_service import AgentDiscoveryService
23
23
  from .agent_version_manager import AgentVersionManager
24
+ from .remote_agent_discovery_service import RemoteAgentDiscoveryService
24
25
 
25
26
 
26
27
  class MultiSourceAgentDeploymentService:
27
28
  """Service for deploying agents from multiple sources with version comparison.
28
29
 
29
30
  This service ensures that the highest version of each agent is deployed,
30
- regardless of whether it comes from system templates, project agents, or
31
- user agents.
31
+ regardless of whether it comes from system templates, project agents,
32
+ user agents, or remote agents.
33
+
34
+ 4-Tier Agent Discovery:
35
+ 1. System templates (lowest priority) - Built-in agents
36
+ 2. User agents (DEPRECATED) - User-level customizations (~/.claude-mpm/agents/)
37
+ 3. Remote agents - Agents cached from GitHub
38
+ 4. Project agents (highest priority) - Project-specific customizations
32
39
 
33
40
  WHY: The current system processes agents from a single source at a time,
34
41
  which can result in lower version agents being deployed if they exist in
35
42
  a higher priority source. This service fixes that by comparing versions
36
43
  across all sources.
44
+
45
+ DEPRECATION: User-level agents (~/.claude-mpm/agents/) are deprecated and
46
+ will be removed in v5.0.0. Use project-level agents instead.
37
47
  """
38
48
 
39
49
  def __init__(self):
@@ -46,18 +56,30 @@ class MultiSourceAgentDeploymentService:
46
56
  system_templates_dir: Optional[Path] = None,
47
57
  project_agents_dir: Optional[Path] = None,
48
58
  user_agents_dir: Optional[Path] = None,
59
+ remote_agents_dir: Optional[Path] = None,
49
60
  working_directory: Optional[Path] = None,
50
61
  ) -> Dict[str, List[Dict[str, Any]]]:
51
- """Discover agents from all available sources.
62
+ """Discover agents from all 4 tiers (system, user, remote, project).
63
+
64
+ Priority hierarchy (highest to lowest):
65
+ 4. Project agents - Highest priority, project-specific customizations
66
+ 3. Remote agents - GitHub-synced agents from cache
67
+ 2. User agents - DEPRECATED, user-level customizations
68
+ 1. System templates - Lowest priority, built-in agents
52
69
 
53
70
  Args:
54
71
  system_templates_dir: Directory containing system agent templates
55
72
  project_agents_dir: Directory containing project-specific agents
56
- user_agents_dir: Directory containing user custom agents
73
+ user_agents_dir: Directory containing user custom agents (DEPRECATED)
74
+ remote_agents_dir: Directory containing cached remote agents
57
75
  working_directory: Current working directory for finding project agents
58
76
 
59
77
  Returns:
60
78
  Dictionary mapping agent names to list of agent info from different sources
79
+
80
+ Deprecation Warning:
81
+ User-level agents are deprecated and will show a warning if found.
82
+ Use 'claude-mpm agents migrate-to-project' to migrate them.
61
83
  """
62
84
  agents_by_name = {}
63
85
 
@@ -80,24 +102,53 @@ class MultiSourceAgentDeploymentService:
80
102
  if not user_agents_dir.exists():
81
103
  user_agents_dir = None
82
104
 
83
- # Discover agents from each source
105
+ if not remote_agents_dir:
106
+ # Check for remote agents in cache directory
107
+ cache_dir = Path.home() / ".claude-mpm" / "cache"
108
+ remote_agents_dir = cache_dir / "remote-agents"
109
+ if not remote_agents_dir.exists():
110
+ remote_agents_dir = None
111
+
112
+ # Discover agents from each source in priority order
113
+ # Note: We process in reverse priority order (system first) and build up the dictionary
114
+ # The select_highest_version_agents() method will handle the actual prioritization
84
115
  sources = [
85
116
  ("system", system_templates_dir),
86
- ("project", project_agents_dir),
87
117
  ("user", user_agents_dir),
118
+ ("remote", remote_agents_dir),
119
+ ("project", project_agents_dir),
88
120
  ]
89
121
 
122
+ # Track if we found user agents for deprecation warning
123
+ user_agents_found = False
124
+
90
125
  for source_name, source_dir in sources:
91
126
  if source_dir and source_dir.exists():
92
127
  self.logger.debug(
93
128
  f"Discovering agents from {source_name} source: {source_dir}"
94
129
  )
95
- discovery_service = AgentDiscoveryService(source_dir)
96
- # Pass log_discovery=False to avoid duplicate logging
97
- agents = discovery_service.list_available_agents(log_discovery=False)
130
+
131
+ # Use appropriate discovery service based on source type
132
+ if source_name == "remote":
133
+ # Remote agents are Markdown, use RemoteAgentDiscoveryService
134
+ remote_service = RemoteAgentDiscoveryService(source_dir)
135
+ agents = remote_service.discover_remote_agents()
136
+ else:
137
+ # Other sources are JSON, use AgentDiscoveryService
138
+ discovery_service = AgentDiscoveryService(source_dir)
139
+ # Pass log_discovery=False to avoid duplicate logging
140
+ agents = discovery_service.list_available_agents(
141
+ log_discovery=False
142
+ )
143
+
144
+ # Track user agents for deprecation warning
145
+ if source_name == "user" and agents:
146
+ user_agents_found = True
98
147
 
99
148
  for agent_info in agents:
100
- agent_name = agent_info.get("name")
149
+ agent_name = agent_info.get("name") or agent_info.get(
150
+ "metadata", {}
151
+ ).get("name")
101
152
  if not agent_name:
102
153
  continue
103
154
 
@@ -116,6 +167,26 @@ class MultiSourceAgentDeploymentService:
116
167
  f"Discovered {len(agents)} {source_name} agent templates from {source_dir.name}"
117
168
  )
118
169
 
170
+ # Show deprecation warning if user agents found
171
+ if user_agents_found:
172
+ self.logger.warning(
173
+ "\n"
174
+ "⚠️ DEPRECATION WARNING: User-level agents found in ~/.claude-mpm/agents/\n"
175
+ " User-level agent deployment is deprecated and will be removed in v5.0.0\n"
176
+ "\n"
177
+ " Why this change?\n"
178
+ " - Project isolation: Agents should be project-specific\n"
179
+ " - Version control: Project agents can be versioned with your code\n"
180
+ " - Team consistency: All team members use the same agents\n"
181
+ "\n"
182
+ " Migration:\n"
183
+ " 1. Run: claude-mpm agents migrate-to-project\n"
184
+ " 2. Verify agents work in .claude-mpm/agents/\n"
185
+ " 3. Remove: rm -rf ~/.claude-mpm/agents/\n"
186
+ "\n"
187
+ " Learn more: https://docs.claude-mpm.dev/agents/migration\n"
188
+ )
189
+
119
190
  return agents_by_name
120
191
 
121
192
  def select_highest_version_agents(
@@ -176,23 +247,47 @@ class MultiSourceAgentDeploymentService:
176
247
  # Log if a higher priority source was overridden by version
177
248
  for other_agent in agent_versions:
178
249
  if other_agent != highest_version_agent:
179
- self.version_manager.parse_version(
250
+ # Parse both versions for comparison
251
+ other_version = self.version_manager.parse_version(
180
252
  other_agent.get("version", "0.0.0")
181
253
  )
182
- if (
183
- other_agent["source"] == "project"
184
- and highest_version_agent["source"] == "system"
254
+ highest_version = self.version_manager.parse_version(
255
+ highest_version_agent.get("version", "0.0.0")
256
+ )
257
+
258
+ # Compare the versions
259
+ version_comparison = self.version_manager.compare_versions(
260
+ other_version, highest_version
261
+ )
262
+
263
+ # Only warn if the other version is actually lower
264
+ if version_comparison < 0:
265
+ if (
266
+ other_agent["source"] == "project"
267
+ and highest_version_agent["source"] == "system"
268
+ ):
269
+ self.logger.warning(
270
+ f"Project agent '{agent_name}' v{other_agent['version']} "
271
+ f"overridden by higher system version v{highest_version_agent['version']}"
272
+ )
273
+ elif other_agent[
274
+ "source"
275
+ ] == "user" and highest_version_agent["source"] in [
276
+ "system",
277
+ "project",
278
+ ]:
279
+ self.logger.warning(
280
+ f"User agent '{agent_name}' v{other_agent['version']} "
281
+ f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
282
+ )
283
+ elif (
284
+ version_comparison == 0
285
+ and other_agent["source"] != highest_version_agent["source"]
185
286
  ):
186
- self.logger.warning(
187
- f"Project agent '{agent_name}' v{other_agent['version']} "
188
- f"overridden by higher system version v{highest_version_agent['version']}"
189
- )
190
- elif other_agent["source"] == "user" and highest_version_agent[
191
- "source"
192
- ] in ["system", "project"]:
193
- self.logger.warning(
194
- f"User agent '{agent_name}' v{other_agent['version']} "
195
- f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
287
+ # Log info when versions are equal but different sources
288
+ self.logger.info(
289
+ f"Using {highest_version_agent['source']} source for '{agent_name}' "
290
+ f"(same version v{highest_version_agent['version']} as {other_agent['source']} source)"
196
291
  )
197
292
 
198
293
  return selected_agents
@@ -202,17 +297,19 @@ class MultiSourceAgentDeploymentService:
202
297
  system_templates_dir: Optional[Path] = None,
203
298
  project_agents_dir: Optional[Path] = None,
204
299
  user_agents_dir: Optional[Path] = None,
300
+ remote_agents_dir: Optional[Path] = None,
205
301
  working_directory: Optional[Path] = None,
206
302
  excluded_agents: Optional[List[str]] = None,
207
303
  config: Optional[Config] = None,
208
304
  cleanup_outdated: bool = True,
209
305
  ) -> Tuple[Dict[str, Path], Dict[str, str], Dict[str, Any]]:
210
- """Get the highest version agents from all sources for deployment.
306
+ """Get the highest version agents from all 4 tiers for deployment.
211
307
 
212
308
  Args:
213
309
  system_templates_dir: Directory containing system agent templates
214
310
  project_agents_dir: Directory containing project-specific agents
215
- user_agents_dir: Directory containing user custom agents
311
+ user_agents_dir: Directory containing user custom agents (DEPRECATED)
312
+ remote_agents_dir: Directory containing cached remote agents
216
313
  working_directory: Current working directory for finding project agents
217
314
  excluded_agents: List of agent names to exclude from deployment
218
315
  config: Configuration object for additional filtering
@@ -224,11 +321,12 @@ class MultiSourceAgentDeploymentService:
224
321
  - Dictionary mapping agent names to their source
225
322
  - Dictionary with cleanup results (removed, preserved, errors)
226
323
  """
227
- # Discover all available agents
324
+ # Discover all available agents from 4 tiers
228
325
  agents_by_name = self.discover_agents_from_all_sources(
229
326
  system_templates_dir=system_templates_dir,
230
327
  project_agents_dir=project_agents_dir,
231
328
  user_agents_dir=user_agents_dir,
329
+ remote_agents_dir=remote_agents_dir,
232
330
  working_directory=working_directory,
233
331
  )
234
332
 
@@ -276,7 +374,21 @@ class MultiSourceAgentDeploymentService:
276
374
  agent_sources = {}
277
375
 
278
376
  for agent_name, agent_info in selected_agents.items():
279
- template_path = Path(agent_info["path"])
377
+ # Defensive: Try multiple path fields for backward compatibility (ticket 1M-480)
378
+ # Priority: 'path' -> 'file_path' -> 'source_file'
379
+ path_str = (
380
+ agent_info.get("path")
381
+ or agent_info.get("file_path")
382
+ or agent_info.get("source_file")
383
+ )
384
+
385
+ if not path_str:
386
+ self.logger.warning(
387
+ f"Agent '{agent_name}' missing path information (no 'path', 'file_path', or 'source_file' field)"
388
+ )
389
+ continue
390
+
391
+ template_path = Path(path_str)
280
392
  if template_path.exists():
281
393
  # Use the file stem as the key for consistency
282
394
  file_stem = template_path.stem
@@ -347,8 +459,20 @@ class MultiSourceAgentDeploymentService:
347
459
  if agent_info["source"] != "user":
348
460
  continue
349
461
 
462
+ # Defensive: Get path from agent_info (ticket 1M-480)
463
+ path_str = (
464
+ agent_info.get("path")
465
+ or agent_info.get("file_path")
466
+ or agent_info.get("source_file")
467
+ )
468
+ if not path_str:
469
+ self.logger.warning(
470
+ f"User agent '{agent_name}' missing path information, skipping cleanup"
471
+ )
472
+ continue
473
+
350
474
  # Safety check - ensure path is within user agents directory
351
- user_agent_path = Path(agent_info["path"])
475
+ user_agent_path = Path(path_str)
352
476
  try:
353
477
  # Resolve paths to compare them safely
354
478
  resolved_user_path = user_agent_path.resolve()
@@ -469,6 +593,47 @@ class MultiSourceAgentDeploymentService:
469
593
 
470
594
  return cleanup_results
471
595
 
596
+ def _is_user_created_agent(self, agent_file: Path) -> bool:
597
+ """Check if an agent is user-created based on metadata.
598
+
599
+ User agents are identified by:
600
+ - Lack of MPM authorship indicators
601
+ - Missing version or v0.0.0
602
+ - Certain naming patterns
603
+
604
+ Args:
605
+ agent_file: Path to the agent file to check
606
+
607
+ Returns:
608
+ True if the agent appears to be user-created, False otherwise
609
+ """
610
+ try:
611
+ content = agent_file.read_text()
612
+
613
+ # Check for MPM authorship indicators
614
+ mpm_indicators = [
615
+ "author: claude-mpm",
616
+ "author: 'claude-mpm'",
617
+ 'author: "claude-mpm"',
618
+ "author: Claude MPM",
619
+ "Claude MPM Team",
620
+ "Generated by Claude MPM",
621
+ "claude-mpm-project",
622
+ ]
623
+
624
+ for indicator in mpm_indicators:
625
+ if indicator.lower() in content.lower():
626
+ return False # This is an MPM agent
627
+
628
+ # Check for version 0.0.0 (typical user agent default)
629
+ if "version: 0.0.0" in content or "version: '0.0.0'" in content:
630
+ return True
631
+
632
+ return True # Default to user-created if no MPM indicators
633
+
634
+ except Exception:
635
+ return True # Default to user-created if we can't read it
636
+
472
637
  def _apply_config_filters(
473
638
  self, selected_agents: Dict[str, Dict[str, Any]], config: Config
474
639
  ) -> Dict[str, Dict[str, Any]]:
@@ -534,7 +699,8 @@ class MultiSourceAgentDeploymentService:
534
699
  "needs_update": [],
535
700
  "up_to_date": [],
536
701
  "new_agents": [],
537
- "orphaned_agents": [], # Agents without templates
702
+ "orphaned_agents": [], # System agents without templates
703
+ "user_agents": [], # User-created agents (no templates required)
538
704
  "version_upgrades": [],
539
705
  "version_downgrades": [],
540
706
  "source_changes": [],
@@ -655,10 +821,11 @@ class MultiSourceAgentDeploymentService:
655
821
  )
656
822
 
657
823
  # Check for orphaned agents (deployed but no template)
658
- orphaned = self._detect_orphaned_agents_simple(
824
+ system_orphaned, user_orphaned = self._detect_orphaned_agents_simple(
659
825
  deployed_agents_dir, agents_to_deploy
660
826
  )
661
- comparison_results["orphaned_agents"] = orphaned
827
+ comparison_results["orphaned_agents"] = system_orphaned
828
+ comparison_results["user_agents"] = user_orphaned
662
829
 
663
830
  # Log summary
664
831
  summary_parts = [
@@ -668,23 +835,29 @@ class MultiSourceAgentDeploymentService:
668
835
  ]
669
836
  if comparison_results["orphaned_agents"]:
670
837
  summary_parts.append(
671
- f"{len(comparison_results['orphaned_agents'])} orphaned"
838
+ f"{len(comparison_results['orphaned_agents'])} system orphaned"
839
+ )
840
+ if comparison_results["user_agents"]:
841
+ summary_parts.append(
842
+ f"{len(comparison_results['user_agents'])} user agents"
672
843
  )
673
844
 
674
845
  self.logger.info(f"Version comparison complete: {', '.join(summary_parts)}")
675
846
 
847
+ # Don't log upgrades here - let the caller decide when to log
848
+ # This prevents repeated upgrade messages on every startup
676
849
  if comparison_results["version_upgrades"]:
677
850
  for upgrade in comparison_results["version_upgrades"]:
678
- self.logger.info(
679
- f" Upgrade: {upgrade['name']} "
851
+ self.logger.debug(
852
+ f" Upgrade available: {upgrade['name']} "
680
853
  f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
681
854
  f"(from {upgrade['source']})"
682
855
  )
683
856
 
684
857
  if comparison_results["source_changes"]:
685
858
  for change in comparison_results["source_changes"]:
686
- self.logger.info(
687
- f" Source change: {change['name']} "
859
+ self.logger.debug(
860
+ f" Source change available: {change['name']} "
688
861
  f"from {change['from_source']} to {change['to_source']}"
689
862
  )
690
863
 
@@ -698,10 +871,10 @@ class MultiSourceAgentDeploymentService:
698
871
  f"{downgrade['template_version']} (keeping deployed version)"
699
872
  )
700
873
 
701
- # Log orphaned agents if found
874
+ # Log system orphaned agents if found
702
875
  if comparison_results["orphaned_agents"]:
703
876
  self.logger.info(
704
- f"Found {len(comparison_results['orphaned_agents'])} orphaned agent(s) "
877
+ f"Found {len(comparison_results['orphaned_agents'])} system orphaned agent(s) "
705
878
  f"(deployed without templates):"
706
879
  )
707
880
  for orphan in comparison_results["orphaned_agents"]:
@@ -710,6 +883,18 @@ class MultiSourceAgentDeploymentService:
710
883
  f"(consider removing or creating a template)"
711
884
  )
712
885
 
886
+ # Log user agents at debug level if found
887
+ if comparison_results["user_agents"]:
888
+ self.logger.debug(
889
+ f"Found {len(comparison_results['user_agents'])} user-created agent(s) "
890
+ f"(no templates required):"
891
+ )
892
+ for user_agent in comparison_results["user_agents"]:
893
+ self.logger.debug(
894
+ f" - {user_agent['name']} v{user_agent['version']} "
895
+ f"(user-created agent)"
896
+ )
897
+
713
898
  return comparison_results
714
899
 
715
900
  def _infer_agent_source_from_context(
@@ -767,11 +952,13 @@ class MultiSourceAgentDeploymentService:
767
952
  ):
768
953
  # In development mode, unknown agents are likely system agents being tested
769
954
  return "system"
770
- if deployment_context == DeploymentContext.PIPX_INSTALL:
771
- # In pipx mode, unknown agents could be system agents
772
- # Check if agent follows system naming patterns
773
- if agent_name.count("-") <= 2 and len(agent_name) <= 20:
774
- return "system"
955
+ if (
956
+ deployment_context == DeploymentContext.PIPX_INSTALL
957
+ and agent_name.count("-") <= 2
958
+ and len(agent_name) <= 20
959
+ ):
960
+ # In pipx mode, check if agent follows system naming patterns
961
+ return "system"
775
962
  except Exception:
776
963
  pass
777
964
 
@@ -860,7 +1047,7 @@ class MultiSourceAgentDeploymentService:
860
1047
 
861
1048
  def _detect_orphaned_agents_simple(
862
1049
  self, deployed_agents_dir: Path, agents_to_deploy: Dict[str, Path]
863
- ) -> List[Dict[str, Any]]:
1050
+ ) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
864
1051
  """Simple orphan detection that works with agents_to_deploy structure.
865
1052
 
866
1053
  Args:
@@ -868,12 +1055,13 @@ class MultiSourceAgentDeploymentService:
868
1055
  agents_to_deploy: Dictionary mapping file stems to template paths
869
1056
 
870
1057
  Returns:
871
- List of orphaned agent information
1058
+ Tuple of (system_orphaned_agents, user_orphaned_agents)
872
1059
  """
873
- orphaned = []
1060
+ system_orphaned = []
1061
+ user_orphaned = []
874
1062
 
875
1063
  if not deployed_agents_dir.exists():
876
- return orphaned
1064
+ return system_orphaned, user_orphaned
877
1065
 
878
1066
  # agents_to_deploy already contains file stems as keys
879
1067
  available_stems = set(agents_to_deploy.keys())
@@ -885,7 +1073,7 @@ class MultiSourceAgentDeploymentService:
885
1073
  if agent_stem in available_stems:
886
1074
  continue
887
1075
 
888
- # This is an orphaned agent
1076
+ # This is an orphaned agent - determine if it's user-created or system
889
1077
  try:
890
1078
  deployed_content = deployed_file.read_text()
891
1079
  deployed_version, _, _ = (
@@ -899,11 +1087,19 @@ class MultiSourceAgentDeploymentService:
899
1087
  except Exception:
900
1088
  version_str = "unknown"
901
1089
 
902
- orphaned.append(
903
- {"name": agent_stem, "file": str(deployed_file), "version": version_str}
904
- )
1090
+ orphan_info = {
1091
+ "name": agent_stem,
1092
+ "file": str(deployed_file),
1093
+ "version": version_str,
1094
+ }
905
1095
 
906
- return orphaned
1096
+ # Determine if this is a user-created agent
1097
+ if self._is_user_created_agent(deployed_file):
1098
+ user_orphaned.append(orphan_info)
1099
+ else:
1100
+ system_orphaned.append(orphan_info)
1101
+
1102
+ return system_orphaned, user_orphaned
907
1103
 
908
1104
  def cleanup_orphaned_agents(
909
1105
  self, deployed_agents_dir: Path, dry_run: bool = True
@@ -51,11 +51,11 @@ class DeploymentPipelineExecutor:
51
51
  try:
52
52
  # Check if step should be executed
53
53
  if not step.should_execute(context):
54
- self.logger.info(f"Skipping step {i+1}/{len(steps)}: {step.name}")
54
+ self.logger.info(f"Skipping step {i + 1}/{len(steps)}: {step.name}")
55
55
  skipped_steps.append(step.name)
56
56
  continue
57
57
 
58
- self.logger.info(f"Executing step {i+1}/{len(steps)}: {step.name}")
58
+ self.logger.info(f"Executing step {i + 1}/{len(steps)}: {step.name}")
59
59
 
60
60
  # Execute the step
61
61
  result = step.execute(context)
@@ -3,13 +3,14 @@
3
3
  import time
4
4
  from pathlib import Path
5
5
 
6
+ from claude_mpm.core.enums import OperationResult
6
7
  from claude_mpm.services.agents.deployment.processors import (
7
8
  AgentDeploymentContext,
8
9
  AgentDeploymentResult,
9
10
  AgentProcessor,
10
11
  )
11
12
 
12
- from .base_step import BaseDeploymentStep, StepResult, StepStatus
13
+ from .base_step import BaseDeploymentStep, StepResult
13
14
 
14
15
 
15
16
  class AgentProcessingStep(BaseDeploymentStep):
@@ -37,7 +38,7 @@ class AgentProcessingStep(BaseDeploymentStep):
37
38
  if not context.template_files:
38
39
  self.logger.warning("No template files to process")
39
40
  return StepResult(
40
- status=StepStatus.SKIPPED,
41
+ status=OperationResult.SKIPPED,
41
42
  message="No template files found to process",
42
43
  execution_time=time.time() - start_time,
43
44
  )
@@ -103,13 +104,13 @@ class AgentProcessingStep(BaseDeploymentStep):
103
104
 
104
105
  # Determine step status
105
106
  if failed_count == 0:
106
- status = StepStatus.SUCCESS
107
+ status = OperationResult.SUCCESS
107
108
  message = f"Successfully processed {processed_count} agents in {execution_time:.3f}s"
108
109
  elif processed_count > 0:
109
- status = StepStatus.WARNING
110
+ status = OperationResult.WARNING
110
111
  message = f"Processed {processed_count} agents with {failed_count} failures in {execution_time:.3f}s"
111
112
  else:
112
- status = StepStatus.FAILURE
113
+ status = OperationResult.FAILED
113
114
  message = f"Failed to process any agents ({failed_count} failures) in {execution_time:.3f}s"
114
115
 
115
116
  self.logger.info(message)
@@ -127,7 +128,7 @@ class AgentProcessingStep(BaseDeploymentStep):
127
128
  context.add_error(error_msg)
128
129
 
129
130
  return StepResult(
130
- status=StepStatus.FAILURE,
131
+ status=OperationResult.FAILED,
131
132
  message=error_msg,
132
133
  error=e,
133
134
  execution_time=execution_time,
@@ -229,7 +230,7 @@ class AgentProcessingStep(BaseDeploymentStep):
229
230
  cwd = Path.cwd()
230
231
  if str(cwd) in template_str:
231
232
  return "project"
232
- except:
233
+ except Exception:
233
234
  pass
234
235
 
235
236
  # Check if it's a user agent
@@ -2,26 +2,17 @@
2
2
 
3
3
  from abc import ABC, abstractmethod
4
4
  from dataclasses import dataclass
5
- from enum import Enum
6
5
  from typing import Optional
7
6
 
7
+ from claude_mpm.core.enums import OperationResult
8
8
  from claude_mpm.core.logger import get_logger
9
9
 
10
10
 
11
- class StepStatus(Enum):
12
- """Status of a pipeline step execution."""
13
-
14
- SUCCESS = "success"
15
- FAILURE = "failure"
16
- SKIPPED = "skipped"
17
- WARNING = "warning"
18
-
19
-
20
11
  @dataclass
21
12
  class StepResult:
22
13
  """Result of executing a pipeline step."""
23
14
 
24
- status: StepStatus
15
+ status: OperationResult
25
16
  message: Optional[str] = None
26
17
  error: Optional[Exception] = None
27
18
  execution_time: Optional[float] = None
@@ -29,22 +20,22 @@ class StepResult:
29
20
  @property
30
21
  def is_success(self) -> bool:
31
22
  """Check if the step was successful."""
32
- return self.status == StepStatus.SUCCESS
23
+ return self.status == OperationResult.SUCCESS
33
24
 
34
25
  @property
35
26
  def is_failure(self) -> bool:
36
27
  """Check if the step failed."""
37
- return self.status == StepStatus.FAILURE
28
+ return self.status == OperationResult.FAILED
38
29
 
39
30
  @property
40
31
  def is_skipped(self) -> bool:
41
32
  """Check if the step was skipped."""
42
- return self.status == StepStatus.SKIPPED
33
+ return self.status == OperationResult.SKIPPED
43
34
 
44
35
  @property
45
36
  def is_warning(self) -> bool:
46
37
  """Check if the step completed with warnings."""
47
- return self.status == StepStatus.WARNING
38
+ return self.status == OperationResult.WARNING
48
39
 
49
40
 
50
41
  class BaseDeploymentStep(ABC):
@@ -67,7 +58,7 @@ class BaseDeploymentStep(ABC):
67
58
  self.logger = get_logger(f"{__name__}.{self.__class__.__name__}")
68
59
 
69
60
  @abstractmethod
70
- def execute(self, context) -> StepResult:
61
+ def execute(self, context) -> "StepResult":
71
62
  """Execute this deployment step.
72
63
 
73
64
  Args:
@@ -3,8 +3,9 @@
3
3
  import time
4
4
 
5
5
  from claude_mpm.core.config import Config
6
+ from claude_mpm.core.enums import OperationResult
6
7
 
7
- from .base_step import BaseDeploymentStep, StepResult, StepStatus
8
+ from .base_step import BaseDeploymentStep, StepResult
8
9
 
9
10
 
10
11
  class ConfigurationLoadStep(BaseDeploymentStep):
@@ -54,7 +55,7 @@ class ConfigurationLoadStep(BaseDeploymentStep):
54
55
  context.step_timings[self.name] = execution_time
55
56
 
56
57
  return StepResult(
57
- status=StepStatus.SUCCESS,
58
+ status=OperationResult.SUCCESS,
58
59
  message=f"Configuration loaded successfully in {execution_time:.3f}s",
59
60
  execution_time=execution_time,
60
61
  )
@@ -68,7 +69,7 @@ class ConfigurationLoadStep(BaseDeploymentStep):
68
69
  context.add_error(error_msg)
69
70
 
70
71
  return StepResult(
71
- status=StepStatus.FAILURE,
72
+ status=OperationResult.FAILED,
72
73
  message=error_msg,
73
74
  error=e,
74
75
  execution_time=execution_time,