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,290 @@
1
+ """Example usage of Commander memory system.
2
+
3
+ Demonstrates:
4
+ 1. Capturing conversations from Project
5
+ 2. Searching conversations semantically
6
+ 3. Loading context for session resumption
7
+ 4. Entity extraction and filtering
8
+ """
9
+
10
+ import asyncio
11
+
12
+ from ..models.project import Project, ProjectState, ThreadMessage
13
+ from .entities import EntityType
14
+ from .integration import MemoryIntegration
15
+
16
+
17
+ async def example_basic_usage():
18
+ """Example 1: Basic conversation capture and search."""
19
+ print("\n=== Example 1: Basic Usage ===\n")
20
+
21
+ # Initialize memory integration
22
+ memory = MemoryIntegration.create()
23
+
24
+ # Create sample project with conversation
25
+ project = Project(
26
+ id="proj-example-123",
27
+ path="/Users/masa/Projects/example-app",
28
+ name="example-app",
29
+ state=ProjectState.IDLE,
30
+ )
31
+
32
+ # Add sample conversation to project
33
+ project.thread = [
34
+ ThreadMessage(
35
+ id="msg-1",
36
+ role="user",
37
+ content="Fix the login authentication bug in src/auth.py",
38
+ ),
39
+ ThreadMessage(
40
+ id="msg-2",
41
+ role="assistant",
42
+ content="I'll investigate the authentication bug. Let me read the auth.py file.",
43
+ ),
44
+ ThreadMessage(
45
+ id="msg-3",
46
+ role="assistant",
47
+ content="Found the issue in UserService.authenticate() - the token validation was missing expiry check. Fixed it.",
48
+ ),
49
+ ThreadMessage(
50
+ id="msg-4",
51
+ role="user",
52
+ content="Great! Can you also add tests for this fix?",
53
+ ),
54
+ ThreadMessage(
55
+ id="msg-5",
56
+ role="assistant",
57
+ content="Added test_token_expiry_validation() in tests/test_auth.py. All tests passing.",
58
+ ),
59
+ ]
60
+
61
+ # Capture conversation
62
+ conversation = await memory.capture_project_conversation(
63
+ project, instance_name="claude-code-1", session_id="sess-abc123"
64
+ )
65
+
66
+ print(f"✅ Captured conversation: {conversation.id}")
67
+ print(f" Messages: {len(conversation.messages)}")
68
+ print(f" Summary: {conversation.summary}")
69
+ print(
70
+ f" Entities extracted: {len([e for msg in conversation.messages for e in msg.entities])}"
71
+ )
72
+
73
+ # Search conversations
74
+ print("\n🔍 Searching for 'authentication bug'...")
75
+ results = await memory.search_conversations(
76
+ "authentication bug fix", project_id=project.id, limit=3
77
+ )
78
+
79
+ for i, result in enumerate(results, 1):
80
+ print(f"\n{i}. Score: {result.score:.3f}")
81
+ print(f" Conversation: {result.conversation.id}")
82
+ print(f" Snippet: {result.snippet[:100]}...")
83
+
84
+
85
+ async def example_entity_search():
86
+ """Example 2: Entity-based search and filtering."""
87
+ print("\n=== Example 2: Entity Search ===\n")
88
+
89
+ memory = MemoryIntegration.create()
90
+
91
+ # Create project with file references
92
+ project = Project(
93
+ id="proj-example-456",
94
+ path="/Users/masa/Projects/example-app",
95
+ name="example-app",
96
+ )
97
+
98
+ project.thread = [
99
+ ThreadMessage(
100
+ id="msg-1",
101
+ role="user",
102
+ content="Update the UserService class in src/services/user_service.py",
103
+ ),
104
+ ThreadMessage(
105
+ id="msg-2",
106
+ role="assistant",
107
+ content="I'll update UserService.create_user() to include email validation. Also updating tests/test_user_service.py.",
108
+ ),
109
+ ]
110
+
111
+ # Capture
112
+ conversation = await memory.capture_project_conversation(
113
+ project, instance_name="claude-code-2"
114
+ )
115
+
116
+ # Extract entities
117
+ entities = []
118
+ for msg in conversation.messages:
119
+ entities.extend(msg.entities)
120
+
121
+ # Filter by type
122
+ files = memory.extractor.get_unique_values(
123
+ [memory.extractor.Entity.from_dict(e) for e in entities], EntityType.FILE
124
+ )
125
+ print(f"📁 Files mentioned: {files}")
126
+
127
+ classes = memory.extractor.get_unique_values(
128
+ [memory.extractor.Entity.from_dict(e) for e in entities], EntityType.CLASS
129
+ )
130
+ print(f"🏗️ Classes mentioned: {classes}")
131
+
132
+ # Search by entity
133
+ print("\n🔍 Finding conversations that mention 'src/services/user_service.py'...")
134
+ results = await memory.search.search_by_entities(
135
+ EntityType.FILE,
136
+ "src/services/user_service.py",
137
+ project_id=project.id,
138
+ )
139
+
140
+ print(f"Found {len(results)} conversations mentioning this file")
141
+
142
+
143
+ async def example_context_loading():
144
+ """Example 3: Load context for session resumption."""
145
+ print("\n=== Example 3: Context Loading for Session Resumption ===\n")
146
+
147
+ memory = MemoryIntegration.create()
148
+
149
+ # Create multiple conversations (simulating historical work)
150
+ project = Project(
151
+ id="proj-example-789",
152
+ path="/Users/masa/Projects/example-app",
153
+ name="example-app",
154
+ )
155
+
156
+ # Conversation 1: Week ago
157
+ project.thread = [
158
+ ThreadMessage(
159
+ id="msg-1",
160
+ role="user",
161
+ content="Implement user registration with email verification",
162
+ ),
163
+ ThreadMessage(
164
+ id="msg-2",
165
+ role="assistant",
166
+ content="Implemented registration in src/auth.py with email service integration",
167
+ ),
168
+ ]
169
+ await memory.capture_project_conversation(project, instance_name="claude-code-1")
170
+
171
+ # Conversation 2: Yesterday
172
+ project.thread = [
173
+ ThreadMessage(
174
+ id="msg-3",
175
+ role="user",
176
+ content="Fix the email verification bug - tokens not expiring",
177
+ ),
178
+ ThreadMessage(
179
+ id="msg-4",
180
+ role="assistant",
181
+ content="Fixed token expiry check in src/auth.py and added tests",
182
+ ),
183
+ ]
184
+ await memory.capture_project_conversation(project, instance_name="claude-code-1")
185
+
186
+ # Load context for resumption
187
+ print("📖 Loading context for session resumption...")
188
+ context = await memory.load_context_for_session(
189
+ project.id, max_tokens=4000, limit_conversations=10
190
+ )
191
+
192
+ print(f"✅ Loaded context ({len(context)} chars):\n")
193
+ print(context[:500] + "...\n")
194
+
195
+ print(
196
+ "This context would be injected into the new session to provide historical awareness."
197
+ )
198
+
199
+
200
+ async def example_similarity_search():
201
+ """Example 4: Find similar conversations."""
202
+ print("\n=== Example 4: Similarity Search ===\n")
203
+
204
+ memory = MemoryIntegration.create()
205
+
206
+ # Create project with multiple conversations
207
+ project = Project(
208
+ id="proj-example-999",
209
+ path="/Users/masa/Projects/example-app",
210
+ name="example-app",
211
+ )
212
+
213
+ # Reference conversation
214
+ project.thread = [
215
+ ThreadMessage(
216
+ id="msg-1",
217
+ role="user",
218
+ content="Fix the authentication bug in login flow",
219
+ ),
220
+ ThreadMessage(
221
+ id="msg-2",
222
+ role="assistant",
223
+ content="Fixed token validation in src/auth.py",
224
+ ),
225
+ ]
226
+ ref_conv = await memory.capture_project_conversation(project)
227
+
228
+ # Similar conversation
229
+ project.thread = [
230
+ ThreadMessage(
231
+ id="msg-3",
232
+ role="user",
233
+ content="Update the login authentication to use OAuth",
234
+ ),
235
+ ThreadMessage(
236
+ id="msg-4",
237
+ role="assistant",
238
+ content="Implemented OAuth in src/auth.py",
239
+ ),
240
+ ]
241
+ await memory.capture_project_conversation(project)
242
+
243
+ # Different conversation
244
+ project.thread = [
245
+ ThreadMessage(
246
+ id="msg-5",
247
+ role="user",
248
+ content="Add dark mode toggle to the UI",
249
+ ),
250
+ ThreadMessage(
251
+ id="msg-6",
252
+ role="assistant",
253
+ content="Added dark mode CSS in styles/theme.css",
254
+ ),
255
+ ]
256
+ await memory.capture_project_conversation(project)
257
+
258
+ # Find similar
259
+ print(f"🔍 Finding conversations similar to: {ref_conv.id}")
260
+ similar = await memory.search.find_similar(ref_conv.id, limit=3)
261
+
262
+ for i, result in enumerate(similar, 1):
263
+ print(f"\n{i}. Similarity: {result.score:.3f}")
264
+ print(f" Conversation: {result.conversation.id}")
265
+ print(f" Summary: {result.conversation.summary}")
266
+
267
+
268
+ async def main():
269
+ """Run all examples."""
270
+ print("\n" + "=" * 60)
271
+ print("Commander Memory System - Example Usage")
272
+ print("=" * 60)
273
+
274
+ # Run examples
275
+ await example_basic_usage()
276
+ await example_entity_search()
277
+ await example_context_loading()
278
+ await example_similarity_search()
279
+
280
+ print("\n" + "=" * 60)
281
+ print("✅ All examples completed!")
282
+ print("=" * 60 + "\n")
283
+
284
+ print("📚 For more information, see:")
285
+ print(" - src/claude_mpm/commander/memory/README.md")
286
+ print(" - API documentation in each module")
287
+
288
+
289
+ if __name__ == "__main__":
290
+ asyncio.run(main())
@@ -0,0 +1,325 @@
1
+ """Integration helpers for memory system with Commander.
2
+
3
+ Provides high-level functions to integrate conversation memory with
4
+ RuntimeMonitor, Chat CLI, and session resumption workflows.
5
+ """
6
+
7
+ import logging
8
+ import uuid
9
+ from datetime import datetime, timezone
10
+ from typing import List, Optional
11
+
12
+ from ..llm.openrouter_client import OpenRouterClient
13
+ from ..models.project import Project, ThreadMessage
14
+ from .compression import ContextCompressor
15
+ from .embeddings import EmbeddingService
16
+ from .entities import EntityExtractor
17
+ from .search import SemanticSearch
18
+ from .store import Conversation, ConversationMessage, ConversationStore
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class MemoryIntegration:
24
+ """High-level memory integration for Commander.
25
+
26
+ Provides simple API for common memory operations:
27
+ - Capture conversation from Project
28
+ - Search across all conversations
29
+ - Load context for session resume
30
+
31
+ Attributes:
32
+ store: ConversationStore for persistence
33
+ embeddings: EmbeddingService for vectors
34
+ search: SemanticSearch for queries
35
+ compressor: ContextCompressor for summaries
36
+ extractor: EntityExtractor for entity extraction
37
+
38
+ Example:
39
+ >>> memory = MemoryIntegration.create()
40
+ >>> await memory.capture_project_conversation(project)
41
+ >>> results = await memory.search("login bug fix", project_id="proj-xyz")
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ store: ConversationStore,
47
+ embeddings: EmbeddingService,
48
+ search: SemanticSearch,
49
+ compressor: ContextCompressor,
50
+ extractor: EntityExtractor,
51
+ ):
52
+ """Initialize memory integration.
53
+
54
+ Args:
55
+ store: ConversationStore instance
56
+ embeddings: EmbeddingService instance
57
+ search: SemanticSearch instance
58
+ compressor: ContextCompressor instance
59
+ extractor: EntityExtractor instance
60
+ """
61
+ self.store = store
62
+ self.embeddings = embeddings
63
+ self.search = search
64
+ self.compressor = compressor
65
+ self.extractor = extractor
66
+
67
+ logger.info("MemoryIntegration initialized")
68
+
69
+ @classmethod
70
+ def create(
71
+ cls,
72
+ openrouter_client: Optional[OpenRouterClient] = None,
73
+ embedding_provider: str = "sentence-transformers",
74
+ ) -> "MemoryIntegration":
75
+ """Create MemoryIntegration with default configuration.
76
+
77
+ Args:
78
+ openrouter_client: Optional OpenRouterClient for summarization
79
+ embedding_provider: Embedding provider ("sentence-transformers" or "openai")
80
+
81
+ Returns:
82
+ Configured MemoryIntegration instance
83
+
84
+ Example:
85
+ >>> from claude_mpm.commander.llm import OpenRouterClient
86
+ >>> client = OpenRouterClient()
87
+ >>> memory = MemoryIntegration.create(openrouter_client=client)
88
+ """
89
+ store = ConversationStore()
90
+ embeddings = EmbeddingService(provider=embedding_provider)
91
+ search = SemanticSearch(store, embeddings)
92
+
93
+ # Create OpenRouter client if not provided
94
+ if openrouter_client is None:
95
+ openrouter_client = OpenRouterClient()
96
+
97
+ compressor = ContextCompressor(openrouter_client)
98
+ extractor = EntityExtractor()
99
+
100
+ return cls(store, embeddings, search, compressor, extractor)
101
+
102
+ async def capture_project_conversation(
103
+ self,
104
+ project: Project,
105
+ instance_name: str = "unknown",
106
+ session_id: Optional[str] = None,
107
+ ) -> Conversation:
108
+ """Capture conversation from Project thread.
109
+
110
+ Converts Project.thread (List[ThreadMessage]) into a Conversation
111
+ with entity extraction and optional summarization.
112
+
113
+ Args:
114
+ project: Project with conversation thread
115
+ instance_name: Instance name (e.g., "claude-code-1")
116
+ session_id: Optional session ID
117
+
118
+ Returns:
119
+ Captured and saved Conversation
120
+
121
+ Example:
122
+ >>> conv = await memory.capture_project_conversation(project)
123
+ >>> print(f"Captured conversation {conv.id} with {len(conv.messages)} messages")
124
+ """
125
+ if not project.thread:
126
+ logger.warning("Project %s has no conversation thread", project.id)
127
+ return None
128
+
129
+ # Convert ThreadMessages to ConversationMessages
130
+ messages = []
131
+ for thread_msg in project.thread:
132
+ conv_msg = ConversationMessage.from_thread_message(thread_msg)
133
+
134
+ # Extract entities
135
+ entities = self.extractor.extract(conv_msg.content)
136
+ conv_msg.entities = [e.to_dict() for e in entities]
137
+
138
+ messages.append(conv_msg)
139
+
140
+ # Create conversation
141
+ conversation = Conversation(
142
+ id=f"conv-{uuid.uuid4().hex[:12]}",
143
+ project_id=project.id,
144
+ instance_name=instance_name,
145
+ session_id=session_id or f"sess-{uuid.uuid4().hex[:8]}",
146
+ messages=messages,
147
+ )
148
+
149
+ # Auto-summarize if needed
150
+ if self.compressor.needs_summarization(messages):
151
+ conversation.summary = await self.compressor.summarize(messages)
152
+ logger.info("Auto-generated summary for conversation %s", conversation.id)
153
+
154
+ # Generate embedding for semantic search
155
+ text_for_embedding = conversation.summary or conversation.get_full_text()[:1000]
156
+ conversation.embedding = await self.embeddings.embed(text_for_embedding)
157
+
158
+ # Save to store
159
+ await self.store.save(conversation)
160
+
161
+ logger.info(
162
+ "Captured conversation %s (%d messages) from project %s",
163
+ conversation.id,
164
+ len(messages),
165
+ project.id,
166
+ )
167
+
168
+ return conversation
169
+
170
+ async def search_conversations(
171
+ self,
172
+ query: str,
173
+ project_id: Optional[str] = None,
174
+ limit: int = 10,
175
+ ) -> List:
176
+ """Search conversations by natural language query.
177
+
178
+ Args:
179
+ query: Natural language search query
180
+ project_id: Optional project filter
181
+ limit: Maximum results
182
+
183
+ Returns:
184
+ List of SearchResult with conversations
185
+
186
+ Example:
187
+ >>> results = await memory.search_conversations(
188
+ ... "how did we fix the authentication bug?",
189
+ ... project_id="proj-xyz",
190
+ ... limit=5
191
+ ... )
192
+ >>> for result in results:
193
+ ... print(f"{result.score:.2f}: {result.snippet}")
194
+ """
195
+ return await self.search.search(query, project_id=project_id, limit=limit)
196
+
197
+ async def load_context_for_session(
198
+ self,
199
+ project_id: str,
200
+ max_tokens: int = 4000,
201
+ limit_conversations: int = 10,
202
+ ) -> str:
203
+ """Load compressed context for session resumption.
204
+
205
+ Retrieves recent conversations from project and compresses them
206
+ into a context string suitable for LLM input.
207
+
208
+ Args:
209
+ project_id: Project ID to load context for
210
+ max_tokens: Maximum tokens for context
211
+ limit_conversations: Maximum conversations to consider
212
+
213
+ Returns:
214
+ Compressed context string
215
+
216
+ Example:
217
+ >>> context = await memory.load_context_for_session("proj-xyz")
218
+ >>> print(f"Loaded context: {len(context)} chars")
219
+ """
220
+ # Get recent conversations from project
221
+ conversations = await self.store.list_by_project(
222
+ project_id, limit=limit_conversations
223
+ )
224
+
225
+ if not conversations:
226
+ logger.info("No conversations found for project %s", project_id)
227
+ return ""
228
+
229
+ # Compress into context
230
+ context = await self.compressor.compress_for_context(
231
+ conversations, max_tokens=max_tokens
232
+ )
233
+
234
+ logger.info(
235
+ "Loaded context for project %s: %d conversations, %d chars",
236
+ project_id,
237
+ len(conversations),
238
+ len(context),
239
+ )
240
+
241
+ return context
242
+
243
+ async def update_conversation(
244
+ self,
245
+ conversation_id: str,
246
+ new_messages: List[ThreadMessage],
247
+ ) -> Optional[Conversation]:
248
+ """Update existing conversation with new messages.
249
+
250
+ Args:
251
+ conversation_id: Conversation to update
252
+ new_messages: New messages to append
253
+
254
+ Returns:
255
+ Updated conversation if found, None otherwise
256
+
257
+ Example:
258
+ >>> updated = await memory.update_conversation(
259
+ ... "conv-abc123",
260
+ ... [new_message1, new_message2]
261
+ ... )
262
+ """
263
+ # Load existing conversation
264
+ conversation = await self.store.load(conversation_id)
265
+ if not conversation:
266
+ logger.warning("Conversation %s not found", conversation_id)
267
+ return None
268
+
269
+ # Convert and append new messages
270
+ for thread_msg in new_messages:
271
+ conv_msg = ConversationMessage.from_thread_message(thread_msg)
272
+
273
+ # Extract entities
274
+ entities = self.extractor.extract(conv_msg.content)
275
+ conv_msg.entities = [e.to_dict() for e in entities]
276
+
277
+ conversation.messages.append(conv_msg)
278
+
279
+ # Update timestamp
280
+ conversation.updated_at = datetime.now(timezone.utc)
281
+
282
+ # Regenerate summary if needed
283
+ updated_summary = await self.compressor.update_summary_if_stale(
284
+ conversation, message_threshold=5
285
+ )
286
+ if updated_summary:
287
+ conversation.summary = updated_summary
288
+
289
+ # Regenerate embedding
290
+ text_for_embedding = conversation.summary or conversation.get_full_text()[:1000]
291
+ conversation.embedding = await self.embeddings.embed(text_for_embedding)
292
+
293
+ # Save
294
+ await self.store.save(conversation)
295
+
296
+ logger.info(
297
+ "Updated conversation %s (now %d messages)",
298
+ conversation_id,
299
+ len(conversation.messages),
300
+ )
301
+
302
+ return conversation
303
+
304
+ async def get_conversation_by_session(
305
+ self, session_id: str
306
+ ) -> Optional[Conversation]:
307
+ """Get conversation by session ID.
308
+
309
+ Args:
310
+ session_id: Session ID from ToolSession
311
+
312
+ Returns:
313
+ Conversation if found, None otherwise
314
+
315
+ Example:
316
+ >>> conv = await memory.get_conversation_by_session("sess-abc123")
317
+ """
318
+ # For now, this requires loading and checking
319
+ # In production, you'd add an index on session_id
320
+ # This is a placeholder - implement proper query in store
321
+ logger.warning(
322
+ "get_conversation_by_session requires optimization - "
323
+ "add session_id index to store"
324
+ )
325
+ return None