claude-mpm 5.4.55__py3-none-any.whl → 5.6.1__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (401) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  3. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +111 -686
  6. claude_mpm/agents/WORKFLOW.md +2 -0
  7. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  8. claude_mpm/cli/__init__.py +5 -1
  9. claude_mpm/cli/commands/agents.py +2 -4
  10. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  11. claude_mpm/cli/commands/autotodos.py +566 -0
  12. claude_mpm/cli/commands/commander.py +46 -0
  13. claude_mpm/cli/commands/configure.py +620 -21
  14. claude_mpm/cli/commands/hook_errors.py +60 -60
  15. claude_mpm/cli/commands/monitor.py +2 -2
  16. claude_mpm/cli/commands/mpm_init/core.py +2 -2
  17. claude_mpm/cli/commands/run.py +35 -3
  18. claude_mpm/cli/commands/skills.py +166 -14
  19. claude_mpm/cli/executor.py +120 -16
  20. claude_mpm/cli/interactive/__init__.py +10 -0
  21. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  22. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  23. claude_mpm/cli/interactive/skill_selector.py +481 -0
  24. claude_mpm/cli/parsers/base_parser.py +76 -1
  25. claude_mpm/cli/parsers/commander_parser.py +83 -0
  26. claude_mpm/cli/parsers/run_parser.py +10 -0
  27. claude_mpm/cli/startup.py +276 -403
  28. claude_mpm/cli/startup_display.py +72 -5
  29. claude_mpm/cli/startup_logging.py +2 -2
  30. claude_mpm/cli/utils.py +7 -3
  31. claude_mpm/commander/__init__.py +72 -0
  32. claude_mpm/commander/adapters/__init__.py +31 -0
  33. claude_mpm/commander/adapters/base.py +191 -0
  34. claude_mpm/commander/adapters/claude_code.py +361 -0
  35. claude_mpm/commander/adapters/communication.py +366 -0
  36. claude_mpm/commander/api/__init__.py +16 -0
  37. claude_mpm/commander/api/app.py +105 -0
  38. claude_mpm/commander/api/errors.py +112 -0
  39. claude_mpm/commander/api/routes/__init__.py +8 -0
  40. claude_mpm/commander/api/routes/events.py +184 -0
  41. claude_mpm/commander/api/routes/inbox.py +171 -0
  42. claude_mpm/commander/api/routes/messages.py +148 -0
  43. claude_mpm/commander/api/routes/projects.py +271 -0
  44. claude_mpm/commander/api/routes/sessions.py +215 -0
  45. claude_mpm/commander/api/routes/work.py +260 -0
  46. claude_mpm/commander/api/schemas.py +182 -0
  47. claude_mpm/commander/chat/__init__.py +7 -0
  48. claude_mpm/commander/chat/cli.py +107 -0
  49. claude_mpm/commander/chat/commands.py +96 -0
  50. claude_mpm/commander/chat/repl.py +310 -0
  51. claude_mpm/commander/config.py +49 -0
  52. claude_mpm/commander/config_loader.py +115 -0
  53. claude_mpm/commander/daemon.py +398 -0
  54. claude_mpm/commander/events/__init__.py +26 -0
  55. claude_mpm/commander/events/manager.py +332 -0
  56. claude_mpm/commander/frameworks/__init__.py +12 -0
  57. claude_mpm/commander/frameworks/base.py +143 -0
  58. claude_mpm/commander/frameworks/claude_code.py +58 -0
  59. claude_mpm/commander/frameworks/mpm.py +62 -0
  60. claude_mpm/commander/inbox/__init__.py +16 -0
  61. claude_mpm/commander/inbox/dedup.py +128 -0
  62. claude_mpm/commander/inbox/inbox.py +224 -0
  63. claude_mpm/commander/inbox/models.py +70 -0
  64. claude_mpm/commander/instance_manager.py +337 -0
  65. claude_mpm/commander/llm/__init__.py +6 -0
  66. claude_mpm/commander/llm/openrouter_client.py +167 -0
  67. claude_mpm/commander/llm/summarizer.py +70 -0
  68. claude_mpm/commander/models/__init__.py +18 -0
  69. claude_mpm/commander/models/events.py +121 -0
  70. claude_mpm/commander/models/project.py +162 -0
  71. claude_mpm/commander/models/work.py +214 -0
  72. claude_mpm/commander/parsing/__init__.py +20 -0
  73. claude_mpm/commander/parsing/extractor.py +132 -0
  74. claude_mpm/commander/parsing/output_parser.py +270 -0
  75. claude_mpm/commander/parsing/patterns.py +100 -0
  76. claude_mpm/commander/persistence/__init__.py +11 -0
  77. claude_mpm/commander/persistence/event_store.py +274 -0
  78. claude_mpm/commander/persistence/state_store.py +309 -0
  79. claude_mpm/commander/persistence/work_store.py +164 -0
  80. claude_mpm/commander/polling/__init__.py +13 -0
  81. claude_mpm/commander/polling/event_detector.py +104 -0
  82. claude_mpm/commander/polling/output_buffer.py +49 -0
  83. claude_mpm/commander/polling/output_poller.py +153 -0
  84. claude_mpm/commander/project_session.py +268 -0
  85. claude_mpm/commander/proxy/__init__.py +12 -0
  86. claude_mpm/commander/proxy/formatter.py +89 -0
  87. claude_mpm/commander/proxy/output_handler.py +191 -0
  88. claude_mpm/commander/proxy/relay.py +155 -0
  89. claude_mpm/commander/registry.py +404 -0
  90. claude_mpm/commander/runtime/__init__.py +10 -0
  91. claude_mpm/commander/runtime/executor.py +191 -0
  92. claude_mpm/commander/runtime/monitor.py +316 -0
  93. claude_mpm/commander/session/__init__.py +6 -0
  94. claude_mpm/commander/session/context.py +81 -0
  95. claude_mpm/commander/session/manager.py +59 -0
  96. claude_mpm/commander/tmux_orchestrator.py +361 -0
  97. claude_mpm/commander/web/__init__.py +1 -0
  98. claude_mpm/commander/work/__init__.py +30 -0
  99. claude_mpm/commander/work/executor.py +189 -0
  100. claude_mpm/commander/work/queue.py +405 -0
  101. claude_mpm/commander/workflow/__init__.py +27 -0
  102. claude_mpm/commander/workflow/event_handler.py +219 -0
  103. claude_mpm/commander/workflow/notifier.py +146 -0
  104. claude_mpm/commands/mpm-config.md +8 -0
  105. claude_mpm/commands/mpm-doctor.md +8 -0
  106. claude_mpm/commands/mpm-help.md +8 -0
  107. claude_mpm/commands/mpm-init.md +8 -0
  108. claude_mpm/commands/mpm-monitor.md +8 -0
  109. claude_mpm/commands/mpm-organize.md +8 -0
  110. claude_mpm/commands/mpm-postmortem.md +8 -0
  111. claude_mpm/commands/mpm-session-resume.md +9 -1
  112. claude_mpm/commands/mpm-status.md +8 -0
  113. claude_mpm/commands/mpm-ticket-view.md +8 -0
  114. claude_mpm/commands/mpm-version.md +8 -0
  115. claude_mpm/commands/mpm.md +8 -0
  116. claude_mpm/config/agent_presets.py +8 -7
  117. claude_mpm/constants.py +1 -0
  118. claude_mpm/core/claude_runner.py +2 -2
  119. claude_mpm/core/config.py +5 -0
  120. claude_mpm/core/hook_manager.py +51 -3
  121. claude_mpm/core/interactive_session.py +7 -7
  122. claude_mpm/core/logger.py +10 -7
  123. claude_mpm/core/logging_utils.py +4 -2
  124. claude_mpm/core/output_style_manager.py +31 -13
  125. claude_mpm/core/unified_config.py +54 -8
  126. claude_mpm/core/unified_paths.py +30 -13
  127. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  128. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  129. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
  130. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
  131. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
  132. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
  133. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
  134. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
  135. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
  136. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
  137. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
  138. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
  139. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
  140. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
  141. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
  142. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  143. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  144. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
  145. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
  146. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
  147. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
  148. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
  149. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
  150. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
  151. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
  152. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  153. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
  154. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
  155. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
  156. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
  157. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
  158. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
  159. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
  160. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
  161. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
  162. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
  163. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
  164. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
  165. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
  166. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
  167. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
  168. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
  169. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
  170. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  185. claude_mpm/dashboard/static/svelte-build/index.html +9 -9
  186. claude_mpm/experimental/cli_enhancements.py +2 -1
  187. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  188. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  189. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +486 -0
  190. claude_mpm/hooks/claude_hooks/event_handlers.py +250 -11
  191. claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
  192. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  193. claude_mpm/hooks/claude_hooks/installer.py +69 -5
  194. claude_mpm/hooks/claude_hooks/response_tracking.py +3 -1
  195. claude_mpm/hooks/claude_hooks/services/connection_manager.py +20 -0
  196. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +14 -77
  197. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +30 -6
  198. claude_mpm/hooks/session_resume_hook.py +85 -1
  199. claude_mpm/init.py +1 -1
  200. claude_mpm/scripts/claude-hook-handler.sh +36 -10
  201. claude_mpm/scripts/start_activity_logging.py +0 -0
  202. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  203. claude_mpm/services/agents/cache_git_manager.py +1 -1
  204. claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
  205. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  206. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
  207. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  208. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  209. claude_mpm/services/agents/sources/git_source_sync_service.py +7 -4
  210. claude_mpm/services/agents/startup_sync.py +5 -2
  211. claude_mpm/services/cli/__init__.py +3 -0
  212. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  213. claude_mpm/services/cli/session_resume_helper.py +10 -2
  214. claude_mpm/services/delegation_detector.py +175 -0
  215. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  216. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  217. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  218. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  219. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  220. claude_mpm/services/diagnostics/models.py +14 -1
  221. claude_mpm/services/event_log.py +325 -0
  222. claude_mpm/services/infrastructure/__init__.py +4 -0
  223. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  224. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  225. claude_mpm/services/monitor/daemon_manager.py +15 -4
  226. claude_mpm/services/monitor/management/lifecycle.py +8 -2
  227. claude_mpm/services/monitor/server.py +106 -16
  228. claude_mpm/services/pm_skills_deployer.py +261 -85
  229. claude_mpm/services/skills/git_skill_source_manager.py +75 -10
  230. claude_mpm/services/skills/selective_skill_deployer.py +177 -80
  231. claude_mpm/services/skills/skill_discovery_service.py +57 -3
  232. claude_mpm/services/socketio/handlers/hook.py +14 -7
  233. claude_mpm/services/socketio/server/main.py +12 -4
  234. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  235. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  236. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  237. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  238. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  239. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  240. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  241. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  242. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  243. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  244. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  245. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  246. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  247. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  248. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  249. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  250. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  251. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  252. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  253. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  254. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  255. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  256. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  257. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  258. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  259. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  260. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  261. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  262. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  263. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  264. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  265. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  266. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  267. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  268. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  269. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  270. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  271. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  272. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  273. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  274. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  275. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  276. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  277. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  278. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  279. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  280. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  281. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  282. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  283. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  284. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  285. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  286. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  287. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  288. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  289. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  290. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  291. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  292. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  293. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  294. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  295. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  296. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  297. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  298. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  299. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  300. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  301. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  302. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  303. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  304. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  305. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  306. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  307. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  308. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  309. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  310. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  311. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  312. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  313. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  314. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  315. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  316. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  317. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  318. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  319. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  320. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  321. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  322. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  323. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  324. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  325. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  326. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  327. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  328. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  329. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  330. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  331. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  332. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  333. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  334. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  335. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  336. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  337. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  338. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  339. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  340. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  341. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  342. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  343. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  344. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  345. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  346. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  347. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  348. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  349. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  350. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  351. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  352. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  353. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  354. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  358. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  359. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  363. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  364. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  367. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  369. claude_mpm/skills/skill_manager.py +4 -4
  370. claude_mpm/utils/agent_dependency_loader.py +103 -4
  371. claude_mpm/utils/robust_installer.py +45 -24
  372. claude_mpm-5.6.1.dist-info/METADATA +391 -0
  373. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/RECORD +377 -166
  374. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
  375. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
  376. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
  377. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
  378. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
  379. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
  380. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
  381. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
  382. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
  383. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  384. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  385. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  386. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  387. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  388. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  389. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  390. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  391. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  392. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  393. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  394. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  395. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  396. claude_mpm-5.4.55.dist-info/METADATA +0 -999
  397. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/WHEEL +0 -0
  398. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/entry_points.txt +0 -0
  399. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/licenses/LICENSE +0 -0
  400. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  401. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,260 @@
1
+ """Work queue management endpoints for MPM Commander API.
2
+
3
+ This module implements REST endpoints for managing work items
4
+ in project work queues.
5
+ """
6
+
7
+ from typing import List, Optional
8
+
9
+ from fastapi import APIRouter, HTTPException, Query
10
+
11
+ from ...models.work import WorkPriority, WorkState
12
+ from ...work import WorkQueue
13
+ from ..errors import ProjectNotFoundError
14
+ from ..schemas import CreateWorkRequest, WorkItemResponse
15
+
16
+ router = APIRouter()
17
+
18
+
19
+ def _get_registry():
20
+ """Get registry instance from app global."""
21
+ from ..app import registry
22
+
23
+ if registry is None:
24
+ raise RuntimeError("Registry not initialized")
25
+ return registry
26
+
27
+
28
+ def _work_item_to_response(work_item) -> WorkItemResponse:
29
+ """Convert WorkItem model to WorkItemResponse schema.
30
+
31
+ Args:
32
+ work_item: WorkItem instance
33
+
34
+ Returns:
35
+ WorkItemResponse with all work item data
36
+ """
37
+ return WorkItemResponse(
38
+ id=work_item.id,
39
+ project_id=work_item.project_id,
40
+ content=work_item.content,
41
+ state=work_item.state.value,
42
+ priority=work_item.priority.value,
43
+ created_at=work_item.created_at,
44
+ started_at=work_item.started_at,
45
+ completed_at=work_item.completed_at,
46
+ result=work_item.result,
47
+ error=work_item.error,
48
+ depends_on=work_item.depends_on,
49
+ metadata=work_item.metadata,
50
+ )
51
+
52
+
53
+ @router.post("/projects/{project_id}/work", response_model=WorkItemResponse)
54
+ async def add_work(project_id: str, work: CreateWorkRequest) -> WorkItemResponse:
55
+ """Add work item to project queue.
56
+
57
+ Args:
58
+ project_id: Project identifier
59
+ work: Work item creation request
60
+
61
+ Returns:
62
+ Created work item
63
+
64
+ Raises:
65
+ HTTPException: 404 if project not found
66
+
67
+ Example:
68
+ POST /api/projects/proj-123/work
69
+ Request: {
70
+ "content": "Implement OAuth2 authentication",
71
+ "priority": 3,
72
+ "depends_on": ["work-abc"]
73
+ }
74
+ Response: {
75
+ "id": "work-xyz",
76
+ "project_id": "proj-123",
77
+ "content": "Implement OAuth2 authentication",
78
+ "state": "queued",
79
+ "priority": 3,
80
+ ...
81
+ }
82
+ """
83
+ registry = _get_registry()
84
+
85
+ # Get project
86
+ try:
87
+ project = registry.get(project_id)
88
+ except ProjectNotFoundError as e:
89
+ raise HTTPException(status_code=404, detail=str(e)) from e
90
+
91
+ # Get or create work queue for project
92
+ # Note: In full implementation, this would be managed by ProjectSession
93
+ # For now, we'll need to integrate with project's work queue
94
+ # Access or create work queue
95
+ if not hasattr(project, "_work_queue"):
96
+ project._work_queue = WorkQueue(project_id)
97
+
98
+ queue = project._work_queue
99
+
100
+ # Convert priority int to enum
101
+ priority = WorkPriority(work.priority)
102
+
103
+ # Add work item
104
+ work_item = queue.add(
105
+ content=work.content, priority=priority, depends_on=work.depends_on
106
+ )
107
+
108
+ return _work_item_to_response(work_item)
109
+
110
+
111
+ @router.get("/projects/{project_id}/work", response_model=List[WorkItemResponse])
112
+ async def list_work(
113
+ project_id: str, state: Optional[str] = Query(None, description="Filter by state")
114
+ ) -> List[WorkItemResponse]:
115
+ """List work items for project.
116
+
117
+ Args:
118
+ project_id: Project identifier
119
+ state: Optional state filter (pending, queued, in_progress, etc.)
120
+
121
+ Returns:
122
+ List of work items (may be empty)
123
+
124
+ Raises:
125
+ HTTPException: 404 if project not found, 400 if invalid state
126
+
127
+ Example:
128
+ GET /api/projects/proj-123/work
129
+ Response: [
130
+ {"id": "work-1", "state": "queued", ...},
131
+ {"id": "work-2", "state": "in_progress", ...}
132
+ ]
133
+
134
+ GET /api/projects/proj-123/work?state=queued
135
+ Response: [
136
+ {"id": "work-1", "state": "queued", ...}
137
+ ]
138
+ """
139
+ registry = _get_registry()
140
+
141
+ # Get project
142
+ try:
143
+ project = registry.get(project_id)
144
+ except ProjectNotFoundError as e:
145
+ raise HTTPException(status_code=404, detail=str(e)) from e
146
+
147
+ # Get work queue
148
+ if not hasattr(project, "_work_queue"):
149
+ project._work_queue = WorkQueue(project_id)
150
+
151
+ queue = project._work_queue
152
+
153
+ # Parse state filter
154
+ state_filter = None
155
+ if state:
156
+ try:
157
+ state_filter = WorkState(state)
158
+ except ValueError as e:
159
+ raise HTTPException(
160
+ status_code=400,
161
+ detail=f"Invalid state: {state}. "
162
+ f"Valid states: {[s.value for s in WorkState]}",
163
+ ) from e
164
+
165
+ # List work items
166
+ items = queue.list(state=state_filter)
167
+
168
+ return [_work_item_to_response(item) for item in items]
169
+
170
+
171
+ @router.get("/projects/{project_id}/work/{work_id}", response_model=WorkItemResponse)
172
+ async def get_work(project_id: str, work_id: str) -> WorkItemResponse:
173
+ """Get work item details.
174
+
175
+ Args:
176
+ project_id: Project identifier
177
+ work_id: Work item identifier
178
+
179
+ Returns:
180
+ Work item details
181
+
182
+ Raises:
183
+ HTTPException: 404 if project or work item not found
184
+
185
+ Example:
186
+ GET /api/projects/proj-123/work/work-xyz
187
+ Response: {
188
+ "id": "work-xyz",
189
+ "project_id": "proj-123",
190
+ "state": "in_progress",
191
+ ...
192
+ }
193
+ """
194
+ registry = _get_registry()
195
+
196
+ # Get project
197
+ try:
198
+ project = registry.get(project_id)
199
+ except ProjectNotFoundError as e:
200
+ raise HTTPException(status_code=404, detail=str(e)) from e
201
+
202
+ # Get work queue
203
+ if not hasattr(project, "_work_queue"):
204
+ raise HTTPException(status_code=404, detail="Work queue not found")
205
+
206
+ queue = project._work_queue
207
+
208
+ # Get work item
209
+ work_item = queue.get(work_id)
210
+ if not work_item:
211
+ raise HTTPException(status_code=404, detail=f"Work item {work_id} not found")
212
+
213
+ return _work_item_to_response(work_item)
214
+
215
+
216
+ @router.post("/projects/{project_id}/work/{work_id}/cancel")
217
+ async def cancel_work(project_id: str, work_id: str) -> dict:
218
+ """Cancel pending work item.
219
+
220
+ Args:
221
+ project_id: Project identifier
222
+ work_id: Work item identifier
223
+
224
+ Returns:
225
+ Success message
226
+
227
+ Raises:
228
+ HTTPException: 404 if project/work not found, 400 if invalid state
229
+
230
+ Example:
231
+ POST /api/projects/proj-123/work/work-xyz/cancel
232
+ Response: {"status": "cancelled", "id": "work-xyz"}
233
+ """
234
+ registry = _get_registry()
235
+
236
+ # Get project
237
+ try:
238
+ project = registry.get(project_id)
239
+ except ProjectNotFoundError as e:
240
+ raise HTTPException(status_code=404, detail=str(e)) from e
241
+
242
+ # Get work queue
243
+ if not hasattr(project, "_work_queue"):
244
+ raise HTTPException(status_code=404, detail="Work queue not found")
245
+
246
+ queue = project._work_queue
247
+
248
+ # Cancel work item
249
+ if not queue.cancel(work_id):
250
+ work_item = queue.get(work_id)
251
+ if not work_item:
252
+ raise HTTPException(
253
+ status_code=404, detail=f"Work item {work_id} not found"
254
+ )
255
+ raise HTTPException(
256
+ status_code=400,
257
+ detail=f"Cannot cancel work item in state {work_item.state.value}",
258
+ )
259
+
260
+ return {"status": "cancelled", "id": work_id}
@@ -0,0 +1,182 @@
1
+ """Pydantic request/response schemas for MPM Commander API.
2
+
3
+ This module defines all request and response models for the REST API,
4
+ providing type safety and automatic validation.
5
+ """
6
+
7
+ from datetime import datetime
8
+ from typing import List, Optional
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+ # Request Models
13
+
14
+
15
+ class RegisterProjectRequest(BaseModel):
16
+ """Request to register a new project.
17
+
18
+ Attributes:
19
+ path: Filesystem path to project directory
20
+ name: Optional display name (derived from path if omitted)
21
+ """
22
+
23
+ path: str = Field(..., description="Filesystem path to project")
24
+ name: Optional[str] = Field(
25
+ None, description="Display name (derived from path if omitted)"
26
+ )
27
+
28
+
29
+ class CreateSessionRequest(BaseModel):
30
+ """Request to create a new tool session.
31
+
32
+ Attributes:
33
+ runtime: Runtime adapter to use (e.g., "claude-code")
34
+ agent_prompt: Optional custom system prompt for the agent
35
+ """
36
+
37
+ runtime: str = Field("claude-code", description="Runtime adapter to use")
38
+ agent_prompt: Optional[str] = Field(None, description="Custom system prompt")
39
+
40
+
41
+ class SendMessageRequest(BaseModel):
42
+ """Request to send a message to a project.
43
+
44
+ Attributes:
45
+ content: Message content
46
+ session_id: Target session ID (uses active session if omitted)
47
+ """
48
+
49
+ content: str = Field(..., description="Message content")
50
+ session_id: Optional[str] = Field(
51
+ None, description="Target session (uses active if omitted)"
52
+ )
53
+
54
+
55
+ # Response Models
56
+
57
+
58
+ class SessionResponse(BaseModel):
59
+ """Session information response.
60
+
61
+ Attributes:
62
+ id: Unique session identifier
63
+ project_id: Parent project ID
64
+ runtime: Runtime adapter name
65
+ tmux_target: Tmux pane target identifier
66
+ status: Current session status
67
+ created_at: Session creation timestamp
68
+ """
69
+
70
+ id: str
71
+ project_id: str
72
+ runtime: str
73
+ tmux_target: str
74
+ status: str
75
+ created_at: datetime
76
+
77
+
78
+ class ProjectResponse(BaseModel):
79
+ """Project information response.
80
+
81
+ Attributes:
82
+ id: Unique project identifier
83
+ path: Absolute filesystem path
84
+ name: Display name
85
+ state: Current project state
86
+ state_reason: Optional state reason (e.g., error message)
87
+ sessions: List of active sessions
88
+ pending_events_count: Number of pending events
89
+ last_activity: Last activity timestamp
90
+ created_at: Project registration timestamp
91
+ """
92
+
93
+ id: str
94
+ path: str
95
+ name: str
96
+ state: str
97
+ state_reason: Optional[str]
98
+ sessions: List[SessionResponse]
99
+ pending_events_count: int
100
+ last_activity: datetime
101
+ created_at: datetime
102
+
103
+
104
+ class MessageResponse(BaseModel):
105
+ """Conversation message response.
106
+
107
+ Attributes:
108
+ id: Unique message identifier
109
+ role: Message sender role (user, assistant, system, tool)
110
+ content: Message content
111
+ session_id: Associated session ID (if from tool)
112
+ timestamp: Message creation timestamp
113
+ """
114
+
115
+ id: str
116
+ role: str
117
+ content: str
118
+ session_id: Optional[str]
119
+ timestamp: datetime
120
+
121
+
122
+ class CreateWorkRequest(BaseModel):
123
+ """Request to create a work item.
124
+
125
+ Attributes:
126
+ content: Task/message to execute
127
+ priority: Priority level (1-4, where 4 is CRITICAL)
128
+ depends_on: Optional list of work item IDs that must complete first
129
+ """
130
+
131
+ content: str = Field(..., description="Task/message to execute")
132
+ priority: int = Field(
133
+ 2,
134
+ description="Priority level (1=LOW, 2=MEDIUM, 3=HIGH, 4=CRITICAL)",
135
+ ge=1,
136
+ le=4,
137
+ )
138
+ depends_on: Optional[List[str]] = Field(
139
+ None, description="Work item IDs that must complete first"
140
+ )
141
+
142
+
143
+ class WorkItemResponse(BaseModel):
144
+ """Work item information response.
145
+
146
+ Attributes:
147
+ id: Unique work item identifier
148
+ project_id: Parent project ID
149
+ content: Task/message content
150
+ state: Current state (pending, queued, in_progress, blocked, completed, failed, cancelled)
151
+ priority: Priority level (1-4)
152
+ created_at: Creation timestamp
153
+ started_at: Execution start timestamp (if started)
154
+ completed_at: Completion timestamp (if completed/failed)
155
+ result: Result message (if completed)
156
+ error: Error message (if failed)
157
+ depends_on: List of dependency work item IDs
158
+ metadata: Additional structured data
159
+ """
160
+
161
+ id: str
162
+ project_id: str
163
+ content: str
164
+ state: str
165
+ priority: int
166
+ created_at: datetime
167
+ started_at: Optional[datetime]
168
+ completed_at: Optional[datetime]
169
+ result: Optional[str]
170
+ error: Optional[str]
171
+ depends_on: List[str]
172
+ metadata: dict
173
+
174
+
175
+ class ErrorResponse(BaseModel):
176
+ """Error response with structured error information.
177
+
178
+ Attributes:
179
+ error: Error details with code and message
180
+ """
181
+
182
+ error: dict # {code: str, message: str}
@@ -0,0 +1,7 @@
1
+ """Commander chat interface."""
2
+
3
+ from .cli import run_commander
4
+ from .commands import Command, CommandParser, CommandType
5
+ from .repl import CommanderREPL
6
+
7
+ __all__ = ["Command", "CommandParser", "CommandType", "CommanderREPL", "run_commander"]
@@ -0,0 +1,107 @@
1
+ """Commander CLI entry point."""
2
+
3
+ import asyncio
4
+ import logging
5
+ from pathlib import Path
6
+ from typing import Optional
7
+
8
+ from claude_mpm.commander.instance_manager import InstanceManager
9
+ from claude_mpm.commander.llm.openrouter_client import (
10
+ OpenRouterClient,
11
+ OpenRouterConfig,
12
+ )
13
+ from claude_mpm.commander.llm.summarizer import OutputSummarizer
14
+ from claude_mpm.commander.proxy.formatter import OutputFormatter
15
+ from claude_mpm.commander.proxy.output_handler import OutputHandler
16
+ from claude_mpm.commander.proxy.relay import OutputRelay
17
+ from claude_mpm.commander.session.manager import SessionManager
18
+ from claude_mpm.commander.tmux_orchestrator import TmuxOrchestrator
19
+
20
+ from .repl import CommanderREPL
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ async def run_commander(
26
+ port: int = 8765,
27
+ state_dir: Optional[Path] = None,
28
+ ) -> None:
29
+ """Run Commander in interactive mode.
30
+
31
+ Args:
32
+ port: Port for internal services (unused currently).
33
+ state_dir: Directory for state persistence (optional).
34
+
35
+ Example:
36
+ >>> asyncio.run(run_commander())
37
+ # Starts interactive Commander REPL
38
+ """
39
+ # Setup logging
40
+ logging.basicConfig(
41
+ level=logging.INFO,
42
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
43
+ )
44
+
45
+ # Initialize components
46
+ logger.info("Initializing Commander...")
47
+
48
+ # Create tmux orchestrator
49
+ orchestrator = TmuxOrchestrator()
50
+
51
+ # Create instance manager
52
+ instance_manager = InstanceManager(orchestrator)
53
+
54
+ # Create session manager
55
+ session_manager = SessionManager()
56
+
57
+ # Try to initialize LLM client (optional)
58
+ llm_client: Optional[OpenRouterClient] = None
59
+ try:
60
+ config = OpenRouterConfig()
61
+ llm_client = OpenRouterClient(config)
62
+ logger.info("LLM client initialized")
63
+ except ValueError as e:
64
+ logger.warning(f"LLM client not available: {e}")
65
+ logger.warning("Output summarization will be disabled")
66
+
67
+ # Create output relay (optional)
68
+ output_relay: Optional[OutputRelay] = None
69
+ if llm_client:
70
+ try:
71
+ summarizer = OutputSummarizer(llm_client)
72
+ handler = OutputHandler(orchestrator, summarizer)
73
+ formatter = OutputFormatter()
74
+ output_relay = OutputRelay(handler, formatter)
75
+ logger.info("Output relay initialized")
76
+ except Exception as e:
77
+ logger.warning(f"Output relay setup failed: {e}")
78
+
79
+ # Create REPL
80
+ repl = CommanderREPL(
81
+ instance_manager=instance_manager,
82
+ session_manager=session_manager,
83
+ output_relay=output_relay,
84
+ llm_client=llm_client,
85
+ )
86
+
87
+ # Run REPL
88
+ try:
89
+ await repl.run()
90
+ except KeyboardInterrupt:
91
+ logger.info("Commander interrupted by user")
92
+ except Exception as e:
93
+ logger.error(f"Commander error: {e}", exc_info=True)
94
+ finally:
95
+ # Cleanup
96
+ logger.info("Shutting down Commander...")
97
+ if output_relay:
98
+ await output_relay.stop_all()
99
+
100
+
101
+ def main() -> None:
102
+ """Entry point for command-line execution."""
103
+ asyncio.run(run_commander())
104
+
105
+
106
+ if __name__ == "__main__":
107
+ main()
@@ -0,0 +1,96 @@
1
+ """Built-in Commander chat commands."""
2
+
3
+ from dataclasses import dataclass
4
+ from enum import Enum
5
+ from typing import Optional
6
+
7
+
8
+ class CommandType(Enum):
9
+ """Built-in command types."""
10
+
11
+ LIST = "list"
12
+ START = "start"
13
+ STOP = "stop"
14
+ CONNECT = "connect"
15
+ DISCONNECT = "disconnect"
16
+ STATUS = "status"
17
+ HELP = "help"
18
+ EXIT = "exit"
19
+ INSTANCES = "instances" # alias for list
20
+
21
+
22
+ @dataclass
23
+ class Command:
24
+ """Parsed command with args."""
25
+
26
+ type: CommandType
27
+ args: list[str]
28
+ raw: str
29
+
30
+
31
+ class CommandParser:
32
+ """Parses user input into commands."""
33
+
34
+ ALIASES = {
35
+ "ls": CommandType.LIST,
36
+ "instances": CommandType.LIST,
37
+ "quit": CommandType.EXIT,
38
+ "q": CommandType.EXIT,
39
+ }
40
+
41
+ def parse(self, input_text: str) -> Optional[Command]:
42
+ """Parse input into a Command.
43
+
44
+ Returns None if input is not a built-in command (natural language).
45
+
46
+ Args:
47
+ input_text: Raw user input.
48
+
49
+ Returns:
50
+ Command if input is a built-in command, None otherwise.
51
+
52
+ Example:
53
+ >>> parser = CommandParser()
54
+ >>> cmd = parser.parse("list")
55
+ >>> cmd.type
56
+ <CommandType.LIST: 'list'>
57
+ >>> parser.parse("tell me about the code")
58
+ None
59
+ """
60
+ if not input_text:
61
+ return None
62
+
63
+ parts = input_text.split()
64
+ command_str = parts[0].lower()
65
+ args = parts[1:] if len(parts) > 1 else []
66
+
67
+ # Check if it's an alias
68
+ if command_str in self.ALIASES:
69
+ cmd_type = self.ALIASES[command_str]
70
+ return Command(type=cmd_type, args=args, raw=input_text)
71
+
72
+ # Check if it's a direct command
73
+ try:
74
+ cmd_type = CommandType(command_str)
75
+ return Command(type=cmd_type, args=args, raw=input_text)
76
+ except ValueError:
77
+ # Not a built-in command
78
+ return None
79
+
80
+ def is_command(self, input_text: str) -> bool:
81
+ """Check if input is a built-in command.
82
+
83
+ Args:
84
+ input_text: Raw user input.
85
+
86
+ Returns:
87
+ True if input is a built-in command, False otherwise.
88
+
89
+ Example:
90
+ >>> parser = CommandParser()
91
+ >>> parser.is_command("list")
92
+ True
93
+ >>> parser.is_command("tell me about the code")
94
+ False
95
+ """
96
+ return self.parse(input_text) is not None