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.

Potentially problematic release.


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

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,784 @@
1
+ """Local Agent Template Manager for Claude MPM.
2
+
3
+ This module provides comprehensive support for managing local agent templates
4
+ stored in project and user directories. It handles JSON template discovery,
5
+ validation, deployment, and versioning with proper priority handling.
6
+
7
+ Key Features:
8
+ - Local JSON template discovery in .claude-mpm/agents/
9
+ - Project-specific agent templates with project name as author
10
+ - Custom versioning for local agents
11
+ - Template inheritance from system agents
12
+ - Hot-reload support during development
13
+ - Proper priority handling (PROJECT > USER > SYSTEM)
14
+ """
15
+
16
+ import json
17
+ from dataclasses import dataclass
18
+ from datetime import datetime, timezone
19
+ from pathlib import Path
20
+ from typing import Any, Dict, List, Optional, Tuple, Union
21
+
22
+ import yaml
23
+
24
+ from claude_mpm.core.logging_config import get_logger
25
+ from claude_mpm.core.unified_paths import get_path_manager
26
+
27
+ logger = get_logger(__name__)
28
+
29
+
30
+ @dataclass
31
+ class LocalAgentTemplate:
32
+ """Model for local agent templates with project-specific metadata."""
33
+
34
+ schema_version: str = "1.3.0"
35
+ agent_id: str = ""
36
+ agent_version: str = "1.0.0"
37
+ author: str = "" # Will be project name for local agents
38
+ agent_type: str = "" # Backwards compatibility field
39
+
40
+ metadata: Dict[str, Any] = None
41
+ capabilities: Dict[str, Any] = None
42
+ instructions: str = ""
43
+ configuration: Dict[str, Any] = None
44
+
45
+ # Local-specific fields
46
+ tier: str = "project"
47
+ priority: int = 1000 # Higher priority for local agents
48
+ is_local: bool = True
49
+ parent_agent: Optional[str] = None # For inheritance from system agents
50
+ created_at: Optional[str] = None
51
+ updated_at: Optional[str] = None
52
+
53
+ def __post_init__(self):
54
+ """Initialize default values."""
55
+ if self.metadata is None:
56
+ self.metadata = {}
57
+ if self.capabilities is None:
58
+ self.capabilities = {"model": "sonnet", "tools": "*"}
59
+ if self.configuration is None:
60
+ self.configuration = {}
61
+ if self.created_at is None:
62
+ self.created_at = datetime.now(timezone.utc).isoformat()
63
+ if self.updated_at is None:
64
+ self.updated_at = datetime.now(timezone.utc).isoformat()
65
+
66
+ # Ensure metadata has required fields
67
+ if "name" not in self.metadata:
68
+ self.metadata["name"] = self.agent_id.replace("_", " ").title()
69
+ if "description" not in self.metadata:
70
+ self.metadata["description"] = f"Local {self.agent_id} agent"
71
+ if "tier" not in self.metadata:
72
+ self.metadata["tier"] = self.tier
73
+ if "tags" not in self.metadata:
74
+ self.metadata["tags"] = ["local", "custom"]
75
+
76
+ def to_json(self) -> Dict[str, Any]:
77
+ """Convert to JSON-serializable dictionary."""
78
+ data = {
79
+ "schema_version": self.schema_version,
80
+ "agent_id": self.agent_id,
81
+ "agent_version": self.agent_version,
82
+ "author": self.author,
83
+ "agent_type": self.agent_type or self.agent_id,
84
+ "metadata": self.metadata,
85
+ "capabilities": self.capabilities,
86
+ "instructions": self.instructions,
87
+ "configuration": self.configuration,
88
+ "priority": self.priority,
89
+ }
90
+
91
+ # Add optional fields if present
92
+ if self.parent_agent:
93
+ data["parent_agent"] = self.parent_agent
94
+ if self.created_at:
95
+ data["created_at"] = self.created_at
96
+ if self.updated_at:
97
+ data["updated_at"] = self.updated_at
98
+
99
+ return data
100
+
101
+ @classmethod
102
+ def from_json(cls, data: Dict[str, Any]) -> "LocalAgentTemplate":
103
+ """Create from JSON dictionary."""
104
+ return cls(
105
+ schema_version=data.get("schema_version", "1.3.0"),
106
+ agent_id=data.get("agent_id", ""),
107
+ agent_version=data.get("agent_version", "1.0.0"),
108
+ author=data.get("author", ""),
109
+ agent_type=data.get("agent_type", ""),
110
+ metadata=data.get("metadata", {}),
111
+ capabilities=data.get("capabilities", {}),
112
+ instructions=data.get("instructions", ""),
113
+ configuration=data.get("configuration", {}),
114
+ tier=data.get("metadata", {}).get("tier", "project"),
115
+ priority=data.get("priority", 1000),
116
+ parent_agent=data.get("parent_agent"),
117
+ created_at=data.get("created_at"),
118
+ updated_at=data.get("updated_at"),
119
+ )
120
+
121
+
122
+ class LocalAgentTemplateManager:
123
+ """Manager for local agent templates in project and user directories."""
124
+
125
+ def __init__(self, working_directory: Optional[Path] = None):
126
+ """Initialize the local template manager.
127
+
128
+ Args:
129
+ working_directory: Working directory for project-level agents
130
+ """
131
+ self.path_manager = get_path_manager()
132
+ self.working_directory = working_directory or Path.cwd()
133
+
134
+ # Define local agent directories
135
+ self.project_agents_dir = self.working_directory / ".claude-mpm" / "agents"
136
+ self.user_agents_dir = Path.home() / ".claude-mpm" / "agents"
137
+
138
+ # Cache for discovered templates
139
+ self._template_cache: Dict[str, LocalAgentTemplate] = {}
140
+ self._cache_valid = False
141
+
142
+ logger.info(
143
+ f"LocalAgentTemplateManager initialized for project: {self.working_directory}"
144
+ )
145
+
146
+ def get_project_name(self) -> str:
147
+ """Get the current project name for use as author field.
148
+
149
+ Returns:
150
+ Project directory name or 'local-project' as fallback
151
+ """
152
+ try:
153
+ # Use the project directory name
154
+ project_name = self.working_directory.name
155
+ if project_name and project_name != "/":
156
+ return project_name
157
+ except Exception as e:
158
+ logger.warning(f"Failed to get project name: {e}")
159
+
160
+ return "local-project"
161
+
162
+ def discover_local_templates(
163
+ self, force_refresh: bool = False
164
+ ) -> Dict[str, LocalAgentTemplate]:
165
+ """Discover all local agent templates.
166
+
167
+ Args:
168
+ force_refresh: Force re-discovery even if cache is valid
169
+
170
+ Returns:
171
+ Dictionary mapping agent IDs to LocalAgentTemplate objects
172
+ """
173
+ if self._cache_valid and not force_refresh:
174
+ return self._template_cache
175
+
176
+ self._template_cache.clear()
177
+
178
+ # Discover from project directory (highest priority)
179
+ if self.project_agents_dir.exists():
180
+ self._discover_templates_in_dir(self.project_agents_dir, "project")
181
+
182
+ # Discover from user directory
183
+ if self.user_agents_dir.exists():
184
+ self._discover_templates_in_dir(self.user_agents_dir, "user")
185
+
186
+ self._cache_valid = True
187
+ logger.debug(f"Discovered {len(self._template_cache)} local agent templates")
188
+
189
+ return self._template_cache
190
+
191
+ def _discover_templates_in_dir(self, directory: Path, tier: str) -> None:
192
+ """Discover templates in a specific directory.
193
+
194
+ Args:
195
+ directory: Directory to search for templates
196
+ tier: Tier level ('project' or 'user')
197
+ """
198
+ # Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
199
+ for template_file in directory.glob("*.md"):
200
+ try:
201
+ # Read markdown content and extract YAML frontmatter
202
+ content = template_file.read_text()
203
+ frontmatter = self._extract_yaml_frontmatter(content)
204
+ if not frontmatter:
205
+ logger.warning(f"No YAML frontmatter in {template_file.name}")
206
+ continue
207
+ data = frontmatter
208
+
209
+ # Create LocalAgentTemplate
210
+ template = LocalAgentTemplate.from_json(data)
211
+
212
+ # Set tier and author based on location
213
+ template.tier = tier
214
+ if tier == "project" and not template.author:
215
+ template.author = self.get_project_name()
216
+ elif tier == "user" and not template.author:
217
+ template.author = Path.home().name
218
+
219
+ # Use higher priority for project agents
220
+ if tier == "project":
221
+ template.priority = 2000
222
+ else:
223
+ template.priority = 1500
224
+
225
+ # Store in cache (project templates override user templates)
226
+ agent_id = template.agent_id or template_file.stem
227
+ if agent_id not in self._template_cache or tier == "project":
228
+ self._template_cache[agent_id] = template
229
+ logger.debug(f"Discovered {tier} agent template: {agent_id}")
230
+
231
+ except Exception as e:
232
+ logger.error(f"Failed to load template from {template_file}: {e}")
233
+
234
+ def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
235
+ """
236
+ Extract and parse YAML frontmatter from markdown content.
237
+
238
+ Args:
239
+ content: File content to parse
240
+
241
+ Returns:
242
+ Parsed YAML frontmatter as dict, or None if not found/invalid
243
+ """
244
+ if not content.strip().startswith("---"):
245
+ return None
246
+
247
+ # Split on --- delimiters
248
+ parts = content.split("---", 2)
249
+ if len(parts) < 3:
250
+ return None
251
+
252
+ try:
253
+ return yaml.safe_load(parts[1])
254
+ except yaml.YAMLError as e:
255
+ logger.warning(f"Failed to parse YAML frontmatter: {e}")
256
+ return None
257
+
258
+ def create_local_template(
259
+ self,
260
+ agent_id: str,
261
+ name: str,
262
+ description: str,
263
+ instructions: str,
264
+ model: str = "sonnet",
265
+ tools: Union[str, List[str]] = "*",
266
+ parent_agent: Optional[str] = None,
267
+ tier: str = "project",
268
+ ) -> LocalAgentTemplate:
269
+ """Create a new local agent template.
270
+
271
+ Args:
272
+ agent_id: Unique identifier for the agent
273
+ name: Human-readable name
274
+ description: Agent description
275
+ instructions: Agent instructions
276
+ model: Model to use (default: sonnet)
277
+ tools: Tools available to agent (default: all)
278
+ parent_agent: Optional parent agent to inherit from
279
+ tier: Tier level ('project' or 'user')
280
+
281
+ Returns:
282
+ Created LocalAgentTemplate object
283
+ """
284
+ # Determine author based on tier
285
+ author = self.get_project_name() if tier == "project" else Path.home().name
286
+
287
+ # Create template
288
+ return LocalAgentTemplate(
289
+ agent_id=agent_id,
290
+ agent_version="1.0.0",
291
+ author=author,
292
+ agent_type=agent_id,
293
+ metadata={
294
+ "name": name,
295
+ "description": description,
296
+ "tier": tier,
297
+ "tags": ["local", "custom", tier],
298
+ "specializations": [],
299
+ },
300
+ capabilities={
301
+ "model": model,
302
+ "tools": (
303
+ tools
304
+ if isinstance(tools, str)
305
+ else ",".join(tools)
306
+ if tools
307
+ else "*"
308
+ ),
309
+ },
310
+ instructions=instructions,
311
+ configuration={"temperature": 0.7, "max_tokens": 4096},
312
+ tier=tier,
313
+ priority=2000 if tier == "project" else 1500,
314
+ parent_agent=parent_agent,
315
+ )
316
+
317
+ def save_local_template(
318
+ self, template: LocalAgentTemplate, tier: Optional[str] = None
319
+ ) -> Path:
320
+ """Save a local agent template to disk.
321
+
322
+ Args:
323
+ template: Template to save
324
+ tier: Override tier (uses template.tier if not specified)
325
+
326
+ Returns:
327
+ Path to saved template file
328
+ """
329
+ # Determine target directory
330
+ tier = tier or template.tier
331
+ if tier == "project":
332
+ target_dir = self.project_agents_dir
333
+ else:
334
+ target_dir = self.user_agents_dir
335
+
336
+ # Create directory if needed
337
+ target_dir.mkdir(parents=True, exist_ok=True)
338
+
339
+ # Update timestamp
340
+ template.updated_at = datetime.now(timezone.utc).isoformat()
341
+
342
+ # Save to JSON file
343
+ template_file = target_dir / f"{template.agent_id}.json"
344
+ with template_file.open("w") as f:
345
+ json.dump(template.to_json(), f, indent=2)
346
+
347
+ # Invalidate cache
348
+ self._cache_valid = False
349
+
350
+ logger.info(f"Saved local agent template: {template_file}")
351
+ return template_file
352
+
353
+ def delete_local_template(
354
+ self,
355
+ agent_id: str,
356
+ tier: str = "project",
357
+ delete_deployment: bool = True,
358
+ backup_first: bool = False,
359
+ ) -> Dict[str, Any]:
360
+ """Delete a local agent template with comprehensive options.
361
+
362
+ Args:
363
+ agent_id: The agent ID to delete
364
+ tier: The tier (project/user/all) to delete from
365
+ delete_deployment: Also delete from .claude/agents/
366
+ backup_first: Create backup before deletion
367
+
368
+ Returns:
369
+ Dict with status, deleted files, backup location (if applicable)
370
+ """
371
+ result = {
372
+ "success": False,
373
+ "deleted_files": [],
374
+ "errors": [],
375
+ "backup_location": None,
376
+ "agent_id": agent_id,
377
+ "tier": tier,
378
+ }
379
+
380
+ # Check if this is a system agent (protected)
381
+ system_agents = [
382
+ "orchestrator",
383
+ "engineer",
384
+ "architecture",
385
+ "documentation",
386
+ "qa",
387
+ "research",
388
+ "ops",
389
+ "security",
390
+ "data_engineer",
391
+ "version_control",
392
+ "pm",
393
+ "project-manager",
394
+ "claude-mpm",
395
+ ]
396
+ if agent_id in system_agents:
397
+ result["errors"].append(f"Cannot delete system agent: {agent_id}")
398
+ return result
399
+
400
+ # Determine which directories to check based on tier
401
+ dirs_to_check = []
402
+ if tier in ["project", "all"]:
403
+ dirs_to_check.append(("project", self.project_agents_dir))
404
+ if tier in ["user", "all"]:
405
+ dirs_to_check.append(("user", self.user_agents_dir))
406
+
407
+ # Track files to delete
408
+ files_to_delete = []
409
+
410
+ # Find template files (templates migrated to .md in v4.26.0+)
411
+ for tier_name, agent_dir in dirs_to_check:
412
+ template_file = agent_dir / f"{agent_id}.md"
413
+ if template_file.exists():
414
+ files_to_delete.append((tier_name, "template", template_file))
415
+
416
+ # Check for version history
417
+ versions_dir = agent_dir / "versions" / agent_id
418
+ if versions_dir.exists():
419
+ for version_file in versions_dir.glob("*.md"):
420
+ files_to_delete.append((tier_name, "version", version_file))
421
+ files_to_delete.append((tier_name, "versions_dir", versions_dir))
422
+
423
+ # Check for deployment
424
+ if delete_deployment:
425
+ deployment_file = (
426
+ self.working_directory / ".claude" / "agents" / f"{agent_id}.md"
427
+ )
428
+ if deployment_file.exists():
429
+ files_to_delete.append(("deployment", "agent", deployment_file))
430
+
431
+ # If no files found, return early
432
+ if not files_to_delete:
433
+ result["errors"].append(f"Agent '{agent_id}' not found in {tier} tier(s)")
434
+ return result
435
+
436
+ # Create backup if requested
437
+ if backup_first:
438
+ backup_result = self._create_deletion_backup(agent_id, files_to_delete)
439
+ if backup_result["success"]:
440
+ result["backup_location"] = backup_result["location"]
441
+ else:
442
+ result["errors"].append(f"Backup failed: {backup_result['error']}")
443
+ return result
444
+
445
+ # Perform deletion
446
+ for tier_name, file_type, file_path in files_to_delete:
447
+ try:
448
+ if file_type == "versions_dir":
449
+ # Remove empty directory
450
+ if file_path.is_dir() and not any(file_path.iterdir()):
451
+ file_path.rmdir()
452
+ result["deleted_files"].append(str(file_path))
453
+ logger.debug(f"Removed empty directory: {file_path}")
454
+ else:
455
+ file_path.unlink()
456
+ result["deleted_files"].append(str(file_path))
457
+ logger.info(f"Deleted {tier_name} {file_type}: {file_path.name}")
458
+ except Exception as e:
459
+ error_msg = f"Failed to delete {file_path}: {e}"
460
+ result["errors"].append(error_msg)
461
+ logger.error(error_msg)
462
+
463
+ # Invalidate cache if any deletions succeeded
464
+ if result["deleted_files"]:
465
+ self._cache_valid = False
466
+ result["success"] = True
467
+ logger.info(
468
+ f"Successfully deleted agent '{agent_id}' - removed {len(result['deleted_files'])} file(s)"
469
+ )
470
+
471
+ return result
472
+
473
+ def _create_deletion_backup(
474
+ self, agent_id: str, files_to_delete: List[Tuple[str, str, Path]]
475
+ ) -> Dict[str, Any]:
476
+ """Create a backup of files before deletion.
477
+
478
+ Args:
479
+ agent_id: Agent being deleted
480
+ files_to_delete: List of (tier, type, path) tuples
481
+
482
+ Returns:
483
+ Dict with success status and backup location or error
484
+ """
485
+ import shutil
486
+ from datetime import datetime
487
+
488
+ result = {"success": False, "location": None, "error": None}
489
+
490
+ try:
491
+ # Create backup directory
492
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
493
+ backup_dir = (
494
+ self.working_directory
495
+ / ".claude-mpm"
496
+ / "backups"
497
+ / f"{agent_id}_{timestamp}"
498
+ )
499
+ backup_dir.mkdir(parents=True, exist_ok=True)
500
+
501
+ # Copy files to backup
502
+ for tier_name, file_type, file_path in files_to_delete:
503
+ if file_path.exists() and file_type != "versions_dir":
504
+ # Create subdirectory structure in backup
505
+ backup_subdir = backup_dir / tier_name
506
+ backup_subdir.mkdir(exist_ok=True)
507
+
508
+ if file_path.is_file():
509
+ backup_file = backup_subdir / file_path.name
510
+ shutil.copy2(file_path, backup_file)
511
+ logger.debug(f"Backed up {file_path} to {backup_file}")
512
+
513
+ result["success"] = True
514
+ result["location"] = str(backup_dir)
515
+ logger.info(f"Created backup for agent '{agent_id}' at {backup_dir}")
516
+
517
+ except Exception as e:
518
+ result["error"] = str(e)
519
+ logger.error(f"Failed to create backup for '{agent_id}': {e}")
520
+
521
+ return result
522
+
523
+ def delete_multiple_templates(
524
+ self,
525
+ agent_ids: List[str],
526
+ tier: str = "project",
527
+ delete_deployment: bool = True,
528
+ backup_first: bool = False,
529
+ ) -> Dict[str, Any]:
530
+ """Delete multiple local agent templates.
531
+
532
+ Args:
533
+ agent_ids: List of agent IDs to delete
534
+ tier: The tier (project/user/all) to delete from
535
+ delete_deployment: Also delete from .claude/agents/
536
+ backup_first: Create backup before deletion
537
+
538
+ Returns:
539
+ Dict with results for each agent
540
+ """
541
+ results = {
542
+ "successful": [],
543
+ "failed": [],
544
+ "total": len(agent_ids),
545
+ "details": {},
546
+ }
547
+
548
+ for agent_id in agent_ids:
549
+ result = self.delete_local_template(
550
+ agent_id=agent_id,
551
+ tier=tier,
552
+ delete_deployment=delete_deployment,
553
+ backup_first=backup_first,
554
+ )
555
+
556
+ results["details"][agent_id] = result
557
+
558
+ if result["success"]:
559
+ results["successful"].append(agent_id)
560
+ else:
561
+ results["failed"].append(agent_id)
562
+
563
+ logger.info(
564
+ f"Bulk deletion complete: {len(results['successful'])} successful, "
565
+ f"{len(results['failed'])} failed"
566
+ )
567
+
568
+ return results
569
+
570
+ def get_local_template(self, agent_id: str) -> Optional[LocalAgentTemplate]:
571
+ """Get a specific local agent template.
572
+
573
+ Args:
574
+ agent_id: ID of agent to retrieve
575
+
576
+ Returns:
577
+ LocalAgentTemplate if found, None otherwise
578
+ """
579
+ templates = self.discover_local_templates()
580
+ return templates.get(agent_id)
581
+
582
+ def list_local_templates(
583
+ self, tier: Optional[str] = None
584
+ ) -> List[LocalAgentTemplate]:
585
+ """List all local agent templates.
586
+
587
+ Args:
588
+ tier: Filter by tier ('project' or 'user'), None for all
589
+
590
+ Returns:
591
+ List of LocalAgentTemplate objects
592
+ """
593
+ templates = self.discover_local_templates()
594
+
595
+ if tier:
596
+ return [t for t in templates.values() if t.tier == tier]
597
+ return list(templates.values())
598
+
599
+ def inherit_from_system_agent(
600
+ self, system_agent_id: str, new_agent_id: str, modifications: Dict[str, Any]
601
+ ) -> LocalAgentTemplate:
602
+ """Create a local agent by inheriting from a system agent.
603
+
604
+ Args:
605
+ system_agent_id: ID of system agent to inherit from
606
+ new_agent_id: ID for the new local agent
607
+ modifications: Dictionary of modifications to apply
608
+
609
+ Returns:
610
+ Created LocalAgentTemplate object
611
+ """
612
+ # TODO: Load system agent template and merge with modifications
613
+ # For now, create a basic template with parent reference
614
+
615
+ template = self.create_local_template(
616
+ agent_id=new_agent_id,
617
+ name=modifications.get("name", f"Custom {system_agent_id}"),
618
+ description=modifications.get(
619
+ "description", f"Customized version of {system_agent_id}"
620
+ ),
621
+ instructions=modifications.get(
622
+ "instructions", f"Based on {system_agent_id} agent"
623
+ ),
624
+ model=modifications.get("model", "sonnet"),
625
+ tools=modifications.get("tools", "*"),
626
+ parent_agent=system_agent_id,
627
+ tier="project",
628
+ )
629
+
630
+ # Apply any additional modifications
631
+ if "metadata" in modifications:
632
+ template.metadata.update(modifications["metadata"])
633
+ if "capabilities" in modifications:
634
+ template.capabilities.update(modifications["capabilities"])
635
+ if "configuration" in modifications:
636
+ template.configuration.update(modifications["configuration"])
637
+
638
+ return template
639
+
640
+ def version_local_template(self, agent_id: str, new_version: str) -> Optional[Path]:
641
+ """Create a versioned copy of a local agent template.
642
+
643
+ Args:
644
+ agent_id: ID of agent to version
645
+ new_version: New version string
646
+
647
+ Returns:
648
+ Path to versioned template file if successful
649
+ """
650
+ template = self.get_local_template(agent_id)
651
+ if not template:
652
+ logger.error(f"Local agent template not found: {agent_id}")
653
+ return None
654
+
655
+ # Create versions directory
656
+ if template.tier == "project":
657
+ versions_dir = self.project_agents_dir / "versions" / agent_id
658
+ else:
659
+ versions_dir = self.user_agents_dir / "versions" / agent_id
660
+
661
+ versions_dir.mkdir(parents=True, exist_ok=True)
662
+
663
+ # Save current version
664
+ old_version_file = versions_dir / f"{template.agent_version}.json"
665
+ with old_version_file.open("w") as f:
666
+ json.dump(template.to_json(), f, indent=2)
667
+
668
+ # Update template version
669
+ template.agent_version = new_version
670
+ template.updated_at = datetime.now(timezone.utc).isoformat()
671
+
672
+ # Save updated template
673
+ self.save_local_template(template)
674
+
675
+ logger.info(
676
+ f"Versioned local agent {agent_id}: {template.agent_version} -> {new_version}"
677
+ )
678
+ return old_version_file
679
+
680
+ def validate_local_template(
681
+ self, template: LocalAgentTemplate
682
+ ) -> Tuple[bool, List[str]]:
683
+ """Validate a local agent template.
684
+
685
+ Args:
686
+ template: Template to validate
687
+
688
+ Returns:
689
+ Tuple of (is_valid, list_of_errors)
690
+ """
691
+ errors = []
692
+
693
+ # Check required fields
694
+ if not template.agent_id:
695
+ errors.append("agent_id is required")
696
+ if not template.instructions:
697
+ errors.append("instructions are required")
698
+ if not template.metadata.get("name"):
699
+ errors.append("metadata.name is required")
700
+
701
+ # Validate capabilities
702
+ if template.capabilities:
703
+ model = template.capabilities.get("model")
704
+ if model and model not in ["opus", "sonnet", "haiku"]:
705
+ errors.append(f"Invalid model: {model}")
706
+
707
+ # Check for naming conflicts
708
+ if template.agent_id in ["pm", "project-manager", "claude-mpm"]:
709
+ errors.append(f"Reserved agent ID: {template.agent_id}")
710
+
711
+ return len(errors) == 0, errors
712
+
713
+ def export_local_templates(self, output_dir: Path) -> int:
714
+ """Export all local templates to a directory.
715
+
716
+ Args:
717
+ output_dir: Directory to export templates to
718
+
719
+ Returns:
720
+ Number of templates exported
721
+ """
722
+ templates = self.discover_local_templates()
723
+ output_dir.mkdir(parents=True, exist_ok=True)
724
+
725
+ count = 0
726
+ for agent_id, template in templates.items():
727
+ output_file = output_dir / f"{agent_id}.json"
728
+ with output_file.open("w") as f:
729
+ json.dump(template.to_json(), f, indent=2)
730
+ count += 1
731
+
732
+ logger.info(f"Exported {count} local agent templates to {output_dir}")
733
+ return count
734
+
735
+ def import_local_templates(self, input_dir: Path, tier: str = "project") -> int:
736
+ """Import agent templates from a directory.
737
+
738
+ Args:
739
+ input_dir: Directory containing template JSON files
740
+ tier: Tier to import into ('project' or 'user')
741
+
742
+ Returns:
743
+ Number of templates imported
744
+ """
745
+ if not input_dir.exists():
746
+ logger.error(f"Input directory does not exist: {input_dir}")
747
+ return 0
748
+
749
+ count = 0
750
+ # Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
751
+ for template_file in input_dir.glob("*.md"):
752
+ try:
753
+ # Read markdown content and extract YAML frontmatter
754
+ content = template_file.read_text()
755
+ frontmatter = self._extract_yaml_frontmatter(content)
756
+ if not frontmatter:
757
+ logger.warning(f"No YAML frontmatter in {template_file.name}")
758
+ continue
759
+ data = frontmatter
760
+
761
+ template = LocalAgentTemplate.from_json(data)
762
+ template.tier = tier
763
+
764
+ # Update author based on tier
765
+ if tier == "project":
766
+ template.author = self.get_project_name()
767
+ else:
768
+ template.author = Path.home().name
769
+
770
+ # Validate before saving
771
+ is_valid, errors = self.validate_local_template(template)
772
+ if is_valid:
773
+ self.save_local_template(template)
774
+ count += 1
775
+ else:
776
+ logger.warning(
777
+ f"Skipping invalid template {template_file}: {errors}"
778
+ )
779
+
780
+ except Exception as e:
781
+ logger.error(f"Failed to import template from {template_file}: {e}")
782
+
783
+ logger.info(f"Imported {count} local agent templates from {input_dir}")
784
+ return count