claude-mpm 5.4.85__py3-none-any.whl → 5.6.76__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 (322) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +8 -5
  3. claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +109 -706
  5. claude_mpm/agents/WORKFLOW.md +2 -0
  6. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  7. claude_mpm/auth/__init__.py +35 -0
  8. claude_mpm/auth/callback_server.py +328 -0
  9. claude_mpm/auth/models.py +104 -0
  10. claude_mpm/auth/oauth_manager.py +266 -0
  11. claude_mpm/auth/providers/__init__.py +12 -0
  12. claude_mpm/auth/providers/base.py +165 -0
  13. claude_mpm/auth/providers/google.py +261 -0
  14. claude_mpm/auth/token_storage.py +252 -0
  15. claude_mpm/cli/commands/autotodos.py +566 -0
  16. claude_mpm/cli/commands/commander.py +216 -0
  17. claude_mpm/cli/commands/hook_errors.py +60 -60
  18. claude_mpm/cli/commands/mcp.py +29 -17
  19. claude_mpm/cli/commands/mcp_command_router.py +39 -0
  20. claude_mpm/cli/commands/mcp_service_commands.py +304 -0
  21. claude_mpm/cli/commands/monitor.py +2 -2
  22. claude_mpm/cli/commands/mpm_init/core.py +2 -2
  23. claude_mpm/cli/commands/oauth.py +481 -0
  24. claude_mpm/cli/commands/run.py +35 -3
  25. claude_mpm/cli/commands/skill_source.py +51 -2
  26. claude_mpm/cli/commands/skills.py +5 -3
  27. claude_mpm/cli/executor.py +128 -16
  28. claude_mpm/cli/helpers.py +1 -1
  29. claude_mpm/cli/parsers/base_parser.py +84 -1
  30. claude_mpm/cli/parsers/commander_parser.py +116 -0
  31. claude_mpm/cli/parsers/mcp_parser.py +79 -0
  32. claude_mpm/cli/parsers/oauth_parser.py +165 -0
  33. claude_mpm/cli/parsers/run_parser.py +10 -0
  34. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  35. claude_mpm/cli/parsers/skills_parser.py +5 -0
  36. claude_mpm/cli/startup.py +345 -40
  37. claude_mpm/cli/startup_display.py +76 -7
  38. claude_mpm/cli/startup_logging.py +2 -2
  39. claude_mpm/cli/startup_migrations.py +236 -0
  40. claude_mpm/cli/utils.py +7 -3
  41. claude_mpm/commander/__init__.py +78 -0
  42. claude_mpm/commander/adapters/__init__.py +60 -0
  43. claude_mpm/commander/adapters/auggie.py +260 -0
  44. claude_mpm/commander/adapters/base.py +288 -0
  45. claude_mpm/commander/adapters/claude_code.py +392 -0
  46. claude_mpm/commander/adapters/codex.py +237 -0
  47. claude_mpm/commander/adapters/communication.py +366 -0
  48. claude_mpm/commander/adapters/example_usage.py +310 -0
  49. claude_mpm/commander/adapters/mpm.py +389 -0
  50. claude_mpm/commander/adapters/registry.py +204 -0
  51. claude_mpm/commander/api/__init__.py +16 -0
  52. claude_mpm/commander/api/app.py +121 -0
  53. claude_mpm/commander/api/errors.py +133 -0
  54. claude_mpm/commander/api/routes/__init__.py +8 -0
  55. claude_mpm/commander/api/routes/events.py +184 -0
  56. claude_mpm/commander/api/routes/inbox.py +171 -0
  57. claude_mpm/commander/api/routes/messages.py +148 -0
  58. claude_mpm/commander/api/routes/projects.py +271 -0
  59. claude_mpm/commander/api/routes/sessions.py +226 -0
  60. claude_mpm/commander/api/routes/work.py +296 -0
  61. claude_mpm/commander/api/schemas.py +186 -0
  62. claude_mpm/commander/chat/__init__.py +7 -0
  63. claude_mpm/commander/chat/cli.py +149 -0
  64. claude_mpm/commander/chat/commands.py +124 -0
  65. claude_mpm/commander/chat/repl.py +1957 -0
  66. claude_mpm/commander/config.py +51 -0
  67. claude_mpm/commander/config_loader.py +115 -0
  68. claude_mpm/commander/core/__init__.py +10 -0
  69. claude_mpm/commander/core/block_manager.py +325 -0
  70. claude_mpm/commander/core/response_manager.py +323 -0
  71. claude_mpm/commander/daemon.py +603 -0
  72. claude_mpm/commander/env_loader.py +59 -0
  73. claude_mpm/commander/events/__init__.py +26 -0
  74. claude_mpm/commander/events/manager.py +392 -0
  75. claude_mpm/commander/frameworks/__init__.py +12 -0
  76. claude_mpm/commander/frameworks/base.py +233 -0
  77. claude_mpm/commander/frameworks/claude_code.py +58 -0
  78. claude_mpm/commander/frameworks/mpm.py +57 -0
  79. claude_mpm/commander/git/__init__.py +5 -0
  80. claude_mpm/commander/git/worktree_manager.py +212 -0
  81. claude_mpm/commander/inbox/__init__.py +16 -0
  82. claude_mpm/commander/inbox/dedup.py +128 -0
  83. claude_mpm/commander/inbox/inbox.py +224 -0
  84. claude_mpm/commander/inbox/models.py +70 -0
  85. claude_mpm/commander/instance_manager.py +868 -0
  86. claude_mpm/commander/llm/__init__.py +6 -0
  87. claude_mpm/commander/llm/openrouter_client.py +167 -0
  88. claude_mpm/commander/llm/summarizer.py +70 -0
  89. claude_mpm/commander/memory/__init__.py +45 -0
  90. claude_mpm/commander/memory/compression.py +347 -0
  91. claude_mpm/commander/memory/embeddings.py +230 -0
  92. claude_mpm/commander/memory/entities.py +310 -0
  93. claude_mpm/commander/memory/example_usage.py +290 -0
  94. claude_mpm/commander/memory/integration.py +325 -0
  95. claude_mpm/commander/memory/search.py +381 -0
  96. claude_mpm/commander/memory/store.py +657 -0
  97. claude_mpm/commander/models/__init__.py +18 -0
  98. claude_mpm/commander/models/events.py +127 -0
  99. claude_mpm/commander/models/project.py +162 -0
  100. claude_mpm/commander/models/work.py +214 -0
  101. claude_mpm/commander/parsing/__init__.py +20 -0
  102. claude_mpm/commander/parsing/extractor.py +132 -0
  103. claude_mpm/commander/parsing/output_parser.py +270 -0
  104. claude_mpm/commander/parsing/patterns.py +100 -0
  105. claude_mpm/commander/persistence/__init__.py +11 -0
  106. claude_mpm/commander/persistence/event_store.py +274 -0
  107. claude_mpm/commander/persistence/state_store.py +403 -0
  108. claude_mpm/commander/persistence/work_store.py +164 -0
  109. claude_mpm/commander/polling/__init__.py +13 -0
  110. claude_mpm/commander/polling/event_detector.py +104 -0
  111. claude_mpm/commander/polling/output_buffer.py +49 -0
  112. claude_mpm/commander/polling/output_poller.py +153 -0
  113. claude_mpm/commander/project_session.py +268 -0
  114. claude_mpm/commander/proxy/__init__.py +12 -0
  115. claude_mpm/commander/proxy/formatter.py +89 -0
  116. claude_mpm/commander/proxy/output_handler.py +191 -0
  117. claude_mpm/commander/proxy/relay.py +155 -0
  118. claude_mpm/commander/registry.py +410 -0
  119. claude_mpm/commander/runtime/__init__.py +10 -0
  120. claude_mpm/commander/runtime/executor.py +191 -0
  121. claude_mpm/commander/runtime/monitor.py +346 -0
  122. claude_mpm/commander/session/__init__.py +6 -0
  123. claude_mpm/commander/session/context.py +81 -0
  124. claude_mpm/commander/session/manager.py +59 -0
  125. claude_mpm/commander/tmux_orchestrator.py +362 -0
  126. claude_mpm/commander/web/__init__.py +1 -0
  127. claude_mpm/commander/work/__init__.py +30 -0
  128. claude_mpm/commander/work/executor.py +207 -0
  129. claude_mpm/commander/work/queue.py +405 -0
  130. claude_mpm/commander/workflow/__init__.py +27 -0
  131. claude_mpm/commander/workflow/event_handler.py +241 -0
  132. claude_mpm/commander/workflow/notifier.py +146 -0
  133. claude_mpm/commands/mpm-config.md +8 -0
  134. claude_mpm/commands/mpm-doctor.md +8 -0
  135. claude_mpm/commands/mpm-help.md +8 -0
  136. claude_mpm/commands/mpm-init.md +8 -0
  137. claude_mpm/commands/mpm-monitor.md +8 -0
  138. claude_mpm/commands/mpm-organize.md +8 -0
  139. claude_mpm/commands/mpm-postmortem.md +8 -0
  140. claude_mpm/commands/mpm-session-resume.md +9 -1
  141. claude_mpm/commands/mpm-status.md +8 -0
  142. claude_mpm/commands/mpm-ticket-view.md +8 -0
  143. claude_mpm/commands/mpm-version.md +8 -0
  144. claude_mpm/commands/mpm.md +8 -0
  145. claude_mpm/config/agent_presets.py +8 -7
  146. claude_mpm/config/skill_sources.py +16 -0
  147. claude_mpm/constants.py +5 -0
  148. claude_mpm/core/claude_runner.py +152 -0
  149. claude_mpm/core/config.py +35 -22
  150. claude_mpm/core/config_constants.py +74 -9
  151. claude_mpm/core/constants.py +56 -12
  152. claude_mpm/core/hook_manager.py +53 -4
  153. claude_mpm/core/interactive_session.py +5 -4
  154. claude_mpm/core/logger.py +26 -9
  155. claude_mpm/core/logging_utils.py +39 -13
  156. claude_mpm/core/network_config.py +148 -0
  157. claude_mpm/core/oneshot_session.py +7 -6
  158. claude_mpm/core/output_style_manager.py +52 -12
  159. claude_mpm/core/socketio_pool.py +47 -15
  160. claude_mpm/core/unified_config.py +10 -6
  161. claude_mpm/core/unified_paths.py +68 -80
  162. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  163. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  164. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
  165. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
  166. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
  167. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
  168. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
  169. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
  170. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  220. claude_mpm/dashboard/static/svelte-build/index.html +9 -9
  221. claude_mpm/experimental/cli_enhancements.py +2 -1
  222. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  223. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  224. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  225. claude_mpm/hooks/claude_hooks/event_handlers.py +466 -136
  226. claude_mpm/hooks/claude_hooks/hook_handler.py +204 -104
  227. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  228. claude_mpm/hooks/claude_hooks/installer.py +291 -59
  229. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  230. claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
  231. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  232. claude_mpm/hooks/claude_hooks/services/connection_manager.py +41 -26
  233. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
  234. claude_mpm/hooks/claude_hooks/services/container.py +326 -0
  235. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  236. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  237. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
  238. claude_mpm/hooks/session_resume_hook.py +89 -1
  239. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  240. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  241. claude_mpm/init.py +22 -15
  242. claude_mpm/mcp/__init__.py +9 -0
  243. claude_mpm/mcp/google_workspace_server.py +610 -0
  244. claude_mpm/scripts/claude-hook-handler.sh +46 -19
  245. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  246. claude_mpm/services/agents/agent_selection_service.py +2 -2
  247. claude_mpm/services/agents/cache_git_manager.py +1 -1
  248. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
  249. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  250. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  251. claude_mpm/services/cli/__init__.py +3 -0
  252. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  253. claude_mpm/services/cli/session_resume_helper.py +10 -2
  254. claude_mpm/services/command_deployment_service.py +44 -26
  255. claude_mpm/services/delegation_detector.py +175 -0
  256. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  257. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  258. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  259. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  260. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  261. claude_mpm/services/diagnostics/models.py +14 -1
  262. claude_mpm/services/event_log.py +325 -0
  263. claude_mpm/services/hook_installer_service.py +77 -8
  264. claude_mpm/services/infrastructure/__init__.py +4 -0
  265. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  266. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  267. claude_mpm/services/mcp_config_manager.py +99 -19
  268. claude_mpm/services/mcp_service_registry.py +294 -0
  269. claude_mpm/services/monitor/daemon_manager.py +15 -4
  270. claude_mpm/services/monitor/management/lifecycle.py +8 -2
  271. claude_mpm/services/monitor/server.py +111 -16
  272. claude_mpm/services/pm_skills_deployer.py +261 -87
  273. claude_mpm/services/skills/git_skill_source_manager.py +130 -10
  274. claude_mpm/services/skills/selective_skill_deployer.py +142 -16
  275. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  276. claude_mpm/services/skills_deployer.py +31 -5
  277. claude_mpm/services/socketio/handlers/hook.py +14 -7
  278. claude_mpm/services/socketio/server/main.py +12 -4
  279. claude_mpm/skills/__init__.py +2 -1
  280. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  281. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  282. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  283. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  284. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  285. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  286. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  287. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  288. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  289. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  290. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  291. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  292. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  293. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  294. claude_mpm/skills/bundled/pm/{pm-teaching-mode → mpm-teaching-mode}/SKILL.md +2 -2
  295. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  296. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  297. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  298. claude_mpm/skills/registry.py +295 -90
  299. claude_mpm/skills/skill_manager.py +4 -4
  300. claude_mpm-5.6.76.dist-info/METADATA +416 -0
  301. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/RECORD +312 -175
  302. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/WHEEL +1 -1
  303. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/entry_points.txt +2 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
  305. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
  306. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
  307. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
  308. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
  309. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
  310. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
  311. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
  312. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
  313. claude_mpm-5.4.85.dist-info/METADATA +0 -1023
  314. /claude_mpm/skills/bundled/pm/{pm-bug-reporting/pm-bug-reporting.md → mpm-bug-reporting/SKILL.md} +0 -0
  315. /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
  316. /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
  317. /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
  318. /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
  319. /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
  320. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE +0 -0
  321. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  322. {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ Shows welcome message, version info, ASCII art, and what's new section.
7
7
  import os
8
8
  import re
9
9
  import shutil
10
- import subprocess
10
+ import subprocess # nosec B404 - required for git operations
11
11
  from pathlib import Path
12
12
  from typing import List
13
13
 
@@ -65,8 +65,8 @@ def _get_recent_commits(max_commits: int = 3) -> List[str]:
65
65
  if not is_git_repository("."):
66
66
  return []
67
67
 
68
- # Run git log with custom format
69
- result = subprocess.run(
68
+ # Run git log with custom format (safe - no user input)
69
+ result = subprocess.run( # nosec B603 B607
70
70
  ["git", "log", "--format=%h • %ar • %s", f"-{max_commits}"],
71
71
  capture_output=True,
72
72
  text=True,
@@ -216,6 +216,59 @@ def _get_cwd_display(max_width: int = 40) -> str:
216
216
  return "..." + cwd[-(max_width - 3) :]
217
217
 
218
218
 
219
+ def _count_mpm_skills() -> int:
220
+ """
221
+ Count user-level MPM skills from ~/.claude/skills/.
222
+
223
+ Returns:
224
+ Number of skill directories with SKILL.md files
225
+ """
226
+ try:
227
+ user_skills_dir = Path.home() / ".claude" / "skills"
228
+ if not user_skills_dir.exists():
229
+ return 0
230
+
231
+ # Count directories with SKILL.md (skill directories)
232
+ skill_count = 0
233
+ for item in user_skills_dir.iterdir():
234
+ if item.is_dir():
235
+ skill_file = item / "SKILL.md"
236
+ if skill_file.exists():
237
+ skill_count += 1
238
+ # Also count standalone .md files (legacy format)
239
+ elif item.is_file() and item.suffix == ".md" and item.name != "README.md":
240
+ skill_count += 1
241
+
242
+ return skill_count
243
+ except Exception:
244
+ # Silent failure - return 0 if any error
245
+ return 0
246
+
247
+
248
+ def _count_deployed_agents() -> int:
249
+ """
250
+ Count deployed agents from .claude/agents/.
251
+
252
+ Returns:
253
+ Number of deployed agent files
254
+ """
255
+ try:
256
+ deploy_target = Path.cwd() / ".claude" / "agents"
257
+ if not deploy_target.exists():
258
+ return 0
259
+
260
+ # Count .md files, excluding README and other docs
261
+ agent_files = [
262
+ f
263
+ for f in deploy_target.glob("*.md")
264
+ if not f.name.startswith(("README", "INSTRUCTIONS", "."))
265
+ ]
266
+ return len(agent_files)
267
+ except Exception:
268
+ # Silent failure - return 0 if any error
269
+ return 0
270
+
271
+
219
272
  def _format_two_column_line(
220
273
  left: str, right: str, left_panel_width: int, right_panel_width: int
221
274
  ) -> str:
@@ -402,11 +455,25 @@ def display_startup_banner(version: str, logging_level: str) -> None:
402
455
  )
403
456
  )
404
457
 
405
- # Line 10: Model info | separator
458
+ # Line 10: Model info with counts | separator
406
459
  separator = "─" * right_panel_width
460
+ agent_count = _count_deployed_agents()
461
+ skill_count = _count_mpm_skills()
462
+
463
+ # Format: "Sonnet 4.5 · 44 agents, 19 skills"
464
+ if agent_count > 0 or skill_count > 0:
465
+ counts_text = []
466
+ if agent_count > 0:
467
+ counts_text.append(f"{agent_count} agent{'s' if agent_count != 1 else ''}")
468
+ if skill_count > 0:
469
+ counts_text.append(f"{skill_count} skill{'s' if skill_count != 1 else ''}")
470
+ model_info = f"Sonnet 4.5 · {', '.join(counts_text)}"
471
+ else:
472
+ model_info = "Sonnet 4.5 · Claude MPM"
473
+
407
474
  lines.append(
408
475
  _format_two_column_line(
409
- "Sonnet 4.5 · Claude MPM", separator, left_panel_width, right_panel_width
476
+ model_info, separator, left_panel_width, right_panel_width
410
477
  )
411
478
  )
412
479
 
@@ -464,7 +531,7 @@ def should_show_banner(args) -> bool:
464
531
  """
465
532
  Determine if startup banner should be displayed.
466
533
 
467
- Skip banner for: --help, --version, info, doctor, config, configure commands
534
+ Skip banner for: --help, --version, info, doctor, config, configure, oauth commands
468
535
  """
469
536
  # Check for help/version flags
470
537
  if hasattr(args, "help") and args.help:
@@ -473,7 +540,9 @@ def should_show_banner(args) -> bool:
473
540
  return False
474
541
 
475
542
  # Check for commands that should skip banner
476
- skip_commands = {"info", "doctor", "config", "configure"}
543
+ # Commander has its own banner, so skip the main MPM banner
544
+ # OAuth commands are lightweight utilities that should run immediately
545
+ skip_commands = {"info", "doctor", "config", "configure", "commander", "oauth"}
477
546
  if hasattr(args, "command") and args.command in skip_commands:
478
547
  return False
479
548
 
@@ -672,7 +672,7 @@ async def trigger_vector_search_indexing(project_root: Optional[Path] = None) ->
672
672
  # Using installed binary
673
673
  cmd = [vector_search_path, "index", str(project_root)]
674
674
 
675
- logger.info(
675
+ logger.debug(
676
676
  "MCP Vector Search: Starting background indexing for improved code search"
677
677
  )
678
678
 
@@ -761,7 +761,7 @@ def _start_vector_search_subprocess(project_root: Optional[Path] = None) -> None
761
761
  else:
762
762
  cmd = [vector_search_path, "index", str(project_root)]
763
763
 
764
- logger.info(
764
+ logger.debug(
765
765
  "MCP Vector Search: Starting background indexing for improved code search"
766
766
  )
767
767
 
@@ -0,0 +1,236 @@
1
+ """
2
+ Startup migrations for claude-mpm.
3
+
4
+ This module provides a migration registry pattern for automatically fixing
5
+ configuration issues on first startup after an update. Migrations run once
6
+ and are tracked in ~/.claude-mpm/migrations.yaml.
7
+
8
+ Design Principles:
9
+ - Non-blocking: Failures log warnings but don't stop startup
10
+ - Idempotent: Safe to run multiple times (check before migrate)
11
+ - Tracked: Each migration runs only once per installation
12
+ - Early: Runs before agent sync in startup sequence
13
+ """
14
+
15
+ import shutil
16
+ from dataclasses import dataclass
17
+ from datetime import datetime, timezone
18
+ from pathlib import Path
19
+ from typing import Callable
20
+
21
+ import yaml
22
+
23
+ from ..core.logging_utils import get_logger
24
+
25
+ logger = get_logger(__name__)
26
+
27
+
28
+ @dataclass
29
+ class Migration:
30
+ """Definition of a startup migration."""
31
+
32
+ id: str
33
+ description: str
34
+ check: Callable[[], bool] # Returns True if migration is needed
35
+ migrate: Callable[[], bool] # Returns True if migration succeeded
36
+
37
+
38
+ def _get_migrations_file() -> Path:
39
+ """Get path to migrations tracking file."""
40
+ return Path.home() / ".claude-mpm" / "migrations.yaml"
41
+
42
+
43
+ def _load_completed_migrations() -> dict:
44
+ """Load completed migrations from tracking file.
45
+
46
+ Returns:
47
+ Dictionary with completed migrations data.
48
+ """
49
+ migrations_file = _get_migrations_file()
50
+ if not migrations_file.exists():
51
+ return {"migrations": []}
52
+
53
+ try:
54
+ with open(migrations_file) as f:
55
+ data = yaml.safe_load(f) or {}
56
+ return data if "migrations" in data else {"migrations": []}
57
+ except Exception as e:
58
+ logger.debug(f"Failed to load migrations file: {e}")
59
+ return {"migrations": []}
60
+
61
+
62
+ def _save_completed_migration(migration_id: str) -> None:
63
+ """Save a completed migration to tracking file.
64
+
65
+ Args:
66
+ migration_id: The ID of the completed migration.
67
+ """
68
+ migrations_file = _get_migrations_file()
69
+ migrations_file.parent.mkdir(parents=True, exist_ok=True)
70
+
71
+ data = _load_completed_migrations()
72
+
73
+ # Add new migration entry
74
+ data["migrations"].append(
75
+ {"id": migration_id, "completed_at": datetime.now(timezone.utc).isoformat()}
76
+ )
77
+
78
+ try:
79
+ with open(migrations_file, "w") as f:
80
+ yaml.safe_dump(data, f, default_flow_style=False)
81
+ except Exception as e:
82
+ logger.warning(f"Failed to save migration tracking: {e}")
83
+
84
+
85
+ def _is_migration_completed(migration_id: str) -> bool:
86
+ """Check if a migration has already been completed.
87
+
88
+ Args:
89
+ migration_id: The ID of the migration to check.
90
+
91
+ Returns:
92
+ True if the migration has been completed.
93
+ """
94
+ data = _load_completed_migrations()
95
+ completed_ids = [m.get("id") for m in data.get("migrations", [])]
96
+ return migration_id in completed_ids
97
+
98
+
99
+ # =============================================================================
100
+ # Migration: v5.6.76-cache-dir-rename
101
+ # =============================================================================
102
+
103
+
104
+ def _check_cache_dir_rename_needed() -> bool:
105
+ """Check if cache directory rename is needed.
106
+
107
+ Returns:
108
+ True if ~/.claude-mpm/cache/remote-agents/ exists.
109
+ """
110
+ old_cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
111
+ return old_cache_dir.exists()
112
+
113
+
114
+ def _migrate_cache_dir_rename() -> bool:
115
+ """Rename remote-agents cache directory to agents.
116
+
117
+ This migration:
118
+ 1. Moves ~/.claude-mpm/cache/remote-agents/ contents to ~/.claude-mpm/cache/agents/
119
+ 2. Removes the old remote-agents directory
120
+ 3. Updates configuration.yaml if it references the old path
121
+
122
+ Returns:
123
+ True if migration succeeded.
124
+ """
125
+ old_cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
126
+ new_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
127
+
128
+ try:
129
+ # Step 1: Move directory contents
130
+ if old_cache_dir.exists():
131
+ # Ensure parent directory exists
132
+ new_cache_dir.parent.mkdir(parents=True, exist_ok=True)
133
+
134
+ if new_cache_dir.exists():
135
+ # Merge: move contents from old to new
136
+ for item in old_cache_dir.iterdir():
137
+ dest = new_cache_dir / item.name
138
+ if not dest.exists():
139
+ shutil.move(str(item), str(dest))
140
+ # Remove old directory after moving contents
141
+ shutil.rmtree(old_cache_dir, ignore_errors=True)
142
+ else:
143
+ # Simple rename if new dir doesn't exist
144
+ shutil.move(str(old_cache_dir), str(new_cache_dir))
145
+
146
+ logger.debug(
147
+ f"Moved cache directory from {old_cache_dir} to {new_cache_dir}"
148
+ )
149
+
150
+ # Step 2: Update configuration.yaml if needed
151
+ _update_configuration_cache_path()
152
+
153
+ return True
154
+
155
+ except Exception as e:
156
+ logger.warning(f"Cache directory migration failed: {e}")
157
+ return False
158
+
159
+
160
+ def _update_configuration_cache_path() -> None:
161
+ """Update configuration.yaml to use new cache path if it references old path."""
162
+ config_file = Path.home() / ".claude-mpm" / "configuration.yaml"
163
+ if not config_file.exists():
164
+ return
165
+
166
+ try:
167
+ with open(config_file) as f:
168
+ content = f.read()
169
+
170
+ old_path_pattern = "/.claude-mpm/cache/remote-agents"
171
+ new_path_pattern = "/.claude-mpm/cache/agents"
172
+
173
+ if old_path_pattern in content:
174
+ updated_content = content.replace(old_path_pattern, new_path_pattern)
175
+ with open(config_file, "w") as f:
176
+ f.write(updated_content)
177
+ logger.debug("Updated configuration.yaml cache_dir path")
178
+
179
+ except Exception as e:
180
+ logger.debug(f"Failed to update configuration.yaml: {e}")
181
+
182
+
183
+ # =============================================================================
184
+ # Migration Registry
185
+ # =============================================================================
186
+
187
+ MIGRATIONS: list[Migration] = [
188
+ Migration(
189
+ id="v5.6.76-cache-dir-rename",
190
+ description="Rename remote-agents cache dir to agents",
191
+ check=_check_cache_dir_rename_needed,
192
+ migrate=_migrate_cache_dir_rename,
193
+ ),
194
+ ]
195
+
196
+
197
+ def run_migrations() -> None:
198
+ """Run all pending startup migrations.
199
+
200
+ This function:
201
+ 1. Iterates through the migration registry
202
+ 2. Skips already-completed migrations
203
+ 3. Checks if each migration is needed
204
+ 4. Runs the migration if needed
205
+ 5. Tracks completed migrations
206
+
207
+ Errors are logged but do not stop startup.
208
+ """
209
+ for migration in MIGRATIONS:
210
+ try:
211
+ # Skip if already completed
212
+ if _is_migration_completed(migration.id):
213
+ continue
214
+
215
+ # Check if migration is needed
216
+ if not migration.check():
217
+ # Mark as completed even if not needed (condition doesn't apply)
218
+ _save_completed_migration(migration.id)
219
+ continue
220
+
221
+ # Run the migration
222
+ print(f"⚙️ Running startup migration: {migration.description}")
223
+ logger.info(f"Running startup migration: {migration.id}")
224
+
225
+ success = migration.migrate()
226
+
227
+ if success:
228
+ _save_completed_migration(migration.id)
229
+ logger.info(f"Migration {migration.id} completed successfully")
230
+ else:
231
+ logger.warning(f"Migration {migration.id} failed")
232
+
233
+ except Exception as e:
234
+ # Non-blocking: log and continue
235
+ logger.warning(f"Migration {migration.id} error: {e}")
236
+ continue
claude_mpm/cli/utils.py CHANGED
@@ -107,7 +107,7 @@ def get_agent_versions_display() -> Optional[str]:
107
107
  base_version_tuple
108
108
  )
109
109
  output_lines.append(f"\n Base Agent Version: {base_version_str}")
110
- except Exception:
110
+ except Exception: # nosec B110 - intentional: version display is optional
111
111
  pass
112
112
 
113
113
  # Check for agents needing migration
@@ -173,8 +173,12 @@ def setup_logging(args) -> object:
173
173
  if not hasattr(args, "logging") or args.logging is None:
174
174
  args.logging = LogLevel.OFF.value
175
175
 
176
+ # Handle deprecated --verbose flag
177
+ if hasattr(args, "verbose") and args.verbose and args.logging == LogLevel.OFF.value:
178
+ args.logging = LogLevel.INFO.value
179
+
176
180
  # Handle deprecated --debug flag
177
- if hasattr(args, "debug") and args.debug and args.logging == LogLevel.INFO.value:
181
+ if hasattr(args, "debug") and args.debug:
178
182
  args.logging = LogLevel.DEBUG.value
179
183
 
180
184
  # Only setup logging if not OFF
@@ -204,7 +208,7 @@ def ensure_directories() -> None:
204
208
  from ..init import ensure_directories as init_ensure_directories
205
209
 
206
210
  init_ensure_directories()
207
- except Exception:
211
+ except Exception: # nosec B110
208
212
  # Continue even if initialization fails
209
213
  # The individual commands will handle missing directories as needed
210
214
  pass
@@ -0,0 +1,78 @@
1
+ """MPM Commander - Multi-Project Orchestration.
2
+
3
+ This module provides the core infrastructure for managing multiple projects
4
+ with isolated state, work queues, and tool sessions.
5
+
6
+ Key Components:
7
+ - ProjectRegistry: Thread-safe project management
8
+ - Project models: Data structures for state and sessions
9
+ - TmuxOrchestrator: Tmux session and pane management
10
+ - Config loading: .claude-mpm/ directory configuration
11
+ - CommanderDaemon: Main daemon process for orchestration
12
+ - ProjectSession: Per-project lifecycle management
13
+ - InstanceManager: Framework selection and instance lifecycle
14
+ - Frameworks: Claude Code, MPM framework abstractions
15
+ - Memory: Conversation storage, semantic search, context compression
16
+
17
+ Example:
18
+ >>> from claude_mpm.commander import ProjectRegistry
19
+ >>> registry = ProjectRegistry()
20
+ >>> project = registry.register("/path/to/project")
21
+ >>> registry.update_state(project.id, ProjectState.WORKING)
22
+
23
+ >>> # Memory integration
24
+ >>> from claude_mpm.commander.memory import MemoryIntegration
25
+ >>> memory = MemoryIntegration.create()
26
+ >>> await memory.capture_project_conversation(project)
27
+ """
28
+
29
+ from claude_mpm.commander.config import DaemonConfig
30
+ from claude_mpm.commander.config_loader import load_project_config
31
+ from claude_mpm.commander.daemon import CommanderDaemon
32
+ from claude_mpm.commander.frameworks import (
33
+ BaseFramework,
34
+ ClaudeCodeFramework,
35
+ InstanceInfo,
36
+ MPMFramework,
37
+ )
38
+ from claude_mpm.commander.instance_manager import (
39
+ FrameworkNotFoundError,
40
+ InstanceAlreadyExistsError,
41
+ InstanceManager,
42
+ InstanceNotFoundError,
43
+ )
44
+ from claude_mpm.commander.models import (
45
+ Project,
46
+ ProjectState,
47
+ ThreadMessage,
48
+ ToolSession,
49
+ )
50
+ from claude_mpm.commander.project_session import ProjectSession, SessionState
51
+ from claude_mpm.commander.registry import ProjectRegistry
52
+ from claude_mpm.commander.tmux_orchestrator import (
53
+ TmuxNotFoundError,
54
+ TmuxOrchestrator,
55
+ )
56
+
57
+ __all__ = [
58
+ "BaseFramework",
59
+ "ClaudeCodeFramework",
60
+ "CommanderDaemon",
61
+ "DaemonConfig",
62
+ "FrameworkNotFoundError",
63
+ "InstanceAlreadyExistsError",
64
+ "InstanceInfo",
65
+ "InstanceManager",
66
+ "InstanceNotFoundError",
67
+ "MPMFramework",
68
+ "Project",
69
+ "ProjectRegistry",
70
+ "ProjectSession",
71
+ "ProjectState",
72
+ "SessionState",
73
+ "ThreadMessage",
74
+ "TmuxNotFoundError",
75
+ "TmuxOrchestrator",
76
+ "ToolSession",
77
+ "load_project_config",
78
+ ]
@@ -0,0 +1,60 @@
1
+ """Runtime adapters for MPM Commander.
2
+
3
+ This package provides adapters for different AI coding tools, allowing
4
+ the TmuxOrchestrator to interface with various runtimes in a uniform way.
5
+
6
+ Two types of adapters:
7
+ - RuntimeAdapter: Synchronous parsing and state detection
8
+ - CommunicationAdapter: Async I/O and state management
9
+
10
+ Available Runtime Adapters:
11
+ - ClaudeCodeAdapter: Vanilla Claude Code CLI
12
+ - AuggieAdapter: Auggie with MCP support
13
+ - CodexAdapter: Codex (limited features)
14
+ - MPMAdapter: Full MPM with agents, hooks, skills, monitoring
15
+
16
+ Registry:
17
+ - AdapterRegistry: Centralized adapter management with auto-detection
18
+ """
19
+
20
+ from .auggie import AuggieAdapter
21
+ from .base import (
22
+ Capability,
23
+ ParsedResponse,
24
+ RuntimeAdapter,
25
+ RuntimeCapability,
26
+ RuntimeInfo,
27
+ )
28
+ from .claude_code import ClaudeCodeAdapter
29
+ from .codex import CodexAdapter
30
+ from .communication import (
31
+ AdapterResponse,
32
+ AdapterState,
33
+ BaseCommunicationAdapter,
34
+ ClaudeCodeCommunicationAdapter,
35
+ )
36
+ from .mpm import MPMAdapter
37
+ from .registry import AdapterRegistry
38
+
39
+ # Auto-register all adapters
40
+ AdapterRegistry.register("claude-code", ClaudeCodeAdapter)
41
+ AdapterRegistry.register("auggie", AuggieAdapter)
42
+ AdapterRegistry.register("codex", CodexAdapter)
43
+ AdapterRegistry.register("mpm", MPMAdapter)
44
+
45
+ __all__ = [
46
+ "AdapterRegistry",
47
+ "AdapterResponse",
48
+ "AdapterState",
49
+ "AuggieAdapter",
50
+ "BaseCommunicationAdapter",
51
+ "Capability",
52
+ "ClaudeCodeAdapter",
53
+ "ClaudeCodeCommunicationAdapter",
54
+ "CodexAdapter",
55
+ "MPMAdapter",
56
+ "ParsedResponse",
57
+ "RuntimeAdapter",
58
+ "RuntimeCapability",
59
+ "RuntimeInfo",
60
+ ]