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
@@ -0,0 +1,994 @@
1
+ """
2
+ CLI Startup Functions
3
+ =====================
4
+
5
+ This module contains initialization functions that run on CLI startup,
6
+ including project registry, MCP configuration, and update checks.
7
+
8
+ Part of cli/__init__.py refactoring to reduce file size and improve modularity.
9
+ """
10
+
11
+ import os
12
+ import sys
13
+ import warnings
14
+ from pathlib import Path
15
+
16
+
17
+ def check_legacy_cache() -> None:
18
+ """Check for legacy cache/agents/ directory and warn user.
19
+
20
+ WHY: cache/agents/ is deprecated in favor of cache/remote-agents/.
21
+ Research confirmed that cache/remote-agents/ is the canonical location
22
+ with 26 active code references, while cache/agents/ has only 7 legacy references.
23
+
24
+ DESIGN DECISIONS:
25
+ - Non-blocking warning: Doesn't stop execution, just informs user
26
+ - Migration guidance: Provides clear path to migrate
27
+ - One-time check: Only warns if legacy cache contains files
28
+ """
29
+ home = Path.home()
30
+ legacy_cache = home / ".claude-mpm" / "cache" / "agents"
31
+ canonical_cache = home / ".claude-mpm" / "cache" / "remote-agents"
32
+ migration_marker = home / ".claude-mpm" / "cache" / ".migrated_to_remote_agents"
33
+
34
+ # Skip if already migrated or no legacy cache
35
+ if migration_marker.exists() or not legacy_cache.exists():
36
+ return
37
+
38
+ # Check if legacy cache has actual agent files
39
+ legacy_files = list(legacy_cache.glob("*.md")) + list(legacy_cache.glob("*.json"))
40
+ if not legacy_files:
41
+ return
42
+
43
+ # Only warn if canonical cache doesn't exist (indicating unmigrated system)
44
+ if not canonical_cache.exists():
45
+ warnings.warn(
46
+ f"\n⚠️ DEPRECATION: Legacy cache directory detected\n"
47
+ f" Location: {legacy_cache}\n"
48
+ f" Files found: {len(legacy_files)}\n\n"
49
+ f"The 'cache/agents/' directory is deprecated. Please migrate to 'cache/remote-agents/'.\n"
50
+ f"Run: python scripts/migrate_cache_to_remote_agents.py\n",
51
+ DeprecationWarning,
52
+ stacklevel=2,
53
+ )
54
+
55
+
56
+ def setup_early_environment(argv):
57
+ """
58
+ Set up early environment variables and logging suppression.
59
+
60
+ WHY: Some commands need special environment handling before any logging
61
+ or service initialization occurs.
62
+
63
+ CRITICAL: Suppress ALL logging by default until setup_mcp_server_logging()
64
+ configures the user's preference. This prevents early loggers (like
65
+ ProjectInitializer and service.* loggers) from logging at INFO level before
66
+ we know the user's logging preference.
67
+
68
+ Args:
69
+ argv: Command line arguments
70
+
71
+ Returns:
72
+ Processed argv list
73
+ """
74
+ import logging
75
+
76
+ # Disable telemetry and set cleanup flags early
77
+ os.environ.setdefault("DISABLE_TELEMETRY", "1")
78
+ os.environ.setdefault("CLAUDE_MPM_SKIP_CLEANUP", "0")
79
+
80
+ # CRITICAL: Suppress ALL logging by default
81
+ # This catches all loggers (claude_mpm.*, service.*, framework_loader, etc.)
82
+ # This will be overridden by setup_mcp_server_logging() based on user preference
83
+ logging.getLogger().setLevel(logging.CRITICAL + 1) # Root logger catches everything
84
+
85
+ # Process argv
86
+ if argv is None:
87
+ argv = sys.argv[1:]
88
+
89
+ # EARLY CHECK: Additional suppression for configure command
90
+ if "configure" in argv or (len(argv) > 0 and argv[0] == "configure"):
91
+ os.environ["CLAUDE_MPM_SKIP_CLEANUP"] = "1"
92
+
93
+ return argv
94
+
95
+
96
+ def should_skip_background_services(args, processed_argv):
97
+ """
98
+ Determine if background services should be skipped for this command.
99
+
100
+ WHY: Some commands (help, version, configure, doctor) don't need
101
+ background services and should start faster.
102
+
103
+ Args:
104
+ args: Parsed arguments
105
+ processed_argv: Processed command line arguments
106
+
107
+ Returns:
108
+ bool: True if background services should be skipped
109
+ """
110
+ skip_commands = ["--version", "-v", "--help", "-h"]
111
+ return any(cmd in (processed_argv or sys.argv[1:]) for cmd in skip_commands) or (
112
+ hasattr(args, "command")
113
+ and args.command in ["info", "doctor", "config", "mcp", "configure"]
114
+ )
115
+
116
+
117
+ def setup_configure_command_environment(args):
118
+ """
119
+ Set up special environment for configure command.
120
+
121
+ WHY: Configure command needs clean state without background services
122
+ and with suppressed logging.
123
+
124
+ Args:
125
+ args: Parsed arguments
126
+ """
127
+ if hasattr(args, "command") and args.command == "configure":
128
+ os.environ["CLAUDE_MPM_SKIP_CLEANUP"] = "1"
129
+ import logging
130
+
131
+ logging.getLogger("claude_mpm").setLevel(logging.WARNING)
132
+
133
+
134
+ def deploy_bundled_skills():
135
+ """
136
+ Deploy bundled Claude Code skills on startup.
137
+
138
+ WHY: Automatically deploy skills from the bundled/ directory to .claude/skills/
139
+ to ensure skills are available for agents without manual intervention.
140
+
141
+ DESIGN DECISION: Deployment happens with minimal feedback (checkmark on success).
142
+ Failures are logged but don't block startup to ensure claude-mpm remains
143
+ functional even if skills deployment fails. Respects auto_deploy config setting.
144
+ """
145
+ try:
146
+ # Check if auto-deploy is disabled in config
147
+ from ..config.config_loader import ConfigLoader
148
+
149
+ config_loader = ConfigLoader()
150
+ try:
151
+ config = config_loader.load_config()
152
+ skills_config = config.get("skills", {})
153
+ if not skills_config.get("auto_deploy", True):
154
+ # Auto-deploy disabled, skip silently
155
+ return
156
+ except Exception:
157
+ # If config loading fails, assume auto-deploy is enabled (default)
158
+ pass
159
+
160
+ # Import and run skills deployment
161
+ from ..skills.skills_service import SkillsService
162
+
163
+ skills_service = SkillsService()
164
+ deployment_result = skills_service.deploy_bundled_skills()
165
+
166
+ # Log results
167
+ from ..core.logger import get_logger
168
+
169
+ logger = get_logger("cli")
170
+
171
+ if deployment_result.get("deployed"):
172
+ # Show simple feedback for deployed skills
173
+ deployed_count = len(deployment_result["deployed"])
174
+ print(f"✓ Bundled skills ready ({deployed_count} deployed)", flush=True)
175
+ logger.info(f"Skills: Deployed {deployed_count} skill(s)")
176
+ elif not deployment_result.get("errors"):
177
+ # No deployment needed, skills already present
178
+ print("✓ Bundled skills ready", flush=True)
179
+
180
+ if deployment_result.get("errors"):
181
+ logger.warning(
182
+ f"Skills: {len(deployment_result['errors'])} skill(s) failed to deploy"
183
+ )
184
+
185
+ except Exception as e:
186
+ # Import logger here to avoid circular imports
187
+ from ..core.logger import get_logger
188
+
189
+ logger = get_logger("cli")
190
+ logger.debug(f"Failed to deploy bundled skills: {e}")
191
+ # Continue execution - skills deployment failure shouldn't block startup
192
+
193
+
194
+ def discover_and_link_runtime_skills():
195
+ """
196
+ Discover and link runtime skills from user/project directories.
197
+
198
+ WHY: Automatically discover and link skills added to .claude/skills/
199
+ without requiring manual configuration.
200
+
201
+ DESIGN DECISION: Provides simple feedback on completion.
202
+ Failures are logged but don't block startup to ensure
203
+ claude-mpm remains functional even if skills discovery fails.
204
+ """
205
+ try:
206
+ from ..cli.interactive.skills_wizard import (
207
+ discover_and_link_runtime_skills as discover_skills,
208
+ )
209
+
210
+ discover_skills()
211
+ # Show simple success feedback
212
+ print("✓ Runtime skills linked", flush=True)
213
+ except Exception as e:
214
+ # Import logger here to avoid circular imports
215
+ from ..core.logger import get_logger
216
+
217
+ logger = get_logger("cli")
218
+ logger.debug(f"Failed to discover runtime skills: {e}")
219
+ # Continue execution - skills discovery failure shouldn't block startup
220
+
221
+
222
+ def deploy_output_style_on_startup():
223
+ """
224
+ Deploy claude-mpm output style to Claude Code on CLI startup.
225
+
226
+ WHY: Automatically deploy and activate the output style to ensure consistent,
227
+ professional communication without emojis and exclamation points. This ensures
228
+ the style is available even when using Claude Code directly (not via chat command).
229
+
230
+ DESIGN DECISION: This is non-blocking and idempotent. It uses OutputStyleManager
231
+ which handles version detection, file deployment, and settings activation.
232
+ Only works for Claude Code >= 1.0.83.
233
+ """
234
+ try:
235
+ from pathlib import Path
236
+
237
+ from ..core.output_style_manager import OutputStyleManager
238
+
239
+ # Create OutputStyleManager instance
240
+ output_style_manager = OutputStyleManager()
241
+
242
+ # Check if Claude Code supports output styles
243
+ if not output_style_manager.supports_output_styles():
244
+ # Silently skip - version too old or Claude not installed
245
+ return
246
+
247
+ # Check if already deployed and active
248
+ settings_file = Path.home() / ".claude" / "settings.json"
249
+ output_style_file = Path.home() / ".claude" / "output-styles" / "claude-mpm.md"
250
+
251
+ already_configured = False
252
+ if settings_file.exists() and output_style_file.exists():
253
+ try:
254
+ import json
255
+
256
+ # Check if file has content (bug fix: was skipping empty files)
257
+ if output_style_file.stat().st_size == 0:
258
+ # File is empty, need to redeploy with content
259
+ pass # Fall through to deployment below
260
+ else:
261
+ # File has content, check if already active
262
+ settings = json.loads(settings_file.read_text())
263
+ if settings.get("activeOutputStyle") == "claude-mpm":
264
+ # Already deployed and active with content
265
+ already_configured = True
266
+ except Exception:
267
+ pass # Continue with deployment if we can't read settings
268
+
269
+ if already_configured:
270
+ # Show feedback that output style is ready
271
+ print("✓ Output style configured", flush=True)
272
+ return
273
+
274
+ # Read OUTPUT_STYLE.md content
275
+ output_style_path = Path(__file__).parent.parent / "agents" / "OUTPUT_STYLE.md"
276
+
277
+ if not output_style_path.exists():
278
+ # No output style file to deploy
279
+ return
280
+
281
+ output_style_content = output_style_path.read_text()
282
+
283
+ # Deploy the output style (deploys file and activates it)
284
+ output_style_manager.deploy_output_style(output_style_content)
285
+ print("✓ Output style configured", flush=True)
286
+
287
+ except Exception as e:
288
+ # Non-critical - log but don't fail startup
289
+ from ..core.logger import get_logger
290
+
291
+ logger = get_logger("cli")
292
+ logger.debug(f"Failed to deploy output style: {e}")
293
+ # Continue execution - output style deployment shouldn't block startup
294
+
295
+
296
+ def sync_remote_agents_on_startup():
297
+ """
298
+ Synchronize agent templates from remote sources on startup.
299
+
300
+ WHY: Ensures agents are up-to-date from remote Git sources (GitHub)
301
+ without manual intervention. Uses ETag-based caching for efficient
302
+ updates (95%+ bandwidth reduction).
303
+
304
+ DESIGN DECISION: Non-blocking synchronization that doesn't prevent
305
+ startup if network is unavailable. Failures are logged but don't
306
+ block startup to ensure claude-mpm remains functional.
307
+
308
+ Workflow:
309
+ 1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
310
+ 2. Deploy agents to ~/.claude/agents/ - Phase 2 progress bar
311
+ 3. Log deployment results
312
+ """
313
+ # Check for legacy cache and warn user if found
314
+ check_legacy_cache()
315
+
316
+ try:
317
+ from ..services.agents.deployment.agent_deployment import AgentDeploymentService
318
+ from ..services.agents.startup_sync import sync_agents_on_startup
319
+ from ..utils.progress import ProgressBar
320
+
321
+ # Phase 1: Sync files from Git sources
322
+ result = sync_agents_on_startup()
323
+
324
+ # Only proceed with deployment if sync was enabled and ran
325
+ if result.get("enabled") and result.get("sources_synced", 0) > 0:
326
+ from ..core.logger import get_logger
327
+
328
+ logger = get_logger("cli")
329
+
330
+ downloaded = result.get("total_downloaded", 0)
331
+ cached = result.get("cache_hits", 0)
332
+ duration = result.get("duration_ms", 0)
333
+
334
+ if downloaded > 0 or cached > 0:
335
+ logger.debug(
336
+ f"Agent sync: {downloaded} updated, {cached} cached ({duration}ms)"
337
+ )
338
+
339
+ # Log errors if any
340
+ errors = result.get("errors", [])
341
+ if errors:
342
+ logger.warning(f"Agent sync completed with {len(errors)} errors")
343
+
344
+ # Phase 2: Deploy agents from cache to ~/.claude/agents/
345
+ # This mirrors the skills deployment pattern (lines 371-407)
346
+ try:
347
+ # Initialize deployment service
348
+ deployment_service = AgentDeploymentService()
349
+
350
+ # Count agents in cache to show accurate progress
351
+ from pathlib import Path
352
+
353
+ cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
354
+ agent_count = 0
355
+
356
+ if cache_dir.exists():
357
+ # Count MD files in cache (agent markdown files from Git)
358
+ # BUGFIX: Only count files in agent directories, not docs/templates/READMEs
359
+ # Valid agent paths must contain "/agents/" or be in root-level category dirs
360
+ # Exclude PM templates, BASE-AGENT, and documentation files
361
+ pm_templates = {
362
+ "base-agent.md",
363
+ "circuit_breakers.md",
364
+ "pm_examples.md",
365
+ "pm_red_flags.md",
366
+ "research_gate_examples.md",
367
+ "response_format.md",
368
+ "ticket_completeness_examples.md",
369
+ "validation_templates.md",
370
+ "git_file_tracking.md",
371
+ }
372
+ # Documentation files to exclude (by filename)
373
+ doc_files = {
374
+ "readme.md",
375
+ "changelog.md",
376
+ "contributing.md",
377
+ "implementation-summary.md",
378
+ "reorganization-plan.md",
379
+ "auto-deploy-index.md",
380
+ }
381
+
382
+ # Find all markdown files
383
+ all_md_files = list(cache_dir.rglob("*.md"))
384
+
385
+ # Filter to only agent files:
386
+ # 1. Must have "/agents/" in path (from git repos)
387
+ # 2. Must not be in PM templates or doc files
388
+ # 3. Exclude BASE-AGENT.md which is not a deployable agent
389
+ agent_files = [
390
+ f
391
+ for f in all_md_files
392
+ if (
393
+ # Must be in an agent directory (from git repos like bobmatnyc/claude-mpm-agents/agents/)
394
+ "/agents/" in str(f)
395
+ # Exclude PM templates, doc files, and BASE-AGENT
396
+ and f.name.lower() not in pm_templates
397
+ and f.name.lower() not in doc_files
398
+ and f.name.lower() != "base-agent.md"
399
+ )
400
+ ]
401
+ agent_count = len(agent_files)
402
+
403
+ if agent_count > 0:
404
+ # Create progress bar for deployment phase
405
+ deploy_progress = ProgressBar(
406
+ total=agent_count,
407
+ prefix="Deploying agents",
408
+ show_percentage=True,
409
+ show_counter=True,
410
+ )
411
+
412
+ # Deploy agents with progress callback
413
+ deploy_target = Path.home() / ".claude" / "agents"
414
+ deployment_result = deployment_service.deploy_agents(
415
+ target_dir=deploy_target,
416
+ force_rebuild=False, # Only deploy if versions differ
417
+ deployment_mode="update", # Version-aware updates
418
+ )
419
+
420
+ # Update progress bar (single increment since deploy_agents is batch)
421
+ deploy_progress.update(agent_count)
422
+
423
+ # Finish deployment progress bar
424
+ deployed = len(deployment_result.get("deployed", []))
425
+ updated = len(deployment_result.get("updated", []))
426
+ skipped = len(deployment_result.get("skipped", []))
427
+ total_available = deployed + updated + skipped
428
+
429
+ # Show total available agents (deployed + updated + already existing)
430
+ if deployed > 0 or updated > 0:
431
+ deploy_progress.finish(
432
+ f"Complete: {deployed} deployed, {updated} updated, {skipped} already present ({total_available} total)"
433
+ )
434
+ else:
435
+ deploy_progress.finish(
436
+ f"Complete: {total_available} agents ready (all up-to-date)"
437
+ )
438
+
439
+ # Display deployment errors to user (not just logs)
440
+ deploy_errors = deployment_result.get("errors", [])
441
+ if deploy_errors:
442
+ # Log for debugging
443
+ logger.warning(
444
+ f"Agent deployment completed with {len(deploy_errors)} errors: {deploy_errors}"
445
+ )
446
+
447
+ # Display errors to user with clear formatting
448
+ print("\n⚠️ Agent Deployment Errors:")
449
+
450
+ # Show first 10 errors to avoid overwhelming output
451
+ max_errors_to_show = 10
452
+ errors_to_display = deploy_errors[:max_errors_to_show]
453
+
454
+ for error in errors_to_display:
455
+ # Format error message for readability
456
+ # Errors typically come as strings like "agent.md: Error message"
457
+ print(f" - {error}")
458
+
459
+ # If more errors exist, show count
460
+ if len(deploy_errors) > max_errors_to_show:
461
+ remaining = len(deploy_errors) - max_errors_to_show
462
+ print(f" ... and {remaining} more error(s)")
463
+
464
+ # Show summary message
465
+ print(
466
+ f"\n❌ Failed to deploy {len(deploy_errors)} agent(s). Please check the error messages above."
467
+ )
468
+ print(" Run with --verbose for detailed error information.\n")
469
+
470
+ except Exception as e:
471
+ # Deployment failure shouldn't block startup
472
+ from ..core.logger import get_logger
473
+
474
+ logger = get_logger("cli")
475
+ logger.warning(f"Failed to deploy agents from cache: {e}")
476
+
477
+ except Exception as e:
478
+ # Non-critical - log but don't fail startup
479
+ from ..core.logger import get_logger
480
+
481
+ logger = get_logger("cli")
482
+ logger.debug(f"Failed to sync remote agents: {e}")
483
+ # Continue execution - agent sync failure shouldn't block startup
484
+
485
+
486
+ def sync_remote_skills_on_startup():
487
+ """
488
+ Synchronize skill templates from remote sources on startup.
489
+
490
+ WHY: Ensures skills are up-to-date from remote Git sources (GitHub)
491
+ without manual intervention. Provides consistency with agent syncing.
492
+
493
+ DESIGN DECISION: Non-blocking synchronization that doesn't prevent
494
+ startup if network is unavailable. Failures are logged but don't
495
+ block startup to ensure claude-mpm remains functional.
496
+
497
+ Workflow:
498
+ 1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
499
+ 2. Deploy skills to ~/.claude/skills/ with flat structure - Phase 2 progress bar
500
+ 3. Log deployment results
501
+ """
502
+ try:
503
+ from pathlib import Path
504
+
505
+ from ..config.skill_sources import SkillSourceConfiguration
506
+ from ..services.skills.git_skill_source_manager import GitSkillSourceManager
507
+ from ..utils.progress import ProgressBar
508
+
509
+ config = SkillSourceConfiguration()
510
+ manager = GitSkillSourceManager(config)
511
+
512
+ # Get enabled sources
513
+ enabled_sources = config.get_enabled_sources()
514
+ if not enabled_sources:
515
+ return # No sources enabled, nothing to sync
516
+
517
+ # Phase 1: Sync files from Git sources
518
+ # We need to discover file count first to show accurate progress
519
+ # This requires pre-scanning repositories via GitHub API
520
+ from ..core.logger import get_logger
521
+
522
+ logger = get_logger("cli")
523
+
524
+ # Discover total file count across all sources
525
+ total_file_count = 0
526
+ for source in enabled_sources:
527
+ try:
528
+ # Parse GitHub URL
529
+ url_parts = (
530
+ source.url.rstrip("/").replace(".git", "").split("github.com/")
531
+ )
532
+ if len(url_parts) == 2:
533
+ repo_path = url_parts[1].strip("/")
534
+ owner_repo = "/".join(repo_path.split("/")[:2])
535
+
536
+ # Use Tree API to discover all files
537
+ all_files = manager._discover_repository_files_via_tree_api(
538
+ owner_repo, source.branch
539
+ )
540
+
541
+ # Count relevant files (markdown, JSON)
542
+ relevant_files = [
543
+ f
544
+ for f in all_files
545
+ if f.endswith(".md") or f.endswith(".json") or f == ".gitignore"
546
+ ]
547
+ total_file_count += len(relevant_files)
548
+
549
+ except Exception as e:
550
+ logger.debug(f"Failed to discover files for {source.id}: {e}")
551
+ # Use estimate if discovery fails
552
+ total_file_count += 150
553
+
554
+ # Create progress bar for sync phase with actual file count
555
+ sync_progress = ProgressBar(
556
+ total=total_file_count if total_file_count > 0 else 1,
557
+ prefix="Syncing skills",
558
+ show_percentage=True,
559
+ show_counter=True,
560
+ )
561
+
562
+ # Sync all sources with progress callback
563
+ results = manager.sync_all_sources(
564
+ force=False, progress_callback=sync_progress.update
565
+ )
566
+
567
+ # Finish sync progress bar with clear breakdown
568
+ downloaded = results["total_files_updated"]
569
+ cached = results["total_files_cached"]
570
+ total_files = downloaded + cached
571
+
572
+ if cached > 0:
573
+ sync_progress.finish(
574
+ f"Complete: {downloaded} downloaded, {cached} cached ({total_files} total)"
575
+ )
576
+ else:
577
+ # All new downloads (first sync)
578
+ sync_progress.finish(f"Complete: {downloaded} files downloaded")
579
+
580
+ # Phase 2: Deploy skills to ~/.claude/skills/
581
+ # This flattens nested Git structure (e.g., collaboration/parallel-agents/SKILL.md)
582
+ # into flat deployment (e.g., collaboration-dispatching-parallel-agents/SKILL.md)
583
+ if results["synced_count"] > 0:
584
+ # Get all skills to determine deployment count
585
+ all_skills = manager.get_all_skills()
586
+ skill_count = len(all_skills)
587
+
588
+ if skill_count > 0:
589
+ # Create progress bar for deployment phase
590
+ deploy_progress = ProgressBar(
591
+ total=skill_count,
592
+ prefix="Deploying skill directories",
593
+ show_percentage=True,
594
+ show_counter=True,
595
+ )
596
+
597
+ # Deploy skills with progress callback
598
+ # Deploy to project directory (like agents), not user directory
599
+ deployment_result = manager.deploy_skills(
600
+ target_dir=Path.cwd() / ".claude" / "skills",
601
+ force=False,
602
+ progress_callback=deploy_progress.update,
603
+ )
604
+
605
+ # Finish deployment progress bar
606
+ deployed = deployment_result.get("deployed_count", 0)
607
+ skipped = deployment_result.get("skipped_count", 0)
608
+ total_available = deployed + skipped
609
+
610
+ # Show total available skills (deployed + already existing)
611
+ # This is more user-friendly than just showing newly deployed count
612
+ if deployed > 0:
613
+ deploy_progress.finish(
614
+ f"Complete: {deployed} deployed, {skipped} already present ({total_available} total)"
615
+ )
616
+ else:
617
+ deploy_progress.finish(
618
+ f"Complete: {total_available} skills ready (all up-to-date)"
619
+ )
620
+
621
+ # Log deployment errors if any
622
+ from ..core.logger import get_logger
623
+
624
+ logger = get_logger("cli")
625
+
626
+ errors = deployment_result.get("errors", [])
627
+ if errors:
628
+ logger.warning(
629
+ f"Skill deployment completed with {len(errors)} errors: {errors}"
630
+ )
631
+
632
+ # Log sync errors if any
633
+ if results["failed_count"] > 0:
634
+ logger.warning(
635
+ f"Skill sync completed with {results['failed_count']} failures"
636
+ )
637
+
638
+ except Exception as e:
639
+ # Non-critical - log but don't fail startup
640
+ from ..core.logger import get_logger
641
+
642
+ logger = get_logger("cli")
643
+ logger.debug(f"Failed to sync remote skills: {e}")
644
+ # Continue execution - skill sync failure shouldn't block startup
645
+
646
+
647
+ def run_background_services():
648
+ """
649
+ Initialize all background services on startup.
650
+
651
+ WHY: Centralizes all startup service initialization for cleaner main().
652
+
653
+ NOTE: System instructions (PM_INSTRUCTIONS.md, WORKFLOW.md, MEMORY.md) and
654
+ templates do NOT deploy automatically on startup. They only deploy when user
655
+ explicitly requests them via agent-manager commands. This prevents unwanted
656
+ file creation in project .claude/ directories.
657
+ See: SystemInstructionsDeployer and agent_deployment.py line 504-509
658
+ """
659
+ initialize_project_registry()
660
+ check_mcp_auto_configuration()
661
+ verify_mcp_gateway_startup()
662
+ check_for_updates_async()
663
+ sync_remote_agents_on_startup() # Sync agents from remote sources
664
+
665
+ # Skills deployment order (precedence: remote > bundled)
666
+ # 1. Deploy bundled skills first (base layer from package)
667
+ # 2. Sync and deploy remote skills (Git sources, can override bundled)
668
+ # 3. Discover and link runtime skills (user-added skills)
669
+ # This ensures remote skills take precedence over bundled skills when names conflict
670
+ deploy_bundled_skills() # Base layer: package-bundled skills
671
+ sync_remote_skills_on_startup() # Override layer: Git-based skills (takes precedence)
672
+ discover_and_link_runtime_skills() # Discovery: user-added skills
673
+
674
+ deploy_output_style_on_startup()
675
+
676
+
677
+ def setup_mcp_server_logging(args):
678
+ """
679
+ Configure minimal logging for MCP server mode.
680
+
681
+ WHY: MCP server needs minimal stderr-only logging to avoid interfering
682
+ with stdout protocol communication.
683
+
684
+ Args:
685
+ args: Parsed arguments
686
+
687
+ Returns:
688
+ Configured logger
689
+ """
690
+ import logging
691
+
692
+ from ..cli.utils import setup_logging
693
+ from ..constants import CLICommands
694
+
695
+ if (
696
+ args.command == CLICommands.MCP.value
697
+ and getattr(args, "mcp_command", None) == "start"
698
+ ):
699
+ if not getattr(args, "test", False) and not getattr(
700
+ args, "instructions", False
701
+ ):
702
+ # Production MCP mode - minimal logging
703
+ logging.basicConfig(
704
+ level=logging.ERROR,
705
+ format="%(message)s",
706
+ stream=sys.stderr,
707
+ force=True,
708
+ )
709
+ return logging.getLogger("claude_mpm")
710
+ # Test or instructions mode - normal logging
711
+ return setup_logging(args)
712
+ # Normal logging for all other commands
713
+ return setup_logging(args)
714
+
715
+
716
+ def initialize_project_registry():
717
+ """
718
+ Initialize or update the project registry for the current session.
719
+
720
+ WHY: The project registry tracks all claude-mpm projects and their metadata
721
+ across sessions. This function ensures the current project is properly
722
+ registered and updates session information.
723
+
724
+ DESIGN DECISION: Registry failures are logged but don't prevent startup
725
+ to ensure claude-mpm remains functional even if registry operations fail.
726
+ """
727
+ try:
728
+ from ..services.project.registry import ProjectRegistry
729
+
730
+ registry = ProjectRegistry()
731
+ registry.get_or_create_project_entry()
732
+ except Exception as e:
733
+ # Import logger here to avoid circular imports
734
+ from ..core.logger import get_logger
735
+
736
+ logger = get_logger("cli")
737
+ logger.debug(f"Failed to initialize project registry: {e}")
738
+ # Continue execution - registry failure shouldn't block startup
739
+
740
+
741
+ def check_mcp_auto_configuration():
742
+ """
743
+ Check and potentially auto-configure MCP for pipx installations.
744
+
745
+ WHY: Users installing via pipx should have MCP work out-of-the-box with
746
+ minimal friction. This function offers one-time auto-configuration with
747
+ user consent.
748
+
749
+ DESIGN DECISION: This is blocking but quick - it only runs once and has
750
+ a 10-second timeout. Shows progress feedback during checks to avoid
751
+ appearing frozen.
752
+
753
+ OPTIMIZATION: Skip ALL MCP checks for doctor and configure commands to avoid
754
+ duplicate checks (doctor performs its own comprehensive check, configure
755
+ allows users to select services).
756
+ """
757
+ # Skip MCP service checks for the doctor and configure commands
758
+ # The doctor command performs its own comprehensive MCP service check
759
+ # The configure command allows users to configure which services to enable
760
+ # Running both would cause duplicate checks and log messages (9 seconds apart)
761
+ if len(sys.argv) > 1 and sys.argv[1] in ("doctor", "configure"):
762
+ return
763
+
764
+ try:
765
+ from ..services.mcp_gateway.auto_configure import check_and_configure_mcp
766
+
767
+ # Show progress feedback - this operation can take 10+ seconds
768
+ print("Checking MCP configuration...", end="", flush=True)
769
+
770
+ # This function handles all the logic:
771
+ # - Checks if already configured
772
+ # - Checks if pipx installation
773
+ # - Checks if already asked before
774
+ # - Prompts user if needed
775
+ # - Configures if user agrees
776
+ check_and_configure_mcp()
777
+
778
+ # Clear the "Checking..." message by overwriting with spaces
779
+ print("\r" + " " * 30 + "\r", end="", flush=True)
780
+
781
+ except Exception as e:
782
+ # Clear progress message on error
783
+ print("\r" + " " * 30 + "\r", end="", flush=True)
784
+
785
+ # Non-critical - log but don't fail
786
+ from ..core.logger import get_logger
787
+
788
+ logger = get_logger("cli")
789
+ logger.debug(f"MCP auto-configuration check failed: {e}")
790
+
791
+
792
+ def verify_mcp_gateway_startup():
793
+ """
794
+ Verify MCP Gateway configuration on startup and pre-warm MCP services.
795
+
796
+ WHY: The MCP gateway should be automatically configured and verified on startup
797
+ to provide a seamless experience with diagnostic tools, file summarizer, and
798
+ ticket service. Pre-warming MCP services eliminates the 11.9s delay on first use.
799
+
800
+ DESIGN DECISION: This is non-blocking - failures are logged but don't prevent
801
+ startup to ensure claude-mpm remains functional even if MCP gateway has issues.
802
+ """
803
+ # Quick verification of MCP services installation
804
+ try:
805
+ from ..core.logger import get_logger
806
+ from ..services.mcp_service_verifier import verify_mcp_services_on_startup
807
+
808
+ logger = get_logger("mcp_verify")
809
+ all_ok, message = verify_mcp_services_on_startup()
810
+ if not all_ok:
811
+ logger.warning(message)
812
+ except Exception:
813
+ # Non-critical - continue with startup
814
+ pass
815
+
816
+ try:
817
+ import asyncio
818
+
819
+ from ..core.logger import get_logger
820
+ from ..services.mcp_gateway.core.startup_verification import (
821
+ is_mcp_gateway_configured,
822
+ verify_mcp_gateway_on_startup,
823
+ )
824
+
825
+ logger = get_logger("mcp_prewarm")
826
+
827
+ # Quick check first - if already configured, skip detailed verification
828
+ gateway_configured = is_mcp_gateway_configured()
829
+
830
+ # DISABLED: Pre-warming MCP servers can interfere with Claude Code's MCP management
831
+ # This was causing issues with MCP server initialization and stderr handling
832
+ # Pre-warming functionality has been removed. Gateway verification only runs
833
+ # if MCP gateway is not already configured.
834
+
835
+ # Run gateway verification in background if not configured
836
+ if not gateway_configured:
837
+
838
+ def run_verification():
839
+ """Background thread to verify MCP gateway configuration."""
840
+ loop = None
841
+ try:
842
+ loop = asyncio.new_event_loop()
843
+ asyncio.set_event_loop(loop)
844
+ results = loop.run_until_complete(verify_mcp_gateway_on_startup())
845
+
846
+ # Log results but don't block
847
+ from ..core.logger import get_logger
848
+
849
+ logger = get_logger("cli")
850
+
851
+ if results.get("gateway_configured"):
852
+ logger.debug("MCP Gateway verification completed successfully")
853
+ else:
854
+ logger.debug("MCP Gateway verification completed with warnings")
855
+
856
+ except Exception as e:
857
+ from ..core.logger import get_logger
858
+
859
+ logger = get_logger("cli")
860
+ logger.debug(f"MCP Gateway verification failed: {e}")
861
+ finally:
862
+ # Properly clean up event loop to prevent kqueue warnings
863
+ if loop is not None:
864
+ try:
865
+ # Cancel all running tasks
866
+ pending = asyncio.all_tasks(loop)
867
+ for task in pending:
868
+ task.cancel()
869
+ # Wait for tasks to complete cancellation
870
+ if pending:
871
+ loop.run_until_complete(
872
+ asyncio.gather(*pending, return_exceptions=True)
873
+ )
874
+ except Exception:
875
+ pass # Ignore cleanup errors
876
+ finally:
877
+ loop.close()
878
+ # Clear the event loop reference to help with cleanup
879
+ asyncio.set_event_loop(None)
880
+
881
+ # Run in background thread to avoid blocking startup
882
+ import threading
883
+
884
+ verification_thread = threading.Thread(target=run_verification, daemon=True)
885
+ verification_thread.start()
886
+
887
+ except Exception as e:
888
+ # Import logger here to avoid circular imports
889
+ from ..core.logger import get_logger
890
+
891
+ logger = get_logger("cli")
892
+ logger.debug(f"Failed to start MCP Gateway verification: {e}")
893
+ # Continue execution - MCP gateway issues shouldn't block startup
894
+
895
+
896
+ def check_for_updates_async():
897
+ """
898
+ Check for updates in background thread (non-blocking).
899
+
900
+ WHY: Users should be notified of new versions and have an easy way to upgrade
901
+ without manually checking PyPI/npm. This runs asynchronously on startup to avoid
902
+ blocking the CLI.
903
+
904
+ DESIGN DECISION: This is non-blocking and non-critical - failures are logged
905
+ but don't prevent startup. Only runs for pip/pipx/npm installations, skips
906
+ editable/development installations. Respects user configuration settings.
907
+ """
908
+
909
+ def run_update_check():
910
+ """Inner function to run in background thread."""
911
+ loop = None
912
+ try:
913
+ import asyncio
914
+
915
+ from ..core.config import Config
916
+ from ..core.logger import get_logger
917
+ from ..services.self_upgrade_service import SelfUpgradeService
918
+
919
+ logger = get_logger("upgrade_check")
920
+
921
+ # Load configuration
922
+ config = Config()
923
+ updates_config = config.get("updates", {})
924
+
925
+ # Check if update checking is enabled
926
+ if not updates_config.get("check_enabled", True):
927
+ logger.debug("Update checking disabled in configuration")
928
+ return
929
+
930
+ # Check frequency setting
931
+ frequency = updates_config.get("check_frequency", "daily")
932
+ if frequency == "never":
933
+ logger.debug("Update checking frequency set to 'never'")
934
+ return
935
+
936
+ # Create new event loop for this thread
937
+ loop = asyncio.new_event_loop()
938
+ asyncio.set_event_loop(loop)
939
+
940
+ # Create upgrade service and check for updates
941
+ upgrade_service = SelfUpgradeService()
942
+
943
+ # Skip for editable installs (development mode)
944
+ from ..services.self_upgrade_service import InstallationMethod
945
+
946
+ if upgrade_service.installation_method == InstallationMethod.EDITABLE:
947
+ logger.debug("Skipping version check for editable installation")
948
+ return
949
+
950
+ # Get configuration values
951
+ check_claude_code = updates_config.get("check_claude_code", True)
952
+ auto_upgrade = updates_config.get("auto_upgrade", False)
953
+
954
+ # Check and prompt for upgrade if available (non-blocking)
955
+ loop.run_until_complete(
956
+ upgrade_service.check_and_prompt_on_startup(
957
+ auto_upgrade=auto_upgrade, check_claude_code=check_claude_code
958
+ )
959
+ )
960
+
961
+ except Exception as e:
962
+ # Non-critical - log but don't fail startup
963
+ try:
964
+ from ..core.logger import get_logger
965
+
966
+ logger = get_logger("upgrade_check")
967
+ logger.debug(f"Update check failed (non-critical): {e}")
968
+ except Exception:
969
+ pass # Avoid any errors in error handling
970
+ finally:
971
+ # Properly clean up event loop
972
+ if loop is not None:
973
+ try:
974
+ # Cancel all running tasks
975
+ pending = asyncio.all_tasks(loop)
976
+ for task in pending:
977
+ task.cancel()
978
+ # Wait for tasks to complete cancellation
979
+ if pending:
980
+ loop.run_until_complete(
981
+ asyncio.gather(*pending, return_exceptions=True)
982
+ )
983
+ except Exception:
984
+ pass # Ignore cleanup errors
985
+ finally:
986
+ loop.close()
987
+ # Clear the event loop reference to help with cleanup
988
+ asyncio.set_event_loop(None)
989
+
990
+ # Run update check in background thread to avoid blocking startup
991
+ import threading
992
+
993
+ update_check_thread = threading.Thread(target=run_update_check, daemon=True)
994
+ update_check_thread.start()