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,573 @@
1
+ ---
2
+ name: tauri-state-management
3
+ description: Advanced state management in Tauri using Arc, Mutex, RwLock, DashMap for concurrent access patterns and complex state architectures
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Advanced Tauri state patterns: Arc/Mutex, RwLock for read-heavy, DashMap for lock-free maps, multi-state management"
11
+ when_to_use: "When managing complex shared state, high-concurrency scenarios, or multiple independent state containers"
12
+ quick_start: "1. Choose container (Mutex/RwLock/DashMap) 2. Define state struct 3. Register with .manage() 4. Access via State<'_, T>"
13
+ context_limit: 600
14
+ tags:
15
+ - tauri
16
+ - state
17
+ - concurrency
18
+ - arc
19
+ - mutex
20
+ - rwlock
21
+ - dashmap
22
+ requires_tools: []
23
+ ---
24
+
25
+ # Tauri Advanced State Management
26
+
27
+ ## State Container Patterns
28
+
29
+ ### Arc<Mutex<T>> - Basic Exclusive Access
30
+
31
+ Best for: Infrequent writes, occasional reads, simple synchronization
32
+
33
+ ```rust
34
+ use std::sync::Arc;
35
+ use tokio::sync::Mutex;
36
+
37
+ pub struct AppState {
38
+ pub database: Arc<Mutex<Database>>,
39
+ pub config: Arc<Mutex<Config>>,
40
+ }
41
+
42
+ impl AppState {
43
+ pub fn new() -> Self {
44
+ Self {
45
+ database: Arc::new(Mutex::new(Database::new())),
46
+ config: Arc::new(Mutex::new(Config::default())),
47
+ }
48
+ }
49
+ }
50
+
51
+ #[tauri::command]
52
+ async fn update_config(
53
+ key: String,
54
+ value: String,
55
+ state: tauri::State<'_, AppState>,
56
+ ) -> Result<(), String> {
57
+ let mut config = state.config.lock().await;
58
+ config.set(&key, value);
59
+ Ok(())
60
+ }
61
+
62
+ #[tauri::command]
63
+ async fn get_config_value(
64
+ key: String,
65
+ state: tauri::State<'_, AppState>,
66
+ ) -> Result<Option<String>, String> {
67
+ let config = state.config.lock().await;
68
+ Ok(config.get(&key).cloned())
69
+ }
70
+ ```
71
+
72
+ **Key Points**:
73
+ - `Arc` enables shared ownership across async tasks
74
+ - `Mutex` provides exclusive access (one writer OR one reader at a time)
75
+ - Use tokio's `Mutex` (not std) for async contexts
76
+ - Always `.await` on lock acquisition
77
+
78
+ ### Arc<RwLock<T>> - Read-Heavy Workloads
79
+
80
+ Best for: Frequent reads, rare writes, read-dominant patterns
81
+
82
+ ```rust
83
+ use std::sync::Arc;
84
+ use tokio::sync::RwLock;
85
+
86
+ pub struct CacheState {
87
+ pub cache: Arc<RwLock<HashMap<String, CachedData>>>,
88
+ pub stats: Arc<RwLock<CacheStats>>,
89
+ }
90
+
91
+ #[tauri::command]
92
+ async fn get_cached_data(
93
+ key: String,
94
+ state: tauri::State<'_, CacheState>,
95
+ ) -> Result<Option<CachedData>, String> {
96
+ // Read lock - multiple concurrent readers allowed
97
+ let cache = state.cache.read().await;
98
+ Ok(cache.get(&key).cloned())
99
+ }
100
+
101
+ #[tauri::command]
102
+ async fn update_cache(
103
+ key: String,
104
+ data: CachedData,
105
+ state: tauri::State<'_, CacheState>,
106
+ ) -> Result<(), String> {
107
+ // Write lock - exclusive access
108
+ let mut cache = state.cache.write().await;
109
+ cache.insert(key, data);
110
+ Ok(())
111
+ }
112
+
113
+ #[tauri::command]
114
+ async fn get_stats(
115
+ state: tauri::State<'_, CacheState>,
116
+ ) -> Result<CacheStats, String> {
117
+ // Read lock doesn't block other readers
118
+ let stats = state.stats.read().await;
119
+ Ok(stats.clone())
120
+ }
121
+ ```
122
+
123
+ **Key Points**:
124
+ - `read()` allows multiple concurrent readers
125
+ - `write()` requires exclusive access
126
+ - Perfect for caches, configuration, read-heavy data
127
+ - Readers don't block other readers
128
+
129
+ ### Arc<DashMap<K, V>> - Lock-Free Concurrent Map
130
+
131
+ Best for: High-concurrency, frequent map operations, no lock contention
132
+
133
+ ```rust
134
+ use std::sync::Arc;
135
+ use dashmap::DashMap;
136
+
137
+ pub struct SessionState {
138
+ pub sessions: Arc<DashMap<String, Session>>,
139
+ pub active_connections: Arc<DashMap<String, Connection>>,
140
+ }
141
+
142
+ impl SessionState {
143
+ pub fn new() -> Self {
144
+ Self {
145
+ sessions: Arc::new(DashMap::new()),
146
+ active_connections: Arc::new(DashMap::new()),
147
+ }
148
+ }
149
+ }
150
+
151
+ #[tauri::command]
152
+ async fn create_session(
153
+ session_id: String,
154
+ state: tauri::State<'_, SessionState>,
155
+ ) -> Result<(), String> {
156
+ // No explicit locking needed
157
+ state.sessions.insert(
158
+ session_id.clone(),
159
+ Session::new(session_id)
160
+ );
161
+ Ok(())
162
+ }
163
+
164
+ #[tauri::command]
165
+ async fn get_session(
166
+ session_id: String,
167
+ state: tauri::State<'_, SessionState>,
168
+ ) -> Result<Option<Session>, String> {
169
+ // Returns Option without holding lock
170
+ Ok(state.sessions.get(&session_id)
171
+ .map(|entry| entry.value().clone()))
172
+ }
173
+
174
+ #[tauri::command]
175
+ async fn remove_session(
176
+ session_id: String,
177
+ state: tauri::State<'_, SessionState>,
178
+ ) -> Result<(), String> {
179
+ state.sessions.remove(&session_id);
180
+ Ok(())
181
+ }
182
+
183
+ #[tauri::command]
184
+ async fn list_active_sessions(
185
+ state: tauri::State<'_, SessionState>,
186
+ ) -> Result<Vec<String>, String> {
187
+ // Iterate without holding global lock
188
+ Ok(state.sessions.iter()
189
+ .map(|entry| entry.key().clone())
190
+ .collect())
191
+ }
192
+ ```
193
+
194
+ **Key Points**:
195
+ - No explicit `.lock()` needed
196
+ - Lock-free concurrent operations
197
+ - Better performance under high concurrency
198
+ - Use for session management, caches, registries
199
+
200
+ **Add to Cargo.toml**:
201
+ ```toml
202
+ [dependencies]
203
+ dashmap = "6.0"
204
+ ```
205
+
206
+ ## Complex State Architectures
207
+
208
+ ### Multi-State Pattern
209
+
210
+ ```rust
211
+ // Separate concerns into different state containers
212
+ pub struct DatabaseState {
213
+ pub pool: Arc<Mutex<DbPool>>,
214
+ pub migrations: Arc<Mutex<MigrationTracker>>,
215
+ }
216
+
217
+ pub struct UIState {
218
+ pub theme: Arc<RwLock<Theme>>,
219
+ pub preferences: Arc<RwLock<Preferences>>,
220
+ pub window_states: Arc<DashMap<String, WindowState>>,
221
+ }
222
+
223
+ pub struct AuthState {
224
+ pub sessions: Arc<DashMap<String, Session>>,
225
+ pub tokens: Arc<RwLock<TokenManager>>,
226
+ }
227
+
228
+ // Register all states
229
+ fn main() {
230
+ tauri::Builder::default()
231
+ .manage(DatabaseState::new())
232
+ .manage(UIState::new())
233
+ .manage(AuthState::new())
234
+ .invoke_handler(tauri::generate_handler![
235
+ /* commands */
236
+ ])
237
+ .run(tauri::generate_context!())
238
+ .expect("error while running tauri application");
239
+ }
240
+
241
+ // Access multiple states in one command
242
+ #[tauri::command]
243
+ async fn authenticated_query(
244
+ query: String,
245
+ session_id: String,
246
+ db_state: tauri::State<'_, DatabaseState>,
247
+ auth_state: tauri::State<'_, AuthState>,
248
+ ) -> Result<Vec<Row>, String> {
249
+ // Validate session
250
+ let session = auth_state.sessions.get(&session_id)
251
+ .ok_or("Invalid session")?;
252
+
253
+ // Execute query
254
+ let pool = db_state.pool.lock().await;
255
+ pool.query(&query).await
256
+ .map_err(|e| e.to_string())
257
+ }
258
+ ```
259
+
260
+ ### Nested State with Interior Mutability
261
+
262
+ ```rust
263
+ use std::sync::Arc;
264
+ use tokio::sync::RwLock;
265
+
266
+ pub struct User {
267
+ pub id: String,
268
+ pub name: String,
269
+ pub last_active: Arc<RwLock<SystemTime>>,
270
+ }
271
+
272
+ pub struct AppState {
273
+ pub users: Arc<DashMap<String, User>>,
274
+ }
275
+
276
+ #[tauri::command]
277
+ async fn update_user_activity(
278
+ user_id: String,
279
+ state: tauri::State<'_, AppState>,
280
+ ) -> Result<(), String> {
281
+ // Get user from DashMap
282
+ if let Some(user_entry) = state.users.get(&user_id) {
283
+ // Update nested RwLock without locking entire map
284
+ let mut last_active = user_entry.last_active.write().await;
285
+ *last_active = SystemTime::now();
286
+ }
287
+ Ok(())
288
+ }
289
+ ```
290
+
291
+ ## Advanced Patterns
292
+
293
+ ### State with Cleanup
294
+
295
+ ```rust
296
+ pub struct ResourceState {
297
+ pub connections: Arc<DashMap<String, Connection>>,
298
+ }
299
+
300
+ impl ResourceState {
301
+ pub async fn cleanup_expired(&self) {
302
+ let now = SystemTime::now();
303
+ self.connections.retain(|_k, v| {
304
+ !v.is_expired(now)
305
+ });
306
+ }
307
+ }
308
+
309
+ // Background cleanup task
310
+ #[tauri::command]
311
+ async fn start_cleanup_task(
312
+ state: tauri::State<'_, ResourceState>,
313
+ ) -> Result<(), String> {
314
+ let state_clone = state.inner().clone();
315
+
316
+ tokio::spawn(async move {
317
+ loop {
318
+ tokio::time::sleep(Duration::from_secs(60)).await;
319
+ state_clone.cleanup_expired().await;
320
+ }
321
+ });
322
+
323
+ Ok(())
324
+ }
325
+ ```
326
+
327
+ ### State Initialization with Dependencies
328
+
329
+ ```rust
330
+ pub struct AppState {
331
+ pub db: Arc<Mutex<Database>>,
332
+ pub cache: Arc<RwLock<Cache>>,
333
+ }
334
+
335
+ impl AppState {
336
+ pub async fn new(config: &Config) -> Result<Self, String> {
337
+ // Initialize with dependencies
338
+ let db = Database::connect(&config.db_url)
339
+ .await
340
+ .map_err(|e| e.to_string())?;
341
+
342
+ let cache = Cache::with_capacity(config.cache_size);
343
+
344
+ Ok(Self {
345
+ db: Arc::new(Mutex::new(db)),
346
+ cache: Arc::new(RwLock::new(cache)),
347
+ })
348
+ }
349
+ }
350
+
351
+ // In main.rs
352
+ fn main() {
353
+ let config = Config::load().expect("Failed to load config");
354
+
355
+ let runtime = tokio::runtime::Runtime::new()
356
+ .expect("Failed to create runtime");
357
+
358
+ let state = runtime.block_on(async {
359
+ AppState::new(&config).await
360
+ .expect("Failed to initialize state")
361
+ });
362
+
363
+ tauri::Builder::default()
364
+ .manage(state)
365
+ .invoke_handler(tauri::generate_handler![/* commands */])
366
+ .run(tauri::generate_context!())
367
+ .expect("error while running tauri application");
368
+ }
369
+ ```
370
+
371
+ ### Transactional State Updates
372
+
373
+ ```rust
374
+ #[tauri::command]
375
+ async fn transfer_funds(
376
+ from_account: String,
377
+ to_account: String,
378
+ amount: f64,
379
+ state: tauri::State<'_, BankState>,
380
+ ) -> Result<(), String> {
381
+ // Lock both accounts to prevent race conditions
382
+ let mut accounts = state.accounts.write().await;
383
+
384
+ let from_balance = accounts.get_mut(&from_account)
385
+ .ok_or("Source account not found")?;
386
+
387
+ if *from_balance < amount {
388
+ return Err("Insufficient funds".to_string());
389
+ }
390
+
391
+ *from_balance -= amount;
392
+
393
+ let to_balance = accounts.get_mut(&to_account)
394
+ .ok_or("Destination account not found")?;
395
+
396
+ *to_balance += amount;
397
+
398
+ // Both updates succeed or both fail (atomic)
399
+ Ok(())
400
+ }
401
+ ```
402
+
403
+ ## Lock Management Best Practices
404
+
405
+ ### ❌ Holding Locks Across Await Points
406
+
407
+ ```rust
408
+ // WRONG - Lock held across await (potential deadlock)
409
+ #[tauri::command]
410
+ async fn bad_pattern(
411
+ state: tauri::State<'_, AppState>,
412
+ ) -> Result<(), String> {
413
+ let mut data = state.data.lock().await;
414
+ // Lock is held here
415
+ expensive_async_operation().await?; // Deadlock risk!
416
+ data.update();
417
+ Ok(())
418
+ }
419
+
420
+ // CORRECT - Release lock before await
421
+ #[tauri::command]
422
+ async fn good_pattern(
423
+ state: tauri::State<'_, AppState>,
424
+ ) -> Result<(), String> {
425
+ let result = expensive_async_operation().await?;
426
+
427
+ {
428
+ let mut data = state.data.lock().await;
429
+ data.update_with(result);
430
+ } // Lock released here
431
+
432
+ Ok(())
433
+ }
434
+ ```
435
+
436
+ ### ✅ Minimizing Lock Scope
437
+
438
+ ```rust
439
+ #[tauri::command]
440
+ async fn optimized_read(
441
+ key: String,
442
+ state: tauri::State<'_, AppState>,
443
+ ) -> Result<String, String> {
444
+ // Clone only what you need, release lock immediately
445
+ let value = {
446
+ let cache = state.cache.read().await;
447
+ cache.get(&key).cloned()
448
+ }; // Lock released here
449
+
450
+ match value {
451
+ Some(v) => Ok(v),
452
+ None => {
453
+ // Compute without holding lock
454
+ let computed = compute_value(&key).await?;
455
+
456
+ // Lock only for insertion
457
+ {
458
+ let mut cache = state.cache.write().await;
459
+ cache.insert(key, computed.clone());
460
+ }
461
+
462
+ Ok(computed)
463
+ }
464
+ }
465
+ }
466
+ ```
467
+
468
+ ### ✅ Using Try-Lock for Non-Blocking
469
+
470
+ ```rust
471
+ use tokio::sync::Mutex;
472
+
473
+ #[tauri::command]
474
+ async fn try_update(
475
+ state: tauri::State<'_, AppState>,
476
+ ) -> Result<String, String> {
477
+ // Try to acquire lock without blocking
478
+ match state.data.try_lock() {
479
+ Ok(mut data) => {
480
+ data.update();
481
+ Ok("Updated".to_string())
482
+ }
483
+ Err(_) => {
484
+ // Lock is held, don't wait
485
+ Ok("Busy, try again later".to_string())
486
+ }
487
+ }
488
+ }
489
+ ```
490
+
491
+ ## Decision Matrix
492
+
493
+ | Use Case | Container | Reason |
494
+ |----------|-----------|--------|
495
+ | Simple shared data | `Arc<Mutex<T>>` | Easy, works for everything |
496
+ | Frequent reads, rare writes | `Arc<RwLock<T>>` | Concurrent readers |
497
+ | High-concurrency map | `Arc<DashMap<K,V>>` | Lock-free operations |
498
+ | Session management | `Arc<DashMap<K,V>>` | Concurrent access |
499
+ | Configuration cache | `Arc<RwLock<T>>` | Many readers, few writers |
500
+ | Database connection | `Arc<Mutex<T>>` | Exclusive access needed |
501
+ | Active connections | `Arc<DashMap<K,V>>` | High concurrency |
502
+ | User preferences | `Arc<RwLock<T>>` | Read-heavy |
503
+
504
+ ## Performance Considerations
505
+
506
+ ### Benchmarking State Access
507
+
508
+ ```rust
509
+ use std::time::Instant;
510
+
511
+ #[tauri::command]
512
+ async fn benchmark_state_access(
513
+ iterations: usize,
514
+ state: tauri::State<'_, AppState>,
515
+ ) -> Result<BenchmarkResults, String> {
516
+ let start = Instant::now();
517
+
518
+ for _ in 0..iterations {
519
+ let _data = state.data.read().await;
520
+ // Simulate work
521
+ }
522
+
523
+ let duration = start.elapsed();
524
+
525
+ Ok(BenchmarkResults {
526
+ iterations,
527
+ total_ms: duration.as_millis(),
528
+ avg_us: duration.as_micros() / iterations as u128,
529
+ })
530
+ }
531
+ ```
532
+
533
+ ## Common Pitfalls
534
+
535
+ ❌ **Using std::sync::Mutex in async code**:
536
+ ```rust
537
+ use std::sync::Mutex; // WRONG for async
538
+
539
+ // Use tokio's Mutex instead
540
+ use tokio::sync::Mutex; // CORRECT for async
541
+ ```
542
+
543
+ ❌ **Not using Arc for shared state**:
544
+ ```rust
545
+ // WRONG - Mutex alone doesn't provide shared ownership
546
+ pub struct AppState {
547
+ data: Mutex<Data>, // Can't clone/share
548
+ }
549
+
550
+ // CORRECT - Arc enables shared ownership
551
+ pub struct AppState {
552
+ data: Arc<Mutex<Data>>, // Can clone Arc, share across tasks
553
+ }
554
+ ```
555
+
556
+ ❌ **Forgetting to .await lock acquisition**:
557
+ ```rust
558
+ // WRONG - forgot .await
559
+ let data = state.data.lock(); // Returns Future, not MutexGuard
560
+
561
+ // CORRECT
562
+ let data = state.data.lock().await;
563
+ ```
564
+
565
+ ## Summary
566
+
567
+ - **`Arc<Mutex<T>>`** - General purpose, exclusive access
568
+ - **`Arc<RwLock<T>>`** - Read-heavy workloads, concurrent readers
569
+ - **`Arc<DashMap<K,V>>`** - Lock-free maps, high concurrency
570
+ - **Minimize lock scope** - Hold locks for shortest time possible
571
+ - **Don't hold locks across await** - Deadlock risk
572
+ - **Use multiple states** - Separate concerns for better granularity
573
+ - **Always use tokio's Mutex/RwLock** - Not std's version in async