claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__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 (950) 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_OUTPUT_STYLE.md +290 -0
  8. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  9. claude_mpm/agents/MEMORY.md +72 -0
  10. claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
  11. claude_mpm/agents/WORKFLOW.md +111 -0
  12. claude_mpm/agents/__init__.py +92 -80
  13. claude_mpm/agents/agent-template.yaml +83 -0
  14. claude_mpm/agents/agent_loader.py +560 -745
  15. claude_mpm/agents/agent_loader_integration.py +53 -55
  16. claude_mpm/agents/agents_metadata.py +186 -27
  17. claude_mpm/agents/async_agent_loader.py +436 -0
  18. claude_mpm/agents/base_agent.json +8 -4
  19. claude_mpm/agents/frontmatter_validator.py +754 -0
  20. claude_mpm/agents/system_agent_config.py +222 -155
  21. claude_mpm/agents/templates/README.md +465 -0
  22. claude_mpm/agents/templates/__init__.py +17 -13
  23. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  24. claude_mpm/agents/templates/context-management-examples.md +544 -0
  25. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  26. claude_mpm/agents/templates/pm-examples.md +474 -0
  27. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  28. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  29. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  30. claude_mpm/agents/templates/response-format.md +583 -0
  31. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  32. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  33. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  34. claude_mpm/agents/templates/validation-templates.md +312 -0
  35. claude_mpm/cli/__init__.py +90 -128
  36. claude_mpm/cli/__main__.py +33 -0
  37. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  38. claude_mpm/cli/commands/__init__.py +36 -12
  39. claude_mpm/cli/commands/agent_manager.py +1403 -0
  40. claude_mpm/cli/commands/agent_source.py +774 -0
  41. claude_mpm/cli/commands/agent_state_manager.py +335 -0
  42. claude_mpm/cli/commands/agents.py +2503 -168
  43. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  44. claude_mpm/cli/commands/agents_discover.py +338 -0
  45. claude_mpm/cli/commands/aggregate.py +540 -0
  46. claude_mpm/cli/commands/analyze.py +553 -0
  47. claude_mpm/cli/commands/analyze_code.py +528 -0
  48. claude_mpm/cli/commands/auto_configure.py +1053 -0
  49. claude_mpm/cli/commands/cleanup.py +588 -0
  50. claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
  51. claude_mpm/cli/commands/config.py +586 -0
  52. claude_mpm/cli/commands/configure.py +2654 -0
  53. claude_mpm/cli/commands/configure_agent_display.py +282 -0
  54. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  55. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  56. claude_mpm/cli/commands/configure_models.py +18 -0
  57. claude_mpm/cli/commands/configure_navigation.py +184 -0
  58. claude_mpm/cli/commands/configure_paths.py +104 -0
  59. claude_mpm/cli/commands/configure_persistence.py +254 -0
  60. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  61. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  62. claude_mpm/cli/commands/configure_validators.py +73 -0
  63. claude_mpm/cli/commands/dashboard.py +286 -0
  64. claude_mpm/cli/commands/debug.py +1386 -0
  65. claude_mpm/cli/commands/doctor.py +243 -0
  66. claude_mpm/cli/commands/hook_errors.py +277 -0
  67. claude_mpm/cli/commands/info.py +195 -74
  68. claude_mpm/cli/commands/local_deploy.py +534 -0
  69. claude_mpm/cli/commands/mcp.py +205 -0
  70. claude_mpm/cli/commands/mcp_command_router.py +161 -0
  71. claude_mpm/cli/commands/mcp_config.py +154 -0
  72. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  73. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  74. claude_mpm/cli/commands/mcp_install_commands.py +346 -0
  75. claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
  76. claude_mpm/cli/commands/mcp_server_commands.py +155 -0
  77. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  78. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  79. claude_mpm/cli/commands/memory.py +585 -846
  80. claude_mpm/cli/commands/monitor.py +228 -310
  81. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  82. claude_mpm/cli/commands/mpm_init/core.py +759 -0
  83. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  84. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  85. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  86. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  87. claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
  88. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  89. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  90. claude_mpm/cli/commands/postmortem.py +401 -0
  91. claude_mpm/cli/commands/profile.py +276 -0
  92. claude_mpm/cli/commands/run.py +910 -488
  93. claude_mpm/cli/commands/search.py +458 -0
  94. claude_mpm/cli/commands/skill_source.py +694 -0
  95. claude_mpm/cli/commands/skills.py +1246 -0
  96. claude_mpm/cli/commands/summarize.py +413 -0
  97. claude_mpm/cli/commands/tickets.py +536 -53
  98. claude_mpm/cli/commands/uninstall.py +176 -0
  99. claude_mpm/cli/commands/upgrade.py +152 -0
  100. claude_mpm/cli/commands/verify.py +119 -0
  101. claude_mpm/cli/executor.py +297 -0
  102. claude_mpm/cli/helpers.py +105 -0
  103. claude_mpm/cli/interactive/__init__.py +21 -0
  104. claude_mpm/cli/interactive/agent_wizard.py +1947 -0
  105. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  106. claude_mpm/cli/parser.py +87 -563
  107. claude_mpm/cli/parsers/__init__.py +35 -0
  108. claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
  109. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  110. claude_mpm/cli/parsers/agents_parser.py +575 -0
  111. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  112. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  113. claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
  114. claude_mpm/cli/parsers/base_parser.py +644 -0
  115. claude_mpm/cli/parsers/config_parser.py +208 -0
  116. claude_mpm/cli/parsers/configure_parser.py +138 -0
  117. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  118. claude_mpm/cli/parsers/debug_parser.py +319 -0
  119. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  120. claude_mpm/cli/parsers/mcp_parser.py +195 -0
  121. claude_mpm/cli/parsers/memory_parser.py +138 -0
  122. claude_mpm/cli/parsers/monitor_parser.py +142 -0
  123. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  124. claude_mpm/cli/parsers/profile_parser.py +147 -0
  125. claude_mpm/cli/parsers/run_parser.py +157 -0
  126. claude_mpm/cli/parsers/search_parser.py +245 -0
  127. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  128. claude_mpm/cli/parsers/skills_parser.py +277 -0
  129. claude_mpm/cli/parsers/source_parser.py +138 -0
  130. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  131. claude_mpm/cli/shared/__init__.py +40 -0
  132. claude_mpm/cli/shared/argument_patterns.py +205 -0
  133. claude_mpm/cli/shared/base_command.py +242 -0
  134. claude_mpm/cli/shared/error_handling.py +242 -0
  135. claude_mpm/cli/shared/output_formatters.py +241 -0
  136. claude_mpm/cli/startup.py +1743 -0
  137. claude_mpm/cli/startup_display.py +480 -0
  138. claude_mpm/cli/startup_logging.py +839 -0
  139. claude_mpm/cli/utils.py +136 -47
  140. claude_mpm/cli_module/__init__.py +6 -6
  141. claude_mpm/cli_module/args.py +188 -140
  142. claude_mpm/cli_module/commands.py +79 -70
  143. claude_mpm/cli_module/migration_example.py +42 -64
  144. claude_mpm/commands/__init__.py +14 -0
  145. claude_mpm/commands/mpm-config.md +28 -0
  146. claude_mpm/commands/mpm-doctor.md +20 -0
  147. claude_mpm/commands/mpm-help.md +20 -0
  148. claude_mpm/commands/mpm-init.md +120 -0
  149. claude_mpm/commands/mpm-monitor.md +31 -0
  150. claude_mpm/commands/mpm-organize.md +120 -0
  151. claude_mpm/commands/mpm-postmortem.md +21 -0
  152. claude_mpm/commands/mpm-session-resume.md +30 -0
  153. claude_mpm/commands/mpm-status.md +20 -0
  154. claude_mpm/commands/mpm-ticket-view.md +109 -0
  155. claude_mpm/commands/mpm-version.md +20 -0
  156. claude_mpm/commands/mpm.md +31 -0
  157. claude_mpm/config/__init__.py +42 -2
  158. claude_mpm/config/agent_config.py +402 -0
  159. claude_mpm/config/agent_presets.py +488 -0
  160. claude_mpm/config/agent_sources.py +352 -0
  161. claude_mpm/config/experimental_features.py +217 -0
  162. claude_mpm/config/model_config.py +428 -0
  163. claude_mpm/config/paths.py +258 -0
  164. claude_mpm/config/skill_presets.py +392 -0
  165. claude_mpm/config/skill_sources.py +590 -0
  166. claude_mpm/config/socketio_config.py +125 -83
  167. claude_mpm/constants.py +132 -22
  168. claude_mpm/core/__init__.py +62 -36
  169. claude_mpm/core/agent_name_normalizer.py +71 -73
  170. claude_mpm/core/agent_registry.py +385 -492
  171. claude_mpm/core/agent_session_manager.py +81 -70
  172. claude_mpm/core/api_validator.py +330 -0
  173. claude_mpm/core/base_service.py +159 -122
  174. claude_mpm/core/cache.py +560 -0
  175. claude_mpm/core/claude_runner.py +696 -916
  176. claude_mpm/core/config.py +613 -122
  177. claude_mpm/core/config_aliases.py +74 -73
  178. claude_mpm/core/config_constants.py +314 -0
  179. claude_mpm/core/constants.py +361 -0
  180. claude_mpm/core/container.py +646 -104
  181. claude_mpm/core/enums.py +452 -0
  182. claude_mpm/core/error_handler.py +623 -0
  183. claude_mpm/core/exceptions.py +536 -0
  184. claude_mpm/core/factories.py +105 -109
  185. claude_mpm/core/file_utils.py +764 -0
  186. claude_mpm/core/framework/__init__.py +25 -0
  187. claude_mpm/core/framework/formatters/__init__.py +11 -0
  188. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  189. claude_mpm/core/framework/formatters/content_formatter.py +278 -0
  190. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  191. claude_mpm/core/framework/loaders/__init__.py +13 -0
  192. claude_mpm/core/framework/loaders/agent_loader.py +213 -0
  193. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  194. claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
  195. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  196. claude_mpm/core/framework/processors/__init__.py +11 -0
  197. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  198. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  199. claude_mpm/core/framework/processors/template_processor.py +244 -0
  200. claude_mpm/core/framework_loader.py +485 -414
  201. claude_mpm/core/hook_error_memory.py +381 -0
  202. claude_mpm/core/hook_manager.py +246 -86
  203. claude_mpm/core/hook_performance_config.py +147 -0
  204. claude_mpm/core/injectable_service.py +72 -63
  205. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  206. claude_mpm/core/interactive_session.py +670 -0
  207. claude_mpm/core/interfaces.py +570 -164
  208. claude_mpm/core/lazy.py +467 -0
  209. claude_mpm/core/log_manager.py +707 -0
  210. claude_mpm/core/logger.py +295 -134
  211. claude_mpm/core/logging_config.py +474 -0
  212. claude_mpm/core/logging_utils.py +520 -0
  213. claude_mpm/core/minimal_framework_loader.py +24 -22
  214. claude_mpm/core/mixins.py +30 -29
  215. claude_mpm/core/oneshot_session.py +594 -0
  216. claude_mpm/core/optimized_agent_loader.py +479 -0
  217. claude_mpm/core/optimized_startup.py +554 -0
  218. claude_mpm/core/output_style_manager.py +483 -0
  219. claude_mpm/core/pm_hook_interceptor.py +197 -82
  220. claude_mpm/core/protocols/__init__.py +23 -0
  221. claude_mpm/core/protocols/runner_protocol.py +103 -0
  222. claude_mpm/core/protocols/session_protocol.py +131 -0
  223. claude_mpm/core/service_registry.py +153 -116
  224. claude_mpm/core/session_manager.py +179 -64
  225. claude_mpm/core/shared/__init__.py +17 -0
  226. claude_mpm/core/shared/config_loader.py +326 -0
  227. claude_mpm/core/shared/path_resolver.py +281 -0
  228. claude_mpm/core/shared/singleton_manager.py +221 -0
  229. claude_mpm/core/socketio_pool.py +400 -137
  230. claude_mpm/core/system_context.py +38 -0
  231. claude_mpm/core/tool_access_control.py +64 -57
  232. claude_mpm/core/types.py +307 -0
  233. claude_mpm/core/typing_utils.py +553 -0
  234. claude_mpm/core/unified_agent_registry.py +969 -0
  235. claude_mpm/core/unified_config.py +570 -0
  236. claude_mpm/core/unified_paths.py +941 -0
  237. claude_mpm/dashboard/__init__.py +12 -0
  238. claude_mpm/dashboard/api/simple_directory.py +261 -0
  239. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  240. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  241. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  242. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  249. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  250. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  251. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  252. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  253. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  254. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  255. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  256. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  257. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  258. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  259. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  260. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  261. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  262. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  263. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  264. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  265. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  266. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  267. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  268. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  269. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  270. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  271. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  272. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  273. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  274. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  275. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  276. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  277. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  278. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  279. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  280. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  281. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  282. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  283. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  284. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  285. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  286. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  287. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  288. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  289. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  290. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  291. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
  292. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  293. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  303. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  305. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  306. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  307. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  308. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  309. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  310. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  311. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  312. claude_mpm/experimental/__init__.py +10 -0
  313. claude_mpm/experimental/cli_enhancements.py +104 -89
  314. claude_mpm/generators/__init__.py +1 -1
  315. claude_mpm/generators/agent_profile_generator.py +76 -66
  316. claude_mpm/hooks/__init__.py +37 -1
  317. claude_mpm/hooks/base_hook.py +37 -32
  318. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  319. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  320. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  321. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  322. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  323. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  324. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  325. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  326. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  327. claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
  328. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  329. claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
  330. claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
  331. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
  332. claude_mpm/hooks/claude_hooks/installer.py +806 -0
  333. claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
  334. claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
  335. claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
  336. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  337. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  338. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  339. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  340. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  341. claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
  342. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
  343. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  344. claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
  345. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  346. claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
  347. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  348. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  349. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  350. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  351. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  352. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  353. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  354. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  355. claude_mpm/hooks/memory_integration_hook.py +201 -107
  356. claude_mpm/hooks/session_resume_hook.py +121 -0
  357. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  358. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  359. claude_mpm/hooks/tool_call_interceptor.py +92 -76
  360. claude_mpm/hooks/validation_hooks.py +62 -54
  361. claude_mpm/init.py +518 -83
  362. claude_mpm/models/__init__.py +9 -9
  363. claude_mpm/models/agent_definition.py +40 -23
  364. claude_mpm/models/agent_session.py +538 -0
  365. claude_mpm/models/git_repository.py +198 -0
  366. claude_mpm/models/resume_log.py +340 -0
  367. claude_mpm/schemas/__init__.py +12 -0
  368. claude_mpm/scripts/__init__.py +15 -0
  369. claude_mpm/scripts/claude-hook-handler.sh +227 -0
  370. claude_mpm/scripts/launch_monitor.py +165 -0
  371. claude_mpm/scripts/mpm_doctor.py +322 -0
  372. claude_mpm/scripts/socketio_daemon.py +189 -200
  373. claude_mpm/scripts/start_activity_logging.py +91 -0
  374. claude_mpm/services/__init__.py +208 -39
  375. claude_mpm/services/agent_capabilities_service.py +266 -0
  376. claude_mpm/services/agents/__init__.py +89 -0
  377. claude_mpm/services/agents/agent_builder.py +514 -0
  378. claude_mpm/services/agents/agent_preset_service.py +238 -0
  379. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  380. claude_mpm/services/agents/agent_review_service.py +280 -0
  381. claude_mpm/services/agents/agent_selection_service.py +484 -0
  382. claude_mpm/services/agents/auto_config_manager.py +796 -0
  383. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  384. claude_mpm/services/agents/cache_git_manager.py +621 -0
  385. claude_mpm/services/agents/deployment/__init__.py +21 -0
  386. claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
  387. claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
  388. claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
  389. claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
  390. claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
  391. claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
  392. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
  393. claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
  394. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
  395. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
  396. claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
  397. claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
  398. claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
  399. claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
  400. claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
  401. claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
  402. claude_mpm/services/agents/deployment/agent_validator.py +376 -0
  403. claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
  404. claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
  405. claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
  406. claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
  407. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  408. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  409. claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
  410. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  411. claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
  412. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  413. claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
  414. claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
  415. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  416. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  417. claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
  418. claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
  419. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
  421. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  422. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  423. claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
  424. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
  425. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  426. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  427. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
  428. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  429. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  430. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
  431. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
  432. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
  433. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
  434. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
  435. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  436. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
  437. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  438. claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
  439. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
  440. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
  441. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  442. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  443. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  444. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  445. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  446. claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
  447. claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
  448. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  449. claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
  450. claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
  451. claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
  452. claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
  453. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  454. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  455. claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
  456. claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
  457. claude_mpm/services/agents/git_source_manager.py +682 -0
  458. claude_mpm/services/agents/loading/__init__.py +11 -0
  459. claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
  460. claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
  461. claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
  462. claude_mpm/services/agents/local_template_manager.py +784 -0
  463. claude_mpm/services/agents/management/__init__.py +9 -0
  464. claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
  465. claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
  466. claude_mpm/services/agents/memory/__init__.py +22 -0
  467. claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
  468. claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
  469. claude_mpm/services/agents/memory/content_manager.py +470 -0
  470. claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
  471. claude_mpm/services/agents/memory/memory_file_service.py +129 -0
  472. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  473. claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
  474. claude_mpm/services/agents/memory/template_generator.py +83 -0
  475. claude_mpm/services/agents/observers.py +547 -0
  476. claude_mpm/services/agents/recommender.py +617 -0
  477. claude_mpm/services/agents/registry/__init__.py +30 -0
  478. claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
  479. claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
  480. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  481. claude_mpm/services/agents/sources/__init__.py +13 -0
  482. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  483. claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
  484. claude_mpm/services/agents/startup_sync.py +259 -0
  485. claude_mpm/services/agents/toolchain_detector.py +478 -0
  486. claude_mpm/services/analysis/__init__.py +35 -0
  487. claude_mpm/services/analysis/clone_detector.py +1030 -0
  488. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  489. claude_mpm/services/analysis/postmortem_service.py +765 -0
  490. claude_mpm/services/async_session_logger.py +665 -0
  491. claude_mpm/services/claude_session_logger.py +321 -0
  492. claude_mpm/services/cli/__init__.py +18 -0
  493. claude_mpm/services/cli/agent_cleanup_service.py +408 -0
  494. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  495. claude_mpm/services/cli/agent_listing_service.py +463 -0
  496. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  497. claude_mpm/services/cli/agent_validation_service.py +590 -0
  498. claude_mpm/services/cli/memory_crud_service.py +622 -0
  499. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  500. claude_mpm/services/cli/resume_service.py +617 -0
  501. claude_mpm/services/cli/session_manager.py +604 -0
  502. claude_mpm/services/cli/session_pause_manager.py +504 -0
  503. claude_mpm/services/cli/session_resume_helper.py +372 -0
  504. claude_mpm/services/cli/startup_checker.py +362 -0
  505. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  506. claude_mpm/services/command_deployment_service.py +446 -0
  507. claude_mpm/services/command_handler_service.py +221 -0
  508. claude_mpm/services/communication/__init__.py +22 -0
  509. claude_mpm/services/core/__init__.py +108 -0
  510. claude_mpm/services/core/base.py +269 -0
  511. claude_mpm/services/core/cache_manager.py +309 -0
  512. claude_mpm/services/core/interfaces/__init__.py +273 -0
  513. claude_mpm/services/core/interfaces/agent.py +514 -0
  514. claude_mpm/services/core/interfaces/communication.py +316 -0
  515. claude_mpm/services/core/interfaces/health.py +169 -0
  516. claude_mpm/services/core/interfaces/infrastructure.py +357 -0
  517. claude_mpm/services/core/interfaces/model.py +281 -0
  518. claude_mpm/services/core/interfaces/process.py +372 -0
  519. claude_mpm/services/core/interfaces/project.py +121 -0
  520. claude_mpm/services/core/interfaces/restart.py +307 -0
  521. claude_mpm/services/core/interfaces/service.py +405 -0
  522. claude_mpm/services/core/interfaces/stability.py +260 -0
  523. claude_mpm/services/core/interfaces.py +81 -0
  524. claude_mpm/services/core/memory_manager.py +682 -0
  525. claude_mpm/services/core/models/__init__.py +70 -0
  526. claude_mpm/services/core/models/agent_config.py +384 -0
  527. claude_mpm/services/core/models/health.py +162 -0
  528. claude_mpm/services/core/models/process.py +239 -0
  529. claude_mpm/services/core/models/restart.py +302 -0
  530. claude_mpm/services/core/models/stability.py +264 -0
  531. claude_mpm/services/core/models/toolchain.py +306 -0
  532. claude_mpm/services/core/path_resolver.py +517 -0
  533. claude_mpm/services/core/service_container.py +520 -0
  534. claude_mpm/services/core/service_interfaces.py +436 -0
  535. claude_mpm/services/diagnostics/__init__.py +18 -0
  536. claude_mpm/services/diagnostics/checks/__init__.py +38 -0
  537. claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
  538. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  539. claude_mpm/services/diagnostics/checks/base_check.py +60 -0
  540. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  541. claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
  542. claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
  543. claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
  544. claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
  545. claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
  546. claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
  547. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  548. claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
  549. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  550. claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
  551. claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
  552. claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
  553. claude_mpm/services/diagnostics/models.py +138 -0
  554. claude_mpm/services/event_aggregator.py +582 -0
  555. claude_mpm/services/event_bus/__init__.py +18 -0
  556. claude_mpm/services/event_bus/config.py +186 -0
  557. claude_mpm/services/event_bus/direct_relay.py +312 -0
  558. claude_mpm/services/event_bus/event_bus.py +396 -0
  559. claude_mpm/services/event_bus/relay.py +326 -0
  560. claude_mpm/services/events/__init__.py +44 -0
  561. claude_mpm/services/events/consumers/__init__.py +18 -0
  562. claude_mpm/services/events/consumers/dead_letter.py +306 -0
  563. claude_mpm/services/events/consumers/logging.py +184 -0
  564. claude_mpm/services/events/consumers/metrics.py +241 -0
  565. claude_mpm/services/events/consumers/socketio.py +377 -0
  566. claude_mpm/services/events/core.py +480 -0
  567. claude_mpm/services/events/interfaces.py +214 -0
  568. claude_mpm/services/events/producers/__init__.py +14 -0
  569. claude_mpm/services/events/producers/hook.py +269 -0
  570. claude_mpm/services/events/producers/system.py +329 -0
  571. claude_mpm/services/exceptions.py +433 -353
  572. claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
  573. claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
  574. claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
  575. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
  576. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
  577. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
  578. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
  579. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
  580. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  581. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  582. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  583. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  584. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
  585. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  586. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  587. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
  588. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
  589. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  590. claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
  591. claude_mpm/services/git/__init__.py +21 -0
  592. claude_mpm/services/git/git_operations_service.py +579 -0
  593. claude_mpm/services/github/__init__.py +21 -0
  594. claude_mpm/services/github/github_cli_service.py +397 -0
  595. claude_mpm/services/hook_installer_service.py +506 -0
  596. claude_mpm/services/hook_service.py +159 -111
  597. claude_mpm/services/infrastructure/__init__.py +52 -0
  598. claude_mpm/services/infrastructure/context_preservation.py +569 -0
  599. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  600. claude_mpm/services/infrastructure/logging.py +209 -0
  601. claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
  602. claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
  603. claude_mpm/services/infrastructure/monitoring/base.py +122 -0
  604. claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
  605. claude_mpm/services/infrastructure/monitoring/network.py +219 -0
  606. claude_mpm/services/infrastructure/monitoring/process.py +343 -0
  607. claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
  608. claude_mpm/services/infrastructure/monitoring/service.py +368 -0
  609. claude_mpm/services/infrastructure/monitoring.py +71 -0
  610. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  611. claude_mpm/services/instructions/__init__.py +9 -0
  612. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  613. claude_mpm/services/local_ops/__init__.py +155 -0
  614. claude_mpm/services/local_ops/crash_detector.py +257 -0
  615. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  616. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  617. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  618. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  619. claude_mpm/services/local_ops/health_manager.py +427 -0
  620. claude_mpm/services/local_ops/log_monitor.py +396 -0
  621. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  622. claude_mpm/services/local_ops/process_manager.py +595 -0
  623. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  624. claude_mpm/services/local_ops/restart_manager.py +401 -0
  625. claude_mpm/services/local_ops/restart_policy.py +387 -0
  626. claude_mpm/services/local_ops/state_manager.py +372 -0
  627. claude_mpm/services/local_ops/unified_manager.py +600 -0
  628. claude_mpm/services/mcp_config_manager.py +1542 -0
  629. claude_mpm/services/mcp_service_verifier.py +732 -0
  630. claude_mpm/services/memory/__init__.py +19 -0
  631. claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
  632. claude_mpm/services/memory/cache/__init__.py +14 -0
  633. claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
  634. claude_mpm/services/memory/cache/simple_cache.py +331 -0
  635. claude_mpm/services/memory/failure_tracker.py +578 -0
  636. claude_mpm/services/memory/indexed_memory.py +648 -0
  637. claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
  638. claude_mpm/services/memory/router.py +951 -0
  639. claude_mpm/services/memory_hook_service.py +470 -0
  640. claude_mpm/services/model/__init__.py +147 -0
  641. claude_mpm/services/model/base_provider.py +365 -0
  642. claude_mpm/services/model/claude_provider.py +412 -0
  643. claude_mpm/services/model/model_router.py +452 -0
  644. claude_mpm/services/model/ollama_provider.py +415 -0
  645. claude_mpm/services/monitor/__init__.py +20 -0
  646. claude_mpm/services/monitor/daemon.py +698 -0
  647. claude_mpm/services/monitor/daemon_manager.py +1076 -0
  648. claude_mpm/services/monitor/event_emitter.py +350 -0
  649. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  650. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  651. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  652. claude_mpm/services/monitor/handlers/file.py +264 -0
  653. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  654. claude_mpm/services/monitor/management/__init__.py +18 -0
  655. claude_mpm/services/monitor/management/health.py +124 -0
  656. claude_mpm/services/monitor/management/lifecycle.py +730 -0
  657. claude_mpm/services/monitor/server.py +1493 -0
  658. claude_mpm/services/monitor_build_service.py +349 -0
  659. claude_mpm/services/native_agent_converter.py +356 -0
  660. claude_mpm/services/orphan_detection.py +786 -0
  661. claude_mpm/services/pm_skills_deployer.py +707 -0
  662. claude_mpm/services/port_manager.py +597 -0
  663. claude_mpm/services/pr/__init__.py +14 -0
  664. claude_mpm/services/pr/pr_template_service.py +329 -0
  665. claude_mpm/services/profile_manager.py +337 -0
  666. claude_mpm/services/project/__init__.py +44 -0
  667. claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
  668. claude_mpm/services/project/analyzer_v2.py +566 -0
  669. claude_mpm/services/project/architecture_analyzer.py +461 -0
  670. claude_mpm/services/project/archive_manager.py +1045 -0
  671. claude_mpm/services/project/dependency_analyzer.py +462 -0
  672. claude_mpm/services/project/detection_strategies.py +719 -0
  673. claude_mpm/services/project/documentation_manager.py +554 -0
  674. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  675. claude_mpm/services/project/language_analyzer.py +265 -0
  676. claude_mpm/services/project/metrics_collector.py +407 -0
  677. claude_mpm/services/project/project_organizer.py +1009 -0
  678. claude_mpm/services/project/registry.py +636 -0
  679. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  680. claude_mpm/services/project_port_allocator.py +596 -0
  681. claude_mpm/services/recovery_manager.py +293 -240
  682. claude_mpm/services/response_tracker.py +267 -0
  683. claude_mpm/services/runner_configuration_service.py +605 -0
  684. claude_mpm/services/self_upgrade_service.py +608 -0
  685. claude_mpm/services/session_management_service.py +314 -0
  686. claude_mpm/services/session_manager.py +380 -0
  687. claude_mpm/services/shared/__init__.py +21 -0
  688. claude_mpm/services/shared/async_service_base.py +216 -0
  689. claude_mpm/services/shared/config_service_base.py +301 -0
  690. claude_mpm/services/shared/lifecycle_service_base.py +308 -0
  691. claude_mpm/services/shared/manager_base.py +315 -0
  692. claude_mpm/services/shared/service_factory.py +309 -0
  693. claude_mpm/services/skills/__init__.py +21 -0
  694. claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
  695. claude_mpm/services/skills/selective_skill_deployer.py +744 -0
  696. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  697. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  698. claude_mpm/services/skills_config.py +547 -0
  699. claude_mpm/services/skills_deployer.py +1168 -0
  700. claude_mpm/services/socketio/__init__.py +25 -0
  701. claude_mpm/services/socketio/client_proxy.py +229 -0
  702. claude_mpm/services/socketio/dashboard_server.py +362 -0
  703. claude_mpm/services/socketio/event_normalizer.py +798 -0
  704. claude_mpm/services/socketio/handlers/__init__.py +30 -0
  705. claude_mpm/services/socketio/handlers/base.py +136 -0
  706. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  707. claude_mpm/services/socketio/handlers/connection.py +643 -0
  708. claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
  709. claude_mpm/services/socketio/handlers/file.py +263 -0
  710. claude_mpm/services/socketio/handlers/git.py +962 -0
  711. claude_mpm/services/socketio/handlers/hook.py +211 -0
  712. claude_mpm/services/socketio/handlers/memory.py +26 -0
  713. claude_mpm/services/socketio/handlers/project.py +24 -0
  714. claude_mpm/services/socketio/handlers/registry.py +214 -0
  715. claude_mpm/services/socketio/migration_utils.py +343 -0
  716. claude_mpm/services/socketio/monitor_client.py +364 -0
  717. claude_mpm/services/socketio/server/__init__.py +18 -0
  718. claude_mpm/services/socketio/server/broadcaster.py +569 -0
  719. claude_mpm/services/socketio/server/connection_manager.py +579 -0
  720. claude_mpm/services/socketio/server/core.py +1079 -0
  721. claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
  722. claude_mpm/services/socketio/server/main.py +501 -0
  723. claude_mpm/services/socketio_client_manager.py +173 -143
  724. claude_mpm/services/socketio_server.py +38 -1657
  725. claude_mpm/services/subprocess_launcher_service.py +322 -0
  726. claude_mpm/services/system_instructions_service.py +270 -0
  727. claude_mpm/services/ticket_manager.py +25 -209
  728. claude_mpm/services/ticket_services/__init__.py +26 -0
  729. claude_mpm/services/ticket_services/crud_service.py +328 -0
  730. claude_mpm/services/ticket_services/formatter_service.py +290 -0
  731. claude_mpm/services/ticket_services/search_service.py +324 -0
  732. claude_mpm/services/ticket_services/validation_service.py +303 -0
  733. claude_mpm/services/ticket_services/workflow_service.py +244 -0
  734. claude_mpm/services/unified/__init__.py +65 -0
  735. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  736. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  737. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  738. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  739. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  740. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  741. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  742. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  743. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  744. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  745. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  746. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  747. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  748. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  749. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  750. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  751. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  752. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  753. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  754. claude_mpm/services/unified/interfaces.py +475 -0
  755. claude_mpm/services/unified/migration.py +509 -0
  756. claude_mpm/services/unified/strategies.py +534 -0
  757. claude_mpm/services/unified/unified_analyzer.py +542 -0
  758. claude_mpm/services/unified/unified_config.py +691 -0
  759. claude_mpm/services/unified/unified_deployment.py +466 -0
  760. claude_mpm/services/utility_service.py +280 -0
  761. claude_mpm/services/version_control/__init__.py +34 -37
  762. claude_mpm/services/version_control/branch_strategy.py +26 -17
  763. claude_mpm/services/version_control/conflict_resolution.py +52 -36
  764. claude_mpm/services/version_control/git_operations.py +183 -49
  765. claude_mpm/services/version_control/semantic_versioning.py +172 -61
  766. claude_mpm/services/version_control/version_parser.py +546 -0
  767. claude_mpm/services/version_service.py +379 -0
  768. claude_mpm/services/visualization/__init__.py +15 -0
  769. claude_mpm/services/visualization/mermaid_generator.py +937 -0
  770. claude_mpm/skills/__init__.py +42 -0
  771. claude_mpm/skills/agent_skills_injector.py +324 -0
  772. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  773. claude_mpm/skills/bundled/__init__.py +6 -0
  774. claude_mpm/skills/bundled/api-documentation.md +393 -0
  775. claude_mpm/skills/bundled/async-testing.md +571 -0
  776. claude_mpm/skills/bundled/code-review.md +143 -0
  777. claude_mpm/skills/bundled/database-migration.md +199 -0
  778. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  779. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  780. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  781. claude_mpm/skills/bundled/git-workflow.md +414 -0
  782. claude_mpm/skills/bundled/imagemagick.md +204 -0
  783. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  784. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  785. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  786. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  787. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  788. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  789. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  790. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  791. claude_mpm/skills/bundled/pdf.md +141 -0
  792. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  793. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  794. claude_mpm/skills/bundled/security-scanning.md +439 -0
  795. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  796. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +405 -0
  806. claude_mpm/skills/skills_registry.py +347 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/__init__.py +9 -0
  809. claude_mpm/storage/state_storage.py +546 -0
  810. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  811. claude_mpm/templates/questions/__init__.py +38 -0
  812. claude_mpm/templates/questions/base.py +193 -0
  813. claude_mpm/templates/questions/pr_strategy.py +311 -0
  814. claude_mpm/templates/questions/project_init.py +385 -0
  815. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  816. claude_mpm/ticket_wrapper.py +2 -2
  817. claude_mpm/tools/__init__.py +10 -0
  818. claude_mpm/tools/__main__.py +208 -0
  819. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  820. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  821. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  822. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  823. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  824. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  825. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  826. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  827. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  828. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  829. claude_mpm/tools/code_tree_builder.py +631 -0
  830. claude_mpm/tools/code_tree_events.py +420 -0
  831. claude_mpm/tools/socketio_debug.py +671 -0
  832. claude_mpm/utils/__init__.py +8 -8
  833. claude_mpm/utils/agent_dependency_loader.py +1090 -0
  834. claude_mpm/utils/agent_filters.py +261 -0
  835. claude_mpm/utils/common.py +544 -0
  836. claude_mpm/utils/config_manager.py +168 -126
  837. claude_mpm/utils/console.py +11 -0
  838. claude_mpm/utils/database_connector.py +298 -0
  839. claude_mpm/utils/dependency_cache.py +373 -0
  840. claude_mpm/utils/dependency_manager.py +60 -59
  841. claude_mpm/utils/dependency_strategies.py +381 -0
  842. claude_mpm/utils/display_helper.py +260 -0
  843. claude_mpm/utils/environment_context.py +313 -0
  844. claude_mpm/utils/error_handler.py +78 -66
  845. claude_mpm/utils/file_utils.py +305 -0
  846. claude_mpm/utils/framework_detection.py +12 -11
  847. claude_mpm/utils/git_analyzer.py +407 -0
  848. claude_mpm/utils/gitignore.py +244 -0
  849. claude_mpm/utils/import_migration_example.py +12 -60
  850. claude_mpm/utils/imports.py +48 -45
  851. claude_mpm/utils/log_cleanup.py +627 -0
  852. claude_mpm/utils/migration.py +372 -0
  853. claude_mpm/utils/path_operations.py +110 -104
  854. claude_mpm/utils/progress.py +387 -0
  855. claude_mpm/utils/robust_installer.py +823 -0
  856. claude_mpm/utils/session_logging.py +121 -0
  857. claude_mpm/utils/structured_questions.py +619 -0
  858. claude_mpm/utils/subprocess_utils.py +343 -0
  859. claude_mpm/validation/__init__.py +1 -1
  860. claude_mpm/validation/agent_validator.py +214 -108
  861. claude_mpm/validation/frontmatter_validator.py +252 -0
  862. claude_mpm-5.4.55.dist-info/METADATA +999 -0
  863. claude_mpm-5.4.55.dist-info/RECORD +868 -0
  864. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
  865. claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
  866. claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
  867. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
  868. claude_mpm/agents/INSTRUCTIONS.md +0 -352
  869. claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
  870. claude_mpm/agents/base_agent_loader.py +0 -529
  871. claude_mpm/agents/schema/agent_schema.json +0 -314
  872. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
  873. claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
  874. claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
  875. claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
  876. claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
  877. claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
  878. claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
  879. claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
  880. claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
  881. claude_mpm/agents/templates/data_engineer.json +0 -110
  882. claude_mpm/agents/templates/documentation.json +0 -109
  883. claude_mpm/agents/templates/engineer.json +0 -113
  884. claude_mpm/agents/templates/ops.json +0 -109
  885. claude_mpm/agents/templates/pm.json +0 -25
  886. claude_mpm/agents/templates/qa.json +0 -111
  887. claude_mpm/agents/templates/research.json +0 -65
  888. claude_mpm/agents/templates/security.json +0 -113
  889. claude_mpm/agents/templates/test_integration.json +0 -112
  890. claude_mpm/agents/templates/version_control.json +0 -107
  891. claude_mpm/cli/commands/ui.py +0 -57
  892. claude_mpm/core/simple_runner.py +0 -1046
  893. claude_mpm/dashboard/open_dashboard.py +0 -34
  894. claude_mpm/deployment_paths.py +0 -261
  895. claude_mpm/hooks/builtin/__init__.py +0 -1
  896. claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
  897. claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
  898. claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
  899. claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
  900. claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
  901. claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
  902. claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
  903. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
  904. claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
  905. claude_mpm/orchestration/__init__.py +0 -6
  906. claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
  907. claude_mpm/orchestration/archive/factory.py +0 -215
  908. claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
  909. claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
  910. claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
  911. claude_mpm/orchestration/archive/orchestrator.py +0 -501
  912. claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
  913. claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
  914. claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
  915. claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
  916. claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
  917. claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
  918. claude_mpm/schemas/workflow_validator.py +0 -411
  919. claude_mpm/services/agent_deployment.py +0 -1534
  920. claude_mpm/services/agent_lifecycle_manager.py +0 -1169
  921. claude_mpm/services/agent_memory_manager.py +0 -1415
  922. claude_mpm/services/agent_registry.py +0 -676
  923. claude_mpm/services/deployed_agent_discovery.py +0 -226
  924. claude_mpm/services/framework_agent_loader.py +0 -337
  925. claude_mpm/services/framework_claude_md_generator.py +0 -621
  926. claude_mpm/services/health_monitor.py +0 -892
  927. claude_mpm/services/memory_router.py +0 -538
  928. claude_mpm/services/parent_directory_manager/__init__.py +0 -577
  929. claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
  930. claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
  931. claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
  932. claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
  933. claude_mpm/services/parent_directory_manager/operations.py +0 -186
  934. claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
  935. claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
  936. claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
  937. claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
  938. claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
  939. claude_mpm/services/standalone_socketio_server.py +0 -1300
  940. claude_mpm/services/ticket_manager_di.py +0 -318
  941. claude_mpm/services/ticketing_service_original.py +0 -508
  942. claude_mpm/ui/__init__.py +0 -1
  943. claude_mpm/ui/rich_terminal_ui.py +0 -295
  944. claude_mpm/ui/terminal_ui.py +0 -328
  945. claude_mpm/utils/paths.py +0 -289
  946. claude_mpm-3.4.10.dist-info/METADATA +0 -183
  947. claude_mpm-3.4.10.dist-info/RECORD +0 -201
  948. claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
  949. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
  950. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
@@ -1,1169 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Agent Lifecycle Manager - ISS-0118 Integration Service
4
- ======================================================
5
-
6
- Comprehensive agent lifecycle management integrating modification tracking,
7
- persistence, and registry services for complete agent management across
8
- the three-tier hierarchy.
9
-
10
- Key Features:
11
- - Unified agent lifecycle management (create, modify, delete, restore)
12
- - Integrated modification tracking and persistence
13
- - Automatic cache invalidation and registry updates
14
- - Comprehensive backup and versioning system
15
- - Conflict detection and resolution workflows
16
- - Performance monitoring and optimization
17
-
18
- Performance Impact:
19
- - <100ms end-to-end agent operations
20
- - Automatic cache coherency maintenance
21
- - Intelligent persistence routing
22
- - Real-time modification detection
23
-
24
- Created for ISS-0118: Agent Registry and Hierarchical Discovery System
25
- """
26
-
27
- import asyncio
28
- import logging
29
- import time
30
- from dataclasses import dataclass, field
31
- from datetime import datetime, timedelta
32
- from enum import Enum
33
- from pathlib import Path
34
- from typing import Dict, List, Optional, Set, Any, Tuple, Union
35
-
36
- from claude_mpm.services.shared_prompt_cache import SharedPromptCache
37
- from claude_mpm.services.agent_registry import AgentRegistry, AgentMetadata
38
- from claude_mpm.services.agent_modification_tracker import (
39
- AgentModificationTracker,
40
- AgentModification,
41
- ModificationType,
42
- ModificationTier
43
- )
44
- from claude_mpm.services.agent_persistence_service import (
45
- AgentPersistenceService,
46
- PersistenceStrategy,
47
- PersistenceRecord,
48
- PersistenceOperation
49
- )
50
- from claude_mpm.services.agent_management_service import AgentManager
51
- from claude_mpm.models.agent_definition import AgentDefinition, AgentType
52
- from claude_mpm.core.base_service import BaseService
53
- from claude_mpm.utils.path_operations import path_ops
54
- from claude_mpm.utils.config_manager import ConfigurationManager
55
-
56
-
57
- class LifecycleOperation(Enum):
58
- """Agent lifecycle operations."""
59
- CREATE = "create"
60
- UPDATE = "update"
61
- DELETE = "delete"
62
- RESTORE = "restore"
63
- MIGRATE = "migrate"
64
- REPLICATE = "replicate"
65
- VALIDATE = "validate"
66
-
67
-
68
- class LifecycleState(Enum):
69
- """Agent lifecycle states."""
70
- ACTIVE = "active"
71
- MODIFIED = "modified"
72
- DELETED = "deleted"
73
- CONFLICTED = "conflicted"
74
- MIGRATING = "migrating"
75
- VALIDATING = "validating"
76
-
77
-
78
- @dataclass
79
- class AgentLifecycleRecord:
80
- """Complete lifecycle record for an agent."""
81
-
82
- agent_name: str
83
- current_state: LifecycleState
84
- tier: ModificationTier
85
- file_path: str
86
- created_at: float
87
- last_modified: float
88
- version: str
89
- modifications: List[str] = field(default_factory=list) # Modification IDs
90
- persistence_operations: List[str] = field(default_factory=list) # Operation IDs
91
- backup_paths: List[str] = field(default_factory=list)
92
- validation_status: str = "valid"
93
- validation_errors: List[str] = field(default_factory=list)
94
- metadata: Dict[str, Any] = field(default_factory=dict)
95
-
96
- @property
97
- def age_days(self) -> float:
98
- """Get age in days."""
99
- return (time.time() - self.created_at) / (24 * 3600)
100
-
101
- @property
102
- def last_modified_datetime(self) -> datetime:
103
- """Get last modified as datetime."""
104
- return datetime.fromtimestamp(self.last_modified)
105
-
106
-
107
- @dataclass
108
- class LifecycleOperationResult:
109
- """Result of a lifecycle operation."""
110
-
111
- operation: LifecycleOperation
112
- agent_name: str
113
- success: bool
114
- duration_ms: float
115
- error_message: Optional[str] = None
116
- modification_id: Optional[str] = None
117
- persistence_id: Optional[str] = None
118
- cache_invalidated: bool = False
119
- registry_updated: bool = False
120
- metadata: Dict[str, Any] = field(default_factory=dict)
121
-
122
-
123
- class AgentLifecycleManager(BaseService):
124
- """
125
- Agent Lifecycle Manager - Unified agent management across hierarchy tiers.
126
-
127
- Features:
128
- - Complete agent lifecycle management (CRUD operations)
129
- - Integrated modification tracking and persistence
130
- - Automatic cache invalidation and registry synchronization
131
- - Comprehensive backup and versioning system
132
- - Real-time conflict detection and resolution
133
- - Performance monitoring and optimization
134
- """
135
-
136
- def __init__(self, config: Optional[Dict[str, Any]] = None):
137
- """Initialize the agent lifecycle manager."""
138
- super().__init__("agent_lifecycle_manager", config)
139
-
140
- # Configuration
141
- self.enable_auto_backup = self.get_config("enable_auto_backup", True)
142
- self.enable_auto_validation = self.get_config("enable_auto_validation", True)
143
- self.enable_cache_invalidation = self.get_config("enable_cache_invalidation", True)
144
- self.enable_registry_sync = self.get_config("enable_registry_sync", True)
145
- self.default_persistence_strategy = PersistenceStrategy(
146
- self.get_config("default_persistence_strategy", PersistenceStrategy.USER_OVERRIDE.value)
147
- )
148
-
149
- # Core services
150
- self.shared_cache: Optional[SharedPromptCache] = None
151
- self.agent_registry: Optional[AgentRegistry] = None
152
- self.modification_tracker: Optional[AgentModificationTracker] = None
153
- self.persistence_service: Optional[AgentPersistenceService] = None
154
- self.agent_manager: Optional[AgentManager] = None
155
-
156
- # Lifecycle tracking
157
- self.agent_records: Dict[str, AgentLifecycleRecord] = {}
158
- self.operation_history: List[LifecycleOperationResult] = []
159
- self.active_operations: Dict[str, LifecycleOperation] = {}
160
-
161
- # Performance metrics
162
- self.performance_metrics = {
163
- 'total_operations': 0,
164
- 'successful_operations': 0,
165
- 'failed_operations': 0,
166
- 'average_duration_ms': 0.0,
167
- 'cache_hit_rate': 0.0
168
- }
169
-
170
- # Operation lock for thread safety
171
- self._operation_lock = asyncio.Lock()
172
-
173
- # Configuration manager
174
- self.config_mgr = ConfigurationManager(cache_enabled=True)
175
-
176
- self.logger.info("AgentLifecycleManager initialized")
177
-
178
- async def _initialize(self) -> None:
179
- """Initialize the lifecycle manager."""
180
- self.logger.info("Initializing AgentLifecycleManager...")
181
-
182
- # Initialize core services
183
- await self._initialize_core_services()
184
-
185
- # Load existing agent records
186
- await self._load_agent_records()
187
-
188
- # Start service integrations
189
- await self._setup_service_integrations()
190
-
191
- # Perform initial registry sync
192
- if self.enable_registry_sync:
193
- await self._sync_with_registry()
194
-
195
- self.logger.info("AgentLifecycleManager initialized successfully")
196
-
197
- async def _cleanup(self) -> None:
198
- """Cleanup lifecycle manager resources."""
199
- self.logger.info("Cleaning up AgentLifecycleManager...")
200
-
201
- # Save agent records
202
- await self._save_agent_records()
203
-
204
- # Stop core services if we own them
205
- await self._cleanup_core_services()
206
-
207
- self.logger.info("AgentLifecycleManager cleaned up")
208
-
209
- async def _health_check(self) -> Dict[str, bool]:
210
- """Perform lifecycle manager health checks."""
211
- checks = {}
212
-
213
- try:
214
- # Check core service availability
215
- checks["cache_service"] = self.shared_cache is not None
216
- checks["registry_service"] = self.agent_registry is not None
217
- checks["tracker_service"] = self.modification_tracker is not None
218
- checks["persistence_service"] = self.persistence_service is not None
219
-
220
- # Check operation capabilities
221
- checks["can_create_agents"] = await self._test_create_capability()
222
- checks["can_modify_agents"] = await self._test_modify_capability()
223
- checks["can_delete_agents"] = await self._test_delete_capability()
224
-
225
- # Check data integrity
226
- checks["agent_records_valid"] = len(self.agent_records) >= 0
227
- checks["operation_history_valid"] = len(self.operation_history) >= 0
228
-
229
- except Exception as e:
230
- self.logger.error(f"Lifecycle manager health check failed: {e}")
231
- checks["health_check_error"] = False
232
-
233
- return checks
234
-
235
- async def _initialize_core_services(self) -> None:
236
- """Initialize core service dependencies."""
237
- try:
238
- # Initialize SharedPromptCache
239
- self.shared_cache = SharedPromptCache.get_instance()
240
-
241
- # Initialize AgentRegistry
242
- self.agent_registry = AgentRegistry(cache_service=self.shared_cache)
243
-
244
- # Initialize AgentModificationTracker
245
- self.modification_tracker = AgentModificationTracker()
246
- await self.modification_tracker.start()
247
-
248
- # Initialize AgentPersistenceService
249
- self.persistence_service = AgentPersistenceService()
250
- await self.persistence_service.start()
251
-
252
- # Initialize AgentManager
253
- self.agent_manager = AgentManager()
254
-
255
- self.logger.info("Core services initialized successfully")
256
-
257
- except Exception as e:
258
- self.logger.error(f"Failed to initialize core services: {e}")
259
- raise
260
-
261
- async def _setup_service_integrations(self) -> None:
262
- """Set up integrations between services."""
263
- try:
264
- # Register modification callback
265
- if self.modification_tracker:
266
- self.modification_tracker.register_modification_callback(
267
- self._handle_modification_event
268
- )
269
-
270
- self.logger.debug("Service integrations set up successfully")
271
-
272
- except Exception as e:
273
- self.logger.warning(f"Failed to setup some service integrations: {e}")
274
-
275
- async def _load_agent_records(self) -> None:
276
- """Load existing agent lifecycle records."""
277
- try:
278
- records_file = Path.home() / '.claude-pm' / 'agent_tracking' / 'lifecycle_records.json'
279
- if path_ops.validate_exists(records_file):
280
- data = self.config_mgr.load_json(records_file)
281
-
282
- for agent_name, record_data in data.items():
283
- record = AgentLifecycleRecord(**record_data)
284
- # Convert string enum back to enum
285
- record.current_state = LifecycleState(record_data['current_state'])
286
- record.tier = ModificationTier(record_data['tier'])
287
- self.agent_records[agent_name] = record
288
-
289
- self.logger.info(f"Loaded {len(self.agent_records)} agent records")
290
-
291
- except Exception as e:
292
- self.logger.warning(f"Failed to load agent records: {e}")
293
-
294
- async def _save_agent_records(self) -> None:
295
- """Save agent lifecycle records to disk."""
296
- try:
297
- records_file = Path.home() / '.claude-pm' / 'agent_tracking' / 'lifecycle_records.json'
298
- path_ops.ensure_dir(records_file.parent)
299
-
300
- data = {}
301
- for agent_name, record in self.agent_records.items():
302
- record_dict = record.__dict__.copy()
303
- # Convert enums to strings for JSON serialization
304
- record_dict['current_state'] = record.current_state.value
305
- record_dict['tier'] = record.tier.value
306
- data[agent_name] = record_dict
307
-
308
- # Use save_json with custom encoder for datetime serialization
309
- import json
310
-
311
- # First convert to JSON string with custom encoder, then save
312
- json_str = json.dumps(data, indent=2, default=str)
313
- records_file.parent.mkdir(parents=True, exist_ok=True)
314
- with open(records_file, 'w', encoding='utf-8') as f:
315
- f.write(json_str)
316
-
317
- self.logger.debug(f"Saved {len(self.agent_records)} agent records")
318
-
319
- except Exception as e:
320
- self.logger.error(f"Failed to save agent records: {e}")
321
-
322
- async def _sync_with_registry(self) -> None:
323
- """Synchronize with agent registry."""
324
- try:
325
- if not self.agent_registry:
326
- return
327
-
328
- # Discover all agents via registry (sync methods)
329
- self.agent_registry.discover_agents()
330
- all_agents = self.agent_registry.list_agents()
331
-
332
- # Update lifecycle records with registry data
333
- for agent_metadata in all_agents:
334
- if agent_metadata.name not in self.agent_records:
335
- # Create new lifecycle record
336
- tier_map = {
337
- 'project': ModificationTier.PROJECT,
338
- 'user': ModificationTier.USER,
339
- 'system': ModificationTier.SYSTEM
340
- }
341
-
342
- record = AgentLifecycleRecord(
343
- agent_name=agent_metadata.name,
344
- current_state=LifecycleState.ACTIVE,
345
- tier=tier_map.get(agent_metadata.tier, ModificationTier.USER),
346
- file_path=agent_metadata.path,
347
- created_at=agent_metadata.last_modified or time.time(),
348
- last_modified=agent_metadata.last_modified or time.time(),
349
- version="1.0.0",
350
- metadata={
351
- 'type': agent_metadata.type,
352
- 'description': agent_metadata.description,
353
- 'capabilities': agent_metadata.capabilities,
354
- 'validated': agent_metadata.validated
355
- }
356
- )
357
-
358
- self.agent_records[agent_metadata.name] = record
359
-
360
- self.logger.info(f"Synchronized with registry: {len(all_agents)} agents")
361
-
362
- except Exception as e:
363
- self.logger.error(f"Failed to sync with registry: {e}")
364
-
365
- async def create_agent(self,
366
- agent_name: str,
367
- agent_content: str,
368
- tier: ModificationTier = ModificationTier.USER,
369
- agent_type: str = "custom",
370
- **kwargs) -> LifecycleOperationResult:
371
- """
372
- Create a new agent with complete lifecycle tracking.
373
-
374
- Args:
375
- agent_name: Name of the agent to create
376
- agent_content: Content of the agent file
377
- tier: Target tier for creation
378
- agent_type: Type of agent (for classification)
379
- **kwargs: Additional metadata
380
-
381
- Returns:
382
- LifecycleOperationResult with operation details
383
- """
384
- start_time = time.time()
385
-
386
- async with self._operation_lock:
387
- self.active_operations[agent_name] = LifecycleOperation.CREATE
388
-
389
- try:
390
- # Check if agent already exists
391
- if agent_name in self.agent_records:
392
- return LifecycleOperationResult(
393
- operation=LifecycleOperation.CREATE,
394
- agent_name=agent_name,
395
- success=False,
396
- duration_ms=(time.time() - start_time) * 1000,
397
- error_message="Agent already exists"
398
- )
399
-
400
- # Create agent definition
401
- agent_def = await self._create_agent_definition(
402
- agent_name, agent_content, tier, agent_type, **kwargs
403
- )
404
-
405
- # Determine location based on tier
406
- location = "project" if tier == ModificationTier.PROJECT else "framework"
407
-
408
- # Create agent using AgentManager (sync call in executor)
409
- try:
410
- if self.agent_manager:
411
- file_path = await self._run_sync_in_executor(
412
- self.agent_manager.create_agent,
413
- agent_name, agent_def, location
414
- )
415
- else:
416
- # Fallback to direct file creation if AgentManager not available
417
- file_path = await self._determine_agent_file_path(agent_name, tier)
418
- path_ops.ensure_dir(file_path.parent)
419
- path_ops.safe_write(file_path, agent_content)
420
- except Exception as e:
421
- self.logger.error(f"AgentManager failed to create agent: {e}")
422
- # Fallback to direct file creation
423
- file_path = await self._determine_agent_file_path(agent_name, tier)
424
- path_ops.ensure_dir(file_path.parent)
425
- path_ops.safe_write(file_path, agent_content)
426
-
427
- # Track modification
428
- modification = await self.modification_tracker.track_modification(
429
- agent_name=agent_name,
430
- modification_type=ModificationType.CREATE,
431
- file_path=str(file_path),
432
- tier=tier,
433
- agent_type=agent_type,
434
- **kwargs
435
- )
436
-
437
- # Note: We don't use persistence_service for the actual write anymore
438
- # since AgentManager handles that. We create a synthetic record for compatibility.
439
- persistence_record = PersistenceRecord(
440
- operation_id=f"create_{agent_name}_{time.time()}",
441
- operation_type=PersistenceOperation.CREATE,
442
- agent_name=agent_name,
443
- source_tier=tier,
444
- target_tier=tier,
445
- strategy=self.default_persistence_strategy,
446
- success=True,
447
- timestamp=time.time(),
448
- file_path=str(file_path)
449
- )
450
-
451
- # Create lifecycle record
452
- lifecycle_record = AgentLifecycleRecord(
453
- agent_name=agent_name,
454
- current_state=LifecycleState.ACTIVE,
455
- tier=tier,
456
- file_path=str(file_path),
457
- created_at=time.time(),
458
- last_modified=time.time(),
459
- version="1.0.0",
460
- modifications=[modification.modification_id],
461
- persistence_operations=[persistence_record.operation_id],
462
- metadata={
463
- 'agent_type': agent_type,
464
- **kwargs
465
- }
466
- )
467
-
468
- self.agent_records[agent_name] = lifecycle_record
469
-
470
- # Invalidate cache and update registry
471
- cache_invalidated = await self._invalidate_agent_cache(agent_name)
472
- registry_updated = await self._update_registry(agent_name)
473
-
474
- # Create result
475
- result = LifecycleOperationResult(
476
- operation=LifecycleOperation.CREATE,
477
- agent_name=agent_name,
478
- success=persistence_record.success,
479
- duration_ms=(time.time() - start_time) * 1000,
480
- modification_id=modification.modification_id,
481
- persistence_id=persistence_record.operation_id,
482
- cache_invalidated=cache_invalidated,
483
- registry_updated=registry_updated,
484
- metadata={'file_path': str(file_path)}
485
- )
486
-
487
- if not persistence_record.success:
488
- result.error_message = persistence_record.error_message
489
- lifecycle_record.current_state = LifecycleState.CONFLICTED
490
-
491
- # Update performance metrics
492
- await self._update_performance_metrics(result)
493
-
494
- self.operation_history.append(result)
495
- self.logger.info(f"Created agent '{agent_name}' in {result.duration_ms:.1f}ms")
496
-
497
- return result
498
-
499
- except Exception as e:
500
- result = LifecycleOperationResult(
501
- operation=LifecycleOperation.CREATE,
502
- agent_name=agent_name,
503
- success=False,
504
- duration_ms=(time.time() - start_time) * 1000,
505
- error_message=str(e)
506
- )
507
-
508
- self.operation_history.append(result)
509
- await self._update_performance_metrics(result)
510
-
511
- self.logger.error(f"Failed to create agent '{agent_name}': {e}")
512
- return result
513
-
514
- finally:
515
- self.active_operations.pop(agent_name, None)
516
-
517
- async def update_agent(self,
518
- agent_name: str,
519
- agent_content: str,
520
- **kwargs) -> LifecycleOperationResult:
521
- """
522
- Update an existing agent with lifecycle tracking.
523
-
524
- Args:
525
- agent_name: Name of the agent to update
526
- agent_content: New content for the agent
527
- **kwargs: Additional metadata
528
-
529
- Returns:
530
- LifecycleOperationResult with operation details
531
- """
532
- start_time = time.time()
533
-
534
- async with self._operation_lock:
535
- self.active_operations[agent_name] = LifecycleOperation.UPDATE
536
-
537
- try:
538
- # Check if agent exists
539
- if agent_name not in self.agent_records:
540
- return LifecycleOperationResult(
541
- operation=LifecycleOperation.UPDATE,
542
- agent_name=agent_name,
543
- success=False,
544
- duration_ms=(time.time() - start_time) * 1000,
545
- error_message="Agent not found"
546
- )
547
-
548
- record = self.agent_records[agent_name]
549
-
550
- # Update agent using AgentManager
551
- try:
552
- if self.agent_manager:
553
- # Read current agent to get full definition
554
- current_def = await self._run_sync_in_executor(
555
- self.agent_manager.read_agent, agent_name
556
- )
557
-
558
- if current_def:
559
- # Update raw content
560
- current_def.raw_content = agent_content
561
-
562
- # Apply any metadata updates from kwargs
563
- if 'model_preference' in kwargs:
564
- current_def.metadata.model_preference = kwargs['model_preference']
565
- if 'tags' in kwargs:
566
- current_def.metadata.tags = kwargs['tags']
567
- if 'specializations' in kwargs:
568
- current_def.metadata.specializations = kwargs['specializations']
569
-
570
- # Update via AgentManager
571
- updated_def = await self._run_sync_in_executor(
572
- self.agent_manager.update_agent,
573
- agent_name, {"raw_content": agent_content}, True
574
- )
575
-
576
- if not updated_def:
577
- raise Exception("AgentManager update failed")
578
- else:
579
- raise Exception("Could not read current agent definition")
580
- else:
581
- # Fallback to direct file update
582
- file_path = Path(record.file_path)
583
- if path_ops.validate_exists(file_path):
584
- path_ops.safe_write(file_path, agent_content)
585
- except Exception as e:
586
- self.logger.error(f"AgentManager failed to update agent: {e}")
587
- # Fallback to direct file update
588
- file_path = Path(record.file_path)
589
- if path_ops.validate_exists(file_path):
590
- path_ops.safe_write(file_path, agent_content)
591
-
592
- # Track modification
593
- modification = await self.modification_tracker.track_modification(
594
- agent_name=agent_name,
595
- modification_type=ModificationType.MODIFY,
596
- file_path=record.file_path,
597
- tier=record.tier,
598
- **kwargs
599
- )
600
-
601
- # Create synthetic persistence record for compatibility
602
- persistence_record = PersistenceRecord(
603
- operation_id=f"update_{agent_name}_{time.time()}",
604
- operation_type=PersistenceOperation.UPDATE,
605
- agent_name=agent_name,
606
- source_tier=record.tier,
607
- target_tier=record.tier,
608
- strategy=self.default_persistence_strategy,
609
- success=True,
610
- timestamp=time.time(),
611
- file_path=record.file_path
612
- )
613
-
614
- # Update lifecycle record
615
- record.current_state = LifecycleState.MODIFIED
616
- record.last_modified = time.time()
617
- record.modifications.append(modification.modification_id)
618
- record.persistence_operations.append(persistence_record.operation_id)
619
-
620
- # Increment version
621
- current_version = record.version.split('.')
622
- current_version[-1] = str(int(current_version[-1]) + 1)
623
- record.version = '.'.join(current_version)
624
-
625
- # Invalidate cache and update registry
626
- cache_invalidated = await self._invalidate_agent_cache(agent_name)
627
- registry_updated = await self._update_registry(agent_name)
628
-
629
- # Create result
630
- result = LifecycleOperationResult(
631
- operation=LifecycleOperation.UPDATE,
632
- agent_name=agent_name,
633
- success=persistence_record.success,
634
- duration_ms=(time.time() - start_time) * 1000,
635
- modification_id=modification.modification_id,
636
- persistence_id=persistence_record.operation_id,
637
- cache_invalidated=cache_invalidated,
638
- registry_updated=registry_updated,
639
- metadata={'new_version': record.version}
640
- )
641
-
642
- if not persistence_record.success:
643
- result.error_message = persistence_record.error_message
644
- record.current_state = LifecycleState.CONFLICTED
645
-
646
- # Update performance metrics
647
- await self._update_performance_metrics(result)
648
-
649
- self.operation_history.append(result)
650
- self.logger.info(f"Updated agent '{agent_name}' to version {record.version} in {result.duration_ms:.1f}ms")
651
-
652
- return result
653
-
654
- except Exception as e:
655
- result = LifecycleOperationResult(
656
- operation=LifecycleOperation.UPDATE,
657
- agent_name=agent_name,
658
- success=False,
659
- duration_ms=(time.time() - start_time) * 1000,
660
- error_message=str(e)
661
- )
662
-
663
- self.operation_history.append(result)
664
- await self._update_performance_metrics(result)
665
-
666
- self.logger.error(f"Failed to update agent '{agent_name}': {e}")
667
- return result
668
-
669
- finally:
670
- self.active_operations.pop(agent_name, None)
671
-
672
- async def delete_agent(self, agent_name: str, **kwargs) -> LifecycleOperationResult:
673
- """
674
- Delete an agent with lifecycle tracking.
675
-
676
- Args:
677
- agent_name: Name of the agent to delete
678
- **kwargs: Additional metadata
679
-
680
- Returns:
681
- LifecycleOperationResult with operation details
682
- """
683
- start_time = time.time()
684
-
685
- async with self._operation_lock:
686
- self.active_operations[agent_name] = LifecycleOperation.DELETE
687
-
688
- try:
689
- # Check if agent exists
690
- if agent_name not in self.agent_records:
691
- return LifecycleOperationResult(
692
- operation=LifecycleOperation.DELETE,
693
- agent_name=agent_name,
694
- success=False,
695
- duration_ms=(time.time() - start_time) * 1000,
696
- error_message="Agent not found"
697
- )
698
-
699
- record = self.agent_records[agent_name]
700
-
701
- # Create backup before deletion
702
- backup_path = None
703
- if self.enable_auto_backup:
704
- backup_path = await self._create_deletion_backup(agent_name, record)
705
-
706
- # Track modification
707
- modification = await self.modification_tracker.track_modification(
708
- agent_name=agent_name,
709
- modification_type=ModificationType.DELETE,
710
- file_path=record.file_path,
711
- tier=record.tier,
712
- backup_path=backup_path,
713
- **kwargs
714
- )
715
-
716
- # Delete agent using AgentManager
717
- deletion_success = False
718
- try:
719
- if self.agent_manager:
720
- deletion_success = await self._run_sync_in_executor(
721
- self.agent_manager.delete_agent, agent_name
722
- )
723
- if not deletion_success:
724
- raise Exception("AgentManager delete failed")
725
- else:
726
- # Fallback to direct file deletion
727
- file_path = Path(record.file_path)
728
- if path_ops.validate_exists(file_path):
729
- path_ops.safe_delete(file_path)
730
- deletion_success = True
731
- except Exception as e:
732
- self.logger.error(f"AgentManager failed to delete agent: {e}")
733
- # Fallback to direct file deletion
734
- file_path = Path(record.file_path)
735
- if path_ops.validate_exists(file_path):
736
- path_ops.safe_delete(file_path)
737
- deletion_success = True
738
-
739
- # Update lifecycle record
740
- record.current_state = LifecycleState.DELETED
741
- record.last_modified = time.time()
742
- record.modifications.append(modification.modification_id)
743
- if backup_path:
744
- record.backup_paths.append(backup_path)
745
-
746
- # Invalidate cache and update registry
747
- cache_invalidated = await self._invalidate_agent_cache(agent_name)
748
- registry_updated = await self._update_registry(agent_name)
749
-
750
- # Create result
751
- result = LifecycleOperationResult(
752
- operation=LifecycleOperation.DELETE,
753
- agent_name=agent_name,
754
- success=True,
755
- duration_ms=(time.time() - start_time) * 1000,
756
- modification_id=modification.modification_id,
757
- cache_invalidated=cache_invalidated,
758
- registry_updated=registry_updated,
759
- metadata={'backup_path': backup_path}
760
- )
761
-
762
- # Update performance metrics
763
- await self._update_performance_metrics(result)
764
-
765
- self.operation_history.append(result)
766
- self.logger.info(f"Deleted agent '{agent_name}' in {result.duration_ms:.1f}ms")
767
-
768
- return result
769
-
770
- except Exception as e:
771
- result = LifecycleOperationResult(
772
- operation=LifecycleOperation.DELETE,
773
- agent_name=agent_name,
774
- success=False,
775
- duration_ms=(time.time() - start_time) * 1000,
776
- error_message=str(e)
777
- )
778
-
779
- self.operation_history.append(result)
780
- await self._update_performance_metrics(result)
781
-
782
- self.logger.error(f"Failed to delete agent '{agent_name}': {e}")
783
- return result
784
-
785
- finally:
786
- self.active_operations.pop(agent_name, None)
787
-
788
- async def _determine_agent_file_path(self, agent_name: str, tier: ModificationTier) -> Path:
789
- """Determine appropriate file path for agent."""
790
- if tier == ModificationTier.USER:
791
- base_path = Path.home() / '.claude-pm' / 'agents'
792
- elif tier == ModificationTier.PROJECT:
793
- base_path = Path.cwd() / '.claude-pm' / 'agents'
794
- else: # SYSTEM
795
- base_path = Path.cwd() / 'claude_pm' / 'agents'
796
-
797
- path_ops.ensure_dir(base_path)
798
- return base_path / f"{agent_name}_agent.py"
799
-
800
- async def _create_deletion_backup(self, agent_name: str, record: AgentLifecycleRecord) -> Optional[str]:
801
- """Create backup before agent deletion."""
802
- try:
803
- source_path = Path(record.file_path)
804
- if not path_ops.validate_exists(source_path):
805
- return None
806
-
807
- backup_dir = Path.home() / '.claude-pm' / 'agent_tracking' / 'backups'
808
- path_ops.ensure_dir(backup_dir)
809
-
810
- timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
811
- backup_filename = f"{agent_name}_deleted_{timestamp}{source_path.suffix}"
812
- backup_path = backup_dir / backup_filename
813
-
814
- path_ops.safe_copy(source_path, backup_path)
815
- return str(backup_path)
816
-
817
- except Exception as e:
818
- self.logger.warning(f"Failed to create deletion backup for {agent_name}: {e}")
819
- return None
820
-
821
- async def _invalidate_agent_cache(self, agent_name: str) -> bool:
822
- """Invalidate cache entries for agent."""
823
- if not self.enable_cache_invalidation or not self.shared_cache:
824
- return False
825
-
826
- try:
827
- patterns = [
828
- f"agent_profile:{agent_name}:*",
829
- f"task_prompt:{agent_name}:*",
830
- f"agent_registry_discovery",
831
- f"agent_profile_enhanced:{agent_name}:*"
832
- ]
833
-
834
- for pattern in patterns:
835
- await asyncio.get_event_loop().run_in_executor(
836
- None,
837
- lambda p=pattern: self.shared_cache.invalidate(p)
838
- )
839
-
840
- return True
841
-
842
- except Exception as e:
843
- self.logger.warning(f"Failed to invalidate cache for {agent_name}: {e}")
844
- return False
845
-
846
- async def _update_registry(self, agent_name: str) -> bool:
847
- """Update agent registry after modification."""
848
- if not self.enable_registry_sync or not self.agent_registry:
849
- return False
850
-
851
- try:
852
- # Refresh registry (discover_agents is synchronous)
853
- self.agent_registry.discover_agents()
854
- return True
855
-
856
- except Exception as e:
857
- self.logger.warning(f"Failed to update registry for {agent_name}: {e}")
858
- return False
859
-
860
- async def _update_performance_metrics(self, result: LifecycleOperationResult) -> None:
861
- """Update performance metrics with operation result.
862
-
863
- METRICS COLLECTION:
864
- This method demonstrates a simple ETL pipeline for operational metrics:
865
-
866
- 1. EXTRACT: Pull raw data from operation results
867
- - Success/failure status
868
- - Operation duration
869
- - Cache invalidation events
870
- - Operation type and agent tier
871
-
872
- 2. TRANSFORM: Calculate derived metrics
873
- - Success rates and failure percentages
874
- - Rolling averages for performance
875
- - Operation distribution by type
876
- - Performance by agent tier
877
-
878
- 3. LOAD: Store in metrics structure
879
- - In-memory storage for real-time access
880
- - Could be extended to push to:
881
- * Time-series databases (Prometheus, InfluxDB)
882
- * AI observability platforms (Datadog, New Relic)
883
- * Custom analytics pipelines
884
-
885
- OPTIMIZATION OPPORTUNITIES:
886
- - Add percentile calculations (p50, p95, p99)
887
- - Track operation queuing times
888
- - Monitor resource usage per operation
889
- - Implement sliding window metrics
890
- """
891
- self.performance_metrics['total_operations'] += 1
892
-
893
- if result.success:
894
- self.performance_metrics['successful_operations'] += 1
895
- else:
896
- self.performance_metrics['failed_operations'] += 1
897
-
898
- # Update average duration using incremental calculation
899
- # This avoids storing all durations in memory
900
- total_ops = self.performance_metrics['total_operations']
901
- current_avg = self.performance_metrics['average_duration_ms']
902
- new_avg = ((current_avg * (total_ops - 1)) + result.duration_ms) / total_ops
903
- self.performance_metrics['average_duration_ms'] = new_avg
904
-
905
- # METRICS: Track operation type distribution
906
- # This helps identify which operations are most common
907
- op_type = result.operation.value
908
- if 'operation_distribution' not in self.performance_metrics:
909
- self.performance_metrics['operation_distribution'] = {}
910
- self.performance_metrics['operation_distribution'][op_type] = \
911
- self.performance_metrics['operation_distribution'].get(op_type, 0) + 1
912
-
913
- # METRICS: Track performance by agent tier
914
- # Useful for identifying tier-specific performance issues
915
- if hasattr(result, 'tier') and result.tier:
916
- if 'tier_performance' not in self.performance_metrics:
917
- self.performance_metrics['tier_performance'] = {}
918
- tier_name = result.tier.value if hasattr(result.tier, 'value') else str(result.tier)
919
- if tier_name not in self.performance_metrics['tier_performance']:
920
- self.performance_metrics['tier_performance'][tier_name] = {
921
- 'count': 0,
922
- 'total_duration_ms': 0,
923
- 'average_duration_ms': 0
924
- }
925
- tier_metrics = self.performance_metrics['tier_performance'][tier_name]
926
- tier_metrics['count'] += 1
927
- tier_metrics['total_duration_ms'] += result.duration_ms
928
- tier_metrics['average_duration_ms'] = \
929
- tier_metrics['total_duration_ms'] / tier_metrics['count']
930
-
931
- # Update cache hit rate if cache was involved
932
- if result.cache_invalidated:
933
- # Track cache invalidation frequency
934
- if 'cache_invalidations' not in self.performance_metrics:
935
- self.performance_metrics['cache_invalidations'] = 0
936
- self.performance_metrics['cache_invalidations'] += 1
937
-
938
- async def _handle_modification_event(self, modification: AgentModification) -> None:
939
- """Handle modification events from tracker."""
940
- try:
941
- agent_name = modification.agent_name
942
-
943
- # Update lifecycle record if exists
944
- if agent_name in self.agent_records:
945
- record = self.agent_records[agent_name]
946
- record.last_modified = modification.timestamp
947
- record.modifications.append(modification.modification_id)
948
-
949
- # Update state based on modification type
950
- if modification.modification_type == ModificationType.DELETE:
951
- record.current_state = LifecycleState.DELETED
952
- elif modification.modification_type in [ModificationType.CREATE, ModificationType.MODIFY]:
953
- record.current_state = LifecycleState.MODIFIED
954
-
955
- self.logger.debug(f"Updated lifecycle record for {agent_name} due to {modification.modification_type.value}")
956
-
957
- except Exception as e:
958
- self.logger.error(f"Error handling modification event: {e}")
959
-
960
- async def _test_create_capability(self) -> bool:
961
- """Test agent creation capability."""
962
- try:
963
- # This would test if we can create agents in the configured tiers
964
- return (self.modification_tracker is not None and
965
- self.persistence_service is not None)
966
- except Exception:
967
- return False
968
-
969
- async def _test_modify_capability(self) -> bool:
970
- """Test agent modification capability."""
971
- try:
972
- # This would test if we can modify existing agents
973
- return (self.modification_tracker is not None and
974
- self.persistence_service is not None)
975
- except Exception:
976
- return False
977
-
978
- async def _test_delete_capability(self) -> bool:
979
- """Test agent deletion capability."""
980
- try:
981
- # This would test if we can delete agents
982
- return self.modification_tracker is not None
983
- except Exception:
984
- return False
985
-
986
- async def _cleanup_core_services(self) -> None:
987
- """Cleanup core services if we manage their lifecycle."""
988
- try:
989
- if self.modification_tracker:
990
- await self.modification_tracker.stop()
991
-
992
- if self.persistence_service:
993
- await self.persistence_service.stop()
994
-
995
- except Exception as e:
996
- self.logger.error(f"Error cleaning up core services: {e}")
997
-
998
- # Public API Methods
999
-
1000
- async def get_agent_status(self, agent_name: str) -> Optional[AgentLifecycleRecord]:
1001
- """Get current status of an agent."""
1002
- return self.agent_records.get(agent_name)
1003
-
1004
- async def list_agents(self, state_filter: Optional[LifecycleState] = None) -> List[AgentLifecycleRecord]:
1005
- """List agents with optional state filtering."""
1006
- agents = list(self.agent_records.values())
1007
-
1008
- if state_filter:
1009
- agents = [agent for agent in agents if agent.current_state == state_filter]
1010
-
1011
- return sorted(agents, key=lambda x: x.last_modified, reverse=True)
1012
-
1013
- async def get_operation_history(self, agent_name: Optional[str] = None, limit: int = 100) -> List[LifecycleOperationResult]:
1014
- """Get operation history with optional filtering."""
1015
- history = self.operation_history
1016
-
1017
- if agent_name:
1018
- history = [op for op in history if op.agent_name == agent_name]
1019
-
1020
- return sorted(history, key=lambda x: x.duration_ms, reverse=True)[:limit]
1021
-
1022
- async def get_lifecycle_stats(self) -> Dict[str, Any]:
1023
- """Get comprehensive lifecycle statistics."""
1024
- stats = {
1025
- 'total_agents': len(self.agent_records),
1026
- 'active_operations': len(self.active_operations),
1027
- 'performance_metrics': self.performance_metrics.copy()
1028
- }
1029
-
1030
- # State distribution
1031
- state_counts = {}
1032
- for record in self.agent_records.values():
1033
- state_counts[record.current_state.value] = state_counts.get(record.current_state.value, 0) + 1
1034
-
1035
- stats['agents_by_state'] = state_counts
1036
-
1037
- # Tier distribution
1038
- tier_counts = {}
1039
- for record in self.agent_records.values():
1040
- tier_counts[record.tier.value] = tier_counts.get(record.tier.value, 0) + 1
1041
-
1042
- stats['agents_by_tier'] = tier_counts
1043
-
1044
- # Recent activity
1045
- recent_ops = [
1046
- op for op in self.operation_history
1047
- if (time.time() - (op.duration_ms / 1000)) < 3600 # Last hour
1048
- ]
1049
- stats['recent_operations'] = len(recent_ops)
1050
-
1051
- return stats
1052
-
1053
- async def _create_agent_definition(self, agent_name: str, agent_content: str,
1054
- tier: ModificationTier, agent_type: str, **kwargs) -> AgentDefinition:
1055
- """
1056
- Create an AgentDefinition from lifecycle parameters.
1057
-
1058
- WHY: This method bridges the gap between the lifecycle manager's parameters
1059
- and the AgentManager's expected AgentDefinition model.
1060
-
1061
- DESIGN DECISION: Creating a minimal AgentDefinition here because:
1062
- - The full markdown parsing happens in AgentManager
1063
- - We only need to provide the essential metadata
1064
- - This keeps the lifecycle manager focused on orchestration
1065
- """
1066
- # Map tier to AgentType
1067
- type_map = {
1068
- ModificationTier.USER: AgentType.CUSTOM,
1069
- ModificationTier.PROJECT: AgentType.PROJECT,
1070
- ModificationTier.SYSTEM: AgentType.SYSTEM
1071
- }
1072
-
1073
- # Create metadata
1074
- from claude_mpm.models.agent_definition import AgentMetadata, AgentPermissions
1075
- metadata = AgentMetadata(
1076
- type=type_map.get(tier, AgentType.CUSTOM),
1077
- model_preference=kwargs.get('model_preference', 'claude-3-sonnet'),
1078
- version="1.0.0",
1079
- author=kwargs.get('author', 'claude-mpm'),
1080
- tags=kwargs.get('tags', []),
1081
- specializations=kwargs.get('specializations', [])
1082
- )
1083
-
1084
- # Create minimal definition
1085
- definition = AgentDefinition(
1086
- name=agent_name,
1087
- title=agent_name.replace('-', ' ').title(),
1088
- file_path="", # Will be set by AgentManager
1089
- metadata=metadata,
1090
- primary_role=kwargs.get('primary_role', f"{agent_name} agent"),
1091
- when_to_use={"select": [], "do_not_select": []},
1092
- capabilities=[],
1093
- authority=AgentPermissions(),
1094
- workflows=[],
1095
- escalation_triggers=[],
1096
- kpis=[],
1097
- dependencies=[],
1098
- tools_commands="",
1099
- raw_content=agent_content
1100
- )
1101
-
1102
- return definition
1103
-
1104
- async def _run_sync_in_executor(self, func, *args, **kwargs):
1105
- """
1106
- Run a synchronous function in an executor to avoid blocking.
1107
-
1108
- WHY: AgentManager has synchronous methods but AgentLifecycleManager is async.
1109
- This allows us to call sync methods without blocking the event loop.
1110
-
1111
- PERFORMANCE: Uses the default executor which manages a thread pool efficiently.
1112
- """
1113
- loop = asyncio.get_event_loop()
1114
- return await loop.run_in_executor(None, func, *args, **kwargs)
1115
-
1116
- async def restore_agent(self, agent_name: str, backup_path: Optional[str] = None) -> LifecycleOperationResult:
1117
- """Restore agent from backup."""
1118
- start_time = time.time()
1119
-
1120
- try:
1121
- record = self.agent_records.get(agent_name)
1122
- if not record:
1123
- return LifecycleOperationResult(
1124
- operation=LifecycleOperation.RESTORE,
1125
- agent_name=agent_name,
1126
- success=False,
1127
- duration_ms=(time.time() - start_time) * 1000,
1128
- error_message="Agent record not found"
1129
- )
1130
-
1131
- # Use latest backup if not specified
1132
- if not backup_path and record.backup_paths:
1133
- backup_path = record.backup_paths[-1]
1134
-
1135
- if not backup_path or not path_ops.validate_exists(backup_path):
1136
- return LifecycleOperationResult(
1137
- operation=LifecycleOperation.RESTORE,
1138
- agent_name=agent_name,
1139
- success=False,
1140
- duration_ms=(time.time() - start_time) * 1000,
1141
- error_message="No valid backup found"
1142
- )
1143
-
1144
- # Read backup content
1145
- backup_content = path_ops.safe_read(backup_path)
1146
- if not backup_content:
1147
- return LifecycleOperationResult(
1148
- operation=LifecycleOperation.RESTORE,
1149
- agent_name=agent_name,
1150
- success=False,
1151
- duration_ms=(time.time() - start_time) * 1000,
1152
- error_message="Failed to read backup content"
1153
- )
1154
-
1155
- # Restore via update operation
1156
- return await self.update_agent(
1157
- agent_name=agent_name,
1158
- agent_content=backup_content,
1159
- restored_from=backup_path
1160
- )
1161
-
1162
- except Exception as e:
1163
- return LifecycleOperationResult(
1164
- operation=LifecycleOperation.RESTORE,
1165
- agent_name=agent_name,
1166
- success=False,
1167
- duration_ms=(time.time() - start_time) * 1000,
1168
- error_message=str(e)
1169
- )