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
@@ -0,0 +1,260 @@
1
+ """Auggie CLI runtime adapter.
2
+
3
+ This module implements the RuntimeAdapter interface for Auggie,
4
+ an AI coding assistant with MCP (Model Context Protocol) support.
5
+ """
6
+
7
+ import logging
8
+ import re
9
+ import shlex
10
+ from typing import List, Optional, Set
11
+
12
+ from .base import (
13
+ Capability,
14
+ ParsedResponse,
15
+ RuntimeAdapter,
16
+ RuntimeCapability,
17
+ RuntimeInfo,
18
+ )
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class AuggieAdapter(RuntimeAdapter):
24
+ """Adapter for Auggie CLI.
25
+
26
+ Auggie is an AI coding assistant with support for MCP servers,
27
+ custom instructions, and various tool capabilities.
28
+
29
+ Example:
30
+ >>> adapter = AuggieAdapter()
31
+ >>> cmd = adapter.build_launch_command("/home/user/project")
32
+ >>> print(cmd)
33
+ cd '/home/user/project' && auggie
34
+ """
35
+
36
+ # Idle detection patterns
37
+ IDLE_PATTERNS = [
38
+ r"^>\s*$", # Simple prompt
39
+ r"auggie>\s*$", # Named prompt
40
+ r"Ready for input",
41
+ r"What would you like",
42
+ r"How can I assist",
43
+ ]
44
+
45
+ # Error patterns
46
+ ERROR_PATTERNS = [
47
+ r"Error:",
48
+ r"Failed:",
49
+ r"Exception:",
50
+ r"Permission denied",
51
+ r"not found",
52
+ r"Traceback \(most recent call last\)",
53
+ r"FATAL:",
54
+ r"command not found",
55
+ r"cannot access",
56
+ ]
57
+
58
+ # Question patterns
59
+ QUESTION_PATTERNS = [
60
+ r"Which option",
61
+ r"Should I proceed",
62
+ r"Please choose",
63
+ r"\(y/n\)\?",
64
+ r"Are you sure",
65
+ r"Do you want",
66
+ r"\[Y/n\]",
67
+ r"\[yes/no\]",
68
+ ]
69
+
70
+ # ANSI escape code pattern
71
+ ANSI_ESCAPE = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
72
+
73
+ @property
74
+ def name(self) -> str:
75
+ """Return the runtime identifier."""
76
+ return "auggie"
77
+
78
+ @property
79
+ def capabilities(self) -> Set[Capability]:
80
+ """Return the set of capabilities supported by Auggie."""
81
+ return {
82
+ Capability.TOOL_USE,
83
+ Capability.FILE_EDIT,
84
+ Capability.FILE_CREATE,
85
+ Capability.GIT_OPERATIONS,
86
+ Capability.SHELL_COMMANDS,
87
+ Capability.COMPLEX_REASONING,
88
+ }
89
+
90
+ @property
91
+ def runtime_info(self) -> RuntimeInfo:
92
+ """Return detailed runtime information."""
93
+ return RuntimeInfo(
94
+ name="auggie",
95
+ version=None, # Version detection could be added
96
+ capabilities={
97
+ RuntimeCapability.FILE_READ,
98
+ RuntimeCapability.FILE_EDIT,
99
+ RuntimeCapability.FILE_CREATE,
100
+ RuntimeCapability.BASH_EXECUTION,
101
+ RuntimeCapability.GIT_OPERATIONS,
102
+ RuntimeCapability.TOOL_USE,
103
+ RuntimeCapability.MCP_TOOLS, # Auggie supports MCP
104
+ RuntimeCapability.INSTRUCTIONS,
105
+ RuntimeCapability.COMPLEX_REASONING,
106
+ RuntimeCapability.AGENT_DELEGATION, # Auggie now supports agents
107
+ },
108
+ command="auggie",
109
+ supports_agents=True, # Auggie now supports agent delegation
110
+ instruction_file=".augment/instructions.md",
111
+ )
112
+
113
+ def build_launch_command(
114
+ self, project_path: str, agent_prompt: Optional[str] = None
115
+ ) -> str:
116
+ """Generate shell command to start Auggie.
117
+
118
+ Args:
119
+ project_path: Absolute path to the project directory
120
+ agent_prompt: Optional system prompt to configure Auggie
121
+
122
+ Returns:
123
+ Shell command string ready to execute
124
+
125
+ Example:
126
+ >>> adapter = AuggieAdapter()
127
+ >>> adapter.build_launch_command("/home/user/project")
128
+ "cd '/home/user/project' && auggie"
129
+ """
130
+ quoted_path = shlex.quote(project_path)
131
+ cmd = f"cd {quoted_path} && auggie"
132
+
133
+ if agent_prompt:
134
+ # Auggie may support --prompt or similar flag
135
+ # Adjust based on actual Auggie CLI options
136
+ quoted_prompt = shlex.quote(agent_prompt)
137
+ cmd += f" --prompt {quoted_prompt}"
138
+
139
+ logger.debug(f"Built Auggie launch command: {cmd}")
140
+ return cmd
141
+
142
+ def format_input(self, message: str) -> str:
143
+ """Prepare message for Auggie's input format."""
144
+ formatted = message.strip()
145
+ logger.debug(f"Formatted input: {formatted[:100]}...")
146
+ return formatted
147
+
148
+ def strip_ansi(self, text: str) -> str:
149
+ """Remove ANSI escape codes from text."""
150
+ return self.ANSI_ESCAPE.sub("", text)
151
+
152
+ def detect_idle(self, output: str) -> bool:
153
+ """Recognize when Auggie is waiting for input."""
154
+ if not output:
155
+ return False
156
+
157
+ clean = self.strip_ansi(output)
158
+ lines = clean.strip().split("\n")
159
+
160
+ if not lines:
161
+ return False
162
+
163
+ last_line = lines[-1].strip()
164
+
165
+ for pattern in self.IDLE_PATTERNS:
166
+ if re.search(pattern, last_line):
167
+ logger.debug(f"Detected idle state with pattern: {pattern}")
168
+ return True
169
+
170
+ return False
171
+
172
+ def detect_error(self, output: str) -> Optional[str]:
173
+ """Recognize error states and extract error message."""
174
+ clean = self.strip_ansi(output)
175
+
176
+ for pattern in self.ERROR_PATTERNS:
177
+ match = re.search(pattern, clean, re.IGNORECASE)
178
+ if match:
179
+ for line in clean.split("\n"):
180
+ if re.search(pattern, line, re.IGNORECASE):
181
+ error_msg = line.strip()
182
+ logger.warning(f"Detected error: {error_msg}")
183
+ return error_msg
184
+
185
+ return None
186
+
187
+ def detect_question(
188
+ self, output: str
189
+ ) -> tuple[bool, Optional[str], Optional[List[str]]]:
190
+ """Detect if Auggie is asking a question."""
191
+ clean = self.strip_ansi(output)
192
+
193
+ for pattern in self.QUESTION_PATTERNS:
194
+ if re.search(pattern, clean, re.IGNORECASE):
195
+ lines = clean.strip().split("\n")
196
+ question = None
197
+ options = []
198
+
199
+ for line in lines:
200
+ if re.search(pattern, line, re.IGNORECASE):
201
+ question = line.strip()
202
+
203
+ # Look for numbered options
204
+ opt_match = re.match(r"^\s*(\d+)[.):]\s*(.+)$", line)
205
+ if opt_match:
206
+ options.append(opt_match.group(2).strip())
207
+
208
+ logger.debug(
209
+ f"Detected question: {question}, options: {options if options else 'none'}"
210
+ )
211
+ return True, question, options if options else None
212
+
213
+ return False, None, None
214
+
215
+ def parse_response(self, output: str) -> ParsedResponse:
216
+ """Extract meaningful content from Auggie output."""
217
+ if not output:
218
+ return ParsedResponse(
219
+ content="",
220
+ is_complete=False,
221
+ is_error=False,
222
+ is_question=False,
223
+ )
224
+
225
+ clean = self.strip_ansi(output)
226
+ error_msg = self.detect_error(output)
227
+ is_question, question_text, options = self.detect_question(output)
228
+ is_complete = self.detect_idle(output)
229
+
230
+ response = ParsedResponse(
231
+ content=clean,
232
+ is_complete=is_complete,
233
+ is_error=error_msg is not None,
234
+ error_message=error_msg,
235
+ is_question=is_question,
236
+ question_text=question_text,
237
+ options=options,
238
+ )
239
+
240
+ logger.debug(
241
+ f"Parsed response: complete={is_complete}, error={error_msg is not None}, "
242
+ f"question={is_question}"
243
+ )
244
+
245
+ return response
246
+
247
+ def inject_instructions(self, instructions: str) -> Optional[str]:
248
+ """Return command to inject custom instructions.
249
+
250
+ Auggie supports .augment/instructions.md file for custom instructions.
251
+
252
+ Args:
253
+ instructions: Instructions text to inject
254
+
255
+ Returns:
256
+ Command to write instructions file
257
+ """
258
+ # Write to .augment/instructions.md
259
+ escaped = instructions.replace("'", "'\\''")
260
+ return f"mkdir -p .augment && echo '{escaped}' > .augment/instructions.md"
@@ -0,0 +1,288 @@
1
+ """Base runtime adapter interface for MPM Commander.
2
+
3
+ This module defines the abstract interface for runtime adapters that bridge
4
+ between the TmuxOrchestrator and various AI coding tools (Claude Code, Cursor, etc.).
5
+ """
6
+
7
+ from abc import ABC, abstractmethod
8
+ from dataclasses import dataclass
9
+ from enum import Enum, auto
10
+ from typing import List, Optional, Set
11
+
12
+
13
+ class Capability(Enum):
14
+ """Capabilities that a runtime adapter can provide."""
15
+
16
+ TOOL_USE = "tool_use"
17
+ FILE_EDIT = "file_edit"
18
+ FILE_CREATE = "file_create"
19
+ GIT_OPERATIONS = "git_operations"
20
+ SHELL_COMMANDS = "shell_commands"
21
+ WEB_SEARCH = "web_search"
22
+ COMPLEX_REASONING = "complex_reasoning"
23
+
24
+
25
+ class RuntimeCapability(Enum):
26
+ """Extended capabilities a runtime may support (MPM-specific features)."""
27
+
28
+ FILE_READ = auto()
29
+ FILE_EDIT = auto()
30
+ FILE_CREATE = auto()
31
+ BASH_EXECUTION = auto()
32
+ GIT_OPERATIONS = auto()
33
+ TOOL_USE = auto()
34
+ AGENT_DELEGATION = auto() # Sub-agent spawning
35
+ HOOKS = auto() # Lifecycle hooks
36
+ INSTRUCTIONS = auto() # Custom instructions file
37
+ MCP_TOOLS = auto() # MCP server integration
38
+ SKILLS = auto() # Loadable skills
39
+ MONITOR = auto() # Real-time monitoring
40
+ WEB_SEARCH = auto()
41
+ COMPLEX_REASONING = auto()
42
+
43
+
44
+ @dataclass
45
+ class RuntimeInfo:
46
+ """Information about a runtime environment.
47
+
48
+ Attributes:
49
+ name: Runtime identifier (e.g., "claude-code", "auggie")
50
+ version: Optional version string
51
+ capabilities: Set of RuntimeCapability enums
52
+ command: CLI command to invoke runtime
53
+ supports_agents: Whether runtime supports agent delegation
54
+ instruction_file: Path to instructions file (e.g., "CLAUDE.md")
55
+
56
+ Example:
57
+ >>> info = RuntimeInfo(
58
+ ... name="claude-code",
59
+ ... version="1.0.0",
60
+ ... capabilities={RuntimeCapability.FILE_EDIT, RuntimeCapability.TOOL_USE},
61
+ ... command="claude",
62
+ ... supports_agents=False,
63
+ ... instruction_file="CLAUDE.md"
64
+ ... )
65
+ """
66
+
67
+ name: str
68
+ version: Optional[str]
69
+ capabilities: Set[RuntimeCapability]
70
+ command: str
71
+ supports_agents: bool = False
72
+ instruction_file: Optional[str] = None
73
+
74
+
75
+ @dataclass
76
+ class ParsedResponse:
77
+ """Parsed output from a runtime tool.
78
+
79
+ Attributes:
80
+ content: The extracted text content, with ANSI codes removed
81
+ is_complete: True if tool is waiting for input (idle state)
82
+ is_error: True if an error was detected in the output
83
+ error_message: The error message if is_error is True
84
+ is_question: True if tool is asking a question
85
+ question_text: The question text if is_question is True
86
+ options: List of options if presenting a choice
87
+
88
+ Example:
89
+ >>> response = ParsedResponse(
90
+ ... content="File created successfully",
91
+ ... is_complete=True,
92
+ ... is_error=False,
93
+ ... error_message=None,
94
+ ... is_question=False,
95
+ ... question_text=None,
96
+ ... options=None
97
+ ... )
98
+ """
99
+
100
+ content: str
101
+ is_complete: bool
102
+ is_error: bool
103
+ error_message: Optional[str] = None
104
+ is_question: bool = False
105
+ question_text: Optional[str] = None
106
+ options: Optional[List[str]] = None
107
+
108
+
109
+ class RuntimeAdapter(ABC):
110
+ """Abstract base class for runtime adapters.
111
+
112
+ A runtime adapter provides the interface between the TmuxOrchestrator
113
+ and a specific AI coding tool. It handles:
114
+ - Launching the tool with appropriate settings
115
+ - Formatting input messages
116
+ - Detecting tool states (idle, error, questioning)
117
+ - Parsing tool output into structured responses
118
+
119
+ Example:
120
+ >>> class MyAdapter(RuntimeAdapter):
121
+ ... @property
122
+ ... def name(self) -> str:
123
+ ... return "my-tool"
124
+ ...
125
+ ... def build_launch_command(self, project_path: str) -> str:
126
+ ... return f"cd {project_path} && my-tool --interactive"
127
+ """
128
+
129
+ @abstractmethod
130
+ def build_launch_command(
131
+ self, project_path: str, agent_prompt: Optional[str] = None
132
+ ) -> str:
133
+ """Generate shell command to start the tool.
134
+
135
+ Args:
136
+ project_path: Absolute path to the project directory
137
+ agent_prompt: Optional system prompt to configure the agent
138
+
139
+ Returns:
140
+ Shell command string ready to execute
141
+
142
+ Example:
143
+ >>> adapter.build_launch_command("/home/user/project", "You are a Python expert")
144
+ 'cd /home/user/project && claude --system-prompt "You are a Python expert"'
145
+ """
146
+
147
+ @abstractmethod
148
+ def format_input(self, message: str) -> str:
149
+ """Prepare message for tool's input format.
150
+
151
+ Args:
152
+ message: The user message to send
153
+
154
+ Returns:
155
+ Formatted message ready to send to the tool
156
+
157
+ Example:
158
+ >>> adapter.format_input("Fix the bug in main.py")
159
+ 'Fix the bug in main.py'
160
+ """
161
+
162
+ @abstractmethod
163
+ def detect_idle(self, output: str) -> bool:
164
+ """Recognize when tool is waiting for input.
165
+
166
+ Args:
167
+ output: Raw output from the tool (may contain ANSI codes)
168
+
169
+ Returns:
170
+ True if the tool is in an idle state awaiting input
171
+
172
+ Example:
173
+ >>> adapter.detect_idle("Done editing file.\\n> ")
174
+ True
175
+ >>> adapter.detect_idle("Processing request...")
176
+ False
177
+ """
178
+
179
+ @abstractmethod
180
+ def detect_error(self, output: str) -> Optional[str]:
181
+ """Recognize error states, return error message if found.
182
+
183
+ Args:
184
+ output: Raw output from the tool
185
+
186
+ Returns:
187
+ Error message string if error detected, None otherwise
188
+
189
+ Example:
190
+ >>> adapter.detect_error("Error: File not found: config.py")
191
+ 'Error: File not found: config.py'
192
+ >>> adapter.detect_error("File edited successfully")
193
+ None
194
+ """
195
+
196
+ @abstractmethod
197
+ def parse_response(self, output: str) -> ParsedResponse:
198
+ """Extract meaningful content from output.
199
+
200
+ This method combines all detection logic (idle, error, questions)
201
+ into a single structured response.
202
+
203
+ Args:
204
+ output: Raw output from the tool
205
+
206
+ Returns:
207
+ ParsedResponse with all detected states and content
208
+
209
+ Example:
210
+ >>> response = adapter.parse_response("Error: Invalid input\\n> ")
211
+ >>> response.is_error
212
+ True
213
+ >>> response.is_complete
214
+ True
215
+ """
216
+
217
+ @property
218
+ @abstractmethod
219
+ def capabilities(self) -> Set[Capability]:
220
+ """What this tool can do.
221
+
222
+ Returns:
223
+ Set of Capability enums indicating supported features
224
+
225
+ Example:
226
+ >>> adapter.capabilities
227
+ {Capability.FILE_EDIT, Capability.TOOL_USE}
228
+ """
229
+
230
+ @property
231
+ @abstractmethod
232
+ def name(self) -> str:
233
+ """Runtime identifier.
234
+
235
+ Returns:
236
+ Unique name for this runtime adapter
237
+
238
+ Example:
239
+ >>> adapter.name
240
+ 'claude-code'
241
+ """
242
+
243
+ @property
244
+ def runtime_info(self) -> Optional[RuntimeInfo]:
245
+ """Return detailed runtime information.
246
+
247
+ Returns:
248
+ RuntimeInfo with capabilities and configuration, or None if not implemented
249
+
250
+ Example:
251
+ >>> info = adapter.runtime_info
252
+ >>> if info and RuntimeCapability.AGENT_DELEGATION in info.capabilities:
253
+ ... print("Supports agent delegation")
254
+ """
255
+ return None
256
+
257
+ def inject_instructions(self, instructions: str) -> Optional[str]:
258
+ """Return command/method to inject custom instructions.
259
+
260
+ Args:
261
+ instructions: Instructions text to inject
262
+
263
+ Returns:
264
+ Command string to inject instructions, or None if not supported
265
+
266
+ Example:
267
+ >>> cmd = adapter.inject_instructions("You are a Python expert")
268
+ >>> if cmd:
269
+ ... # Execute command to inject instructions
270
+ """
271
+ return None
272
+
273
+ def inject_agent_context(self, agent_id: str, context: dict) -> Optional[str]:
274
+ """Return command to inject agent context.
275
+
276
+ Args:
277
+ agent_id: Unique identifier for agent
278
+ context: Context dictionary with agent metadata
279
+
280
+ Returns:
281
+ Command string to inject context, or None if not supported
282
+
283
+ Example:
284
+ >>> cmd = adapter.inject_agent_context("eng-001", {"role": "Engineer"})
285
+ >>> if cmd:
286
+ ... # Execute command to inject context
287
+ """
288
+ return None