claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1062) hide show
  1. claude_mpm/BUILD_NUMBER +1 -0
  2. claude_mpm/VERSION +1 -0
  3. claude_mpm/__init__.py +50 -12
  4. claude_mpm/__main__.py +7 -2
  5. claude_mpm/agents/BASE_AGENT.md +164 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  8. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
  9. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  10. claude_mpm/agents/MEMORY.md +72 -0
  11. claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
  12. claude_mpm/agents/WORKFLOW.md +111 -0
  13. claude_mpm/agents/__init__.py +92 -80
  14. claude_mpm/agents/agent-template.yaml +83 -0
  15. claude_mpm/agents/agent_loader.py +560 -745
  16. claude_mpm/agents/agent_loader_integration.py +53 -55
  17. claude_mpm/agents/agents_metadata.py +186 -27
  18. claude_mpm/agents/async_agent_loader.py +436 -0
  19. claude_mpm/agents/base_agent.json +8 -4
  20. claude_mpm/agents/frontmatter_validator.py +754 -0
  21. claude_mpm/agents/system_agent_config.py +222 -155
  22. claude_mpm/agents/templates/README.md +465 -0
  23. claude_mpm/agents/templates/__init__.py +17 -13
  24. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  25. claude_mpm/agents/templates/context-management-examples.md +544 -0
  26. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  27. claude_mpm/agents/templates/pm-examples.md +474 -0
  28. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  29. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  30. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  31. claude_mpm/agents/templates/response-format.md +583 -0
  32. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  33. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  34. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  35. claude_mpm/agents/templates/validation-templates.md +312 -0
  36. claude_mpm/cli/__init__.py +94 -128
  37. claude_mpm/cli/__main__.py +33 -0
  38. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  39. claude_mpm/cli/commands/__init__.py +36 -12
  40. claude_mpm/cli/commands/agent_manager.py +1403 -0
  41. claude_mpm/cli/commands/agent_source.py +774 -0
  42. claude_mpm/cli/commands/agent_state_manager.py +335 -0
  43. claude_mpm/cli/commands/agents.py +2501 -168
  44. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  47. claude_mpm/cli/commands/aggregate.py +540 -0
  48. claude_mpm/cli/commands/analyze.py +553 -0
  49. claude_mpm/cli/commands/analyze_code.py +528 -0
  50. claude_mpm/cli/commands/auto_configure.py +1053 -0
  51. claude_mpm/cli/commands/cleanup.py +588 -0
  52. claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
  53. claude_mpm/cli/commands/config.py +586 -0
  54. claude_mpm/cli/commands/configure.py +3253 -0
  55. claude_mpm/cli/commands/configure_agent_display.py +282 -0
  56. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  57. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  58. claude_mpm/cli/commands/configure_models.py +18 -0
  59. claude_mpm/cli/commands/configure_navigation.py +184 -0
  60. claude_mpm/cli/commands/configure_paths.py +104 -0
  61. claude_mpm/cli/commands/configure_persistence.py +254 -0
  62. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  63. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  64. claude_mpm/cli/commands/configure_validators.py +73 -0
  65. claude_mpm/cli/commands/dashboard.py +286 -0
  66. claude_mpm/cli/commands/debug.py +1386 -0
  67. claude_mpm/cli/commands/doctor.py +243 -0
  68. claude_mpm/cli/commands/hook_errors.py +277 -0
  69. claude_mpm/cli/commands/info.py +195 -74
  70. claude_mpm/cli/commands/local_deploy.py +534 -0
  71. claude_mpm/cli/commands/mcp.py +205 -0
  72. claude_mpm/cli/commands/mcp_command_router.py +161 -0
  73. claude_mpm/cli/commands/mcp_config.py +154 -0
  74. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  75. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  76. claude_mpm/cli/commands/mcp_install_commands.py +346 -0
  77. claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
  78. claude_mpm/cli/commands/mcp_server_commands.py +155 -0
  79. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  80. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  81. claude_mpm/cli/commands/memory.py +585 -846
  82. claude_mpm/cli/commands/monitor.py +228 -310
  83. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  84. claude_mpm/cli/commands/mpm_init/core.py +759 -0
  85. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  86. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  87. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  88. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  89. claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
  90. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  91. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  92. claude_mpm/cli/commands/postmortem.py +401 -0
  93. claude_mpm/cli/commands/profile.py +276 -0
  94. claude_mpm/cli/commands/run.py +910 -488
  95. claude_mpm/cli/commands/search.py +458 -0
  96. claude_mpm/cli/commands/skill_source.py +694 -0
  97. claude_mpm/cli/commands/skills.py +1398 -0
  98. claude_mpm/cli/commands/summarize.py +413 -0
  99. claude_mpm/cli/commands/tickets.py +536 -53
  100. claude_mpm/cli/commands/uninstall.py +176 -0
  101. claude_mpm/cli/commands/upgrade.py +152 -0
  102. claude_mpm/cli/commands/verify.py +119 -0
  103. claude_mpm/cli/executor.py +298 -0
  104. claude_mpm/cli/helpers.py +105 -0
  105. claude_mpm/cli/interactive/__init__.py +31 -0
  106. claude_mpm/cli/interactive/agent_wizard.py +1927 -0
  107. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  108. claude_mpm/cli/interactive/skill_selector.py +481 -0
  109. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  110. claude_mpm/cli/parser.py +87 -563
  111. claude_mpm/cli/parsers/__init__.py +35 -0
  112. claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
  113. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  114. claude_mpm/cli/parsers/agents_parser.py +575 -0
  115. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  116. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  117. claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
  118. claude_mpm/cli/parsers/base_parser.py +649 -0
  119. claude_mpm/cli/parsers/config_parser.py +208 -0
  120. claude_mpm/cli/parsers/configure_parser.py +138 -0
  121. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  122. claude_mpm/cli/parsers/debug_parser.py +319 -0
  123. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  124. claude_mpm/cli/parsers/mcp_parser.py +195 -0
  125. claude_mpm/cli/parsers/memory_parser.py +138 -0
  126. claude_mpm/cli/parsers/monitor_parser.py +142 -0
  127. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  128. claude_mpm/cli/parsers/profile_parser.py +147 -0
  129. claude_mpm/cli/parsers/run_parser.py +157 -0
  130. claude_mpm/cli/parsers/search_parser.py +245 -0
  131. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  132. claude_mpm/cli/parsers/skills_parser.py +277 -0
  133. claude_mpm/cli/parsers/source_parser.py +138 -0
  134. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  135. claude_mpm/cli/shared/__init__.py +40 -0
  136. claude_mpm/cli/shared/argument_patterns.py +205 -0
  137. claude_mpm/cli/shared/base_command.py +242 -0
  138. claude_mpm/cli/shared/error_handling.py +242 -0
  139. claude_mpm/cli/shared/output_formatters.py +241 -0
  140. claude_mpm/cli/startup.py +1578 -0
  141. claude_mpm/cli/startup_display.py +480 -0
  142. claude_mpm/cli/startup_logging.py +839 -0
  143. claude_mpm/cli/utils.py +136 -47
  144. claude_mpm/cli_module/__init__.py +6 -6
  145. claude_mpm/cli_module/args.py +188 -140
  146. claude_mpm/cli_module/commands.py +79 -70
  147. claude_mpm/cli_module/migration_example.py +42 -64
  148. claude_mpm/commands/__init__.py +14 -0
  149. claude_mpm/commands/mpm-config.md +28 -0
  150. claude_mpm/commands/mpm-doctor.md +20 -0
  151. claude_mpm/commands/mpm-help.md +20 -0
  152. claude_mpm/commands/mpm-init.md +120 -0
  153. claude_mpm/commands/mpm-monitor.md +31 -0
  154. claude_mpm/commands/mpm-organize.md +120 -0
  155. claude_mpm/commands/mpm-postmortem.md +21 -0
  156. claude_mpm/commands/mpm-session-resume.md +30 -0
  157. claude_mpm/commands/mpm-status.md +20 -0
  158. claude_mpm/commands/mpm-ticket-view.md +109 -0
  159. claude_mpm/commands/mpm-version.md +20 -0
  160. claude_mpm/commands/mpm.md +31 -0
  161. claude_mpm/config/__init__.py +42 -2
  162. claude_mpm/config/agent_config.py +402 -0
  163. claude_mpm/config/agent_presets.py +488 -0
  164. claude_mpm/config/agent_sources.py +352 -0
  165. claude_mpm/config/experimental_features.py +217 -0
  166. claude_mpm/config/model_config.py +428 -0
  167. claude_mpm/config/paths.py +258 -0
  168. claude_mpm/config/skill_presets.py +392 -0
  169. claude_mpm/config/skill_sources.py +590 -0
  170. claude_mpm/config/socketio_config.py +125 -83
  171. claude_mpm/constants.py +133 -22
  172. claude_mpm/core/__init__.py +62 -36
  173. claude_mpm/core/agent_name_normalizer.py +71 -73
  174. claude_mpm/core/agent_registry.py +385 -492
  175. claude_mpm/core/agent_session_manager.py +81 -70
  176. claude_mpm/core/api_validator.py +330 -0
  177. claude_mpm/core/base_service.py +159 -122
  178. claude_mpm/core/cache.py +560 -0
  179. claude_mpm/core/claude_runner.py +696 -916
  180. claude_mpm/core/config.py +613 -122
  181. claude_mpm/core/config_aliases.py +74 -73
  182. claude_mpm/core/config_constants.py +314 -0
  183. claude_mpm/core/constants.py +361 -0
  184. claude_mpm/core/container.py +646 -104
  185. claude_mpm/core/enums.py +452 -0
  186. claude_mpm/core/error_handler.py +623 -0
  187. claude_mpm/core/exceptions.py +536 -0
  188. claude_mpm/core/factories.py +105 -109
  189. claude_mpm/core/file_utils.py +764 -0
  190. claude_mpm/core/framework/__init__.py +25 -0
  191. claude_mpm/core/framework/formatters/__init__.py +11 -0
  192. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  193. claude_mpm/core/framework/formatters/content_formatter.py +278 -0
  194. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  195. claude_mpm/core/framework/loaders/__init__.py +13 -0
  196. claude_mpm/core/framework/loaders/agent_loader.py +213 -0
  197. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  198. claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
  199. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  200. claude_mpm/core/framework/processors/__init__.py +11 -0
  201. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  202. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  203. claude_mpm/core/framework/processors/template_processor.py +244 -0
  204. claude_mpm/core/framework_loader.py +485 -414
  205. claude_mpm/core/hook_error_memory.py +381 -0
  206. claude_mpm/core/hook_manager.py +246 -86
  207. claude_mpm/core/hook_performance_config.py +147 -0
  208. claude_mpm/core/injectable_service.py +72 -63
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +670 -0
  211. claude_mpm/core/interfaces.py +570 -164
  212. claude_mpm/core/lazy.py +467 -0
  213. claude_mpm/core/log_manager.py +707 -0
  214. claude_mpm/core/logger.py +295 -134
  215. claude_mpm/core/logging_config.py +474 -0
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/minimal_framework_loader.py +24 -22
  218. claude_mpm/core/mixins.py +30 -29
  219. claude_mpm/core/oneshot_session.py +594 -0
  220. claude_mpm/core/optimized_agent_loader.py +479 -0
  221. claude_mpm/core/optimized_startup.py +554 -0
  222. claude_mpm/core/output_style_manager.py +491 -0
  223. claude_mpm/core/pm_hook_interceptor.py +197 -82
  224. claude_mpm/core/protocols/__init__.py +23 -0
  225. claude_mpm/core/protocols/runner_protocol.py +103 -0
  226. claude_mpm/core/protocols/session_protocol.py +131 -0
  227. claude_mpm/core/service_registry.py +153 -116
  228. claude_mpm/core/session_manager.py +179 -64
  229. claude_mpm/core/shared/__init__.py +17 -0
  230. claude_mpm/core/shared/config_loader.py +326 -0
  231. claude_mpm/core/shared/path_resolver.py +281 -0
  232. claude_mpm/core/shared/singleton_manager.py +221 -0
  233. claude_mpm/core/socketio_pool.py +400 -137
  234. claude_mpm/core/system_context.py +38 -0
  235. claude_mpm/core/tool_access_control.py +64 -57
  236. claude_mpm/core/types.py +307 -0
  237. claude_mpm/core/typing_utils.py +553 -0
  238. claude_mpm/core/unified_agent_registry.py +969 -0
  239. claude_mpm/core/unified_config.py +612 -0
  240. claude_mpm/core/unified_paths.py +958 -0
  241. claude_mpm/dashboard/__init__.py +12 -0
  242. claude_mpm/dashboard/api/simple_directory.py +261 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  249. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  250. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  251. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  252. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  253. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  254. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  255. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  256. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  257. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  258. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  259. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  260. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  261. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  262. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  263. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  264. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  265. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  266. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  267. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  268. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  269. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  270. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  271. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  272. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  273. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  274. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  275. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  276. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  277. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  278. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  279. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  280. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  281. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  282. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  283. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  284. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  285. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  286. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  287. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  288. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  289. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  290. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  291. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  292. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  293. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  303. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  305. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
  306. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  307. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  308. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  309. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  310. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  311. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  312. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  313. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  314. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  315. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  316. claude_mpm/experimental/__init__.py +10 -0
  317. claude_mpm/experimental/cli_enhancements.py +104 -89
  318. claude_mpm/generators/__init__.py +1 -1
  319. claude_mpm/generators/agent_profile_generator.py +76 -66
  320. claude_mpm/hooks/__init__.py +37 -1
  321. claude_mpm/hooks/base_hook.py +37 -32
  322. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  323. claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
  324. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  325. claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
  326. claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
  327. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
  328. claude_mpm/hooks/claude_hooks/installer.py +806 -0
  329. claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
  330. claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
  331. claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
  332. claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
  333. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
  334. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  335. claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
  336. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  337. claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
  338. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  339. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  340. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  341. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  342. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  343. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  344. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  345. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  346. claude_mpm/hooks/memory_integration_hook.py +201 -107
  347. claude_mpm/hooks/session_resume_hook.py +121 -0
  348. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  349. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  350. claude_mpm/hooks/tool_call_interceptor.py +92 -76
  351. claude_mpm/hooks/validation_hooks.py +62 -54
  352. claude_mpm/init.py +518 -83
  353. claude_mpm/models/__init__.py +9 -9
  354. claude_mpm/models/agent_definition.py +40 -23
  355. claude_mpm/models/agent_session.py +538 -0
  356. claude_mpm/models/git_repository.py +198 -0
  357. claude_mpm/models/resume_log.py +340 -0
  358. claude_mpm/schemas/__init__.py +12 -0
  359. claude_mpm/scripts/__init__.py +15 -0
  360. claude_mpm/scripts/claude-hook-handler.sh +227 -0
  361. claude_mpm/scripts/launch_monitor.py +165 -0
  362. claude_mpm/scripts/mpm_doctor.py +322 -0
  363. claude_mpm/scripts/socketio_daemon.py +189 -200
  364. claude_mpm/scripts/start_activity_logging.py +91 -0
  365. claude_mpm/services/__init__.py +208 -39
  366. claude_mpm/services/agent_capabilities_service.py +266 -0
  367. claude_mpm/services/agents/__init__.py +89 -0
  368. claude_mpm/services/agents/agent_builder.py +514 -0
  369. claude_mpm/services/agents/agent_preset_service.py +238 -0
  370. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  371. claude_mpm/services/agents/agent_review_service.py +280 -0
  372. claude_mpm/services/agents/agent_selection_service.py +484 -0
  373. claude_mpm/services/agents/auto_config_manager.py +796 -0
  374. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  375. claude_mpm/services/agents/cache_git_manager.py +621 -0
  376. claude_mpm/services/agents/deployment/__init__.py +21 -0
  377. claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
  378. claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
  379. claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
  380. claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
  381. claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
  382. claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
  383. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
  384. claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
  385. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
  386. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
  387. claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
  388. claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
  389. claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
  390. claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
  391. claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
  392. claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
  393. claude_mpm/services/agents/deployment/agent_validator.py +376 -0
  394. claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
  395. claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
  396. claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
  397. claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
  398. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  399. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  400. claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
  401. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  402. claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
  403. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  404. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  405. claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
  406. claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
  407. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  408. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  409. claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
  410. claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
  411. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  412. claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
  413. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  414. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  415. claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
  416. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
  417. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  418. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  419. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
  420. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  421. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  422. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
  423. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
  424. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
  425. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
  426. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
  427. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  428. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
  429. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  430. claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
  431. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
  432. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
  433. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  434. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  435. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  436. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  437. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  438. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  439. claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
  440. claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
  441. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  442. claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
  443. claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
  444. claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
  445. claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
  446. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  447. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  448. claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
  449. claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
  450. claude_mpm/services/agents/git_source_manager.py +682 -0
  451. claude_mpm/services/agents/loading/__init__.py +11 -0
  452. claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
  453. claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
  454. claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
  455. claude_mpm/services/agents/local_template_manager.py +784 -0
  456. claude_mpm/services/agents/management/__init__.py +9 -0
  457. claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
  458. claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
  459. claude_mpm/services/agents/memory/__init__.py +22 -0
  460. claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
  461. claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
  462. claude_mpm/services/agents/memory/content_manager.py +470 -0
  463. claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
  464. claude_mpm/services/agents/memory/memory_file_service.py +129 -0
  465. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  466. claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
  467. claude_mpm/services/agents/memory/template_generator.py +83 -0
  468. claude_mpm/services/agents/observers.py +547 -0
  469. claude_mpm/services/agents/recommender.py +617 -0
  470. claude_mpm/services/agents/registry/__init__.py +30 -0
  471. claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
  472. claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
  473. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  474. claude_mpm/services/agents/sources/__init__.py +13 -0
  475. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  476. claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
  477. claude_mpm/services/agents/startup_sync.py +262 -0
  478. claude_mpm/services/agents/toolchain_detector.py +478 -0
  479. claude_mpm/services/analysis/__init__.py +35 -0
  480. claude_mpm/services/analysis/clone_detector.py +1030 -0
  481. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  482. claude_mpm/services/analysis/postmortem_service.py +765 -0
  483. claude_mpm/services/async_session_logger.py +665 -0
  484. claude_mpm/services/claude_session_logger.py +321 -0
  485. claude_mpm/services/cli/__init__.py +18 -0
  486. claude_mpm/services/cli/agent_cleanup_service.py +408 -0
  487. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  488. claude_mpm/services/cli/agent_listing_service.py +463 -0
  489. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  490. claude_mpm/services/cli/agent_validation_service.py +590 -0
  491. claude_mpm/services/cli/memory_crud_service.py +622 -0
  492. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  493. claude_mpm/services/cli/resume_service.py +617 -0
  494. claude_mpm/services/cli/session_manager.py +604 -0
  495. claude_mpm/services/cli/session_pause_manager.py +504 -0
  496. claude_mpm/services/cli/session_resume_helper.py +372 -0
  497. claude_mpm/services/cli/startup_checker.py +362 -0
  498. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  499. claude_mpm/services/command_deployment_service.py +446 -0
  500. claude_mpm/services/command_handler_service.py +221 -0
  501. claude_mpm/services/communication/__init__.py +22 -0
  502. claude_mpm/services/core/__init__.py +108 -0
  503. claude_mpm/services/core/base.py +269 -0
  504. claude_mpm/services/core/cache_manager.py +309 -0
  505. claude_mpm/services/core/interfaces/__init__.py +273 -0
  506. claude_mpm/services/core/interfaces/agent.py +514 -0
  507. claude_mpm/services/core/interfaces/communication.py +316 -0
  508. claude_mpm/services/core/interfaces/health.py +169 -0
  509. claude_mpm/services/core/interfaces/infrastructure.py +357 -0
  510. claude_mpm/services/core/interfaces/model.py +281 -0
  511. claude_mpm/services/core/interfaces/process.py +372 -0
  512. claude_mpm/services/core/interfaces/project.py +121 -0
  513. claude_mpm/services/core/interfaces/restart.py +307 -0
  514. claude_mpm/services/core/interfaces/service.py +405 -0
  515. claude_mpm/services/core/interfaces/stability.py +260 -0
  516. claude_mpm/services/core/interfaces.py +81 -0
  517. claude_mpm/services/core/memory_manager.py +682 -0
  518. claude_mpm/services/core/models/__init__.py +70 -0
  519. claude_mpm/services/core/models/agent_config.py +384 -0
  520. claude_mpm/services/core/models/health.py +162 -0
  521. claude_mpm/services/core/models/process.py +239 -0
  522. claude_mpm/services/core/models/restart.py +302 -0
  523. claude_mpm/services/core/models/stability.py +264 -0
  524. claude_mpm/services/core/models/toolchain.py +306 -0
  525. claude_mpm/services/core/path_resolver.py +517 -0
  526. claude_mpm/services/core/service_container.py +520 -0
  527. claude_mpm/services/core/service_interfaces.py +436 -0
  528. claude_mpm/services/diagnostics/__init__.py +18 -0
  529. claude_mpm/services/diagnostics/checks/__init__.py +38 -0
  530. claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
  531. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  532. claude_mpm/services/diagnostics/checks/base_check.py +60 -0
  533. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  534. claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
  535. claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
  536. claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
  537. claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
  538. claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
  539. claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
  540. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  541. claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
  542. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  543. claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
  544. claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
  545. claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
  546. claude_mpm/services/diagnostics/models.py +138 -0
  547. claude_mpm/services/event_aggregator.py +582 -0
  548. claude_mpm/services/event_bus/__init__.py +18 -0
  549. claude_mpm/services/event_bus/config.py +186 -0
  550. claude_mpm/services/event_bus/direct_relay.py +312 -0
  551. claude_mpm/services/event_bus/event_bus.py +396 -0
  552. claude_mpm/services/event_bus/relay.py +326 -0
  553. claude_mpm/services/events/__init__.py +44 -0
  554. claude_mpm/services/events/consumers/__init__.py +18 -0
  555. claude_mpm/services/events/consumers/dead_letter.py +306 -0
  556. claude_mpm/services/events/consumers/logging.py +184 -0
  557. claude_mpm/services/events/consumers/metrics.py +241 -0
  558. claude_mpm/services/events/consumers/socketio.py +377 -0
  559. claude_mpm/services/events/core.py +480 -0
  560. claude_mpm/services/events/interfaces.py +214 -0
  561. claude_mpm/services/events/producers/__init__.py +14 -0
  562. claude_mpm/services/events/producers/hook.py +269 -0
  563. claude_mpm/services/events/producers/system.py +329 -0
  564. claude_mpm/services/exceptions.py +433 -353
  565. claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
  566. claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
  567. claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
  568. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
  569. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
  570. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
  571. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
  572. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
  573. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  574. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  575. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  576. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  577. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
  578. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  579. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  580. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
  581. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
  582. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  583. claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
  584. claude_mpm/services/git/__init__.py +21 -0
  585. claude_mpm/services/git/git_operations_service.py +579 -0
  586. claude_mpm/services/github/__init__.py +21 -0
  587. claude_mpm/services/github/github_cli_service.py +397 -0
  588. claude_mpm/services/hook_installer_service.py +506 -0
  589. claude_mpm/services/hook_service.py +159 -111
  590. claude_mpm/services/infrastructure/__init__.py +52 -0
  591. claude_mpm/services/infrastructure/context_preservation.py +569 -0
  592. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  593. claude_mpm/services/infrastructure/logging.py +209 -0
  594. claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
  595. claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
  596. claude_mpm/services/infrastructure/monitoring/base.py +122 -0
  597. claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
  598. claude_mpm/services/infrastructure/monitoring/network.py +219 -0
  599. claude_mpm/services/infrastructure/monitoring/process.py +343 -0
  600. claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
  601. claude_mpm/services/infrastructure/monitoring/service.py +368 -0
  602. claude_mpm/services/infrastructure/monitoring.py +71 -0
  603. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  604. claude_mpm/services/instructions/__init__.py +9 -0
  605. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  606. claude_mpm/services/local_ops/__init__.py +155 -0
  607. claude_mpm/services/local_ops/crash_detector.py +257 -0
  608. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  609. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  610. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  611. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  612. claude_mpm/services/local_ops/health_manager.py +427 -0
  613. claude_mpm/services/local_ops/log_monitor.py +396 -0
  614. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  615. claude_mpm/services/local_ops/process_manager.py +595 -0
  616. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  617. claude_mpm/services/local_ops/restart_manager.py +401 -0
  618. claude_mpm/services/local_ops/restart_policy.py +387 -0
  619. claude_mpm/services/local_ops/state_manager.py +372 -0
  620. claude_mpm/services/local_ops/unified_manager.py +600 -0
  621. claude_mpm/services/mcp_config_manager.py +1542 -0
  622. claude_mpm/services/mcp_service_verifier.py +732 -0
  623. claude_mpm/services/memory/__init__.py +19 -0
  624. claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
  625. claude_mpm/services/memory/cache/__init__.py +14 -0
  626. claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
  627. claude_mpm/services/memory/cache/simple_cache.py +331 -0
  628. claude_mpm/services/memory/failure_tracker.py +578 -0
  629. claude_mpm/services/memory/indexed_memory.py +648 -0
  630. claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
  631. claude_mpm/services/memory/router.py +951 -0
  632. claude_mpm/services/memory_hook_service.py +470 -0
  633. claude_mpm/services/model/__init__.py +147 -0
  634. claude_mpm/services/model/base_provider.py +365 -0
  635. claude_mpm/services/model/claude_provider.py +412 -0
  636. claude_mpm/services/model/model_router.py +452 -0
  637. claude_mpm/services/model/ollama_provider.py +415 -0
  638. claude_mpm/services/monitor/__init__.py +20 -0
  639. claude_mpm/services/monitor/daemon.py +698 -0
  640. claude_mpm/services/monitor/daemon_manager.py +1076 -0
  641. claude_mpm/services/monitor/event_emitter.py +350 -0
  642. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  643. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  644. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  645. claude_mpm/services/monitor/handlers/file.py +264 -0
  646. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  647. claude_mpm/services/monitor/management/__init__.py +18 -0
  648. claude_mpm/services/monitor/management/health.py +124 -0
  649. claude_mpm/services/monitor/management/lifecycle.py +730 -0
  650. claude_mpm/services/monitor/server.py +1493 -0
  651. claude_mpm/services/monitor_build_service.py +349 -0
  652. claude_mpm/services/native_agent_converter.py +356 -0
  653. claude_mpm/services/orphan_detection.py +786 -0
  654. claude_mpm/services/pm_skills_deployer.py +711 -0
  655. claude_mpm/services/port_manager.py +597 -0
  656. claude_mpm/services/pr/__init__.py +14 -0
  657. claude_mpm/services/pr/pr_template_service.py +329 -0
  658. claude_mpm/services/profile_manager.py +337 -0
  659. claude_mpm/services/project/__init__.py +44 -0
  660. claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
  661. claude_mpm/services/project/analyzer_v2.py +566 -0
  662. claude_mpm/services/project/architecture_analyzer.py +461 -0
  663. claude_mpm/services/project/archive_manager.py +1045 -0
  664. claude_mpm/services/project/dependency_analyzer.py +462 -0
  665. claude_mpm/services/project/detection_strategies.py +719 -0
  666. claude_mpm/services/project/documentation_manager.py +554 -0
  667. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  668. claude_mpm/services/project/language_analyzer.py +265 -0
  669. claude_mpm/services/project/metrics_collector.py +407 -0
  670. claude_mpm/services/project/project_organizer.py +1009 -0
  671. claude_mpm/services/project/registry.py +636 -0
  672. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  673. claude_mpm/services/project_port_allocator.py +596 -0
  674. claude_mpm/services/recovery_manager.py +293 -240
  675. claude_mpm/services/response_tracker.py +267 -0
  676. claude_mpm/services/runner_configuration_service.py +605 -0
  677. claude_mpm/services/self_upgrade_service.py +608 -0
  678. claude_mpm/services/session_management_service.py +314 -0
  679. claude_mpm/services/session_manager.py +380 -0
  680. claude_mpm/services/shared/__init__.py +21 -0
  681. claude_mpm/services/shared/async_service_base.py +216 -0
  682. claude_mpm/services/shared/config_service_base.py +301 -0
  683. claude_mpm/services/shared/lifecycle_service_base.py +308 -0
  684. claude_mpm/services/shared/manager_base.py +315 -0
  685. claude_mpm/services/shared/service_factory.py +309 -0
  686. claude_mpm/services/skills/__init__.py +21 -0
  687. claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
  688. claude_mpm/services/skills/selective_skill_deployer.py +743 -0
  689. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  690. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  691. claude_mpm/services/skills_config.py +547 -0
  692. claude_mpm/services/skills_deployer.py +1168 -0
  693. claude_mpm/services/socketio/__init__.py +25 -0
  694. claude_mpm/services/socketio/client_proxy.py +229 -0
  695. claude_mpm/services/socketio/dashboard_server.py +362 -0
  696. claude_mpm/services/socketio/event_normalizer.py +798 -0
  697. claude_mpm/services/socketio/handlers/__init__.py +30 -0
  698. claude_mpm/services/socketio/handlers/base.py +136 -0
  699. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  700. claude_mpm/services/socketio/handlers/connection.py +643 -0
  701. claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
  702. claude_mpm/services/socketio/handlers/file.py +263 -0
  703. claude_mpm/services/socketio/handlers/git.py +962 -0
  704. claude_mpm/services/socketio/handlers/hook.py +211 -0
  705. claude_mpm/services/socketio/handlers/memory.py +26 -0
  706. claude_mpm/services/socketio/handlers/project.py +24 -0
  707. claude_mpm/services/socketio/handlers/registry.py +214 -0
  708. claude_mpm/services/socketio/migration_utils.py +343 -0
  709. claude_mpm/services/socketio/monitor_client.py +364 -0
  710. claude_mpm/services/socketio/server/__init__.py +18 -0
  711. claude_mpm/services/socketio/server/broadcaster.py +569 -0
  712. claude_mpm/services/socketio/server/connection_manager.py +579 -0
  713. claude_mpm/services/socketio/server/core.py +1079 -0
  714. claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
  715. claude_mpm/services/socketio/server/main.py +501 -0
  716. claude_mpm/services/socketio_client_manager.py +173 -143
  717. claude_mpm/services/socketio_server.py +38 -1657
  718. claude_mpm/services/subprocess_launcher_service.py +322 -0
  719. claude_mpm/services/system_instructions_service.py +270 -0
  720. claude_mpm/services/ticket_manager.py +25 -209
  721. claude_mpm/services/ticket_services/__init__.py +26 -0
  722. claude_mpm/services/ticket_services/crud_service.py +328 -0
  723. claude_mpm/services/ticket_services/formatter_service.py +290 -0
  724. claude_mpm/services/ticket_services/search_service.py +324 -0
  725. claude_mpm/services/ticket_services/validation_service.py +303 -0
  726. claude_mpm/services/ticket_services/workflow_service.py +244 -0
  727. claude_mpm/services/unified/__init__.py +65 -0
  728. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  729. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  730. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  731. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  732. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  733. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  734. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  735. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  736. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  737. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  738. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  739. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  740. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  741. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  742. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  743. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  744. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  745. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  746. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  747. claude_mpm/services/unified/interfaces.py +475 -0
  748. claude_mpm/services/unified/migration.py +509 -0
  749. claude_mpm/services/unified/strategies.py +534 -0
  750. claude_mpm/services/unified/unified_analyzer.py +542 -0
  751. claude_mpm/services/unified/unified_config.py +691 -0
  752. claude_mpm/services/unified/unified_deployment.py +466 -0
  753. claude_mpm/services/utility_service.py +280 -0
  754. claude_mpm/services/version_control/__init__.py +34 -37
  755. claude_mpm/services/version_control/branch_strategy.py +26 -17
  756. claude_mpm/services/version_control/conflict_resolution.py +52 -36
  757. claude_mpm/services/version_control/git_operations.py +183 -49
  758. claude_mpm/services/version_control/semantic_versioning.py +172 -61
  759. claude_mpm/services/version_control/version_parser.py +546 -0
  760. claude_mpm/services/version_service.py +379 -0
  761. claude_mpm/services/visualization/__init__.py +15 -0
  762. claude_mpm/services/visualization/mermaid_generator.py +937 -0
  763. claude_mpm/skills/__init__.py +42 -0
  764. claude_mpm/skills/agent_skills_injector.py +324 -0
  765. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  766. claude_mpm/skills/bundled/__init__.py +6 -0
  767. claude_mpm/skills/bundled/api-documentation.md +393 -0
  768. claude_mpm/skills/bundled/async-testing.md +571 -0
  769. claude_mpm/skills/bundled/code-review.md +143 -0
  770. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  771. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  772. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  773. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  774. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  775. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  776. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  777. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  778. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  779. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  780. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  781. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  782. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  783. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  784. claude_mpm/skills/bundled/database-migration.md +199 -0
  785. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  786. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  787. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  788. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  789. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  790. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  791. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  792. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  793. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  794. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  795. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  796. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  797. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  798. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  799. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  800. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  801. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  802. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  803. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  804. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  805. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  806. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  807. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  808. claude_mpm/skills/bundled/git-workflow.md +414 -0
  809. claude_mpm/skills/bundled/imagemagick.md +204 -0
  810. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  811. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  812. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  813. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  814. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  815. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  816. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  817. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  818. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  819. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  820. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  821. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  822. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  823. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  824. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  825. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  826. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  827. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  828. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  829. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  830. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  831. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  832. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  833. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  834. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  835. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  836. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  837. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  838. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  839. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  840. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  841. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  842. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  843. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  844. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  845. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  846. claude_mpm/skills/bundled/pdf.md +141 -0
  847. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  848. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  849. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  850. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  851. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  852. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  853. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  854. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  855. claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
  856. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  857. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  858. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  859. claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
  860. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  861. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  862. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  863. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  864. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  865. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  866. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  867. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  868. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  869. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  870. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  871. claude_mpm/skills/bundled/security-scanning.md +439 -0
  872. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  873. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  874. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  875. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  876. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  877. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  878. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  879. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  880. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  881. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  882. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  883. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  884. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  885. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  886. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  887. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  888. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  889. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  890. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  891. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  892. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  893. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  894. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  895. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  896. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  897. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  898. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  899. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  900. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  901. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  902. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  903. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  904. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  905. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  906. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  907. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  908. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  909. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  910. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  911. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  912. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  913. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  914. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  915. claude_mpm/skills/bundled/xlsx.md +157 -0
  916. claude_mpm/skills/registry.py +286 -0
  917. claude_mpm/skills/skill_manager.py +405 -0
  918. claude_mpm/skills/skills_registry.py +347 -0
  919. claude_mpm/skills/skills_service.py +739 -0
  920. claude_mpm/storage/__init__.py +9 -0
  921. claude_mpm/storage/state_storage.py +546 -0
  922. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  923. claude_mpm/templates/questions/__init__.py +38 -0
  924. claude_mpm/templates/questions/base.py +193 -0
  925. claude_mpm/templates/questions/pr_strategy.py +311 -0
  926. claude_mpm/templates/questions/project_init.py +385 -0
  927. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  928. claude_mpm/ticket_wrapper.py +2 -2
  929. claude_mpm/tools/__init__.py +10 -0
  930. claude_mpm/tools/__main__.py +208 -0
  931. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  932. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  933. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  934. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  935. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  936. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  937. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  938. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  939. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  940. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  941. claude_mpm/tools/code_tree_builder.py +631 -0
  942. claude_mpm/tools/code_tree_events.py +420 -0
  943. claude_mpm/tools/socketio_debug.py +671 -0
  944. claude_mpm/utils/__init__.py +8 -8
  945. claude_mpm/utils/agent_dependency_loader.py +1189 -0
  946. claude_mpm/utils/agent_filters.py +261 -0
  947. claude_mpm/utils/common.py +544 -0
  948. claude_mpm/utils/config_manager.py +168 -126
  949. claude_mpm/utils/console.py +11 -0
  950. claude_mpm/utils/database_connector.py +298 -0
  951. claude_mpm/utils/dependency_cache.py +373 -0
  952. claude_mpm/utils/dependency_manager.py +60 -59
  953. claude_mpm/utils/dependency_strategies.py +381 -0
  954. claude_mpm/utils/display_helper.py +260 -0
  955. claude_mpm/utils/environment_context.py +313 -0
  956. claude_mpm/utils/error_handler.py +78 -66
  957. claude_mpm/utils/file_utils.py +305 -0
  958. claude_mpm/utils/framework_detection.py +12 -11
  959. claude_mpm/utils/git_analyzer.py +407 -0
  960. claude_mpm/utils/gitignore.py +244 -0
  961. claude_mpm/utils/import_migration_example.py +12 -60
  962. claude_mpm/utils/imports.py +48 -45
  963. claude_mpm/utils/log_cleanup.py +627 -0
  964. claude_mpm/utils/migration.py +372 -0
  965. claude_mpm/utils/path_operations.py +110 -104
  966. claude_mpm/utils/progress.py +387 -0
  967. claude_mpm/utils/robust_installer.py +844 -0
  968. claude_mpm/utils/session_logging.py +121 -0
  969. claude_mpm/utils/structured_questions.py +619 -0
  970. claude_mpm/utils/subprocess_utils.py +343 -0
  971. claude_mpm/validation/__init__.py +1 -1
  972. claude_mpm/validation/agent_validator.py +214 -108
  973. claude_mpm/validation/frontmatter_validator.py +252 -0
  974. claude_mpm-5.4.85.dist-info/METADATA +1023 -0
  975. claude_mpm-5.4.85.dist-info/RECORD +980 -0
  976. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
  977. claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
  978. claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
  979. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
  980. claude_mpm/agents/INSTRUCTIONS.md +0 -352
  981. claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
  982. claude_mpm/agents/base_agent_loader.py +0 -529
  983. claude_mpm/agents/schema/agent_schema.json +0 -314
  984. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
  985. claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
  986. claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
  987. claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
  988. claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
  989. claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
  990. claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
  991. claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
  992. claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
  993. claude_mpm/agents/templates/data_engineer.json +0 -110
  994. claude_mpm/agents/templates/documentation.json +0 -109
  995. claude_mpm/agents/templates/engineer.json +0 -113
  996. claude_mpm/agents/templates/ops.json +0 -109
  997. claude_mpm/agents/templates/pm.json +0 -25
  998. claude_mpm/agents/templates/qa.json +0 -111
  999. claude_mpm/agents/templates/research.json +0 -65
  1000. claude_mpm/agents/templates/security.json +0 -113
  1001. claude_mpm/agents/templates/test_integration.json +0 -112
  1002. claude_mpm/agents/templates/version_control.json +0 -107
  1003. claude_mpm/cli/commands/ui.py +0 -57
  1004. claude_mpm/core/simple_runner.py +0 -1046
  1005. claude_mpm/dashboard/open_dashboard.py +0 -34
  1006. claude_mpm/deployment_paths.py +0 -261
  1007. claude_mpm/hooks/builtin/__init__.py +0 -1
  1008. claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
  1009. claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
  1010. claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
  1011. claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
  1012. claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
  1013. claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
  1014. claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
  1015. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
  1016. claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
  1017. claude_mpm/orchestration/__init__.py +0 -6
  1018. claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
  1019. claude_mpm/orchestration/archive/factory.py +0 -215
  1020. claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
  1021. claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
  1022. claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
  1023. claude_mpm/orchestration/archive/orchestrator.py +0 -501
  1024. claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
  1025. claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
  1026. claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
  1027. claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
  1028. claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
  1029. claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
  1030. claude_mpm/schemas/workflow_validator.py +0 -411
  1031. claude_mpm/services/agent_deployment.py +0 -1534
  1032. claude_mpm/services/agent_lifecycle_manager.py +0 -1169
  1033. claude_mpm/services/agent_memory_manager.py +0 -1415
  1034. claude_mpm/services/agent_registry.py +0 -676
  1035. claude_mpm/services/deployed_agent_discovery.py +0 -226
  1036. claude_mpm/services/framework_agent_loader.py +0 -337
  1037. claude_mpm/services/framework_claude_md_generator.py +0 -621
  1038. claude_mpm/services/health_monitor.py +0 -892
  1039. claude_mpm/services/memory_router.py +0 -538
  1040. claude_mpm/services/parent_directory_manager/__init__.py +0 -577
  1041. claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
  1042. claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
  1043. claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
  1044. claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
  1045. claude_mpm/services/parent_directory_manager/operations.py +0 -186
  1046. claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
  1047. claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
  1048. claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
  1049. claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
  1050. claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
  1051. claude_mpm/services/standalone_socketio_server.py +0 -1300
  1052. claude_mpm/services/ticket_manager_di.py +0 -318
  1053. claude_mpm/services/ticketing_service_original.py +0 -508
  1054. claude_mpm/ui/__init__.py +0 -1
  1055. claude_mpm/ui/rich_terminal_ui.py +0 -295
  1056. claude_mpm/ui/terminal_ui.py +0 -328
  1057. claude_mpm/utils/paths.py +0 -289
  1058. claude_mpm-3.4.10.dist-info/METADATA +0 -183
  1059. claude_mpm-3.4.10.dist-info/RECORD +0 -201
  1060. claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
  1061. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
  1062. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
@@ -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
- )