claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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 (1062) hide show
  1. claude_mpm/BUILD_NUMBER +1 -0
  2. claude_mpm/VERSION +1 -0
  3. claude_mpm/__init__.py +50 -12
  4. claude_mpm/__main__.py +7 -2
  5. claude_mpm/agents/BASE_AGENT.md +164 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  8. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
  9. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  10. claude_mpm/agents/MEMORY.md +72 -0
  11. claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
  12. claude_mpm/agents/WORKFLOW.md +111 -0
  13. claude_mpm/agents/__init__.py +92 -80
  14. claude_mpm/agents/agent-template.yaml +83 -0
  15. claude_mpm/agents/agent_loader.py +560 -745
  16. claude_mpm/agents/agent_loader_integration.py +53 -55
  17. claude_mpm/agents/agents_metadata.py +186 -27
  18. claude_mpm/agents/async_agent_loader.py +436 -0
  19. claude_mpm/agents/base_agent.json +8 -4
  20. claude_mpm/agents/frontmatter_validator.py +754 -0
  21. claude_mpm/agents/system_agent_config.py +222 -155
  22. claude_mpm/agents/templates/README.md +465 -0
  23. claude_mpm/agents/templates/__init__.py +17 -13
  24. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  25. claude_mpm/agents/templates/context-management-examples.md +544 -0
  26. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  27. claude_mpm/agents/templates/pm-examples.md +474 -0
  28. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  29. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  30. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  31. claude_mpm/agents/templates/response-format.md +583 -0
  32. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  33. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  34. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  35. claude_mpm/agents/templates/validation-templates.md +312 -0
  36. claude_mpm/cli/__init__.py +94 -128
  37. claude_mpm/cli/__main__.py +33 -0
  38. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  39. claude_mpm/cli/commands/__init__.py +36 -12
  40. claude_mpm/cli/commands/agent_manager.py +1403 -0
  41. claude_mpm/cli/commands/agent_source.py +774 -0
  42. claude_mpm/cli/commands/agent_state_manager.py +335 -0
  43. claude_mpm/cli/commands/agents.py +2501 -168
  44. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  47. claude_mpm/cli/commands/aggregate.py +540 -0
  48. claude_mpm/cli/commands/analyze.py +553 -0
  49. claude_mpm/cli/commands/analyze_code.py +528 -0
  50. claude_mpm/cli/commands/auto_configure.py +1053 -0
  51. claude_mpm/cli/commands/cleanup.py +588 -0
  52. claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
  53. claude_mpm/cli/commands/config.py +586 -0
  54. claude_mpm/cli/commands/configure.py +3253 -0
  55. claude_mpm/cli/commands/configure_agent_display.py +282 -0
  56. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  57. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  58. claude_mpm/cli/commands/configure_models.py +18 -0
  59. claude_mpm/cli/commands/configure_navigation.py +184 -0
  60. claude_mpm/cli/commands/configure_paths.py +104 -0
  61. claude_mpm/cli/commands/configure_persistence.py +254 -0
  62. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  63. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  64. claude_mpm/cli/commands/configure_validators.py +73 -0
  65. claude_mpm/cli/commands/dashboard.py +286 -0
  66. claude_mpm/cli/commands/debug.py +1386 -0
  67. claude_mpm/cli/commands/doctor.py +243 -0
  68. claude_mpm/cli/commands/hook_errors.py +277 -0
  69. claude_mpm/cli/commands/info.py +195 -74
  70. claude_mpm/cli/commands/local_deploy.py +534 -0
  71. claude_mpm/cli/commands/mcp.py +205 -0
  72. claude_mpm/cli/commands/mcp_command_router.py +161 -0
  73. claude_mpm/cli/commands/mcp_config.py +154 -0
  74. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  75. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  76. claude_mpm/cli/commands/mcp_install_commands.py +346 -0
  77. claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
  78. claude_mpm/cli/commands/mcp_server_commands.py +155 -0
  79. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  80. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  81. claude_mpm/cli/commands/memory.py +585 -846
  82. claude_mpm/cli/commands/monitor.py +228 -310
  83. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  84. claude_mpm/cli/commands/mpm_init/core.py +759 -0
  85. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  86. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  87. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  88. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  89. claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
  90. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  91. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  92. claude_mpm/cli/commands/postmortem.py +401 -0
  93. claude_mpm/cli/commands/profile.py +276 -0
  94. claude_mpm/cli/commands/run.py +910 -488
  95. claude_mpm/cli/commands/search.py +458 -0
  96. claude_mpm/cli/commands/skill_source.py +694 -0
  97. claude_mpm/cli/commands/skills.py +1398 -0
  98. claude_mpm/cli/commands/summarize.py +413 -0
  99. claude_mpm/cli/commands/tickets.py +536 -53
  100. claude_mpm/cli/commands/uninstall.py +176 -0
  101. claude_mpm/cli/commands/upgrade.py +152 -0
  102. claude_mpm/cli/commands/verify.py +119 -0
  103. claude_mpm/cli/executor.py +298 -0
  104. claude_mpm/cli/helpers.py +105 -0
  105. claude_mpm/cli/interactive/__init__.py +31 -0
  106. claude_mpm/cli/interactive/agent_wizard.py +1927 -0
  107. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  108. claude_mpm/cli/interactive/skill_selector.py +481 -0
  109. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  110. claude_mpm/cli/parser.py +87 -563
  111. claude_mpm/cli/parsers/__init__.py +35 -0
  112. claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
  113. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  114. claude_mpm/cli/parsers/agents_parser.py +575 -0
  115. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  116. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  117. claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
  118. claude_mpm/cli/parsers/base_parser.py +649 -0
  119. claude_mpm/cli/parsers/config_parser.py +208 -0
  120. claude_mpm/cli/parsers/configure_parser.py +138 -0
  121. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  122. claude_mpm/cli/parsers/debug_parser.py +319 -0
  123. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  124. claude_mpm/cli/parsers/mcp_parser.py +195 -0
  125. claude_mpm/cli/parsers/memory_parser.py +138 -0
  126. claude_mpm/cli/parsers/monitor_parser.py +142 -0
  127. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  128. claude_mpm/cli/parsers/profile_parser.py +147 -0
  129. claude_mpm/cli/parsers/run_parser.py +157 -0
  130. claude_mpm/cli/parsers/search_parser.py +245 -0
  131. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  132. claude_mpm/cli/parsers/skills_parser.py +277 -0
  133. claude_mpm/cli/parsers/source_parser.py +138 -0
  134. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  135. claude_mpm/cli/shared/__init__.py +40 -0
  136. claude_mpm/cli/shared/argument_patterns.py +205 -0
  137. claude_mpm/cli/shared/base_command.py +242 -0
  138. claude_mpm/cli/shared/error_handling.py +242 -0
  139. claude_mpm/cli/shared/output_formatters.py +241 -0
  140. claude_mpm/cli/startup.py +1578 -0
  141. claude_mpm/cli/startup_display.py +480 -0
  142. claude_mpm/cli/startup_logging.py +839 -0
  143. claude_mpm/cli/utils.py +136 -47
  144. claude_mpm/cli_module/__init__.py +6 -6
  145. claude_mpm/cli_module/args.py +188 -140
  146. claude_mpm/cli_module/commands.py +79 -70
  147. claude_mpm/cli_module/migration_example.py +42 -64
  148. claude_mpm/commands/__init__.py +14 -0
  149. claude_mpm/commands/mpm-config.md +28 -0
  150. claude_mpm/commands/mpm-doctor.md +20 -0
  151. claude_mpm/commands/mpm-help.md +20 -0
  152. claude_mpm/commands/mpm-init.md +120 -0
  153. claude_mpm/commands/mpm-monitor.md +31 -0
  154. claude_mpm/commands/mpm-organize.md +120 -0
  155. claude_mpm/commands/mpm-postmortem.md +21 -0
  156. claude_mpm/commands/mpm-session-resume.md +30 -0
  157. claude_mpm/commands/mpm-status.md +20 -0
  158. claude_mpm/commands/mpm-ticket-view.md +109 -0
  159. claude_mpm/commands/mpm-version.md +20 -0
  160. claude_mpm/commands/mpm.md +31 -0
  161. claude_mpm/config/__init__.py +42 -2
  162. claude_mpm/config/agent_config.py +402 -0
  163. claude_mpm/config/agent_presets.py +488 -0
  164. claude_mpm/config/agent_sources.py +352 -0
  165. claude_mpm/config/experimental_features.py +217 -0
  166. claude_mpm/config/model_config.py +428 -0
  167. claude_mpm/config/paths.py +258 -0
  168. claude_mpm/config/skill_presets.py +392 -0
  169. claude_mpm/config/skill_sources.py +590 -0
  170. claude_mpm/config/socketio_config.py +125 -83
  171. claude_mpm/constants.py +133 -22
  172. claude_mpm/core/__init__.py +62 -36
  173. claude_mpm/core/agent_name_normalizer.py +71 -73
  174. claude_mpm/core/agent_registry.py +385 -492
  175. claude_mpm/core/agent_session_manager.py +81 -70
  176. claude_mpm/core/api_validator.py +330 -0
  177. claude_mpm/core/base_service.py +159 -122
  178. claude_mpm/core/cache.py +560 -0
  179. claude_mpm/core/claude_runner.py +696 -916
  180. claude_mpm/core/config.py +613 -122
  181. claude_mpm/core/config_aliases.py +74 -73
  182. claude_mpm/core/config_constants.py +314 -0
  183. claude_mpm/core/constants.py +361 -0
  184. claude_mpm/core/container.py +646 -104
  185. claude_mpm/core/enums.py +452 -0
  186. claude_mpm/core/error_handler.py +623 -0
  187. claude_mpm/core/exceptions.py +536 -0
  188. claude_mpm/core/factories.py +105 -109
  189. claude_mpm/core/file_utils.py +764 -0
  190. claude_mpm/core/framework/__init__.py +25 -0
  191. claude_mpm/core/framework/formatters/__init__.py +11 -0
  192. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  193. claude_mpm/core/framework/formatters/content_formatter.py +278 -0
  194. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  195. claude_mpm/core/framework/loaders/__init__.py +13 -0
  196. claude_mpm/core/framework/loaders/agent_loader.py +213 -0
  197. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  198. claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
  199. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  200. claude_mpm/core/framework/processors/__init__.py +11 -0
  201. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  202. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  203. claude_mpm/core/framework/processors/template_processor.py +244 -0
  204. claude_mpm/core/framework_loader.py +485 -414
  205. claude_mpm/core/hook_error_memory.py +381 -0
  206. claude_mpm/core/hook_manager.py +246 -86
  207. claude_mpm/core/hook_performance_config.py +147 -0
  208. claude_mpm/core/injectable_service.py +72 -63
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +670 -0
  211. claude_mpm/core/interfaces.py +570 -164
  212. claude_mpm/core/lazy.py +467 -0
  213. claude_mpm/core/log_manager.py +707 -0
  214. claude_mpm/core/logger.py +295 -134
  215. claude_mpm/core/logging_config.py +474 -0
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/minimal_framework_loader.py +24 -22
  218. claude_mpm/core/mixins.py +30 -29
  219. claude_mpm/core/oneshot_session.py +594 -0
  220. claude_mpm/core/optimized_agent_loader.py +479 -0
  221. claude_mpm/core/optimized_startup.py +554 -0
  222. claude_mpm/core/output_style_manager.py +491 -0
  223. claude_mpm/core/pm_hook_interceptor.py +197 -82
  224. claude_mpm/core/protocols/__init__.py +23 -0
  225. claude_mpm/core/protocols/runner_protocol.py +103 -0
  226. claude_mpm/core/protocols/session_protocol.py +131 -0
  227. claude_mpm/core/service_registry.py +153 -116
  228. claude_mpm/core/session_manager.py +179 -64
  229. claude_mpm/core/shared/__init__.py +17 -0
  230. claude_mpm/core/shared/config_loader.py +326 -0
  231. claude_mpm/core/shared/path_resolver.py +281 -0
  232. claude_mpm/core/shared/singleton_manager.py +221 -0
  233. claude_mpm/core/socketio_pool.py +400 -137
  234. claude_mpm/core/system_context.py +38 -0
  235. claude_mpm/core/tool_access_control.py +64 -57
  236. claude_mpm/core/types.py +307 -0
  237. claude_mpm/core/typing_utils.py +553 -0
  238. claude_mpm/core/unified_agent_registry.py +969 -0
  239. claude_mpm/core/unified_config.py +612 -0
  240. claude_mpm/core/unified_paths.py +958 -0
  241. claude_mpm/dashboard/__init__.py +12 -0
  242. claude_mpm/dashboard/api/simple_directory.py +261 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  249. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  250. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  251. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  252. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  253. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  254. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  255. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  256. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  257. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  258. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  259. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  260. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  261. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  262. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  263. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  264. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  265. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  266. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  267. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  268. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  269. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  270. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  271. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  272. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  273. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  274. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  275. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  276. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  277. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  278. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  279. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  280. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  281. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  282. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  283. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  284. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  285. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  286. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  287. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  288. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  289. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  290. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  291. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  292. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  293. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  303. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  305. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
  306. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  307. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  308. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  309. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  310. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  311. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  312. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  313. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  314. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  315. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  316. claude_mpm/experimental/__init__.py +10 -0
  317. claude_mpm/experimental/cli_enhancements.py +104 -89
  318. claude_mpm/generators/__init__.py +1 -1
  319. claude_mpm/generators/agent_profile_generator.py +76 -66
  320. claude_mpm/hooks/__init__.py +37 -1
  321. claude_mpm/hooks/base_hook.py +37 -32
  322. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  323. claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
  324. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  325. claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
  326. claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
  327. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
  328. claude_mpm/hooks/claude_hooks/installer.py +806 -0
  329. claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
  330. claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
  331. claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
  332. claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
  333. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
  334. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  335. claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
  336. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  337. claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
  338. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  339. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  340. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  341. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  342. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  343. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  344. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  345. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  346. claude_mpm/hooks/memory_integration_hook.py +201 -107
  347. claude_mpm/hooks/session_resume_hook.py +121 -0
  348. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  349. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  350. claude_mpm/hooks/tool_call_interceptor.py +92 -76
  351. claude_mpm/hooks/validation_hooks.py +62 -54
  352. claude_mpm/init.py +518 -83
  353. claude_mpm/models/__init__.py +9 -9
  354. claude_mpm/models/agent_definition.py +40 -23
  355. claude_mpm/models/agent_session.py +538 -0
  356. claude_mpm/models/git_repository.py +198 -0
  357. claude_mpm/models/resume_log.py +340 -0
  358. claude_mpm/schemas/__init__.py +12 -0
  359. claude_mpm/scripts/__init__.py +15 -0
  360. claude_mpm/scripts/claude-hook-handler.sh +227 -0
  361. claude_mpm/scripts/launch_monitor.py +165 -0
  362. claude_mpm/scripts/mpm_doctor.py +322 -0
  363. claude_mpm/scripts/socketio_daemon.py +189 -200
  364. claude_mpm/scripts/start_activity_logging.py +91 -0
  365. claude_mpm/services/__init__.py +208 -39
  366. claude_mpm/services/agent_capabilities_service.py +266 -0
  367. claude_mpm/services/agents/__init__.py +89 -0
  368. claude_mpm/services/agents/agent_builder.py +514 -0
  369. claude_mpm/services/agents/agent_preset_service.py +238 -0
  370. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  371. claude_mpm/services/agents/agent_review_service.py +280 -0
  372. claude_mpm/services/agents/agent_selection_service.py +484 -0
  373. claude_mpm/services/agents/auto_config_manager.py +796 -0
  374. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  375. claude_mpm/services/agents/cache_git_manager.py +621 -0
  376. claude_mpm/services/agents/deployment/__init__.py +21 -0
  377. claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
  378. claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
  379. claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
  380. claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
  381. claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
  382. claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
  383. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
  384. claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
  385. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
  386. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
  387. claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
  388. claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
  389. claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
  390. claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
  391. claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
  392. claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
  393. claude_mpm/services/agents/deployment/agent_validator.py +376 -0
  394. claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
  395. claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
  396. claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
  397. claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
  398. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  399. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  400. claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
  401. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  402. claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
  403. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  404. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  405. claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
  406. claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
  407. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  408. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  409. claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
  410. claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
  411. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  412. claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
  413. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  414. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  415. claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
  416. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
  417. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  418. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  419. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
  420. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  421. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  422. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
  423. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
  424. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
  425. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
  426. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
  427. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  428. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
  429. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  430. claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
  431. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
  432. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
  433. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  434. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  435. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  436. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  437. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  438. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  439. claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
  440. claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
  441. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  442. claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
  443. claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
  444. claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
  445. claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
  446. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  447. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  448. claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
  449. claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
  450. claude_mpm/services/agents/git_source_manager.py +682 -0
  451. claude_mpm/services/agents/loading/__init__.py +11 -0
  452. claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
  453. claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
  454. claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
  455. claude_mpm/services/agents/local_template_manager.py +784 -0
  456. claude_mpm/services/agents/management/__init__.py +9 -0
  457. claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
  458. claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
  459. claude_mpm/services/agents/memory/__init__.py +22 -0
  460. claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
  461. claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
  462. claude_mpm/services/agents/memory/content_manager.py +470 -0
  463. claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
  464. claude_mpm/services/agents/memory/memory_file_service.py +129 -0
  465. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  466. claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
  467. claude_mpm/services/agents/memory/template_generator.py +83 -0
  468. claude_mpm/services/agents/observers.py +547 -0
  469. claude_mpm/services/agents/recommender.py +617 -0
  470. claude_mpm/services/agents/registry/__init__.py +30 -0
  471. claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
  472. claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
  473. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  474. claude_mpm/services/agents/sources/__init__.py +13 -0
  475. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  476. claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
  477. claude_mpm/services/agents/startup_sync.py +262 -0
  478. claude_mpm/services/agents/toolchain_detector.py +478 -0
  479. claude_mpm/services/analysis/__init__.py +35 -0
  480. claude_mpm/services/analysis/clone_detector.py +1030 -0
  481. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  482. claude_mpm/services/analysis/postmortem_service.py +765 -0
  483. claude_mpm/services/async_session_logger.py +665 -0
  484. claude_mpm/services/claude_session_logger.py +321 -0
  485. claude_mpm/services/cli/__init__.py +18 -0
  486. claude_mpm/services/cli/agent_cleanup_service.py +408 -0
  487. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  488. claude_mpm/services/cli/agent_listing_service.py +463 -0
  489. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  490. claude_mpm/services/cli/agent_validation_service.py +590 -0
  491. claude_mpm/services/cli/memory_crud_service.py +622 -0
  492. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  493. claude_mpm/services/cli/resume_service.py +617 -0
  494. claude_mpm/services/cli/session_manager.py +604 -0
  495. claude_mpm/services/cli/session_pause_manager.py +504 -0
  496. claude_mpm/services/cli/session_resume_helper.py +372 -0
  497. claude_mpm/services/cli/startup_checker.py +362 -0
  498. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  499. claude_mpm/services/command_deployment_service.py +446 -0
  500. claude_mpm/services/command_handler_service.py +221 -0
  501. claude_mpm/services/communication/__init__.py +22 -0
  502. claude_mpm/services/core/__init__.py +108 -0
  503. claude_mpm/services/core/base.py +269 -0
  504. claude_mpm/services/core/cache_manager.py +309 -0
  505. claude_mpm/services/core/interfaces/__init__.py +273 -0
  506. claude_mpm/services/core/interfaces/agent.py +514 -0
  507. claude_mpm/services/core/interfaces/communication.py +316 -0
  508. claude_mpm/services/core/interfaces/health.py +169 -0
  509. claude_mpm/services/core/interfaces/infrastructure.py +357 -0
  510. claude_mpm/services/core/interfaces/model.py +281 -0
  511. claude_mpm/services/core/interfaces/process.py +372 -0
  512. claude_mpm/services/core/interfaces/project.py +121 -0
  513. claude_mpm/services/core/interfaces/restart.py +307 -0
  514. claude_mpm/services/core/interfaces/service.py +405 -0
  515. claude_mpm/services/core/interfaces/stability.py +260 -0
  516. claude_mpm/services/core/interfaces.py +81 -0
  517. claude_mpm/services/core/memory_manager.py +682 -0
  518. claude_mpm/services/core/models/__init__.py +70 -0
  519. claude_mpm/services/core/models/agent_config.py +384 -0
  520. claude_mpm/services/core/models/health.py +162 -0
  521. claude_mpm/services/core/models/process.py +239 -0
  522. claude_mpm/services/core/models/restart.py +302 -0
  523. claude_mpm/services/core/models/stability.py +264 -0
  524. claude_mpm/services/core/models/toolchain.py +306 -0
  525. claude_mpm/services/core/path_resolver.py +517 -0
  526. claude_mpm/services/core/service_container.py +520 -0
  527. claude_mpm/services/core/service_interfaces.py +436 -0
  528. claude_mpm/services/diagnostics/__init__.py +18 -0
  529. claude_mpm/services/diagnostics/checks/__init__.py +38 -0
  530. claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
  531. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  532. claude_mpm/services/diagnostics/checks/base_check.py +60 -0
  533. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  534. claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
  535. claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
  536. claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
  537. claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
  538. claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
  539. claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
  540. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  541. claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
  542. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  543. claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
  544. claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
  545. claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
  546. claude_mpm/services/diagnostics/models.py +138 -0
  547. claude_mpm/services/event_aggregator.py +582 -0
  548. claude_mpm/services/event_bus/__init__.py +18 -0
  549. claude_mpm/services/event_bus/config.py +186 -0
  550. claude_mpm/services/event_bus/direct_relay.py +312 -0
  551. claude_mpm/services/event_bus/event_bus.py +396 -0
  552. claude_mpm/services/event_bus/relay.py +326 -0
  553. claude_mpm/services/events/__init__.py +44 -0
  554. claude_mpm/services/events/consumers/__init__.py +18 -0
  555. claude_mpm/services/events/consumers/dead_letter.py +306 -0
  556. claude_mpm/services/events/consumers/logging.py +184 -0
  557. claude_mpm/services/events/consumers/metrics.py +241 -0
  558. claude_mpm/services/events/consumers/socketio.py +377 -0
  559. claude_mpm/services/events/core.py +480 -0
  560. claude_mpm/services/events/interfaces.py +214 -0
  561. claude_mpm/services/events/producers/__init__.py +14 -0
  562. claude_mpm/services/events/producers/hook.py +269 -0
  563. claude_mpm/services/events/producers/system.py +329 -0
  564. claude_mpm/services/exceptions.py +433 -353
  565. claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
  566. claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
  567. claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
  568. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
  569. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
  570. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
  571. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
  572. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
  573. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  574. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  575. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  576. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  577. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
  578. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  579. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  580. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
  581. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
  582. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  583. claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
  584. claude_mpm/services/git/__init__.py +21 -0
  585. claude_mpm/services/git/git_operations_service.py +579 -0
  586. claude_mpm/services/github/__init__.py +21 -0
  587. claude_mpm/services/github/github_cli_service.py +397 -0
  588. claude_mpm/services/hook_installer_service.py +506 -0
  589. claude_mpm/services/hook_service.py +159 -111
  590. claude_mpm/services/infrastructure/__init__.py +52 -0
  591. claude_mpm/services/infrastructure/context_preservation.py +569 -0
  592. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  593. claude_mpm/services/infrastructure/logging.py +209 -0
  594. claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
  595. claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
  596. claude_mpm/services/infrastructure/monitoring/base.py +122 -0
  597. claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
  598. claude_mpm/services/infrastructure/monitoring/network.py +219 -0
  599. claude_mpm/services/infrastructure/monitoring/process.py +343 -0
  600. claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
  601. claude_mpm/services/infrastructure/monitoring/service.py +368 -0
  602. claude_mpm/services/infrastructure/monitoring.py +71 -0
  603. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  604. claude_mpm/services/instructions/__init__.py +9 -0
  605. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  606. claude_mpm/services/local_ops/__init__.py +155 -0
  607. claude_mpm/services/local_ops/crash_detector.py +257 -0
  608. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  609. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  610. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  611. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  612. claude_mpm/services/local_ops/health_manager.py +427 -0
  613. claude_mpm/services/local_ops/log_monitor.py +396 -0
  614. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  615. claude_mpm/services/local_ops/process_manager.py +595 -0
  616. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  617. claude_mpm/services/local_ops/restart_manager.py +401 -0
  618. claude_mpm/services/local_ops/restart_policy.py +387 -0
  619. claude_mpm/services/local_ops/state_manager.py +372 -0
  620. claude_mpm/services/local_ops/unified_manager.py +600 -0
  621. claude_mpm/services/mcp_config_manager.py +1542 -0
  622. claude_mpm/services/mcp_service_verifier.py +732 -0
  623. claude_mpm/services/memory/__init__.py +19 -0
  624. claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
  625. claude_mpm/services/memory/cache/__init__.py +14 -0
  626. claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
  627. claude_mpm/services/memory/cache/simple_cache.py +331 -0
  628. claude_mpm/services/memory/failure_tracker.py +578 -0
  629. claude_mpm/services/memory/indexed_memory.py +648 -0
  630. claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
  631. claude_mpm/services/memory/router.py +951 -0
  632. claude_mpm/services/memory_hook_service.py +470 -0
  633. claude_mpm/services/model/__init__.py +147 -0
  634. claude_mpm/services/model/base_provider.py +365 -0
  635. claude_mpm/services/model/claude_provider.py +412 -0
  636. claude_mpm/services/model/model_router.py +452 -0
  637. claude_mpm/services/model/ollama_provider.py +415 -0
  638. claude_mpm/services/monitor/__init__.py +20 -0
  639. claude_mpm/services/monitor/daemon.py +698 -0
  640. claude_mpm/services/monitor/daemon_manager.py +1076 -0
  641. claude_mpm/services/monitor/event_emitter.py +350 -0
  642. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  643. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  644. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  645. claude_mpm/services/monitor/handlers/file.py +264 -0
  646. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  647. claude_mpm/services/monitor/management/__init__.py +18 -0
  648. claude_mpm/services/monitor/management/health.py +124 -0
  649. claude_mpm/services/monitor/management/lifecycle.py +730 -0
  650. claude_mpm/services/monitor/server.py +1493 -0
  651. claude_mpm/services/monitor_build_service.py +349 -0
  652. claude_mpm/services/native_agent_converter.py +356 -0
  653. claude_mpm/services/orphan_detection.py +786 -0
  654. claude_mpm/services/pm_skills_deployer.py +711 -0
  655. claude_mpm/services/port_manager.py +597 -0
  656. claude_mpm/services/pr/__init__.py +14 -0
  657. claude_mpm/services/pr/pr_template_service.py +329 -0
  658. claude_mpm/services/profile_manager.py +337 -0
  659. claude_mpm/services/project/__init__.py +44 -0
  660. claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
  661. claude_mpm/services/project/analyzer_v2.py +566 -0
  662. claude_mpm/services/project/architecture_analyzer.py +461 -0
  663. claude_mpm/services/project/archive_manager.py +1045 -0
  664. claude_mpm/services/project/dependency_analyzer.py +462 -0
  665. claude_mpm/services/project/detection_strategies.py +719 -0
  666. claude_mpm/services/project/documentation_manager.py +554 -0
  667. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  668. claude_mpm/services/project/language_analyzer.py +265 -0
  669. claude_mpm/services/project/metrics_collector.py +407 -0
  670. claude_mpm/services/project/project_organizer.py +1009 -0
  671. claude_mpm/services/project/registry.py +636 -0
  672. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  673. claude_mpm/services/project_port_allocator.py +596 -0
  674. claude_mpm/services/recovery_manager.py +293 -240
  675. claude_mpm/services/response_tracker.py +267 -0
  676. claude_mpm/services/runner_configuration_service.py +605 -0
  677. claude_mpm/services/self_upgrade_service.py +608 -0
  678. claude_mpm/services/session_management_service.py +314 -0
  679. claude_mpm/services/session_manager.py +380 -0
  680. claude_mpm/services/shared/__init__.py +21 -0
  681. claude_mpm/services/shared/async_service_base.py +216 -0
  682. claude_mpm/services/shared/config_service_base.py +301 -0
  683. claude_mpm/services/shared/lifecycle_service_base.py +308 -0
  684. claude_mpm/services/shared/manager_base.py +315 -0
  685. claude_mpm/services/shared/service_factory.py +309 -0
  686. claude_mpm/services/skills/__init__.py +21 -0
  687. claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
  688. claude_mpm/services/skills/selective_skill_deployer.py +743 -0
  689. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  690. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  691. claude_mpm/services/skills_config.py +547 -0
  692. claude_mpm/services/skills_deployer.py +1168 -0
  693. claude_mpm/services/socketio/__init__.py +25 -0
  694. claude_mpm/services/socketio/client_proxy.py +229 -0
  695. claude_mpm/services/socketio/dashboard_server.py +362 -0
  696. claude_mpm/services/socketio/event_normalizer.py +798 -0
  697. claude_mpm/services/socketio/handlers/__init__.py +30 -0
  698. claude_mpm/services/socketio/handlers/base.py +136 -0
  699. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  700. claude_mpm/services/socketio/handlers/connection.py +643 -0
  701. claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
  702. claude_mpm/services/socketio/handlers/file.py +263 -0
  703. claude_mpm/services/socketio/handlers/git.py +962 -0
  704. claude_mpm/services/socketio/handlers/hook.py +211 -0
  705. claude_mpm/services/socketio/handlers/memory.py +26 -0
  706. claude_mpm/services/socketio/handlers/project.py +24 -0
  707. claude_mpm/services/socketio/handlers/registry.py +214 -0
  708. claude_mpm/services/socketio/migration_utils.py +343 -0
  709. claude_mpm/services/socketio/monitor_client.py +364 -0
  710. claude_mpm/services/socketio/server/__init__.py +18 -0
  711. claude_mpm/services/socketio/server/broadcaster.py +569 -0
  712. claude_mpm/services/socketio/server/connection_manager.py +579 -0
  713. claude_mpm/services/socketio/server/core.py +1079 -0
  714. claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
  715. claude_mpm/services/socketio/server/main.py +501 -0
  716. claude_mpm/services/socketio_client_manager.py +173 -143
  717. claude_mpm/services/socketio_server.py +38 -1657
  718. claude_mpm/services/subprocess_launcher_service.py +322 -0
  719. claude_mpm/services/system_instructions_service.py +270 -0
  720. claude_mpm/services/ticket_manager.py +25 -209
  721. claude_mpm/services/ticket_services/__init__.py +26 -0
  722. claude_mpm/services/ticket_services/crud_service.py +328 -0
  723. claude_mpm/services/ticket_services/formatter_service.py +290 -0
  724. claude_mpm/services/ticket_services/search_service.py +324 -0
  725. claude_mpm/services/ticket_services/validation_service.py +303 -0
  726. claude_mpm/services/ticket_services/workflow_service.py +244 -0
  727. claude_mpm/services/unified/__init__.py +65 -0
  728. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  729. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  730. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  731. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  732. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  733. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  734. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  735. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  736. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  737. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  738. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  739. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  740. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  741. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  742. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  743. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  744. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  745. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  746. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  747. claude_mpm/services/unified/interfaces.py +475 -0
  748. claude_mpm/services/unified/migration.py +509 -0
  749. claude_mpm/services/unified/strategies.py +534 -0
  750. claude_mpm/services/unified/unified_analyzer.py +542 -0
  751. claude_mpm/services/unified/unified_config.py +691 -0
  752. claude_mpm/services/unified/unified_deployment.py +466 -0
  753. claude_mpm/services/utility_service.py +280 -0
  754. claude_mpm/services/version_control/__init__.py +34 -37
  755. claude_mpm/services/version_control/branch_strategy.py +26 -17
  756. claude_mpm/services/version_control/conflict_resolution.py +52 -36
  757. claude_mpm/services/version_control/git_operations.py +183 -49
  758. claude_mpm/services/version_control/semantic_versioning.py +172 -61
  759. claude_mpm/services/version_control/version_parser.py +546 -0
  760. claude_mpm/services/version_service.py +379 -0
  761. claude_mpm/services/visualization/__init__.py +15 -0
  762. claude_mpm/services/visualization/mermaid_generator.py +937 -0
  763. claude_mpm/skills/__init__.py +42 -0
  764. claude_mpm/skills/agent_skills_injector.py +324 -0
  765. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  766. claude_mpm/skills/bundled/__init__.py +6 -0
  767. claude_mpm/skills/bundled/api-documentation.md +393 -0
  768. claude_mpm/skills/bundled/async-testing.md +571 -0
  769. claude_mpm/skills/bundled/code-review.md +143 -0
  770. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  771. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  772. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  773. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  774. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  775. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  776. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  777. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  778. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  779. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  780. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  781. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  782. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  783. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  784. claude_mpm/skills/bundled/database-migration.md +199 -0
  785. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  786. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  787. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  788. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  789. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  790. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  791. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  792. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  793. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  794. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  795. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  796. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  797. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  798. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  799. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  800. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  801. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  802. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  803. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  804. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  805. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  806. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  807. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  808. claude_mpm/skills/bundled/git-workflow.md +414 -0
  809. claude_mpm/skills/bundled/imagemagick.md +204 -0
  810. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  811. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  812. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  813. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  814. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  815. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  816. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  817. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  818. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  819. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  820. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  821. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  822. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  823. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  824. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  825. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  826. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  827. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  828. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  829. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  830. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  831. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  832. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  833. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  834. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  835. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  836. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  837. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  838. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  839. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  840. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  841. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  842. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  843. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  844. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  845. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  846. claude_mpm/skills/bundled/pdf.md +141 -0
  847. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  848. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  849. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  850. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  851. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  852. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  853. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  854. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  855. claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
  856. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  857. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  858. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  859. claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
  860. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  861. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  862. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  863. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  864. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  865. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  866. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  867. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  868. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  869. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  870. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  871. claude_mpm/skills/bundled/security-scanning.md +439 -0
  872. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  873. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  874. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  875. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  876. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  877. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  878. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  879. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  880. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  881. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  882. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  883. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  884. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  885. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  886. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  887. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  888. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  889. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  890. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  891. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  892. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  893. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  894. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  895. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  896. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  897. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  898. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  899. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  900. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  901. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  902. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  903. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  904. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  905. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  906. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  907. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  908. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  909. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  910. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  911. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  912. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  913. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  914. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  915. claude_mpm/skills/bundled/xlsx.md +157 -0
  916. claude_mpm/skills/registry.py +286 -0
  917. claude_mpm/skills/skill_manager.py +405 -0
  918. claude_mpm/skills/skills_registry.py +347 -0
  919. claude_mpm/skills/skills_service.py +739 -0
  920. claude_mpm/storage/__init__.py +9 -0
  921. claude_mpm/storage/state_storage.py +546 -0
  922. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  923. claude_mpm/templates/questions/__init__.py +38 -0
  924. claude_mpm/templates/questions/base.py +193 -0
  925. claude_mpm/templates/questions/pr_strategy.py +311 -0
  926. claude_mpm/templates/questions/project_init.py +385 -0
  927. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  928. claude_mpm/ticket_wrapper.py +2 -2
  929. claude_mpm/tools/__init__.py +10 -0
  930. claude_mpm/tools/__main__.py +208 -0
  931. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  932. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  933. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  934. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  935. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  936. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  937. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  938. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  939. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  940. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  941. claude_mpm/tools/code_tree_builder.py +631 -0
  942. claude_mpm/tools/code_tree_events.py +420 -0
  943. claude_mpm/tools/socketio_debug.py +671 -0
  944. claude_mpm/utils/__init__.py +8 -8
  945. claude_mpm/utils/agent_dependency_loader.py +1189 -0
  946. claude_mpm/utils/agent_filters.py +261 -0
  947. claude_mpm/utils/common.py +544 -0
  948. claude_mpm/utils/config_manager.py +168 -126
  949. claude_mpm/utils/console.py +11 -0
  950. claude_mpm/utils/database_connector.py +298 -0
  951. claude_mpm/utils/dependency_cache.py +373 -0
  952. claude_mpm/utils/dependency_manager.py +60 -59
  953. claude_mpm/utils/dependency_strategies.py +381 -0
  954. claude_mpm/utils/display_helper.py +260 -0
  955. claude_mpm/utils/environment_context.py +313 -0
  956. claude_mpm/utils/error_handler.py +78 -66
  957. claude_mpm/utils/file_utils.py +305 -0
  958. claude_mpm/utils/framework_detection.py +12 -11
  959. claude_mpm/utils/git_analyzer.py +407 -0
  960. claude_mpm/utils/gitignore.py +244 -0
  961. claude_mpm/utils/import_migration_example.py +12 -60
  962. claude_mpm/utils/imports.py +48 -45
  963. claude_mpm/utils/log_cleanup.py +627 -0
  964. claude_mpm/utils/migration.py +372 -0
  965. claude_mpm/utils/path_operations.py +110 -104
  966. claude_mpm/utils/progress.py +387 -0
  967. claude_mpm/utils/robust_installer.py +844 -0
  968. claude_mpm/utils/session_logging.py +121 -0
  969. claude_mpm/utils/structured_questions.py +619 -0
  970. claude_mpm/utils/subprocess_utils.py +343 -0
  971. claude_mpm/validation/__init__.py +1 -1
  972. claude_mpm/validation/agent_validator.py +214 -108
  973. claude_mpm/validation/frontmatter_validator.py +252 -0
  974. claude_mpm-5.4.85.dist-info/METADATA +1023 -0
  975. claude_mpm-5.4.85.dist-info/RECORD +980 -0
  976. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
  977. claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
  978. claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
  979. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
  980. claude_mpm/agents/INSTRUCTIONS.md +0 -352
  981. claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
  982. claude_mpm/agents/base_agent_loader.py +0 -529
  983. claude_mpm/agents/schema/agent_schema.json +0 -314
  984. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
  985. claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
  986. claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
  987. claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
  988. claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
  989. claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
  990. claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
  991. claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
  992. claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
  993. claude_mpm/agents/templates/data_engineer.json +0 -110
  994. claude_mpm/agents/templates/documentation.json +0 -109
  995. claude_mpm/agents/templates/engineer.json +0 -113
  996. claude_mpm/agents/templates/ops.json +0 -109
  997. claude_mpm/agents/templates/pm.json +0 -25
  998. claude_mpm/agents/templates/qa.json +0 -111
  999. claude_mpm/agents/templates/research.json +0 -65
  1000. claude_mpm/agents/templates/security.json +0 -113
  1001. claude_mpm/agents/templates/test_integration.json +0 -112
  1002. claude_mpm/agents/templates/version_control.json +0 -107
  1003. claude_mpm/cli/commands/ui.py +0 -57
  1004. claude_mpm/core/simple_runner.py +0 -1046
  1005. claude_mpm/dashboard/open_dashboard.py +0 -34
  1006. claude_mpm/deployment_paths.py +0 -261
  1007. claude_mpm/hooks/builtin/__init__.py +0 -1
  1008. claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
  1009. claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
  1010. claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
  1011. claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
  1012. claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
  1013. claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
  1014. claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
  1015. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
  1016. claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
  1017. claude_mpm/orchestration/__init__.py +0 -6
  1018. claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
  1019. claude_mpm/orchestration/archive/factory.py +0 -215
  1020. claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
  1021. claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
  1022. claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
  1023. claude_mpm/orchestration/archive/orchestrator.py +0 -501
  1024. claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
  1025. claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
  1026. claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
  1027. claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
  1028. claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
  1029. claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
  1030. claude_mpm/schemas/workflow_validator.py +0 -411
  1031. claude_mpm/services/agent_deployment.py +0 -1534
  1032. claude_mpm/services/agent_lifecycle_manager.py +0 -1169
  1033. claude_mpm/services/agent_memory_manager.py +0 -1415
  1034. claude_mpm/services/agent_registry.py +0 -676
  1035. claude_mpm/services/deployed_agent_discovery.py +0 -226
  1036. claude_mpm/services/framework_agent_loader.py +0 -337
  1037. claude_mpm/services/framework_claude_md_generator.py +0 -621
  1038. claude_mpm/services/health_monitor.py +0 -892
  1039. claude_mpm/services/memory_router.py +0 -538
  1040. claude_mpm/services/parent_directory_manager/__init__.py +0 -577
  1041. claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
  1042. claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
  1043. claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
  1044. claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
  1045. claude_mpm/services/parent_directory_manager/operations.py +0 -186
  1046. claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
  1047. claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
  1048. claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
  1049. claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
  1050. claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
  1051. claude_mpm/services/standalone_socketio_server.py +0 -1300
  1052. claude_mpm/services/ticket_manager_di.py +0 -318
  1053. claude_mpm/services/ticketing_service_original.py +0 -508
  1054. claude_mpm/ui/__init__.py +0 -1
  1055. claude_mpm/ui/rich_terminal_ui.py +0 -295
  1056. claude_mpm/ui/terminal_ui.py +0 -328
  1057. claude_mpm/utils/paths.py +0 -289
  1058. claude_mpm-3.4.10.dist-info/METADATA +0 -183
  1059. claude_mpm-3.4.10.dist-info/RECORD +0 -201
  1060. claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
  1061. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
  1062. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1403 @@
1
+ """Agent Manager CLI command for comprehensive agent lifecycle management.
2
+
3
+ This module provides CLI interface for:
4
+ - Creating and customizing agents
5
+ - Managing agent variants
6
+ - Deploying agents across tiers
7
+ - Customizing PM instructions
8
+ - Discovering and listing agents
9
+ """
10
+
11
+ import json
12
+ import shutil
13
+ import sys
14
+ from pathlib import Path
15
+ from typing import Any, Dict, List, Optional
16
+
17
+ from ...core.enums import OutputFormat
18
+ from ...core.logging_config import get_logger
19
+ from ...services.agents.agent_builder import AgentBuilderService
20
+ from ...services.agents.deployment.agent_deployment import AgentDeploymentService
21
+ from ..shared import AgentCommand, CommandResult
22
+
23
+
24
+ class AgentManagerCommand(AgentCommand):
25
+ """Agent Manager command for comprehensive agent management."""
26
+
27
+ def __init__(self):
28
+ super().__init__("agent-manager")
29
+ self.builder_service = AgentBuilderService()
30
+ self.deployment_service = None
31
+ self.logger = get_logger(__name__)
32
+
33
+ @property
34
+ def deployment(self):
35
+ """Lazy load deployment service."""
36
+ if self.deployment_service is None:
37
+ self.deployment_service = AgentDeploymentService()
38
+ return self.deployment_service
39
+
40
+ def _get_output_format(self, args) -> str:
41
+ """
42
+ Get output format from args with enum default.
43
+
44
+ Args:
45
+ args: Command arguments
46
+
47
+ Returns:
48
+ Output format string (compatible with both enum and string usage)
49
+ """
50
+ return getattr(args, "format", OutputFormat.TEXT)
51
+
52
+ def run(self, args) -> CommandResult:
53
+ """Execute agent manager command.
54
+
55
+ Args:
56
+ args: Command arguments
57
+
58
+ Returns:
59
+ CommandResult with operation status
60
+ """
61
+ if not hasattr(args, "agent_manager_command"):
62
+ return self._show_help()
63
+
64
+ command_map = {
65
+ "list": self._list_agents,
66
+ "create": self._create_agent,
67
+ "variant": self._create_variant,
68
+ "deploy": self._deploy_agent,
69
+ "customize-pm": self._customize_pm,
70
+ "show": self._show_agent,
71
+ "test": self._test_agent,
72
+ "templates": self._list_templates,
73
+ "reset": self._reset_agents,
74
+ # Interactive commands
75
+ "create-interactive": self._create_interactive,
76
+ "manage-local": self._manage_local_interactive,
77
+ "edit-interactive": self._edit_interactive,
78
+ "test-local": self._test_local_agent,
79
+ # Local agent commands
80
+ "create-local": self._create_local_agent,
81
+ "deploy-local": self._deploy_local_agents,
82
+ "list-local": self._list_local_agents,
83
+ "sync-local": self._sync_local_agents,
84
+ "export-local": self._export_local_agents,
85
+ "import-local": self._import_local_agents,
86
+ "delete-local": self._delete_local_agents,
87
+ }
88
+
89
+ command = args.agent_manager_command
90
+ if command in command_map:
91
+ return command_map[command](args)
92
+ return CommandResult.error_result(f"Unknown command: {command}")
93
+
94
+ def _list_agents(self, args) -> CommandResult:
95
+ """List all agents across tiers with hierarchy.
96
+
97
+ Shows agents from:
98
+ 1. Project level (.claude/agents/)
99
+ 2. User level (~/.claude/agents/)
100
+ 3. System level (framework)
101
+ """
102
+ agents = {"project": [], "user": [], "system": []}
103
+
104
+ # Check project level
105
+ project_dir = Path.cwd() / ".claude" / "agents"
106
+ if project_dir.exists():
107
+ for agent_file in project_dir.glob("*.md"):
108
+ agents["project"].append(
109
+ self._read_agent_summary(agent_file, "project")
110
+ )
111
+
112
+ # Check user level
113
+ user_dir = Path.home() / ".claude" / "agents"
114
+ if user_dir.exists():
115
+ for agent_file in user_dir.glob("*.md"):
116
+ agent_id = agent_file.stem
117
+ # Skip if overridden by project
118
+ if not any(a["id"] == agent_id for a in agents["project"]):
119
+ agents["user"].append(self._read_agent_summary(agent_file, "user"))
120
+
121
+ # Get system agents
122
+ templates = self.builder_service.list_available_templates()
123
+ for template in templates:
124
+ agent_id = template["id"]
125
+ # Skip if overridden by project or user
126
+ if not any(a["id"] == agent_id for a in agents["project"] + agents["user"]):
127
+ agents["system"].append(
128
+ {
129
+ "id": agent_id,
130
+ "name": template["name"],
131
+ "tier": "system",
132
+ "description": template["description"],
133
+ "category": template.get("category", "custom"),
134
+ }
135
+ )
136
+
137
+ # Format output
138
+ output_format = self._get_output_format(args)
139
+ if str(output_format).lower() == OutputFormat.JSON:
140
+ return CommandResult.success_result("Agents listed", data=agents)
141
+ output = self._format_agent_list(agents)
142
+ return CommandResult.success_result(output)
143
+
144
+ def _create_agent(self, args) -> CommandResult:
145
+ """Create a new agent interactively or from arguments."""
146
+ try:
147
+ # Interactive mode if no arguments
148
+ if not hasattr(args, "agent_id"):
149
+ return self._interactive_create()
150
+
151
+ # Create from arguments
152
+ config, instructions = self.builder_service.create_agent(
153
+ agent_id=args.agent_id,
154
+ name=getattr(args, "name", args.agent_id),
155
+ description=getattr(
156
+ args, "description", f"Custom agent {args.agent_id}"
157
+ ),
158
+ model=getattr(args, "model", "sonnet"),
159
+ tool_choice=getattr(args, "tool_choice", "auto"),
160
+ base_template=getattr(args, "template", None),
161
+ )
162
+
163
+ # Save agent files
164
+ result = self._save_agent(config, instructions, args.agent_id)
165
+
166
+ if result:
167
+ return CommandResult.success_result(
168
+ f"Agent '{args.agent_id}' created successfully"
169
+ )
170
+ return CommandResult.error_result("Failed to save agent files")
171
+
172
+ except Exception as e:
173
+ return CommandResult.error_result(f"Failed to create agent: {e}")
174
+
175
+ def _create_variant(self, args) -> CommandResult:
176
+ """Create an agent variant."""
177
+ try:
178
+ if not hasattr(args, "base_agent"):
179
+ return CommandResult.error_result(
180
+ "Base agent ID required for variant creation"
181
+ )
182
+
183
+ modifications = {}
184
+ if hasattr(args, "model"):
185
+ modifications["model"] = args.model
186
+ if hasattr(args, "tool_choice"):
187
+ modifications["tool_choice"] = args.tool_choice
188
+
189
+ config, instructions = self.builder_service.create_variant(
190
+ base_agent_id=args.base_agent,
191
+ variant_id=args.variant_id,
192
+ variant_name=getattr(args, "name", f"{args.base_agent}-variant"),
193
+ modifications=modifications,
194
+ instructions_append=getattr(args, "instructions", None),
195
+ )
196
+
197
+ # Save variant
198
+ result = self._save_agent(config, instructions, args.variant_id)
199
+
200
+ if result:
201
+ return CommandResult.success_result(
202
+ f"Variant '{args.variant_id}' created successfully"
203
+ )
204
+ return CommandResult.error_result("Failed to save variant files")
205
+
206
+ except Exception as e:
207
+ return CommandResult.error_result(f"Failed to create variant: {e}")
208
+
209
+ def _deploy_agent(self, args) -> CommandResult:
210
+ """Deploy an agent to specified tier."""
211
+ try:
212
+ agent_id = args.agent_id
213
+ tier = getattr(
214
+ args, "tier", "project"
215
+ ) # Default to project (changed from 'user')
216
+
217
+ # Always deploy to project directory
218
+ # Regardless of tier, all agents go to project .claude/agents
219
+ deploy_path = Path.cwd() / ".claude" / "agents"
220
+
221
+ # Note: We're keeping the tier parameter for backward compatibility
222
+ # but it no longer affects the deployment location
223
+ if tier not in ["project", "user"]:
224
+ return CommandResult.error_result(
225
+ "Invalid tier. Use 'project' or 'user'"
226
+ )
227
+
228
+ # Create directory if needed
229
+ deploy_path.mkdir(parents=True, exist_ok=True)
230
+
231
+ # Find agent files
232
+ template_dir = Path(__file__).parent.parent.parent / "agents" / "templates"
233
+ json_file = template_dir / f"{agent_id}.json"
234
+ template_dir / f"{agent_id}.md"
235
+
236
+ if not json_file.exists():
237
+ return CommandResult.error_result(f"Agent '{agent_id}' not found")
238
+
239
+ # Deploy using deployment service
240
+ # Pass Path object, not string
241
+ self.deployment.deploy_agent(agent_id, deploy_path)
242
+
243
+ return CommandResult.success_result(
244
+ f"Agent '{agent_id}' deployed to {tier} level"
245
+ )
246
+
247
+ except Exception as e:
248
+ return CommandResult.error_result(f"Deployment failed: {e}")
249
+
250
+ def _customize_pm(self, args) -> CommandResult:
251
+ """Customize PM instructions via .claude-mpm/INSTRUCTIONS.md."""
252
+ try:
253
+ level = getattr(args, "level", "user")
254
+
255
+ # Use .claude-mpm/INSTRUCTIONS.md for customization
256
+ if level == "user":
257
+ pm_file = Path.home() / ".claude-mpm" / "INSTRUCTIONS.md"
258
+ elif level == "project":
259
+ pm_file = Path.cwd() / ".claude-mpm" / "INSTRUCTIONS.md"
260
+ else:
261
+ return CommandResult.error_result(
262
+ "Invalid level. Use 'user' or 'project'"
263
+ )
264
+
265
+ # Create backup if file exists
266
+ if pm_file.exists():
267
+ backup_file = pm_file.with_suffix(".md.backup")
268
+ shutil.copy(pm_file, backup_file)
269
+ self.logger.info(f"Backup created: {backup_file}")
270
+
271
+ # Generate or load instructions
272
+ if hasattr(args, "template"):
273
+ instructions = self._load_pm_template(args.template)
274
+ else:
275
+ instructions = self.builder_service.generate_pm_instructions(
276
+ delegation_patterns=getattr(args, "patterns", None),
277
+ workflow_overrides=getattr(args, "workflows", None),
278
+ custom_rules=getattr(args, "rules", None),
279
+ )
280
+
281
+ # Save instructions to .claude-mpm directory
282
+ pm_file.parent.mkdir(parents=True, exist_ok=True)
283
+ pm_file.write_text(instructions)
284
+
285
+ return CommandResult.success_result(
286
+ f"PM instructions customized at {level} level: {pm_file}\n"
287
+ f"Note: These instructions will be loaded by the framework loader."
288
+ )
289
+
290
+ except Exception as e:
291
+ return CommandResult.error_result(f"Failed to customize PM: {e}")
292
+
293
+ def _show_agent(self, args) -> CommandResult:
294
+ """Show detailed agent information."""
295
+ try:
296
+ agent_id = args.agent_id
297
+
298
+ # Find agent across tiers
299
+ agent_info = self._find_agent(agent_id)
300
+
301
+ if not agent_info:
302
+ return CommandResult.error_result(f"Agent '{agent_id}' not found")
303
+
304
+ output_format = self._get_output_format(args)
305
+ if str(output_format).lower() == OutputFormat.JSON:
306
+ return CommandResult.success_result("Agent details", data=agent_info)
307
+ output = self._format_agent_details(agent_info)
308
+ return CommandResult.success_result(output)
309
+
310
+ except Exception as e:
311
+ return CommandResult.error_result(f"Failed to show agent: {e}")
312
+
313
+ def _test_agent(self, args) -> CommandResult:
314
+ """Test agent configuration."""
315
+ try:
316
+ agent_id = args.agent_id
317
+
318
+ # Find agent configuration
319
+ config = self._load_agent_config(agent_id)
320
+
321
+ if not config:
322
+ return CommandResult.error_result(f"Agent '{agent_id}' not found")
323
+
324
+ # Validate configuration
325
+ errors = self.builder_service.validate_configuration(config)
326
+
327
+ if errors:
328
+ return CommandResult.error_result(
329
+ "Validation failed:\n" + "\n".join(f" - {e}" for e in errors)
330
+ )
331
+
332
+ # Check for conflicts
333
+ conflicts = self._check_conflicts(agent_id)
334
+
335
+ warning = f"Warning: Agent overrides {conflicts}" if conflicts else ""
336
+
337
+ return CommandResult.success_result(
338
+ f"Agent '{agent_id}' configuration is valid. {warning}"
339
+ )
340
+
341
+ except Exception as e:
342
+ return CommandResult.error_result(f"Test failed: {e}")
343
+
344
+ def _list_templates(self, args) -> CommandResult:
345
+ """List available agent templates."""
346
+ templates = self.builder_service.list_available_templates()
347
+
348
+ output_format = self._get_output_format(args)
349
+ if str(output_format).lower() == OutputFormat.JSON:
350
+ return CommandResult.success_result("Templates listed", data=templates)
351
+ output = "Available Agent Templates:\n\n"
352
+ for template in templates:
353
+ template_id = template.get("id", "unknown")
354
+ template_name = template.get("name", "Unnamed")
355
+ output += f" {template_id:<20} - {template_name}\n"
356
+ if template.get("description"):
357
+ output += f" {template['description']}\n"
358
+ return CommandResult.success_result(output)
359
+
360
+ def _reset_agents(self, args) -> CommandResult:
361
+ """Reset by removing claude-mpm authored agents from project and user directories.
362
+
363
+ This command removes any agents with "author: claude-mpm" in their frontmatter,
364
+ preserving user-created agents. This is useful for clean reinstalls or when
365
+ wanting to get fresh versions of system agents.
366
+ """
367
+ try:
368
+ # Determine which directories to clean
369
+ clean_project = not getattr(args, "user_only", False)
370
+ clean_user = not getattr(args, "project_only", False)
371
+ dry_run = getattr(args, "dry_run", False)
372
+ force = getattr(args, "force", False)
373
+ output_format = self._get_output_format(args)
374
+
375
+ # Track results
376
+ results = {
377
+ "project": {"checked": False, "removed": [], "preserved": []},
378
+ "user": {"checked": False, "removed": [], "preserved": []},
379
+ "dry_run": dry_run,
380
+ "total_removed": 0,
381
+ "total_preserved": 0,
382
+ }
383
+
384
+ # Check project directory - always scan first to see what's there
385
+ if clean_project:
386
+ project_dir = Path.cwd() / ".claude" / "agents"
387
+ if project_dir.exists():
388
+ results["project"]["checked"] = True
389
+ # Always scan with dry_run=True first to see what's there
390
+ self._scan_and_clean_directory(
391
+ project_dir, results["project"], dry_run=True
392
+ )
393
+
394
+ # Check user directory - always scan first to see what's there
395
+ if clean_user:
396
+ user_dir = Path.home() / ".claude" / "agents"
397
+ if user_dir.exists():
398
+ results["user"]["checked"] = True
399
+ # Always scan with dry_run=True first to see what's there
400
+ self._scan_and_clean_directory(
401
+ user_dir, results["user"], dry_run=True
402
+ )
403
+
404
+ # Calculate totals
405
+ results["total_removed"] = len(results["project"]["removed"]) + len(
406
+ results["user"]["removed"]
407
+ )
408
+ results["total_preserved"] = len(results["project"]["preserved"]) + len(
409
+ results["user"]["preserved"]
410
+ )
411
+
412
+ # Handle output based on format
413
+ if str(output_format).lower() == OutputFormat.JSON:
414
+ return CommandResult.success_result("Reset completed", data=results)
415
+
416
+ # Generate text output
417
+ output = self._format_reset_results(results, dry_run, force)
418
+
419
+ # If not dry-run, perform actual removal
420
+ if not dry_run and results["total_removed"] > 0:
421
+ # If force mode, remove immediately; otherwise get confirmation
422
+ if not force:
423
+ # Get confirmation first
424
+ print(output)
425
+ print("\n⚠️ This will permanently remove the agents listed above.")
426
+
427
+ # Ensure stdout is flushed before reading input
428
+ sys.stdout.flush()
429
+
430
+ # Get confirmation
431
+ try:
432
+ response = input("Continue? [y/N]: ").strip().lower()
433
+ if response not in ["y", "yes"]:
434
+ return CommandResult.success_result(
435
+ "Reset cancelled by user"
436
+ )
437
+ except (KeyboardInterrupt, EOFError):
438
+ return CommandResult.success_result("\nReset cancelled")
439
+
440
+ # Perform actual removal using the list we already have
441
+ if clean_project and results["project"]["removed"]:
442
+ project_dir = Path.cwd() / ".claude" / "agents"
443
+ for agent in results["project"]["removed"]:
444
+ agent_file = project_dir / agent
445
+ try:
446
+ if agent_file.exists():
447
+ agent_file.unlink()
448
+ self.logger.info(
449
+ f"Removed claude-mpm agent: {agent_file}"
450
+ )
451
+ except Exception as e:
452
+ self.logger.warning(f"Could not remove {agent_file}: {e}")
453
+
454
+ if clean_user and results["user"]["removed"]:
455
+ user_dir = Path.home() / ".claude" / "agents"
456
+ for agent in results["user"]["removed"]:
457
+ agent_file = user_dir / agent
458
+ try:
459
+ if agent_file.exists():
460
+ agent_file.unlink()
461
+ self.logger.info(
462
+ f"Removed claude-mpm agent: {agent_file}"
463
+ )
464
+ except Exception as e:
465
+ self.logger.warning(f"Could not remove {agent_file}: {e}")
466
+
467
+ # Update output to show actual removal
468
+ output = self._format_reset_results(results, dry_run=False, force=force)
469
+
470
+ return CommandResult.success_result(output)
471
+
472
+ except Exception as e:
473
+ self.logger.error(f"Failed to reset agents: {e}", exc_info=True)
474
+ return CommandResult.error_result(f"Failed to reset agents: {e}")
475
+
476
+ def _scan_and_clean_directory(
477
+ self, directory: Path, results: Dict[str, Any], dry_run: bool
478
+ ) -> None:
479
+ """Scan a directory for claude-mpm authored agents and optionally remove them.
480
+
481
+ Args:
482
+ directory: Directory to scan
483
+ results: Results dictionary to update
484
+ dry_run: If True, only scan without removing
485
+ """
486
+ for agent_file in directory.glob("*.md"):
487
+ try:
488
+ content = agent_file.read_text()
489
+ # Check if this is a claude-mpm authored agent
490
+ if "author: claude-mpm" in content.lower():
491
+ results["removed"].append(agent_file.name)
492
+ if not dry_run:
493
+ agent_file.unlink()
494
+ self.logger.info(f"Removed claude-mpm agent: {agent_file}")
495
+ else:
496
+ results["preserved"].append(agent_file.name)
497
+ self.logger.debug(f"Preserved user agent: {agent_file}")
498
+ except Exception as e:
499
+ self.logger.warning(f"Could not process {agent_file}: {e}")
500
+
501
+ def _format_reset_results(
502
+ self, results: Dict[str, Any], dry_run: bool, force: bool
503
+ ) -> str:
504
+ """Format reset results for display.
505
+
506
+ Args:
507
+ results: Results dictionary
508
+ dry_run: Whether this was a dry run
509
+ force: Whether force mode was used
510
+
511
+ Returns:
512
+ Formatted output string
513
+ """
514
+ if dry_run:
515
+ output = "🔍 DRY RUN - No changes will be made\n"
516
+ output += "=" * 50 + "\n\n"
517
+ else:
518
+ output = "🧹 Agent Reset Complete\n"
519
+ output += "=" * 50 + "\n\n"
520
+
521
+ # Show project results
522
+ if results["project"]["checked"]:
523
+ output += "📁 Project Level (.claude/agents):\n"
524
+ if results["project"]["removed"]:
525
+ action = "Would remove" if dry_run else "Removed"
526
+ output += f" {action} {len(results['project']['removed'])} claude-mpm agent(s):\n"
527
+ for agent in results["project"]["removed"][:5]:
528
+ output += f" • {agent}\n"
529
+ if len(results["project"]["removed"]) > 5:
530
+ output += (
531
+ f" ... and {len(results['project']['removed']) - 5} more\n"
532
+ )
533
+ else:
534
+ output += " No claude-mpm agents found\n"
535
+
536
+ if results["project"]["preserved"]:
537
+ output += f" Preserved {len(results['project']['preserved'])} user-created agent(s)\n"
538
+ output += "\n"
539
+
540
+ # Show user results
541
+ if results["user"]["checked"]:
542
+ output += "📁 User Level (~/.claude/agents):\n"
543
+ if results["user"]["removed"]:
544
+ action = "Would remove" if dry_run else "Removed"
545
+ output += f" {action} {len(results['user']['removed'])} claude-mpm agent(s):\n"
546
+ for agent in results["user"]["removed"][:5]:
547
+ output += f" • {agent}\n"
548
+ if len(results["user"]["removed"]) > 5:
549
+ output += (
550
+ f" ... and {len(results['user']['removed']) - 5} more\n"
551
+ )
552
+ else:
553
+ output += " No claude-mpm agents found\n"
554
+
555
+ if results["user"]["preserved"]:
556
+ output += f" Preserved {len(results['user']['preserved'])} user-created agent(s)\n"
557
+ output += "\n"
558
+
559
+ # Show summary
560
+ output += "📊 Summary:\n"
561
+ if dry_run:
562
+ output += f" • Would remove: {results['total_removed']} agent(s)\n"
563
+ else:
564
+ output += f" • Removed: {results['total_removed']} agent(s)\n"
565
+ output += f" • Preserved: {results['total_preserved']} user agent(s)\n"
566
+
567
+ if dry_run and results["total_removed"] > 0:
568
+ output += "\n💡 Run with --force to execute this cleanup immediately"
569
+
570
+ return output
571
+
572
+ def _interactive_create(self) -> CommandResult:
573
+ """Interactive agent creation wizard."""
574
+ print("\n=== Agent Creation Wizard ===\n")
575
+
576
+ # Get agent ID
577
+ agent_id = input("Agent ID (lowercase, hyphens only): ").strip()
578
+ if not agent_id:
579
+ return CommandResult.error_result("Agent ID is required")
580
+
581
+ # Get name
582
+ name = input(f"Display name [{agent_id}]: ").strip() or agent_id
583
+
584
+ # Get description
585
+ description = input("Description: ").strip()
586
+ if not description:
587
+ return CommandResult.error_result("Description is required")
588
+
589
+ # Get model
590
+ print("\nAvailable models: sonnet, opus, haiku")
591
+ model = input("Model [sonnet]: ").strip() or "sonnet"
592
+
593
+ # Get tool choice
594
+ print("\nTool choices: auto, required, any, none")
595
+ tool_choice = input("Tool choice [auto]: ").strip() or "auto"
596
+
597
+ # Create agent
598
+ try:
599
+ config, instructions = self.builder_service.create_agent(
600
+ agent_id=agent_id,
601
+ name=name,
602
+ description=description,
603
+ model=model,
604
+ tool_choice=tool_choice,
605
+ )
606
+
607
+ # Save agent
608
+ if self._save_agent(config, instructions, agent_id):
609
+ return CommandResult.success_result(
610
+ f"\nAgent '{agent_id}' created successfully!"
611
+ )
612
+ return CommandResult.error_result("Failed to save agent files")
613
+
614
+ except Exception as e:
615
+ return CommandResult.error_result(f"Creation failed: {e}")
616
+
617
+ def _save_agent(
618
+ self, config: Dict[str, Any], instructions: str, agent_id: str
619
+ ) -> bool:
620
+ """Save agent configuration and instructions.
621
+
622
+ Args:
623
+ config: Agent configuration dictionary
624
+ instructions: Agent instructions markdown
625
+ agent_id: Agent identifier
626
+
627
+ Returns:
628
+ True if saved successfully
629
+ """
630
+ try:
631
+ template_dir = Path(__file__).parent.parent.parent / "agents" / "templates"
632
+ template_dir.mkdir(parents=True, exist_ok=True)
633
+
634
+ # Save JSON configuration
635
+ json_file = template_dir / f"{agent_id}.json"
636
+ with json_file.open("w") as f:
637
+ json.dump(config, f, indent=2)
638
+
639
+ # Save instructions
640
+ md_file = template_dir / f"{agent_id}.md"
641
+ md_file.write_text(instructions)
642
+
643
+ self.logger.info(f"Agent saved: {json_file} and {md_file}")
644
+ return True
645
+
646
+ except Exception as e:
647
+ self.logger.error(f"Failed to save agent: {e}")
648
+ return False
649
+
650
+ def _read_agent_summary(self, agent_file: Path, tier: str) -> Dict[str, Any]:
651
+ """Read agent summary from file."""
652
+ try:
653
+ agent_id = agent_file.stem
654
+ content = agent_file.read_text()
655
+
656
+ # Parse frontmatter for .md files
657
+ if agent_file.suffix == ".md" and content.startswith("---"):
658
+ import yaml
659
+
660
+ try:
661
+ # Extract YAML frontmatter
662
+ parts = content.split("---", 2)
663
+ if len(parts) >= 2:
664
+ frontmatter = yaml.safe_load(parts[1])
665
+ if isinstance(frontmatter, dict):
666
+ return {
667
+ "id": agent_id,
668
+ "name": frontmatter.get(
669
+ "name", agent_id.replace("-", " ").title()
670
+ ),
671
+ "tier": tier,
672
+ "file": str(agent_file),
673
+ "description": frontmatter.get("description", ""),
674
+ "is_local": frontmatter.get("is_local", False),
675
+ "priority": frontmatter.get("priority", 1000),
676
+ }
677
+ except Exception:
678
+ pass
679
+
680
+ # Fallback for files without proper frontmatter
681
+ return {
682
+ "id": agent_id,
683
+ "name": agent_id.replace("-", " ").title(),
684
+ "tier": tier,
685
+ "file": str(agent_file),
686
+ }
687
+ except Exception:
688
+ return {}
689
+
690
+ def _format_agent_list(self, agents: Dict[str, List]) -> str:
691
+ """Format agent list for display."""
692
+ output = "=== Agent Hierarchy ===\n\n"
693
+
694
+ # Project agents
695
+ if agents["project"]:
696
+ output += "[P] PROJECT LEVEL (Highest Priority)\n"
697
+ for agent in agents["project"]:
698
+ local_indicator = " [LOCAL-PROJECT]" if agent.get("is_local") else ""
699
+ output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}{local_indicator}\n"
700
+ output += "\n"
701
+
702
+ # User agents
703
+ if agents["user"]:
704
+ output += "[U] USER LEVEL\n"
705
+ for agent in agents["user"]:
706
+ local_indicator = " [LOCAL-USER]" if agent.get("is_local") else ""
707
+ output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}{local_indicator}\n"
708
+ output += "\n"
709
+
710
+ # System agents
711
+ if agents["system"]:
712
+ output += "[S] SYSTEM LEVEL (Framework Defaults)\n"
713
+ for agent in agents["system"]:
714
+ output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}\n"
715
+
716
+ return output
717
+
718
+ def _find_agent(self, agent_id: str) -> Optional[Dict[str, Any]]:
719
+ """Find agent across all tiers."""
720
+ # Implementation would search across tiers
721
+ # This is a simplified version
722
+ return {"id": agent_id, "tier": "system"}
723
+
724
+ def _load_agent_config(self, agent_id: str) -> Optional[Dict[str, Any]]:
725
+ """Load agent configuration."""
726
+ try:
727
+ return self.builder_service._load_template(agent_id)
728
+ except Exception:
729
+ return None
730
+
731
+ def _check_conflicts(self, agent_id: str) -> Optional[str]:
732
+ """Check for agent conflicts across tiers."""
733
+ # Check if agent exists in multiple tiers
734
+ # Return tier information if conflicts exist
735
+ return None
736
+
737
+ def _format_agent_details(self, agent_info: Dict[str, Any]) -> str:
738
+ """Format agent details for display."""
739
+ output = f"=== Agent: {agent_info['id']} ===\n\n"
740
+ for key, value in agent_info.items():
741
+ output += f"{key}: {value}\n"
742
+ return output
743
+
744
+ def _load_pm_template(self, template_name: str) -> str:
745
+ """Load PM instruction template."""
746
+ # Load predefined PM templates
747
+ return "# PM Instructions Template\n"
748
+
749
+ def _create_local_agent(self, args) -> CommandResult:
750
+ """Create a new local agent template.
751
+
752
+ Creates a JSON template in .claude-mpm/agents/ directory.
753
+ """
754
+ try:
755
+ from ...services.agents.local_template_manager import (
756
+ LocalAgentTemplateManager,
757
+ )
758
+
759
+ manager = LocalAgentTemplateManager()
760
+
761
+ # Get arguments
762
+ agent_id = getattr(args, "agent_id", None)
763
+ if not agent_id:
764
+ return CommandResult.error_result(
765
+ "--agent-id is required for create-local"
766
+ )
767
+
768
+ name = getattr(args, "name", agent_id.replace("_", " ").title())
769
+ description = getattr(args, "description", f"Local {agent_id} agent")
770
+ instructions = getattr(
771
+ args, "instructions", f"Custom instructions for {agent_id}"
772
+ )
773
+ model = getattr(args, "model", "sonnet")
774
+ tools = getattr(args, "tools", "*")
775
+ parent_agent = getattr(args, "parent", None)
776
+ tier = getattr(args, "tier", "project")
777
+
778
+ # Create template
779
+ template = manager.create_local_template(
780
+ agent_id=agent_id,
781
+ name=name,
782
+ description=description,
783
+ instructions=instructions,
784
+ model=model,
785
+ tools=tools,
786
+ parent_agent=parent_agent,
787
+ tier=tier,
788
+ )
789
+
790
+ # Validate template
791
+ is_valid, errors = manager.validate_local_template(template)
792
+ if not is_valid:
793
+ return CommandResult.error_result(
794
+ f"Invalid template: {', '.join(errors)}"
795
+ )
796
+
797
+ # Save template
798
+ template_file = manager.save_local_template(template, tier)
799
+
800
+ return CommandResult.success_result(
801
+ f"Created local agent template: {template_file}\n"
802
+ f"Deploy with: claude-mpm agent-manager deploy-local --agent-id {agent_id}"
803
+ )
804
+
805
+ except Exception as e:
806
+ return CommandResult.error_result(f"Failed to create local agent: {e}")
807
+
808
+ def _deploy_local_agents(self, args) -> CommandResult:
809
+ """Deploy local JSON templates to Claude Code."""
810
+ try:
811
+ from ...services.agents.deployment.local_template_deployment import (
812
+ LocalTemplateDeploymentService,
813
+ )
814
+
815
+ service = LocalTemplateDeploymentService()
816
+
817
+ # Check for specific agent
818
+ agent_id = getattr(args, "agent_id", None)
819
+ force = getattr(args, "force", False)
820
+
821
+ if agent_id:
822
+ # Deploy single agent
823
+ success = service.deploy_single_local_template(agent_id, force)
824
+ if success:
825
+ return CommandResult.success_result(
826
+ f"Deployed local agent: {agent_id}"
827
+ )
828
+ return CommandResult.error_result(
829
+ f"Failed to deploy local agent: {agent_id}"
830
+ )
831
+
832
+ # Deploy all local agents
833
+ tier_filter = getattr(args, "tier", None)
834
+ results = service.deploy_local_templates(force, tier_filter)
835
+
836
+ # Format output
837
+ output = "Local Agent Deployment Results:\n"
838
+ output += f" Deployed: {len(results['deployed'])}\n"
839
+ output += f" Updated: {len(results['updated'])}\n"
840
+ output += f" Skipped: {len(results['skipped'])}\n"
841
+ output += f" Errors: {len(results['errors'])}\n"
842
+
843
+ if results["deployed"]:
844
+ output += f"\nDeployed agents: {', '.join(results['deployed'])}"
845
+ if results["updated"]:
846
+ output += f"\nUpdated agents: {', '.join(results['updated'])}"
847
+ if results["errors"]:
848
+ output += "\nErrors:\n"
849
+ for error in results["errors"]:
850
+ output += f" - {error}\n"
851
+
852
+ return CommandResult.success_result(output, data=results)
853
+
854
+ except Exception as e:
855
+ return CommandResult.error_result(f"Failed to deploy local agents: {e}")
856
+
857
+ def _list_local_agents(self, args) -> CommandResult:
858
+ """List all local agent templates."""
859
+ try:
860
+ from ...services.agents.local_template_manager import (
861
+ LocalAgentTemplateManager,
862
+ )
863
+
864
+ manager = LocalAgentTemplateManager()
865
+
866
+ # Get tier filter
867
+ tier = getattr(args, "tier", None)
868
+ templates = manager.list_local_templates(tier)
869
+
870
+ if not templates:
871
+ return CommandResult.success_result("No local agent templates found")
872
+
873
+ # Format output
874
+ output_format = self._get_output_format(args)
875
+
876
+ if str(output_format).lower() == OutputFormat.JSON:
877
+ data = [
878
+ {
879
+ "id": t.agent_id,
880
+ "name": t.metadata.get("name", t.agent_id),
881
+ "version": t.agent_version,
882
+ "author": t.author,
883
+ "tier": t.tier,
884
+ "tags": t.metadata.get("tags", []),
885
+ }
886
+ for t in templates
887
+ ]
888
+ return CommandResult.success_result("Local agents", data=data)
889
+
890
+ # Text format
891
+ output = "Local Agent Templates:\n\n"
892
+
893
+ # Group by tier
894
+ project_agents = [t for t in templates if t.tier == "project"]
895
+ user_agents = [t for t in templates if t.tier == "user"]
896
+
897
+ if project_agents:
898
+ output += "PROJECT AGENTS:\n"
899
+ for template in project_agents:
900
+ output += f" • {template.agent_id} (v{template.agent_version})"
901
+ output += f" - {template.metadata.get('name', template.agent_id)}\n"
902
+ if template.metadata.get("description"):
903
+ output += f" {template.metadata['description']}\n"
904
+ output += "\n"
905
+
906
+ if user_agents:
907
+ output += "USER AGENTS:\n"
908
+ for template in user_agents:
909
+ output += f" • {template.agent_id} (v{template.agent_version})"
910
+ output += f" - {template.metadata.get('name', template.agent_id)}\n"
911
+ if template.metadata.get("description"):
912
+ output += f" {template.metadata['description']}\n"
913
+
914
+ return CommandResult.success_result(output)
915
+
916
+ except Exception as e:
917
+ return CommandResult.error_result(f"Failed to list local agents: {e}")
918
+
919
+ def _sync_local_agents(self, args) -> CommandResult:
920
+ """Synchronize local templates with deployed agents."""
921
+ try:
922
+ from ...services.agents.deployment.local_template_deployment import (
923
+ LocalTemplateDeploymentService,
924
+ )
925
+
926
+ service = LocalTemplateDeploymentService()
927
+ results = service.sync_local_templates()
928
+
929
+ # Format output
930
+ output = "Local Agent Synchronization:\n"
931
+ output += f" Added: {len(results['added'])}\n"
932
+ output += f" Updated: {len(results['updated'])}\n"
933
+ output += f" Removed: {len(results['removed'])}\n"
934
+
935
+ if results["added"]:
936
+ output += f"\nAdded agents: {', '.join(results['added'])}"
937
+ if results["updated"]:
938
+ output += f"\nUpdated agents: {', '.join(results['updated'])}"
939
+ if results["removed"]:
940
+ output += f"\nRemoved agents: {', '.join(results['removed'])}"
941
+ if results["errors"]:
942
+ output += "\nErrors:\n"
943
+ for error in results["errors"]:
944
+ output += f" - {error}\n"
945
+
946
+ return CommandResult.success_result(output, data=results)
947
+
948
+ except Exception as e:
949
+ return CommandResult.error_result(f"Failed to sync local agents: {e}")
950
+
951
+ def _export_local_agents(self, args) -> CommandResult:
952
+ """Export local agent templates to a directory."""
953
+ try:
954
+ from ...services.agents.local_template_manager import (
955
+ LocalAgentTemplateManager,
956
+ )
957
+
958
+ manager = LocalAgentTemplateManager()
959
+
960
+ # Get output directory
961
+ output_dir = getattr(args, "output", "./exported-agents")
962
+ output_path = Path(output_dir)
963
+
964
+ count = manager.export_local_templates(output_path)
965
+
966
+ return CommandResult.success_result(
967
+ f"Exported {count} local agent templates to {output_path}"
968
+ )
969
+
970
+ except Exception as e:
971
+ return CommandResult.error_result(f"Failed to export local agents: {e}")
972
+
973
+ def _import_local_agents(self, args) -> CommandResult:
974
+ """Import agent templates from a directory."""
975
+ try:
976
+ from ...services.agents.local_template_manager import (
977
+ LocalAgentTemplateManager,
978
+ )
979
+
980
+ manager = LocalAgentTemplateManager()
981
+
982
+ # Get input directory
983
+ input_dir = getattr(args, "input", None)
984
+ if not input_dir:
985
+ return CommandResult.error_result("--input directory is required")
986
+
987
+ input_path = Path(input_dir)
988
+ if not input_path.exists():
989
+ return CommandResult.error_result(
990
+ f"Input directory does not exist: {input_path}"
991
+ )
992
+
993
+ # Get tier
994
+ tier = getattr(args, "tier", "project")
995
+
996
+ count = manager.import_local_templates(input_path, tier)
997
+
998
+ return CommandResult.success_result(
999
+ f"Imported {count} local agent templates from {input_path}"
1000
+ )
1001
+
1002
+ except Exception as e:
1003
+ return CommandResult.error_result(f"Failed to import local agents: {e}")
1004
+
1005
+ def _create_interactive(self, args) -> CommandResult:
1006
+ """Launch interactive agent creation wizard."""
1007
+ try:
1008
+ from ...cli.interactive.agent_wizard import run_interactive_agent_wizard
1009
+
1010
+ # Run the interactive wizard
1011
+ exit_code = run_interactive_agent_wizard()
1012
+
1013
+ if exit_code == 0:
1014
+ return CommandResult.success_result(
1015
+ "Interactive agent creation completed"
1016
+ )
1017
+ return CommandResult.error_result(
1018
+ "Interactive agent creation failed or cancelled"
1019
+ )
1020
+
1021
+ except Exception as e:
1022
+ return CommandResult.error_result(f"Interactive creation failed: {e}")
1023
+
1024
+ def _manage_local_interactive(self, args) -> CommandResult:
1025
+ """Launch interactive agent management menu."""
1026
+ try:
1027
+ from ...cli.interactive.agent_wizard import run_interactive_agent_manager
1028
+
1029
+ # Run the interactive management menu
1030
+ exit_code = run_interactive_agent_manager()
1031
+
1032
+ if exit_code == 0:
1033
+ return CommandResult.success_result(
1034
+ "Interactive agent management completed"
1035
+ )
1036
+ return CommandResult.error_result(
1037
+ "Interactive agent management failed or cancelled"
1038
+ )
1039
+
1040
+ except Exception as e:
1041
+ return CommandResult.error_result(f"Interactive management failed: {e}")
1042
+
1043
+ def _edit_interactive(self, args) -> CommandResult:
1044
+ """Edit agent configuration interactively."""
1045
+ try:
1046
+ from ...services.agents.local_template_manager import (
1047
+ LocalAgentTemplateManager,
1048
+ )
1049
+
1050
+ agent_id = getattr(args, "agent_id", None)
1051
+ if not agent_id:
1052
+ return CommandResult.error_result(
1053
+ "--agent-id is required for edit-interactive"
1054
+ )
1055
+
1056
+ manager = LocalAgentTemplateManager()
1057
+ template = manager.get_local_template(agent_id)
1058
+
1059
+ if not template:
1060
+ return CommandResult.error_result(f"Local agent '{agent_id}' not found")
1061
+
1062
+ # Get template file path
1063
+ if template.tier == "project":
1064
+ template_file = manager.project_agents_dir / f"{agent_id}.json"
1065
+ else:
1066
+ template_file = manager.user_agents_dir / f"{agent_id}.json"
1067
+
1068
+ # Open in editor
1069
+ import os
1070
+ import subprocess
1071
+
1072
+ editor = os.environ.get("EDITOR", "nano")
1073
+ print(f"Opening {template_file} in {editor}...")
1074
+
1075
+ try:
1076
+ subprocess.run([editor, str(template_file)], check=True)
1077
+ return CommandResult.success_result(
1078
+ f"Agent '{agent_id}' edited successfully"
1079
+ )
1080
+ except subprocess.CalledProcessError:
1081
+ return CommandResult.error_result("Editor exited with error")
1082
+ except FileNotFoundError:
1083
+ return CommandResult.error_result(
1084
+ f"Editor '{editor}' not found. Set EDITOR environment variable."
1085
+ )
1086
+
1087
+ except Exception as e:
1088
+ return CommandResult.error_result(f"Interactive edit failed: {e}")
1089
+
1090
+ def _test_local_agent(self, args) -> CommandResult:
1091
+ """Test a local agent with sample task."""
1092
+ try:
1093
+ from ...services.agents.local_template_manager import (
1094
+ LocalAgentTemplateManager,
1095
+ )
1096
+
1097
+ agent_id = getattr(args, "agent_id", None)
1098
+ if not agent_id:
1099
+ return CommandResult.error_result(
1100
+ "--agent-id is required for test-local"
1101
+ )
1102
+
1103
+ manager = LocalAgentTemplateManager()
1104
+ template = manager.get_local_template(agent_id)
1105
+
1106
+ if not template:
1107
+ return CommandResult.error_result(f"Local agent '{agent_id}' not found")
1108
+
1109
+ # Validate template
1110
+ is_valid, errors = manager.validate_local_template(template)
1111
+
1112
+ if not is_valid:
1113
+ error_msg = f"Agent '{agent_id}' validation failed:\n"
1114
+ error_msg += "\n".join(f" • {error}" for error in errors)
1115
+ return CommandResult.error_result(error_msg)
1116
+
1117
+ # Check if agent is deployed
1118
+ from ...services.agents.deployment.local_template_deployment import (
1119
+ LocalTemplateDeploymentService,
1120
+ )
1121
+
1122
+ deployment_service = LocalTemplateDeploymentService()
1123
+
1124
+ # Test deployment
1125
+ try:
1126
+ success = deployment_service.deploy_single_local_template(
1127
+ agent_id, force=True
1128
+ )
1129
+ if not success:
1130
+ return CommandResult.error_result(
1131
+ f"Failed to deploy agent '{agent_id}' for testing"
1132
+ )
1133
+ except Exception as deploy_error:
1134
+ return CommandResult.error_result(f"Deployment failed: {deploy_error}")
1135
+
1136
+ # Success message with usage instructions
1137
+ success_msg = (
1138
+ f"✅ Agent '{agent_id}' is valid and deployed successfully!\n\n"
1139
+ )
1140
+ success_msg += "🧪 Test your agent:\n"
1141
+ success_msg += (
1142
+ f' claude-mpm run --agent {agent_id} "Test task for this agent"\n\n'
1143
+ )
1144
+ success_msg += "📊 Agent Details:\n"
1145
+ success_msg += f" Name: {template.metadata.get('name', agent_id)}\n"
1146
+ success_msg += (
1147
+ f" Model: {template.capabilities.get('model', 'unknown')}\n"
1148
+ )
1149
+ success_msg += f" Version: {template.agent_version}\n"
1150
+ success_msg += f" Tier: {template.tier}\n"
1151
+
1152
+ if template.parent_agent:
1153
+ success_msg += f" Inherits: {template.parent_agent}\n"
1154
+
1155
+ return CommandResult.success_result(success_msg)
1156
+
1157
+ except Exception as e:
1158
+ return CommandResult.error_result(f"Local agent test failed: {e}")
1159
+
1160
+ def _delete_local_agents(self, args) -> CommandResult:
1161
+ """Delete local agent templates with comprehensive options."""
1162
+ try:
1163
+ from ...services.agents.local_template_manager import (
1164
+ LocalAgentTemplateManager,
1165
+ )
1166
+
1167
+ manager = LocalAgentTemplateManager()
1168
+
1169
+ # Get command arguments
1170
+ agent_ids = getattr(args, "agent_id", [])
1171
+ delete_all = getattr(args, "all", False)
1172
+ tier = getattr(args, "tier", "project")
1173
+ force = getattr(args, "force", False)
1174
+ keep_deployment = getattr(args, "keep_deployment", False)
1175
+ backup = getattr(args, "backup", False)
1176
+
1177
+ # Validate arguments
1178
+ if not agent_ids and not delete_all:
1179
+ return CommandResult.error_result(
1180
+ "Either --agent-id or --all must be specified"
1181
+ )
1182
+
1183
+ if delete_all and agent_ids:
1184
+ return CommandResult.error_result(
1185
+ "Cannot use both --agent-id and --all together"
1186
+ )
1187
+
1188
+ # Get agents to delete
1189
+ if delete_all:
1190
+ # Get all local agents for the specified tier
1191
+ templates = manager.list_local_templates(
1192
+ tier=None if tier == "all" else tier
1193
+ )
1194
+ if not templates:
1195
+ return CommandResult.success_result(
1196
+ f"No local agents found in {tier} tier(s)"
1197
+ )
1198
+ agent_ids = [t.agent_id for t in templates]
1199
+
1200
+ # Strong confirmation for --all
1201
+ if not force:
1202
+ print(
1203
+ f"\n⚠️ WARNING: This will delete ALL {len(agent_ids)} local agents in {tier} tier(s)!"
1204
+ )
1205
+ print("\nAgents to be deleted:")
1206
+ for agent_id in agent_ids:
1207
+ print(f" - {agent_id}")
1208
+
1209
+ confirm = input("\nType 'DELETE ALL' to confirm: ").strip()
1210
+ if confirm != "DELETE ALL":
1211
+ return CommandResult.error_result("Deletion cancelled")
1212
+ else:
1213
+ # Validate that agents exist
1214
+ missing_agents = []
1215
+ for agent_id in agent_ids:
1216
+ template = manager.get_local_template(agent_id)
1217
+ if not template:
1218
+ missing_agents.append(agent_id)
1219
+
1220
+ if missing_agents:
1221
+ return CommandResult.error_result(
1222
+ f"Agent(s) not found: {', '.join(missing_agents)}"
1223
+ )
1224
+
1225
+ # Confirmation for multiple agents
1226
+ if len(agent_ids) > 1 and not force:
1227
+ print(f"\n⚠️ This will delete {len(agent_ids)} agents:")
1228
+ for agent_id in agent_ids:
1229
+ print(f" - {agent_id}")
1230
+
1231
+ confirm = input("\nAre you sure? [y/N]: ").strip().lower()
1232
+ if confirm not in ["y", "yes"]:
1233
+ return CommandResult.error_result("Deletion cancelled")
1234
+
1235
+ # Confirmation for single agent
1236
+ elif len(agent_ids) == 1 and not force:
1237
+ template = manager.get_local_template(agent_ids[0])
1238
+ print("\n📋 Agent to delete:")
1239
+ print(f" ID: {template.agent_id}")
1240
+ print(f" Name: {template.metadata.get('name', template.agent_id)}")
1241
+ print(f" Tier: {template.tier}")
1242
+
1243
+ confirm = input("\nAre you sure? [y/N]: ").strip().lower()
1244
+ if confirm not in ["y", "yes"]:
1245
+ return CommandResult.error_result("Deletion cancelled")
1246
+
1247
+ # Perform deletion
1248
+ if len(agent_ids) == 1:
1249
+ # Single deletion
1250
+ result = manager.delete_local_template(
1251
+ agent_id=agent_ids[0],
1252
+ tier=tier,
1253
+ delete_deployment=not keep_deployment,
1254
+ backup_first=backup,
1255
+ )
1256
+
1257
+ if result["success"]:
1258
+ message = f"✅ Successfully deleted agent '{agent_ids[0]}'"
1259
+ if result["backup_location"]:
1260
+ message += f"\n Backup saved to: {result['backup_location']}"
1261
+ message += f"\n Removed {len(result['deleted_files'])} file(s)"
1262
+ return CommandResult.success_result(message)
1263
+ errors = "\n".join(result["errors"])
1264
+ return CommandResult.error_result(
1265
+ f"Failed to delete agent '{agent_ids[0]}':\n{errors}"
1266
+ )
1267
+ # Multiple deletion
1268
+ results = manager.delete_multiple_templates(
1269
+ agent_ids=agent_ids,
1270
+ tier=tier,
1271
+ delete_deployment=not keep_deployment,
1272
+ backup_first=backup,
1273
+ )
1274
+
1275
+ # Format results
1276
+ message = ""
1277
+ if results["successful"]:
1278
+ message = (
1279
+ f"✅ Successfully deleted {len(results['successful'])} agent(s):\n"
1280
+ )
1281
+ for agent_id in results["successful"]:
1282
+ message += f" - {agent_id}\n"
1283
+
1284
+ if results["failed"]:
1285
+ if message:
1286
+ message += "\n"
1287
+ message += f"❌ Failed to delete {len(results['failed'])} agent(s):\n"
1288
+ for agent_id in results["failed"]:
1289
+ errors = results["details"][agent_id]["errors"]
1290
+ message += f" - {agent_id}: {', '.join(errors)}\n"
1291
+
1292
+ if not message:
1293
+ message = "No agents were deleted"
1294
+
1295
+ return (
1296
+ CommandResult.success_result(message.strip())
1297
+ if results["successful"]
1298
+ else CommandResult.error_result(message.strip())
1299
+ )
1300
+
1301
+ except Exception as e:
1302
+ return CommandResult.error_result(f"Failed to delete local agents: {e}")
1303
+
1304
+ def _show_help(self) -> CommandResult:
1305
+ """Show help for agent manager."""
1306
+ help_text = """
1307
+ Agent Manager - Comprehensive Agent Lifecycle Management
1308
+
1309
+ Interactive Commands (Recommended):
1310
+ create-interactive 🧙‍♂️ Launch step-by-step agent creation wizard
1311
+ manage-local 🔧 Interactive menu for managing local agents
1312
+ edit-interactive ✏️ Edit agent configuration interactively
1313
+ test-local 🧪 Test local agent with validation and deployment
1314
+
1315
+ Standard Commands:
1316
+ list List all agents across tiers with hierarchy
1317
+ create Create a new agent (interactive or with arguments)
1318
+ variant Create an agent variant based on existing agent
1319
+ deploy Deploy agent to project or user tier
1320
+ customize-pm Customize PM instructions via .claude-mpm/INSTRUCTIONS.md
1321
+ show Display detailed agent information
1322
+ test Validate agent configuration
1323
+ templates List available agent templates
1324
+ reset Remove claude-mpm authored agents for clean install
1325
+
1326
+ Local Agent Commands:
1327
+ create-local Create a local JSON agent template in .claude-mpm/agents/
1328
+ deploy-local Deploy local JSON templates to Claude Code
1329
+ list-local List all local agent templates
1330
+ sync-local Synchronize local templates with deployed agents
1331
+ export-local Export local templates to a directory
1332
+ import-local Import templates from a directory
1333
+ delete-local Delete local agent templates with safety checks
1334
+
1335
+ Interactive Examples:
1336
+ claude-mpm agent-manager create-interactive
1337
+ claude-mpm agent-manager manage-local
1338
+ claude-mpm agent-manager edit-interactive --agent-id my-agent
1339
+ claude-mpm agent-manager test-local --agent-id my-agent
1340
+
1341
+ Standard Examples:
1342
+ claude-mpm agent-manager list
1343
+ claude-mpm agent-manager create --id my-agent --name "My Agent"
1344
+ claude-mpm agent-manager variant --base research --id research-v2
1345
+ claude-mpm agent-manager deploy --agent-id my-agent --tier user
1346
+ claude-mpm agent-manager customize-pm --level project
1347
+ claude-mpm agent-manager reset --dry-run
1348
+ claude-mpm agent-manager reset --force --project-only
1349
+
1350
+ Local Agent Examples:
1351
+ claude-mpm agent-manager create-local --agent-id custom-research --name "Custom Research"
1352
+ claude-mpm agent-manager deploy-local --agent-id custom-research
1353
+ claude-mpm agent-manager list-local --tier project
1354
+ claude-mpm agent-manager sync-local
1355
+ claude-mpm agent-manager export-local --output ./my-agents
1356
+ claude-mpm agent-manager import-local --input ./shared-agents --tier user
1357
+ claude-mpm agent-manager delete-local --agent-id custom-qa
1358
+ claude-mpm agent-manager delete-local --agent-id qa research --force
1359
+ claude-mpm agent-manager delete-local --all --tier project --backup
1360
+
1361
+ Interactive Features:
1362
+ ✨ Step-by-step guided agent creation
1363
+ 🎯 Intelligent defaults and suggestions
1364
+ 🔍 Real-time validation with helpful errors
1365
+ 👁️ Preview configurations before creation
1366
+ 🏗️ Inherit from existing system agents
1367
+ 📝 Management menu for all local agents
1368
+ 🚀 One-click deployment and testing
1369
+
1370
+ Notes:
1371
+ • Interactive mode provides the best user experience
1372
+ • PM customization writes to .claude-mpm/INSTRUCTIONS.md, not CLAUDE.md
1373
+ • Local agents are stored as JSON templates in .claude-mpm/agents/
1374
+ • Local project agents override system agents with the same name
1375
+ • Project name is used as the "author" field for local agents
1376
+ """
1377
+ return CommandResult.success_result(help_text)
1378
+
1379
+
1380
+ # Module-level function for CLI integration
1381
+ def manage_agent_manager(args) -> int:
1382
+ """Entry point for agent-manager command from CLI.
1383
+
1384
+ Args:
1385
+ args: Parsed command line arguments
1386
+
1387
+ Returns:
1388
+ Exit code (0 for success, non-zero for failure)
1389
+ """
1390
+ command = AgentManagerCommand()
1391
+ result = command.run(args)
1392
+
1393
+ if result.success:
1394
+ # Handle JSON output format
1395
+ output_format = getattr(args, "format", OutputFormat.TEXT)
1396
+ if str(output_format).lower() == OutputFormat.JSON and result.data is not None:
1397
+ print(json.dumps(result.data, indent=2))
1398
+ elif result.message:
1399
+ print(result.message)
1400
+ return 0
1401
+ if result.message:
1402
+ print(f"Error: {result.message}", file=sys.stderr)
1403
+ return 1