claude-mpm 5.4.41__py3-none-any.whl → 5.6.23__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 (460) 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 +161 -298
  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 +216 -0
  13. claude_mpm/cli/commands/configure.py +620 -21
  14. claude_mpm/cli/commands/configure_agent_display.py +3 -1
  15. claude_mpm/cli/commands/hook_errors.py +60 -60
  16. claude_mpm/cli/commands/monitor.py +2 -2
  17. claude_mpm/cli/commands/mpm_init/core.py +15 -8
  18. claude_mpm/cli/commands/profile.py +9 -10
  19. claude_mpm/cli/commands/run.py +35 -3
  20. claude_mpm/cli/commands/skill_source.py +51 -2
  21. claude_mpm/cli/commands/skills.py +182 -32
  22. claude_mpm/cli/executor.py +120 -16
  23. claude_mpm/cli/interactive/__init__.py +10 -0
  24. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  25. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  26. claude_mpm/cli/interactive/skill_selector.py +481 -0
  27. claude_mpm/cli/parsers/base_parser.py +76 -1
  28. claude_mpm/cli/parsers/commander_parser.py +116 -0
  29. claude_mpm/cli/parsers/profile_parser.py +0 -1
  30. claude_mpm/cli/parsers/run_parser.py +10 -0
  31. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  32. claude_mpm/cli/parsers/skills_parser.py +2 -3
  33. claude_mpm/cli/startup.py +527 -506
  34. claude_mpm/cli/startup_display.py +74 -6
  35. claude_mpm/cli/startup_logging.py +2 -2
  36. claude_mpm/cli/utils.py +7 -3
  37. claude_mpm/commander/__init__.py +78 -0
  38. claude_mpm/commander/adapters/__init__.py +60 -0
  39. claude_mpm/commander/adapters/auggie.py +260 -0
  40. claude_mpm/commander/adapters/base.py +288 -0
  41. claude_mpm/commander/adapters/claude_code.py +392 -0
  42. claude_mpm/commander/adapters/codex.py +237 -0
  43. claude_mpm/commander/adapters/communication.py +366 -0
  44. claude_mpm/commander/adapters/example_usage.py +310 -0
  45. claude_mpm/commander/adapters/mpm.py +389 -0
  46. claude_mpm/commander/adapters/registry.py +204 -0
  47. claude_mpm/commander/api/__init__.py +16 -0
  48. claude_mpm/commander/api/app.py +121 -0
  49. claude_mpm/commander/api/errors.py +133 -0
  50. claude_mpm/commander/api/routes/__init__.py +8 -0
  51. claude_mpm/commander/api/routes/events.py +184 -0
  52. claude_mpm/commander/api/routes/inbox.py +171 -0
  53. claude_mpm/commander/api/routes/messages.py +148 -0
  54. claude_mpm/commander/api/routes/projects.py +271 -0
  55. claude_mpm/commander/api/routes/sessions.py +226 -0
  56. claude_mpm/commander/api/routes/work.py +296 -0
  57. claude_mpm/commander/api/schemas.py +186 -0
  58. claude_mpm/commander/chat/__init__.py +7 -0
  59. claude_mpm/commander/chat/cli.py +146 -0
  60. claude_mpm/commander/chat/commands.py +96 -0
  61. claude_mpm/commander/chat/repl.py +310 -0
  62. claude_mpm/commander/config.py +51 -0
  63. claude_mpm/commander/config_loader.py +115 -0
  64. claude_mpm/commander/core/__init__.py +10 -0
  65. claude_mpm/commander/core/block_manager.py +325 -0
  66. claude_mpm/commander/core/response_manager.py +323 -0
  67. claude_mpm/commander/daemon.py +603 -0
  68. claude_mpm/commander/env_loader.py +59 -0
  69. claude_mpm/commander/events/__init__.py +26 -0
  70. claude_mpm/commander/events/manager.py +332 -0
  71. claude_mpm/commander/frameworks/__init__.py +12 -0
  72. claude_mpm/commander/frameworks/base.py +146 -0
  73. claude_mpm/commander/frameworks/claude_code.py +58 -0
  74. claude_mpm/commander/frameworks/mpm.py +62 -0
  75. claude_mpm/commander/inbox/__init__.py +16 -0
  76. claude_mpm/commander/inbox/dedup.py +128 -0
  77. claude_mpm/commander/inbox/inbox.py +224 -0
  78. claude_mpm/commander/inbox/models.py +70 -0
  79. claude_mpm/commander/instance_manager.py +450 -0
  80. claude_mpm/commander/llm/__init__.py +6 -0
  81. claude_mpm/commander/llm/openrouter_client.py +167 -0
  82. claude_mpm/commander/llm/summarizer.py +70 -0
  83. claude_mpm/commander/memory/__init__.py +45 -0
  84. claude_mpm/commander/memory/compression.py +347 -0
  85. claude_mpm/commander/memory/embeddings.py +230 -0
  86. claude_mpm/commander/memory/entities.py +310 -0
  87. claude_mpm/commander/memory/example_usage.py +290 -0
  88. claude_mpm/commander/memory/integration.py +325 -0
  89. claude_mpm/commander/memory/search.py +381 -0
  90. claude_mpm/commander/memory/store.py +657 -0
  91. claude_mpm/commander/models/__init__.py +18 -0
  92. claude_mpm/commander/models/events.py +121 -0
  93. claude_mpm/commander/models/project.py +162 -0
  94. claude_mpm/commander/models/work.py +214 -0
  95. claude_mpm/commander/parsing/__init__.py +20 -0
  96. claude_mpm/commander/parsing/extractor.py +132 -0
  97. claude_mpm/commander/parsing/output_parser.py +270 -0
  98. claude_mpm/commander/parsing/patterns.py +100 -0
  99. claude_mpm/commander/persistence/__init__.py +11 -0
  100. claude_mpm/commander/persistence/event_store.py +274 -0
  101. claude_mpm/commander/persistence/state_store.py +309 -0
  102. claude_mpm/commander/persistence/work_store.py +164 -0
  103. claude_mpm/commander/polling/__init__.py +13 -0
  104. claude_mpm/commander/polling/event_detector.py +104 -0
  105. claude_mpm/commander/polling/output_buffer.py +49 -0
  106. claude_mpm/commander/polling/output_poller.py +153 -0
  107. claude_mpm/commander/project_session.py +268 -0
  108. claude_mpm/commander/proxy/__init__.py +12 -0
  109. claude_mpm/commander/proxy/formatter.py +89 -0
  110. claude_mpm/commander/proxy/output_handler.py +191 -0
  111. claude_mpm/commander/proxy/relay.py +155 -0
  112. claude_mpm/commander/registry.py +410 -0
  113. claude_mpm/commander/runtime/__init__.py +10 -0
  114. claude_mpm/commander/runtime/executor.py +191 -0
  115. claude_mpm/commander/runtime/monitor.py +346 -0
  116. claude_mpm/commander/session/__init__.py +6 -0
  117. claude_mpm/commander/session/context.py +81 -0
  118. claude_mpm/commander/session/manager.py +59 -0
  119. claude_mpm/commander/tmux_orchestrator.py +361 -0
  120. claude_mpm/commander/web/__init__.py +1 -0
  121. claude_mpm/commander/work/__init__.py +30 -0
  122. claude_mpm/commander/work/executor.py +207 -0
  123. claude_mpm/commander/work/queue.py +405 -0
  124. claude_mpm/commander/workflow/__init__.py +27 -0
  125. claude_mpm/commander/workflow/event_handler.py +241 -0
  126. claude_mpm/commander/workflow/notifier.py +146 -0
  127. claude_mpm/commands/mpm-config.md +8 -0
  128. claude_mpm/commands/mpm-doctor.md +8 -0
  129. claude_mpm/commands/mpm-help.md +8 -0
  130. claude_mpm/commands/mpm-init.md +8 -0
  131. claude_mpm/commands/mpm-monitor.md +8 -0
  132. claude_mpm/commands/mpm-organize.md +8 -0
  133. claude_mpm/commands/mpm-postmortem.md +8 -0
  134. claude_mpm/commands/mpm-session-resume.md +9 -1
  135. claude_mpm/commands/mpm-status.md +8 -0
  136. claude_mpm/commands/mpm-ticket-view.md +8 -0
  137. claude_mpm/commands/mpm-version.md +8 -0
  138. claude_mpm/commands/mpm.md +8 -0
  139. claude_mpm/config/agent_presets.py +8 -7
  140. claude_mpm/config/skill_sources.py +16 -0
  141. claude_mpm/constants.py +1 -0
  142. claude_mpm/core/claude_runner.py +154 -2
  143. claude_mpm/core/config.py +35 -22
  144. claude_mpm/core/config_constants.py +74 -9
  145. claude_mpm/core/constants.py +56 -12
  146. claude_mpm/core/hook_manager.py +51 -3
  147. claude_mpm/core/interactive_session.py +12 -11
  148. claude_mpm/core/logger.py +26 -9
  149. claude_mpm/core/logging_utils.py +35 -11
  150. claude_mpm/core/network_config.py +148 -0
  151. claude_mpm/core/oneshot_session.py +7 -6
  152. claude_mpm/core/optimized_startup.py +3 -1
  153. claude_mpm/core/output_style_manager.py +63 -18
  154. claude_mpm/core/shared/config_loader.py +3 -1
  155. claude_mpm/core/socketio_pool.py +13 -5
  156. claude_mpm/core/unified_config.py +54 -8
  157. claude_mpm/core/unified_paths.py +95 -90
  158. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  159. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  160. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  161. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  162. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  163. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  164. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  165. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  166. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  167. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  168. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  169. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  170. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{N4qtv3Hx.js → DR8nis88.js} +2 -2
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.CAGBuiOw.js → 0.RgBboRvH.js} +1 -1
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  223. claude_mpm/dashboard/static/svelte-build/index.html +11 -11
  224. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  225. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  226. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  227. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  228. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  229. claude_mpm/experimental/cli_enhancements.py +2 -1
  230. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  231. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  232. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  233. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  234. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  235. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  236. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  237. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  238. claude_mpm/hooks/claude_hooks/event_handlers.py +305 -87
  239. claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
  240. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  241. claude_mpm/hooks/claude_hooks/installer.py +116 -8
  242. claude_mpm/hooks/claude_hooks/memory_integration.py +51 -31
  243. claude_mpm/hooks/claude_hooks/response_tracking.py +42 -59
  244. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  245. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  246. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  247. claude_mpm/hooks/claude_hooks/services/connection_manager.py +39 -24
  248. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  249. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  250. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
  251. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  252. claude_mpm/hooks/session_resume_hook.py +89 -1
  253. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  254. claude_mpm/init.py +215 -2
  255. claude_mpm/scripts/claude-hook-handler.sh +43 -16
  256. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  257. claude_mpm/services/agents/agent_selection_service.py +2 -2
  258. claude_mpm/services/agents/cache_git_manager.py +1 -1
  259. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
  260. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  261. claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
  262. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  263. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  264. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  265. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +36 -8
  266. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +50 -26
  267. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  268. claude_mpm/services/agents/git_source_manager.py +21 -2
  269. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  270. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  271. claude_mpm/services/agents/sources/git_source_sync_service.py +116 -5
  272. claude_mpm/services/agents/startup_sync.py +5 -2
  273. claude_mpm/services/cli/__init__.py +3 -0
  274. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  275. claude_mpm/services/cli/session_resume_helper.py +10 -2
  276. claude_mpm/services/delegation_detector.py +175 -0
  277. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  278. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  279. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  280. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  281. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  282. claude_mpm/services/diagnostics/models.py +14 -1
  283. claude_mpm/services/event_log.py +325 -0
  284. claude_mpm/services/infrastructure/__init__.py +4 -0
  285. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  286. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  287. claude_mpm/services/monitor/daemon_manager.py +15 -4
  288. claude_mpm/services/monitor/management/lifecycle.py +8 -3
  289. claude_mpm/services/monitor/server.py +106 -16
  290. claude_mpm/services/pm_skills_deployer.py +302 -94
  291. claude_mpm/services/profile_manager.py +10 -4
  292. claude_mpm/services/skills/git_skill_source_manager.py +192 -29
  293. claude_mpm/services/skills/selective_skill_deployer.py +211 -46
  294. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  295. claude_mpm/services/skills_deployer.py +192 -70
  296. claude_mpm/services/socketio/handlers/hook.py +14 -7
  297. claude_mpm/services/socketio/server/main.py +12 -4
  298. claude_mpm/skills/__init__.py +2 -1
  299. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  300. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  301. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  302. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  303. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  304. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  305. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  306. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  307. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  308. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  309. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  310. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  311. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  312. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  313. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  314. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  315. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  316. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  317. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  318. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  319. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  320. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  321. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  322. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  323. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  324. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  325. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  326. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  327. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  328. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  329. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  330. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  331. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  332. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  333. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  334. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  335. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  336. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  337. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  338. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  339. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  340. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  341. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  342. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  343. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  344. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  345. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  346. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  347. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  348. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  349. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  350. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  351. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  352. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  353. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  354. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  355. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  356. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  357. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  358. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  359. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  360. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  361. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  362. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  363. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  364. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  365. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  366. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  367. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  368. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  369. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  370. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  371. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  372. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  373. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  374. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  375. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  376. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  377. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  378. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  379. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  380. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  381. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  382. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  383. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  384. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  385. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  386. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  387. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  388. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  389. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  390. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  391. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  392. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  393. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  394. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  395. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  396. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  397. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  398. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  399. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  400. claude_mpm/skills/bundled/security-scanning.md +112 -0
  401. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  402. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  403. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  404. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  405. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  406. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  407. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  408. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  409. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  410. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  411. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  412. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  413. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  414. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  415. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  416. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  417. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  418. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  419. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  420. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  421. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  422. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  423. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  424. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  425. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  426. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  427. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  428. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  429. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  430. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  431. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  432. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  433. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  434. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  435. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  436. claude_mpm/skills/registry.py +295 -90
  437. claude_mpm/skills/skill_manager.py +29 -23
  438. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  439. claude_mpm/utils/agent_dependency_loader.py +103 -4
  440. claude_mpm/utils/robust_installer.py +45 -24
  441. claude_mpm-5.6.23.dist-info/METADATA +393 -0
  442. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +447 -149
  443. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
  444. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
  445. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
  446. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
  447. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +0 -1
  448. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
  449. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
  450. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
  451. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
  452. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
  453. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  454. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  455. claude_mpm-5.4.41.dist-info/METADATA +0 -998
  456. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
  457. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/entry_points.txt +0 -0
  458. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/licenses/LICENSE +0 -0
  459. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  460. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,148 @@
1
+ """Centralized network port configuration for Claude MPM.
2
+
3
+ This module provides the single source of truth for all network port defaults
4
+ and environment variable names used throughout the MPM system.
5
+
6
+ WHY: Previously, port defaults were hardcoded in multiple locations (config.py,
7
+ constants.py, commander/config.py, CLI parsers), leading to inconsistencies and
8
+ difficulty maintaining different defaults per service.
9
+
10
+ USAGE:
11
+ from claude_mpm.core.network_config import NetworkPorts
12
+
13
+ # Get default ports
14
+ monitor_port = NetworkPorts.MONITOR_DEFAULT
15
+ commander_port = NetworkPorts.COMMANDER_DEFAULT
16
+
17
+ # Get from environment with fallback
18
+ port = NetworkPorts.get_monitor_port()
19
+ """
20
+
21
+ import os
22
+ from typing import Optional
23
+
24
+
25
+ class NetworkPorts:
26
+ """Network port configuration with different defaults for each service.
27
+
28
+ Service Default Ports:
29
+ - Monitor: 8765 (user's preferred default)
30
+ - Commander: 8766
31
+ - Dashboard: 8767
32
+ - SocketIO: 8768
33
+
34
+ Port Range: 8765-8785 (21 ports available)
35
+
36
+ Environment Variables:
37
+ - CLAUDE_MPM_MONITOR_PORT: Override monitor port
38
+ - CLAUDE_MPM_COMMANDER_PORT: Override commander port
39
+ - CLAUDE_MPM_DASHBOARD_PORT: Override dashboard port
40
+ - CLAUDE_MPM_SOCKETIO_PORT: Override socketio port
41
+ - CLAUDE_MPM_DEFAULT_HOST: Override default host (default: 127.0.0.1)
42
+ """
43
+
44
+ # Default ports for each service
45
+ MONITOR_DEFAULT = 8765
46
+ COMMANDER_DEFAULT = 8766
47
+ DASHBOARD_DEFAULT = 8767
48
+ SOCKETIO_DEFAULT = 8768
49
+
50
+ # Port range configuration
51
+ PORT_RANGE_START = 8765
52
+ PORT_RANGE_END = 8785
53
+
54
+ # Default host
55
+ DEFAULT_HOST = "127.0.0.1"
56
+
57
+ # Environment variable names
58
+ ENV_MONITOR_PORT = "CLAUDE_MPM_MONITOR_PORT"
59
+ ENV_COMMANDER_PORT = "CLAUDE_MPM_COMMANDER_PORT"
60
+ ENV_DASHBOARD_PORT = "CLAUDE_MPM_DASHBOARD_PORT"
61
+ ENV_SOCKETIO_PORT = "CLAUDE_MPM_SOCKETIO_PORT"
62
+ ENV_DEFAULT_HOST = "CLAUDE_MPM_DEFAULT_HOST"
63
+
64
+ @classmethod
65
+ def get_monitor_port(cls, default: Optional[int] = None) -> int:
66
+ """Get monitor port from environment or default.
67
+
68
+ Args:
69
+ default: Optional override default (if not provided, uses MONITOR_DEFAULT)
70
+
71
+ Returns:
72
+ Port number from environment or default
73
+ """
74
+ if default is None:
75
+ default = cls.MONITOR_DEFAULT
76
+ return int(os.getenv(cls.ENV_MONITOR_PORT, default))
77
+
78
+ @classmethod
79
+ def get_commander_port(cls, default: Optional[int] = None) -> int:
80
+ """Get commander port from environment or default.
81
+
82
+ Args:
83
+ default: Optional override default (if not provided, uses COMMANDER_DEFAULT)
84
+
85
+ Returns:
86
+ Port number from environment or default
87
+ """
88
+ if default is None:
89
+ default = cls.COMMANDER_DEFAULT
90
+ return int(os.getenv(cls.ENV_COMMANDER_PORT, default))
91
+
92
+ @classmethod
93
+ def get_dashboard_port(cls, default: Optional[int] = None) -> int:
94
+ """Get dashboard port from environment or default.
95
+
96
+ Args:
97
+ default: Optional override default (if not provided, uses DASHBOARD_DEFAULT)
98
+
99
+ Returns:
100
+ Port number from environment or default
101
+ """
102
+ if default is None:
103
+ default = cls.DASHBOARD_DEFAULT
104
+ return int(os.getenv(cls.ENV_DASHBOARD_PORT, default))
105
+
106
+ @classmethod
107
+ def get_socketio_port(cls, default: Optional[int] = None) -> int:
108
+ """Get socketio port from environment or default.
109
+
110
+ Args:
111
+ default: Optional override default (if not provided, uses SOCKETIO_DEFAULT)
112
+
113
+ Returns:
114
+ Port number from environment or default
115
+ """
116
+ if default is None:
117
+ default = cls.SOCKETIO_DEFAULT
118
+ return int(os.getenv(cls.ENV_SOCKETIO_PORT, default))
119
+
120
+ @classmethod
121
+ def get_default_host(cls) -> str:
122
+ """Get default host from environment or default.
123
+
124
+ Returns:
125
+ Host address from environment or DEFAULT_HOST
126
+ """
127
+ return os.getenv(cls.ENV_DEFAULT_HOST, cls.DEFAULT_HOST)
128
+
129
+ @classmethod
130
+ def get_port_range(cls) -> range:
131
+ """Get the valid port range.
132
+
133
+ Returns:
134
+ Range object from PORT_RANGE_START to PORT_RANGE_END (inclusive)
135
+ """
136
+ return range(cls.PORT_RANGE_START, cls.PORT_RANGE_END + 1)
137
+
138
+ @classmethod
139
+ def is_port_in_range(cls, port: int) -> bool:
140
+ """Check if port is within valid range.
141
+
142
+ Args:
143
+ port: Port number to check
144
+
145
+ Returns:
146
+ True if port is in valid range, False otherwise
147
+ """
148
+ return cls.PORT_RANGE_START <= port <= cls.PORT_RANGE_END
@@ -11,7 +11,7 @@ defines the interface it needs.
11
11
 
12
12
  import contextlib
13
13
  import os
14
- import subprocess
14
+ import subprocess # nosec B404
15
15
  import tempfile
16
16
  import time
17
17
  import uuid
@@ -86,11 +86,12 @@ class OneshotSession:
86
86
  Returns:
87
87
  True if successful, False otherwise
88
88
  """
89
- # Deploy system agents
90
- if not self.runner.setup_agents():
91
- print("Continuing without native agents...")
89
+ # NOTE: System agents are deployed via reconciliation during startup.
90
+ # The reconciliation process respects user configuration and handles
91
+ # both native and custom mode deployment. No need to call setup_agents() here.
92
92
 
93
- # Deploy project-specific agents
93
+ # Deploy project-specific agents from .claude-mpm/agents/
94
+ # This is separate from system agents and handles user-defined agents
94
95
  self.runner.deploy_project_agents_to_claude()
95
96
 
96
97
  return True
@@ -225,7 +226,7 @@ class OneshotSession:
225
226
  if len(cmd) > 5:
226
227
  self.logger.debug(f"Command has {len(cmd)} arguments total")
227
228
 
228
- result = subprocess.run(
229
+ result = subprocess.run( # nosec B603
229
230
  cmd, capture_output=True, text=True, env=env, check=False
230
231
  )
231
232
 
@@ -250,7 +250,9 @@ class OptimizedStartup:
250
250
  import os
251
251
 
252
252
  # Check environment variable override
253
- env_disable = os.environ.get("CLAUDE_MPM_DISABLE_AUTO_DEPLOY_PM_SKILLS", "").lower()
253
+ env_disable = os.environ.get(
254
+ "CLAUDE_MPM_DISABLE_AUTO_DEPLOY_PM_SKILLS", ""
255
+ ).lower()
254
256
  if env_disable in ("1", "true", "yes"):
255
257
  return False
256
258
 
@@ -13,7 +13,7 @@ Users can change it if they want, and the system will respect their choice.
13
13
 
14
14
  import json
15
15
  import re
16
- import subprocess
16
+ import subprocess # nosec B404
17
17
  from pathlib import Path
18
18
  from typing import Any, Dict, Literal, Optional, TypedDict, cast
19
19
 
@@ -27,7 +27,9 @@ _CACHED_CLAUDE_VERSION: Optional[str] = None
27
27
  _VERSION_DETECTED: bool = False
28
28
 
29
29
  # Output style types
30
- OutputStyleType = Literal["professional", "teaching"]
30
+ OutputStyleType = Literal[
31
+ "professional", "teaching", "research", "founders"
32
+ ] # "founders" is deprecated, use "research"
31
33
 
32
34
 
33
35
  class StyleConfig(TypedDict):
@@ -41,9 +43,10 @@ class StyleConfig(TypedDict):
41
43
  class OutputStyleManager:
42
44
  """Manages output style deployment and version-based handling.
43
45
 
44
- Supports two output styles:
46
+ Supports three output styles:
45
47
  - professional: Default Claude MPM style (claude-mpm.md)
46
- - teaching: Adaptive teaching mode (claude-mpm-teach.md)
48
+ - teaching: Adaptive teaching mode (claude-mpm-teacher.md)
49
+ - research: Codebase research mode for founders, PMs, and developers (claude-mpm-research.md)
47
50
  """
48
51
 
49
52
  def __init__(self) -> None:
@@ -51,8 +54,8 @@ class OutputStyleManager:
51
54
  self.logger = get_logger("output_style_manager") # type: ignore[misc]
52
55
  self.claude_version = self._detect_claude_version()
53
56
 
54
- # Deploy to ~/.claude/styles/ directory (NOT output-styles/)
55
- self.output_style_dir = Path.home() / ".claude" / "styles"
57
+ # Deploy to ~/.claude/output-styles/ directory (official Claude Code location)
58
+ self.output_style_dir = Path.home() / ".claude" / "output-styles"
56
59
  self.settings_file = Path.home() / ".claude" / "settings.json"
57
60
 
58
61
  # Style definitions
@@ -62,14 +65,29 @@ class OutputStyleManager:
62
65
  / "agents"
63
66
  / "CLAUDE_MPM_OUTPUT_STYLE.md",
64
67
  target=self.output_style_dir / "claude-mpm.md",
65
- name="claude-mpm",
68
+ name="Claude MPM",
66
69
  ),
67
70
  "teaching": StyleConfig(
68
71
  source=Path(__file__).parent.parent
69
72
  / "agents"
70
73
  / "CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md",
71
- target=self.output_style_dir / "claude-mpm-teach.md",
72
- name="claude-mpm-teach",
74
+ target=self.output_style_dir / "claude-mpm-teacher.md",
75
+ name="Claude MPM Teacher",
76
+ ),
77
+ "research": StyleConfig(
78
+ source=Path(__file__).parent.parent
79
+ / "agents"
80
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
81
+ target=self.output_style_dir / "claude-mpm-research.md",
82
+ name="Claude MPM Research",
83
+ ),
84
+ # Backward compatibility alias (deprecated)
85
+ "founders": StyleConfig(
86
+ source=Path(__file__).parent.parent
87
+ / "agents"
88
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
89
+ target=self.output_style_dir / "claude-mpm-research.md",
90
+ name="Claude MPM Research",
73
91
  ),
74
92
  }
75
93
 
@@ -93,7 +111,7 @@ class OutputStyleManager:
93
111
 
94
112
  try:
95
113
  # Run claude --version command
96
- result = subprocess.run(
114
+ result = subprocess.run( # nosec B603 B607
97
115
  ["claude", "--version"],
98
116
  capture_output=True,
99
117
  text=True,
@@ -279,6 +297,9 @@ class OutputStyleManager:
279
297
  target_path = style_config["target"]
280
298
  style_name = style_config["name"]
281
299
 
300
+ # Check if this is a fresh install (file doesn't exist yet)
301
+ is_fresh_install = not target_path.exists()
302
+
282
303
  # If content not provided, read from source
283
304
  if content is None:
284
305
  content = self.extract_output_style_content(style=style)
@@ -292,7 +313,9 @@ class OutputStyleManager:
292
313
 
293
314
  # Activate the style if requested
294
315
  if activate:
295
- self._activate_output_style(style_name)
316
+ self._activate_output_style(
317
+ style_name, is_fresh_install=is_fresh_install
318
+ )
296
319
 
297
320
  return True
298
321
 
@@ -300,12 +323,21 @@ class OutputStyleManager:
300
323
  self.logger.error(f"Failed to deploy {style} style: {e}")
301
324
  return False
302
325
 
303
- def _activate_output_style(self, style_name: str = "claude-mpm") -> bool:
326
+ def _activate_output_style(
327
+ self, style_name: str = "Claude MPM", is_fresh_install: bool = False
328
+ ) -> bool:
304
329
  """
305
330
  Update Claude Code settings to activate a specific output style.
306
331
 
332
+ Only activates the style if:
333
+ 1. No active style is currently set (first deployment), OR
334
+ 2. This is a fresh install (style file didn't exist before deployment)
335
+
336
+ This preserves user preferences if they've manually changed their active style.
337
+
307
338
  Args:
308
- style_name: Name of the style to activate (e.g., "claude-mpm", "claude-mpm-teach")
339
+ style_name: Name of the style to activate (e.g., "Claude MPM", "Claude MPM Teacher")
340
+ is_fresh_install: Whether this is a fresh install (style file didn't exist before)
309
341
 
310
342
  Returns:
311
343
  True if activated successfully, False otherwise
@@ -324,8 +356,12 @@ class OutputStyleManager:
324
356
  # Check current active style
325
357
  current_style = settings.get("activeOutputStyle")
326
358
 
327
- # Update active output style if different
328
- if current_style != style_name:
359
+ # Only set activeOutputStyle if:
360
+ # 1. No active style is set (first deployment), OR
361
+ # 2. This is a fresh install (file didn't exist before deployment)
362
+ should_activate = current_style is None or is_fresh_install
363
+
364
+ if should_activate and current_style != style_name:
329
365
  settings["activeOutputStyle"] = style_name
330
366
 
331
367
  # Ensure settings directory exists
@@ -340,7 +376,10 @@ class OutputStyleManager:
340
376
  f"✅ Activated {style_name} output style (was: {current_style or 'none'})"
341
377
  )
342
378
  else:
343
- self.logger.debug(f"{style_name} output style already active")
379
+ self.logger.debug(
380
+ f"Preserving user preference: {current_style or 'none'} "
381
+ f"(skipping activation of {style_name})"
382
+ )
344
383
 
345
384
  return True
346
385
 
@@ -434,6 +473,10 @@ class OutputStyleManager:
434
473
  """
435
474
  results: Dict[str, bool] = {}
436
475
 
476
+ # Check if professional style exists BEFORE deployment
477
+ # This determines if this is a fresh install
478
+ professional_style_existed = self.styles["professional"]["target"].exists()
479
+
437
480
  for style_type_key in self.styles:
438
481
  # Deploy without activation
439
482
  # Cast is safe because we know self.styles keys are OutputStyleType
@@ -441,9 +484,11 @@ class OutputStyleManager:
441
484
  success = self.deploy_output_style(style=style_type, activate=False)
442
485
  results[style_type] = success
443
486
 
444
- # Activate the default style if requested
487
+ # Activate the default style if requested AND this is first deployment
445
488
  if activate_default and results.get("professional", False):
446
- self._activate_output_style("claude-mpm")
489
+ self._activate_output_style(
490
+ "Claude MPM", is_fresh_install=not professional_style_existed
491
+ )
447
492
 
448
493
  return results
449
494
 
@@ -51,7 +51,9 @@ class ConfigLoader:
51
51
  search_paths=[".", ".claude-mpm", "agents"],
52
52
  env_prefix="CLAUDE_MPM_AGENT_",
53
53
  defaults={"timeout": 30, "max_retries": 3, "log_level": "INFO"},
54
- required_keys=["name"], # model is optional - defaults to sonnet if not specified
54
+ required_keys=[
55
+ "name"
56
+ ], # model is optional - defaults to sonnet if not specified
55
57
  )
56
58
 
57
59
  MEMORY_CONFIG = ConfigPattern(
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env python3
2
1
  """Socket.IO connection pool for efficient client connection management.
3
2
 
4
3
  This module provides a connection pool to reuse Socket.IO client connections,
@@ -31,12 +30,21 @@ except ImportError:
31
30
  # Import constants for configuration
32
31
  try:
33
32
  from claude_mpm.core.constants import NetworkConfig
33
+ from claude_mpm.core.network_config import NetworkPorts
34
34
  except ImportError:
35
35
  # Fallback if constants module not available
36
+ class NetworkPorts:
37
+ MONITOR_DEFAULT = 8765
38
+ COMMANDER_DEFAULT = 8766
39
+ DASHBOARD_DEFAULT = 8767
40
+ SOCKETIO_DEFAULT = 8768
41
+ PORT_RANGE_START = 8765
42
+ PORT_RANGE_END = 8785
43
+
36
44
  class NetworkConfig:
37
- DEFAULT_DASHBOARD_PORT = 8765
45
+ DEFAULT_DASHBOARD_PORT = 8767
38
46
  SOCKETIO_PORT_RANGE = (8765, 8785)
39
- DEFAULT_SOCKETIO_PORT = 8765
47
+ DEFAULT_SOCKETIO_PORT = 8768
40
48
 
41
49
  socketio = None
42
50
 
@@ -309,7 +317,7 @@ class SocketIOConnectionPool:
309
317
  self.server_url = f"http://localhost:{port}"
310
318
  self.logger.debug(f"Detected Socket.IO server on port {port}")
311
319
  return
312
- except Exception:
320
+ except Exception: # nosec B112 - intentional: skip ports that fail
313
321
  continue
314
322
 
315
323
  # Fall back to default
@@ -579,7 +587,7 @@ class SocketIOConnectionPool:
579
587
  loop.stop()
580
588
  loop.run_until_complete(loop.shutdown_asyncgens())
581
589
  loop.close()
582
- except Exception:
590
+ except Exception: # nosec B110 - intentional: cleanup best-effort
583
591
  pass
584
592
 
585
593
  async def _connect_client(self, client: socketio.AsyncClient):
@@ -16,7 +16,7 @@ Design Principles:
16
16
  from pathlib import Path
17
17
  from typing import Any, Dict, List, Optional, Union
18
18
 
19
- from pydantic import BaseModel, Field, validator
19
+ from pydantic import BaseModel, Field, field_validator
20
20
  from pydantic_settings import BaseSettings
21
21
 
22
22
  from .exceptions import ConfigurationError
@@ -54,8 +54,9 @@ class LoggingConfig(BaseModel):
54
54
  default=True, description="Enable console logging"
55
55
  )
56
56
 
57
- @validator("level")
58
- def validate_log_level(self, v):
57
+ @field_validator("level")
58
+ @classmethod
59
+ def validate_log_level(cls, v):
59
60
  valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
60
61
  if v.upper() not in valid_levels:
61
62
  raise ValueError(f"Invalid log level. Must be one of: {valid_levels}")
@@ -65,8 +66,36 @@ class LoggingConfig(BaseModel):
65
66
  class AgentConfig(BaseModel):
66
67
  """Agent system configuration."""
67
68
 
69
+ # Explicit deployment lists (simplified model)
70
+ enabled: List[str] = Field(
71
+ default_factory=list,
72
+ description="Explicit list of agent IDs to deploy (empty = use auto_discover)",
73
+ )
74
+
75
+ # Required agents that are always deployed
76
+ # Standard 7 core agents for essential PM workflow functionality
77
+ # These are auto-deployed when no agents are specified in configuration
78
+ required: List[str] = Field(
79
+ default_factory=lambda: [
80
+ "engineer", # General-purpose implementation
81
+ "research", # Codebase exploration and analysis
82
+ "qa", # Testing and quality assurance
83
+ "web-qa", # Browser-based testing specialist
84
+ "documentation", # Documentation generation
85
+ "ops", # Basic deployment operations
86
+ "ticketing", # Ticket tracking (essential for PM workflow)
87
+ ],
88
+ description="Agents that are always deployed (standard 7 core agents)",
89
+ )
90
+
91
+ include_universal: bool = Field(
92
+ default=True,
93
+ description="Auto-include all agents with 'universal' toolchain/category",
94
+ )
95
+
68
96
  auto_discover: bool = Field(
69
- default=True, description="Enable automatic agent discovery"
97
+ default=False,
98
+ description="Enable automatic agent discovery (deprecated, use enabled list)",
70
99
  )
71
100
  precedence: List[str] = Field(
72
101
  default=["project", "user", "system"], description="Agent precedence order"
@@ -239,6 +268,21 @@ class DocumentationConfig(BaseModel):
239
268
  )
240
269
 
241
270
 
271
+ class SkillConfig(BaseModel):
272
+ """Skill system configuration."""
273
+
274
+ # Explicit deployment lists (simplified model)
275
+ enabled: List[str] = Field(
276
+ default_factory=list,
277
+ description="Explicit list of skill IDs to deploy (includes agent dependencies)",
278
+ )
279
+
280
+ auto_detect_dependencies: bool = Field(
281
+ default=True,
282
+ description="Automatically include skills required by enabled agents",
283
+ )
284
+
285
+
242
286
  class UnifiedConfig(BaseSettings):
243
287
  """
244
288
  Unified configuration model for Claude MPM.
@@ -258,6 +302,7 @@ class UnifiedConfig(BaseSettings):
258
302
  network: NetworkConfig = Field(default_factory=NetworkConfig)
259
303
  logging: LoggingConfig = Field(default_factory=LoggingConfig)
260
304
  agents: AgentConfig = Field(default_factory=AgentConfig)
305
+ skills: SkillConfig = Field(default_factory=SkillConfig)
261
306
  memory: MemoryConfig = Field(default_factory=MemoryConfig)
262
307
  security: SecurityConfig = Field(default_factory=SecurityConfig)
263
308
  performance: PerformanceConfig = Field(default_factory=PerformanceConfig)
@@ -287,8 +332,9 @@ class UnifiedConfig(BaseSettings):
287
332
  validate_assignment = True
288
333
  extra = "allow" # Allow extra fields for backward compatibility
289
334
 
290
- @validator("environment")
291
- def validate_environment(self, v):
335
+ @field_validator("environment")
336
+ @classmethod
337
+ def validate_environment(cls, v):
292
338
  valid_envs = ["development", "testing", "production"]
293
339
  if v not in valid_envs:
294
340
  raise ValueError(f"Invalid environment. Must be one of: {valid_envs}")
@@ -554,12 +600,12 @@ class ConfigurationService:
554
600
  import yaml
555
601
 
556
602
  with file_path.open("w") as f:
557
- yaml.dump(self._config.dict(), f, default_flow_style=False)
603
+ yaml.dump(self._config.model_dump(), f, default_flow_style=False)
558
604
  elif format.lower() == "json":
559
605
  import json
560
606
 
561
607
  with file_path.open("w") as f:
562
- json.dump(self._config.dict(), f, indent=2)
608
+ json.dump(self._config.model_dump(), f, indent=2)
563
609
  else:
564
610
  raise ConfigurationError(f"Unsupported export format: {format}")
565
611