claude-mpm 5.4.22__py3-none-any.whl → 5.6.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (487) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_AGENT.md +164 -0
  3. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +374 -1257
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +1 -1
  11. claude_mpm/agents/base_agent.json +31 -0
  12. claude_mpm/agents/frontmatter_validator.py +2 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  14. claude_mpm/cli/__init__.py +5 -1
  15. claude_mpm/cli/commands/agent_state_manager.py +10 -10
  16. claude_mpm/cli/commands/agents.py +11 -13
  17. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  18. claude_mpm/cli/commands/auto_configure.py +4 -4
  19. claude_mpm/cli/commands/autotodos.py +566 -0
  20. claude_mpm/cli/commands/commander.py +216 -0
  21. claude_mpm/cli/commands/configure.py +621 -22
  22. claude_mpm/cli/commands/configure_agent_display.py +12 -0
  23. claude_mpm/cli/commands/hook_errors.py +60 -60
  24. claude_mpm/cli/commands/monitor.py +2 -2
  25. claude_mpm/cli/commands/mpm_init/core.py +72 -0
  26. claude_mpm/cli/commands/postmortem.py +1 -1
  27. claude_mpm/cli/commands/profile.py +276 -0
  28. claude_mpm/cli/commands/run.py +35 -3
  29. claude_mpm/cli/commands/skill_source.py +51 -2
  30. claude_mpm/cli/commands/skills.py +182 -32
  31. claude_mpm/cli/executor.py +130 -16
  32. claude_mpm/cli/interactive/__init__.py +10 -0
  33. claude_mpm/cli/interactive/agent_wizard.py +32 -52
  34. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  35. claude_mpm/cli/interactive/skill_selector.py +481 -0
  36. claude_mpm/cli/parsers/base_parser.py +83 -1
  37. claude_mpm/cli/parsers/commander_parser.py +116 -0
  38. claude_mpm/cli/parsers/profile_parser.py +147 -0
  39. claude_mpm/cli/parsers/run_parser.py +10 -0
  40. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  41. claude_mpm/cli/parsers/skills_parser.py +2 -3
  42. claude_mpm/cli/startup.py +690 -386
  43. claude_mpm/cli/startup_display.py +74 -6
  44. claude_mpm/cli/startup_logging.py +2 -2
  45. claude_mpm/cli/utils.py +7 -3
  46. claude_mpm/commander/__init__.py +78 -0
  47. claude_mpm/commander/adapters/__init__.py +60 -0
  48. claude_mpm/commander/adapters/auggie.py +260 -0
  49. claude_mpm/commander/adapters/base.py +288 -0
  50. claude_mpm/commander/adapters/claude_code.py +392 -0
  51. claude_mpm/commander/adapters/codex.py +237 -0
  52. claude_mpm/commander/adapters/communication.py +366 -0
  53. claude_mpm/commander/adapters/example_usage.py +310 -0
  54. claude_mpm/commander/adapters/mpm.py +389 -0
  55. claude_mpm/commander/adapters/registry.py +204 -0
  56. claude_mpm/commander/api/__init__.py +16 -0
  57. claude_mpm/commander/api/app.py +121 -0
  58. claude_mpm/commander/api/errors.py +133 -0
  59. claude_mpm/commander/api/routes/__init__.py +8 -0
  60. claude_mpm/commander/api/routes/events.py +184 -0
  61. claude_mpm/commander/api/routes/inbox.py +171 -0
  62. claude_mpm/commander/api/routes/messages.py +148 -0
  63. claude_mpm/commander/api/routes/projects.py +271 -0
  64. claude_mpm/commander/api/routes/sessions.py +226 -0
  65. claude_mpm/commander/api/routes/work.py +296 -0
  66. claude_mpm/commander/api/schemas.py +186 -0
  67. claude_mpm/commander/chat/__init__.py +7 -0
  68. claude_mpm/commander/chat/cli.py +146 -0
  69. claude_mpm/commander/chat/commands.py +96 -0
  70. claude_mpm/commander/chat/repl.py +310 -0
  71. claude_mpm/commander/config.py +51 -0
  72. claude_mpm/commander/config_loader.py +115 -0
  73. claude_mpm/commander/core/__init__.py +10 -0
  74. claude_mpm/commander/core/block_manager.py +325 -0
  75. claude_mpm/commander/core/response_manager.py +323 -0
  76. claude_mpm/commander/daemon.py +603 -0
  77. claude_mpm/commander/env_loader.py +59 -0
  78. claude_mpm/commander/events/__init__.py +26 -0
  79. claude_mpm/commander/events/manager.py +332 -0
  80. claude_mpm/commander/frameworks/__init__.py +12 -0
  81. claude_mpm/commander/frameworks/base.py +146 -0
  82. claude_mpm/commander/frameworks/claude_code.py +58 -0
  83. claude_mpm/commander/frameworks/mpm.py +62 -0
  84. claude_mpm/commander/inbox/__init__.py +16 -0
  85. claude_mpm/commander/inbox/dedup.py +128 -0
  86. claude_mpm/commander/inbox/inbox.py +224 -0
  87. claude_mpm/commander/inbox/models.py +70 -0
  88. claude_mpm/commander/instance_manager.py +450 -0
  89. claude_mpm/commander/llm/__init__.py +6 -0
  90. claude_mpm/commander/llm/openrouter_client.py +167 -0
  91. claude_mpm/commander/llm/summarizer.py +70 -0
  92. claude_mpm/commander/memory/__init__.py +45 -0
  93. claude_mpm/commander/memory/compression.py +347 -0
  94. claude_mpm/commander/memory/embeddings.py +230 -0
  95. claude_mpm/commander/memory/entities.py +310 -0
  96. claude_mpm/commander/memory/example_usage.py +290 -0
  97. claude_mpm/commander/memory/integration.py +325 -0
  98. claude_mpm/commander/memory/search.py +381 -0
  99. claude_mpm/commander/memory/store.py +657 -0
  100. claude_mpm/commander/models/__init__.py +18 -0
  101. claude_mpm/commander/models/events.py +121 -0
  102. claude_mpm/commander/models/project.py +162 -0
  103. claude_mpm/commander/models/work.py +214 -0
  104. claude_mpm/commander/parsing/__init__.py +20 -0
  105. claude_mpm/commander/parsing/extractor.py +132 -0
  106. claude_mpm/commander/parsing/output_parser.py +270 -0
  107. claude_mpm/commander/parsing/patterns.py +100 -0
  108. claude_mpm/commander/persistence/__init__.py +11 -0
  109. claude_mpm/commander/persistence/event_store.py +274 -0
  110. claude_mpm/commander/persistence/state_store.py +309 -0
  111. claude_mpm/commander/persistence/work_store.py +164 -0
  112. claude_mpm/commander/polling/__init__.py +13 -0
  113. claude_mpm/commander/polling/event_detector.py +104 -0
  114. claude_mpm/commander/polling/output_buffer.py +49 -0
  115. claude_mpm/commander/polling/output_poller.py +153 -0
  116. claude_mpm/commander/project_session.py +268 -0
  117. claude_mpm/commander/proxy/__init__.py +12 -0
  118. claude_mpm/commander/proxy/formatter.py +89 -0
  119. claude_mpm/commander/proxy/output_handler.py +191 -0
  120. claude_mpm/commander/proxy/relay.py +155 -0
  121. claude_mpm/commander/registry.py +410 -0
  122. claude_mpm/commander/runtime/__init__.py +10 -0
  123. claude_mpm/commander/runtime/executor.py +191 -0
  124. claude_mpm/commander/runtime/monitor.py +346 -0
  125. claude_mpm/commander/session/__init__.py +6 -0
  126. claude_mpm/commander/session/context.py +81 -0
  127. claude_mpm/commander/session/manager.py +59 -0
  128. claude_mpm/commander/tmux_orchestrator.py +361 -0
  129. claude_mpm/commander/web/__init__.py +1 -0
  130. claude_mpm/commander/work/__init__.py +30 -0
  131. claude_mpm/commander/work/executor.py +207 -0
  132. claude_mpm/commander/work/queue.py +405 -0
  133. claude_mpm/commander/workflow/__init__.py +27 -0
  134. claude_mpm/commander/workflow/event_handler.py +241 -0
  135. claude_mpm/commander/workflow/notifier.py +146 -0
  136. claude_mpm/commands/mpm-config.md +20 -249
  137. claude_mpm/commands/mpm-doctor.md +16 -21
  138. claude_mpm/commands/mpm-help.md +12 -205
  139. claude_mpm/commands/mpm-init.md +88 -506
  140. claude_mpm/commands/mpm-monitor.md +22 -401
  141. claude_mpm/commands/mpm-organize.md +70 -442
  142. claude_mpm/commands/mpm-postmortem.md +13 -107
  143. claude_mpm/commands/mpm-session-resume.md +20 -363
  144. claude_mpm/commands/mpm-status.md +13 -69
  145. claude_mpm/commands/mpm-ticket-view.md +60 -495
  146. claude_mpm/commands/mpm-version.md +13 -107
  147. claude_mpm/commands/mpm.md +8 -0
  148. claude_mpm/config/agent_presets.py +8 -7
  149. claude_mpm/config/skill_sources.py +16 -0
  150. claude_mpm/constants.py +1 -0
  151. claude_mpm/core/claude_runner.py +154 -2
  152. claude_mpm/core/config.py +37 -26
  153. claude_mpm/core/config_constants.py +74 -9
  154. claude_mpm/core/constants.py +56 -12
  155. claude_mpm/core/framework/loaders/agent_loader.py +1 -1
  156. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  157. claude_mpm/core/hook_manager.py +51 -3
  158. claude_mpm/core/interactive_session.py +12 -11
  159. claude_mpm/core/logger.py +26 -9
  160. claude_mpm/core/logging_utils.py +39 -13
  161. claude_mpm/core/network_config.py +148 -0
  162. claude_mpm/core/oneshot_session.py +7 -6
  163. claude_mpm/core/optimized_startup.py +61 -0
  164. claude_mpm/core/output_style_manager.py +66 -18
  165. claude_mpm/core/shared/config_loader.py +3 -1
  166. claude_mpm/core/socketio_pool.py +47 -15
  167. claude_mpm/core/unified_agent_registry.py +1 -1
  168. claude_mpm/core/unified_config.py +54 -8
  169. claude_mpm/core/unified_paths.py +95 -90
  170. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  236. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  237. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  238. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  239. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  240. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  241. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  242. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  243. claude_mpm/experimental/cli_enhancements.py +2 -1
  244. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  245. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  246. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  247. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  248. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  249. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  250. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  251. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  252. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  255. claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
  256. claude_mpm/hooks/claude_hooks/hook_handler.py +313 -99
  257. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  258. claude_mpm/hooks/claude_hooks/installer.py +206 -36
  259. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  260. claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
  261. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  262. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +67 -32
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
  271. claude_mpm/hooks/claude_hooks/services/container.py +310 -0
  272. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  273. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  274. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
  275. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  276. claude_mpm/hooks/session_resume_hook.py +89 -1
  277. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  278. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  279. claude_mpm/init.py +276 -0
  280. claude_mpm/models/git_repository.py +3 -3
  281. claude_mpm/scripts/claude-hook-handler.sh +46 -19
  282. claude_mpm/services/agents/agent_builder.py +3 -3
  283. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  284. claude_mpm/services/agents/agent_selection_service.py +2 -2
  285. claude_mpm/services/agents/cache_git_manager.py +7 -7
  286. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  287. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -2
  288. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  289. claude_mpm/services/agents/deployment/agent_template_builder.py +39 -19
  290. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  291. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  292. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  293. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  294. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +169 -26
  295. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +101 -75
  296. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  297. claude_mpm/services/agents/git_source_manager.py +23 -4
  298. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  299. claude_mpm/services/agents/recommender.py +5 -3
  300. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  301. claude_mpm/services/agents/sources/git_source_sync_service.py +121 -10
  302. claude_mpm/services/agents/startup_sync.py +27 -4
  303. claude_mpm/services/cli/__init__.py +3 -0
  304. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  305. claude_mpm/services/cli/session_resume_helper.py +10 -2
  306. claude_mpm/services/command_deployment_service.py +44 -26
  307. claude_mpm/services/delegation_detector.py +175 -0
  308. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  309. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  310. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  311. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  312. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  313. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  314. claude_mpm/services/diagnostics/models.py +14 -1
  315. claude_mpm/services/event_log.py +325 -0
  316. claude_mpm/services/git/git_operations_service.py +8 -8
  317. claude_mpm/services/hook_installer_service.py +77 -8
  318. claude_mpm/services/infrastructure/__init__.py +4 -0
  319. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  320. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  321. claude_mpm/services/monitor/daemon_manager.py +15 -4
  322. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  323. claude_mpm/services/monitor/server.py +571 -11
  324. claude_mpm/services/pm_skills_deployer.py +884 -0
  325. claude_mpm/services/profile_manager.py +337 -0
  326. claude_mpm/services/skills/git_skill_source_manager.py +281 -20
  327. claude_mpm/services/skills/selective_skill_deployer.py +211 -46
  328. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  329. claude_mpm/services/skills_deployer.py +192 -70
  330. claude_mpm/services/socketio/dashboard_server.py +1 -0
  331. claude_mpm/services/socketio/event_normalizer.py +37 -6
  332. claude_mpm/services/socketio/handlers/hook.py +14 -7
  333. claude_mpm/services/socketio/server/core.py +262 -123
  334. claude_mpm/services/socketio/server/main.py +12 -4
  335. claude_mpm/skills/__init__.py +2 -1
  336. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  337. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  338. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  339. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  340. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  341. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  342. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  343. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  344. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  345. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  346. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  347. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  348. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  349. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  350. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  351. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  352. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  353. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  354. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  355. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  356. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  357. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  358. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  359. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  360. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  361. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  362. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  363. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  364. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  365. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  366. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  367. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  368. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  369. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  370. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  371. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  372. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  373. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  374. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  375. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  376. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  377. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  378. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  379. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  380. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  381. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  382. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  383. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  384. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  385. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  386. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  387. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  388. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  389. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  390. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  391. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  392. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  393. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  394. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  395. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  396. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  397. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  398. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  399. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  400. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  401. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  402. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  403. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  404. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  405. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  406. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  407. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  408. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  409. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  410. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  411. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  412. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  413. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  414. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  415. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  416. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  417. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  418. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  419. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  420. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  422. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  423. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  424. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  425. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  426. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  427. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  428. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  429. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  430. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  431. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  432. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  433. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  434. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  435. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  436. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  437. claude_mpm/skills/bundled/security-scanning.md +112 -0
  438. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  439. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  440. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  441. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  442. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  443. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  444. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  445. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  446. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  447. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  448. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  449. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  450. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  451. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  452. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  453. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  454. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  455. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  456. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  457. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  458. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  459. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  460. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  461. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  462. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  463. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  464. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  465. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  467. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  468. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  469. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  470. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  471. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  472. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  473. claude_mpm/skills/registry.py +295 -90
  474. claude_mpm/skills/skill_manager.py +98 -3
  475. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  476. claude_mpm/utils/agent_dependency_loader.py +115 -4
  477. claude_mpm/utils/agent_filters.py +1 -1
  478. claude_mpm/utils/migration.py +4 -4
  479. claude_mpm/utils/robust_installer.py +86 -21
  480. claude_mpm-5.6.34.dist-info/METADATA +393 -0
  481. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +486 -145
  482. claude_mpm-5.4.22.dist-info/METADATA +0 -996
  483. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
  484. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
  485. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
  486. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  487. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,310 @@
1
+ """Example usage of multi-runtime adapter architecture.
2
+
3
+ This module demonstrates how to use the adapter registry and
4
+ individual adapters for different AI coding runtimes.
5
+ """
6
+
7
+ import logging
8
+ from typing import Optional
9
+
10
+ from claude_mpm.commander.adapters import (
11
+ AdapterRegistry,
12
+ AuggieAdapter,
13
+ ClaudeCodeAdapter,
14
+ CodexAdapter,
15
+ MPMAdapter,
16
+ RuntimeAdapter,
17
+ RuntimeCapability,
18
+ )
19
+
20
+ # Configure logging
21
+ logging.basicConfig(
22
+ level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
23
+ )
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ def example_registry_usage() -> None:
28
+ """Demonstrate adapter registry usage."""
29
+ print("\n" + "=" * 60)
30
+ print("ADAPTER REGISTRY USAGE")
31
+ print("=" * 60 + "\n")
32
+
33
+ # List all registered adapters
34
+ registered = AdapterRegistry.list_registered()
35
+ print(f"Registered adapters: {registered}")
36
+
37
+ # Detect available runtimes on system
38
+ available = AdapterRegistry.detect_available()
39
+ print(f"Available runtimes: {available}")
40
+
41
+ # Get default adapter (best available)
42
+ default_adapter = AdapterRegistry.get_default()
43
+ if default_adapter:
44
+ print(f"\nDefault adapter: {default_adapter.name}")
45
+ print(f"Capabilities: {default_adapter.capabilities}")
46
+ else:
47
+ print("\nNo adapters available on this system")
48
+
49
+ # Get specific adapter
50
+ mpm_adapter = AdapterRegistry.get("mpm")
51
+ if mpm_adapter:
52
+ print(f"\nMPM adapter available: {mpm_adapter.name}")
53
+ else:
54
+ print("\nMPM adapter not available")
55
+
56
+ # Check if specific runtime is available
57
+ if AdapterRegistry.is_available("claude-code"):
58
+ print("\nClaude Code is available")
59
+ else:
60
+ print("\nClaude Code is NOT available")
61
+
62
+
63
+ def example_adapter_capabilities() -> None:
64
+ """Demonstrate checking adapter capabilities."""
65
+ print("\n" + "=" * 60)
66
+ print("ADAPTER CAPABILITIES")
67
+ print("=" * 60 + "\n")
68
+
69
+ adapters = [
70
+ ClaudeCodeAdapter(),
71
+ AuggieAdapter(),
72
+ CodexAdapter(),
73
+ MPMAdapter(),
74
+ ]
75
+
76
+ for adapter in adapters:
77
+ print(f"\n{adapter.name.upper()} Adapter:")
78
+ print(
79
+ f" Command: {adapter.runtime_info.command if adapter.runtime_info else 'N/A'}"
80
+ )
81
+
82
+ # Check for specific capabilities
83
+ info = adapter.runtime_info
84
+ if info:
85
+ print(f" Supports agents: {info.supports_agents}")
86
+ print(f" Instruction file: {info.instruction_file or 'None'}")
87
+
88
+ # Check for advanced features
89
+ if RuntimeCapability.AGENT_DELEGATION in info.capabilities:
90
+ print(" ✓ Agent delegation supported")
91
+ else:
92
+ print(" ✗ Agent delegation NOT supported")
93
+
94
+ if RuntimeCapability.HOOKS in info.capabilities:
95
+ print(" ✓ Lifecycle hooks supported")
96
+ else:
97
+ print(" ✗ Lifecycle hooks NOT supported")
98
+
99
+ if RuntimeCapability.MCP_TOOLS in info.capabilities:
100
+ print(" ✓ MCP tools supported")
101
+ else:
102
+ print(" ✗ MCP tools NOT supported")
103
+
104
+ if RuntimeCapability.SKILLS in info.capabilities:
105
+ print(" ✓ Skills supported")
106
+ else:
107
+ print(" ✗ Skills NOT supported")
108
+
109
+ if RuntimeCapability.MONITOR in info.capabilities:
110
+ print(" ✓ Real-time monitoring supported")
111
+ else:
112
+ print(" ✗ Real-time monitoring NOT supported")
113
+
114
+
115
+ def example_build_commands() -> None:
116
+ """Demonstrate building launch commands."""
117
+ print("\n" + "=" * 60)
118
+ print("BUILD LAUNCH COMMANDS")
119
+ print("=" * 60 + "\n")
120
+
121
+ project_path = "/home/user/my-project"
122
+ agent_prompt = "You are a Python expert specializing in FastAPI and async code."
123
+
124
+ adapters = [
125
+ ClaudeCodeAdapter(),
126
+ AuggieAdapter(),
127
+ CodexAdapter(),
128
+ MPMAdapter(),
129
+ ]
130
+
131
+ for adapter in adapters:
132
+ print(f"\n{adapter.name.upper()}:")
133
+
134
+ # Basic launch command
135
+ cmd = adapter.build_launch_command(project_path)
136
+ print(f" Basic: {cmd}")
137
+
138
+ # With agent prompt
139
+ cmd_with_prompt = adapter.build_launch_command(project_path, agent_prompt)
140
+ print(f" With prompt: {cmd_with_prompt}")
141
+
142
+
143
+ def example_inject_instructions() -> None:
144
+ """Demonstrate injecting custom instructions."""
145
+ print("\n" + "=" * 60)
146
+ print("INJECT CUSTOM INSTRUCTIONS")
147
+ print("=" * 60 + "\n")
148
+
149
+ instructions = """You are a senior Python engineer.
150
+ Follow PEP 8 strictly.
151
+ Write comprehensive tests for all code.
152
+ Use type hints everywhere."""
153
+
154
+ adapters = [
155
+ ClaudeCodeAdapter(),
156
+ AuggieAdapter(),
157
+ CodexAdapter(),
158
+ MPMAdapter(),
159
+ ]
160
+
161
+ for adapter in adapters:
162
+ print(f"\n{adapter.name.upper()}:")
163
+
164
+ cmd = adapter.inject_instructions(instructions)
165
+ if cmd:
166
+ print(f" Command: {cmd}")
167
+ else:
168
+ print(" Not supported")
169
+
170
+
171
+ def example_inject_agent_context() -> None:
172
+ """Demonstrate injecting agent context."""
173
+ print("\n" + "=" * 60)
174
+ print("INJECT AGENT CONTEXT")
175
+ print("=" * 60 + "\n")
176
+
177
+ agent_id = "eng-001"
178
+ context = {
179
+ "role": "Engineer",
180
+ "specialty": "Backend Python",
181
+ "task": "Implement API endpoints",
182
+ }
183
+
184
+ adapters = [
185
+ ClaudeCodeAdapter(),
186
+ AuggieAdapter(),
187
+ CodexAdapter(),
188
+ MPMAdapter(),
189
+ ]
190
+
191
+ for adapter in adapters:
192
+ print(f"\n{adapter.name.upper()}:")
193
+
194
+ cmd = adapter.inject_agent_context(agent_id, context)
195
+ if cmd:
196
+ print(f" Command: {cmd[:100]}...")
197
+ else:
198
+ print(" Not supported")
199
+
200
+
201
+ def example_parse_response() -> None:
202
+ """Demonstrate parsing runtime output."""
203
+ print("\n" + "=" * 60)
204
+ print("PARSE RUNTIME OUTPUT")
205
+ print("=" * 60 + "\n")
206
+
207
+ # Simulate different output scenarios
208
+ outputs = {
209
+ "idle": "File created successfully.\n> ",
210
+ "error": "Error: File not found: config.py\n> ",
211
+ "question": "Should I proceed with the changes? (y/n)?",
212
+ "processing": "Processing your request...",
213
+ }
214
+
215
+ adapter = ClaudeCodeAdapter()
216
+
217
+ for scenario, output in outputs.items():
218
+ print(f"\n{scenario.upper()}:")
219
+ parsed = adapter.parse_response(output)
220
+ print(f" Content: {parsed.content[:50]}...")
221
+ print(f" Is complete: {parsed.is_complete}")
222
+ print(f" Is error: {parsed.is_error}")
223
+ print(f" Is question: {parsed.is_question}")
224
+ if parsed.error_message:
225
+ print(f" Error message: {parsed.error_message}")
226
+ if parsed.question_text:
227
+ print(f" Question: {parsed.question_text}")
228
+
229
+
230
+ def example_runtime_selection() -> None:
231
+ """Demonstrate selecting runtime based on requirements."""
232
+ print("\n" + "=" * 60)
233
+ print("RUNTIME SELECTION LOGIC")
234
+ print("=" * 60 + "\n")
235
+
236
+ def select_runtime(
237
+ needs_agents: bool = False, needs_mcp: bool = False
238
+ ) -> Optional[RuntimeAdapter]:
239
+ """Select appropriate runtime based on requirements."""
240
+ # Get all available adapters
241
+ available = AdapterRegistry.detect_available()
242
+
243
+ # Filter by requirements
244
+ for name in available:
245
+ adapter = AdapterRegistry.get(name)
246
+ if not adapter or not adapter.runtime_info:
247
+ continue
248
+
249
+ info = adapter.runtime_info
250
+
251
+ # Check agent requirement
252
+ if needs_agents and not info.supports_agents:
253
+ continue
254
+
255
+ # Check MCP requirement
256
+ if needs_mcp and RuntimeCapability.MCP_TOOLS not in info.capabilities:
257
+ continue
258
+
259
+ # Found suitable runtime
260
+ return adapter
261
+
262
+ return None
263
+
264
+ # Example 1: Need agent delegation
265
+ print("Requirement: Agent delegation")
266
+ adapter = select_runtime(needs_agents=True)
267
+ if adapter:
268
+ print(f" Selected: {adapter.name}")
269
+ else:
270
+ print(" No suitable runtime found")
271
+
272
+ # Example 2: Need MCP tools
273
+ print("\nRequirement: MCP tools")
274
+ adapter = select_runtime(needs_mcp=True)
275
+ if adapter:
276
+ print(f" Selected: {adapter.name}")
277
+ else:
278
+ print(" No suitable runtime found")
279
+
280
+ # Example 3: Need both
281
+ print("\nRequirement: Agent delegation + MCP tools")
282
+ adapter = select_runtime(needs_agents=True, needs_mcp=True)
283
+ if adapter:
284
+ print(f" Selected: {adapter.name}")
285
+ else:
286
+ print(" No suitable runtime found")
287
+
288
+
289
+ def main() -> None:
290
+ """Run all examples."""
291
+ print("\n" + "#" * 60)
292
+ print("# MULTI-RUNTIME ADAPTER ARCHITECTURE EXAMPLES")
293
+ print("#" * 60)
294
+
295
+ # Run all examples
296
+ example_registry_usage()
297
+ example_adapter_capabilities()
298
+ example_build_commands()
299
+ example_inject_instructions()
300
+ example_inject_agent_context()
301
+ example_parse_response()
302
+ example_runtime_selection()
303
+
304
+ print("\n" + "#" * 60)
305
+ print("# EXAMPLES COMPLETE")
306
+ print("#" * 60 + "\n")
307
+
308
+
309
+ if __name__ == "__main__":
310
+ main()
@@ -0,0 +1,389 @@
1
+ """MPM (Multi-agent Project Manager) runtime adapter.
2
+
3
+ This module implements the RuntimeAdapter interface for MPM,
4
+ providing full support for agent delegation, hooks, skills, and monitoring.
5
+ """
6
+
7
+ import json
8
+ import logging
9
+ import re
10
+ import shlex
11
+ from typing import List, Optional, Set
12
+
13
+ from .base import (
14
+ Capability,
15
+ ParsedResponse,
16
+ RuntimeAdapter,
17
+ RuntimeCapability,
18
+ RuntimeInfo,
19
+ )
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class MPMAdapter(RuntimeAdapter):
25
+ """Adapter for MPM (Multi-agent Project Manager).
26
+
27
+ MPM extends Claude Code with multi-agent orchestration, lifecycle hooks,
28
+ skills, real-time monitoring, and advanced project management capabilities.
29
+
30
+ Features:
31
+ - Agent delegation and sub-agent spawning
32
+ - Lifecycle hooks (pre/post task, pre/post commit, etc.)
33
+ - Loadable skills for specialized tasks
34
+ - Real-time monitoring dashboard
35
+ - Custom instructions via CLAUDE.md
36
+ - MCP server integration
37
+ - Git workflow automation
38
+
39
+ Example:
40
+ >>> adapter = MPMAdapter()
41
+ >>> cmd = adapter.build_launch_command("/home/user/project")
42
+ >>> # Inject agent context
43
+ >>> ctx_cmd = adapter.inject_agent_context("eng-001", {"role": "Engineer"})
44
+ >>> # Check capabilities
45
+ >>> info = adapter.runtime_info
46
+ >>> if RuntimeCapability.AGENT_DELEGATION in info.capabilities:
47
+ ... print("Supports agent delegation")
48
+ """
49
+
50
+ # Idle detection patterns (inherits from Claude Code)
51
+ IDLE_PATTERNS = [
52
+ r"^>\s*$", # Simple prompt
53
+ r"claude>\s*$", # Named prompt
54
+ r"╭─+╮", # Box drawing
55
+ r"What would you like",
56
+ r"How can I help",
57
+ ]
58
+
59
+ # MPM-specific patterns
60
+ MPM_PATTERNS = [
61
+ r"\[MPM\]", # MPM prefix
62
+ r"Agent spawned:",
63
+ r"Delegating to agent:",
64
+ r"Hook triggered:",
65
+ r"Skill loaded:",
66
+ ]
67
+
68
+ # Error patterns
69
+ ERROR_PATTERNS = [
70
+ r"Error:",
71
+ r"Failed:",
72
+ r"Exception:",
73
+ r"Permission denied",
74
+ r"not found",
75
+ r"Traceback \(most recent call last\)",
76
+ r"FATAL:",
77
+ r"✗",
78
+ r"command not found",
79
+ r"cannot access",
80
+ r"Agent error:",
81
+ r"Hook failed:",
82
+ ]
83
+
84
+ # Question patterns
85
+ QUESTION_PATTERNS = [
86
+ r"Which option",
87
+ r"Should I proceed",
88
+ r"Please choose",
89
+ r"\(y/n\)\?",
90
+ r"Are you sure",
91
+ r"Do you want",
92
+ r"\[Y/n\]",
93
+ r"\[yes/no\]",
94
+ r"Select an option",
95
+ r"Choose from",
96
+ r"Delegate to which agent",
97
+ ]
98
+
99
+ # ANSI escape code pattern
100
+ ANSI_ESCAPE = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
101
+
102
+ @property
103
+ def name(self) -> str:
104
+ """Return the runtime identifier."""
105
+ return "mpm"
106
+
107
+ @property
108
+ def capabilities(self) -> Set[Capability]:
109
+ """Return the set of capabilities supported by MPM."""
110
+ return {
111
+ Capability.TOOL_USE,
112
+ Capability.FILE_EDIT,
113
+ Capability.FILE_CREATE,
114
+ Capability.GIT_OPERATIONS,
115
+ Capability.SHELL_COMMANDS,
116
+ Capability.WEB_SEARCH,
117
+ Capability.COMPLEX_REASONING,
118
+ }
119
+
120
+ @property
121
+ def runtime_info(self) -> RuntimeInfo:
122
+ """Return detailed runtime information.
123
+
124
+ MPM has the most comprehensive capabilities of all runtimes.
125
+ """
126
+ return RuntimeInfo(
127
+ name="mpm",
128
+ version=None, # Could parse from mpm --version
129
+ capabilities={
130
+ RuntimeCapability.FILE_READ,
131
+ RuntimeCapability.FILE_EDIT,
132
+ RuntimeCapability.FILE_CREATE,
133
+ RuntimeCapability.BASH_EXECUTION,
134
+ RuntimeCapability.GIT_OPERATIONS,
135
+ RuntimeCapability.TOOL_USE,
136
+ RuntimeCapability.AGENT_DELEGATION, # Key MPM feature
137
+ RuntimeCapability.HOOKS, # Lifecycle hooks
138
+ RuntimeCapability.INSTRUCTIONS, # CLAUDE.md
139
+ RuntimeCapability.MCP_TOOLS, # MCP integration
140
+ RuntimeCapability.SKILLS, # Loadable skills
141
+ RuntimeCapability.MONITOR, # Real-time monitoring
142
+ RuntimeCapability.WEB_SEARCH,
143
+ RuntimeCapability.COMPLEX_REASONING,
144
+ },
145
+ command="claude", # MPM uses claude CLI with MPM config
146
+ supports_agents=True, # Full agent support
147
+ instruction_file="CLAUDE.md",
148
+ )
149
+
150
+ def build_launch_command(
151
+ self, project_path: str, agent_prompt: Optional[str] = None
152
+ ) -> str:
153
+ """Generate shell command to start MPM.
154
+
155
+ Args:
156
+ project_path: Absolute path to the project directory
157
+ agent_prompt: Optional system prompt to configure agent
158
+
159
+ Returns:
160
+ Shell command string ready to execute
161
+
162
+ Example:
163
+ >>> adapter = MPMAdapter()
164
+ >>> adapter.build_launch_command("/home/user/project")
165
+ "cd '/home/user/project' && claude --dangerously-skip-permissions"
166
+ """
167
+ quoted_path = shlex.quote(project_path)
168
+ cmd = f"cd {quoted_path} && claude"
169
+
170
+ if agent_prompt:
171
+ quoted_prompt = shlex.quote(agent_prompt)
172
+ cmd += f" --system-prompt {quoted_prompt}"
173
+
174
+ # Skip permissions for automated operation
175
+ cmd += " --dangerously-skip-permissions"
176
+
177
+ logger.debug(f"Built MPM launch command: {cmd}")
178
+ return cmd
179
+
180
+ def format_input(self, message: str) -> str:
181
+ """Prepare message for MPM's input format."""
182
+ formatted = message.strip()
183
+ logger.debug(f"Formatted input: {formatted[:100]}...")
184
+ return formatted
185
+
186
+ def strip_ansi(self, text: str) -> str:
187
+ """Remove ANSI escape codes from text."""
188
+ return self.ANSI_ESCAPE.sub("", text)
189
+
190
+ def detect_idle(self, output: str) -> bool:
191
+ """Recognize when MPM is waiting for input."""
192
+ if not output:
193
+ return False
194
+
195
+ clean = self.strip_ansi(output)
196
+ lines = clean.strip().split("\n")
197
+
198
+ if not lines:
199
+ return False
200
+
201
+ last_line = lines[-1].strip()
202
+
203
+ for pattern in self.IDLE_PATTERNS:
204
+ if re.search(pattern, last_line):
205
+ logger.debug(f"Detected idle state with pattern: {pattern}")
206
+ return True
207
+
208
+ return False
209
+
210
+ def detect_error(self, output: str) -> Optional[str]:
211
+ """Recognize error states and extract error message."""
212
+ clean = self.strip_ansi(output)
213
+
214
+ for pattern in self.ERROR_PATTERNS:
215
+ match = re.search(pattern, clean, re.IGNORECASE)
216
+ if match:
217
+ for line in clean.split("\n"):
218
+ if re.search(pattern, line, re.IGNORECASE):
219
+ error_msg = line.strip()
220
+ logger.warning(f"Detected error: {error_msg}")
221
+ return error_msg
222
+
223
+ return None
224
+
225
+ def detect_question(
226
+ self, output: str
227
+ ) -> tuple[bool, Optional[str], Optional[List[str]]]:
228
+ """Detect if MPM is asking a question."""
229
+ clean = self.strip_ansi(output)
230
+
231
+ for pattern in self.QUESTION_PATTERNS:
232
+ if re.search(pattern, clean, re.IGNORECASE):
233
+ lines = clean.strip().split("\n")
234
+ question = None
235
+ options = []
236
+
237
+ for line in lines:
238
+ if re.search(pattern, line, re.IGNORECASE):
239
+ question = line.strip()
240
+
241
+ # Look for numbered options
242
+ opt_match = re.match(r"^\s*(\d+)[.):]\s*(.+)$", line)
243
+ if opt_match:
244
+ options.append(opt_match.group(2).strip())
245
+
246
+ logger.debug(
247
+ f"Detected question: {question}, options: {options if options else 'none'}"
248
+ )
249
+ return True, question, options if options else None
250
+
251
+ return False, None, None
252
+
253
+ def parse_response(self, output: str) -> ParsedResponse:
254
+ """Extract meaningful content from MPM output."""
255
+ if not output:
256
+ return ParsedResponse(
257
+ content="",
258
+ is_complete=False,
259
+ is_error=False,
260
+ is_question=False,
261
+ )
262
+
263
+ clean = self.strip_ansi(output)
264
+ error_msg = self.detect_error(output)
265
+ is_question, question_text, options = self.detect_question(output)
266
+ is_complete = self.detect_idle(output)
267
+
268
+ response = ParsedResponse(
269
+ content=clean,
270
+ is_complete=is_complete,
271
+ is_error=error_msg is not None,
272
+ error_message=error_msg,
273
+ is_question=is_question,
274
+ question_text=question_text,
275
+ options=options,
276
+ )
277
+
278
+ logger.debug(
279
+ f"Parsed response: complete={is_complete}, error={error_msg is not None}, "
280
+ f"question={is_question}"
281
+ )
282
+
283
+ return response
284
+
285
+ def inject_instructions(self, instructions: str) -> Optional[str]:
286
+ """Return command to inject custom instructions.
287
+
288
+ MPM uses CLAUDE.md for custom instructions.
289
+
290
+ Args:
291
+ instructions: Instructions text to inject
292
+
293
+ Returns:
294
+ Command to write CLAUDE.md file
295
+
296
+ Example:
297
+ >>> adapter = MPMAdapter()
298
+ >>> cmd = adapter.inject_instructions("You are a Python expert")
299
+ >>> print(cmd)
300
+ echo '...' > CLAUDE.md
301
+ """
302
+ # Write to CLAUDE.md
303
+ escaped = instructions.replace("'", "'\\''")
304
+ return f"echo '{escaped}' > CLAUDE.md"
305
+
306
+ def inject_agent_context(self, agent_id: str, context: dict) -> Optional[str]:
307
+ """Return command to inject agent context.
308
+
309
+ MPM supports agent context injection via special command.
310
+
311
+ Args:
312
+ agent_id: Unique identifier for agent
313
+ context: Context dictionary with agent metadata
314
+
315
+ Returns:
316
+ Command to inject agent context
317
+
318
+ Example:
319
+ >>> adapter = MPMAdapter()
320
+ >>> cmd = adapter.inject_agent_context("eng-001", {"role": "Engineer"})
321
+ >>> # Command would set MPM_AGENT_ID and MPM_AGENT_CONTEXT env vars
322
+ """
323
+ # Serialize context to JSON
324
+ context_json = json.dumps(context)
325
+ escaped_json = context_json.replace("'", "'\\''")
326
+
327
+ # Set environment variables for MPM agent context
328
+ # MPM runtime can read these to understand agent identity
329
+ cmd = f"export MPM_AGENT_ID='{agent_id}' && export MPM_AGENT_CONTEXT='{escaped_json}'"
330
+
331
+ logger.debug(f"Built agent context injection command for {agent_id}")
332
+ return cmd
333
+
334
+ def detect_agent_spawn(self, output: str) -> Optional[dict]:
335
+ """Detect if MPM has spawned a new agent.
336
+
337
+ Args:
338
+ output: Raw output from MPM
339
+
340
+ Returns:
341
+ Dict with agent info if spawn detected, None otherwise
342
+
343
+ Example:
344
+ >>> adapter = MPMAdapter()
345
+ >>> info = adapter.detect_agent_spawn("[MPM] Agent spawned: eng-001 (Engineer)")
346
+ >>> if info:
347
+ ... print(info['agent_id'])
348
+ 'eng-001'
349
+ """
350
+ clean = self.strip_ansi(output)
351
+
352
+ # Pattern: [MPM] Agent spawned: <agent_id> (<role>)
353
+ match = re.search(r"\[MPM\] Agent spawned: (\S+) \(([^)]+)\)", clean)
354
+ if match:
355
+ agent_id = match.group(1)
356
+ role = match.group(2)
357
+
358
+ logger.info(f"Detected agent spawn: {agent_id} ({role})")
359
+ return {"agent_id": agent_id, "role": role}
360
+
361
+ return None
362
+
363
+ def detect_hook_trigger(self, output: str) -> Optional[dict]:
364
+ """Detect if a lifecycle hook was triggered.
365
+
366
+ Args:
367
+ output: Raw output from MPM
368
+
369
+ Returns:
370
+ Dict with hook info if trigger detected, None otherwise
371
+
372
+ Example:
373
+ >>> adapter = MPMAdapter()
374
+ >>> info = adapter.detect_hook_trigger("[MPM] Hook triggered: pre-commit")
375
+ >>> if info:
376
+ ... print(info['hook_name'])
377
+ 'pre-commit'
378
+ """
379
+ clean = self.strip_ansi(output)
380
+
381
+ # Pattern: [MPM] Hook triggered: <hook_name>
382
+ match = re.search(r"\[MPM\] Hook triggered: (\S+)", clean)
383
+ if match:
384
+ hook_name = match.group(1)
385
+
386
+ logger.info(f"Detected hook trigger: {hook_name}")
387
+ return {"hook_name": hook_name}
388
+
389
+ return None