claude-mpm 5.4.41__py3-none-any.whl → 5.6.72__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 (490) 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/auth/__init__.py +35 -0
  9. claude_mpm/auth/callback_server.py +328 -0
  10. claude_mpm/auth/models.py +104 -0
  11. claude_mpm/auth/oauth_manager.py +266 -0
  12. claude_mpm/auth/providers/__init__.py +12 -0
  13. claude_mpm/auth/providers/base.py +165 -0
  14. claude_mpm/auth/providers/google.py +261 -0
  15. claude_mpm/auth/token_storage.py +252 -0
  16. claude_mpm/cli/__init__.py +5 -1
  17. claude_mpm/cli/commands/agents.py +2 -4
  18. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  19. claude_mpm/cli/commands/autotodos.py +566 -0
  20. claude_mpm/cli/commands/commander.py +216 -0
  21. claude_mpm/cli/commands/configure.py +620 -21
  22. claude_mpm/cli/commands/configure_agent_display.py +3 -1
  23. claude_mpm/cli/commands/hook_errors.py +60 -60
  24. claude_mpm/cli/commands/mcp.py +29 -17
  25. claude_mpm/cli/commands/mcp_command_router.py +39 -0
  26. claude_mpm/cli/commands/mcp_service_commands.py +304 -0
  27. claude_mpm/cli/commands/monitor.py +2 -2
  28. claude_mpm/cli/commands/mpm_init/core.py +15 -8
  29. claude_mpm/cli/commands/oauth.py +481 -0
  30. claude_mpm/cli/commands/profile.py +9 -10
  31. claude_mpm/cli/commands/run.py +35 -3
  32. claude_mpm/cli/commands/skill_source.py +51 -2
  33. claude_mpm/cli/commands/skills.py +182 -32
  34. claude_mpm/cli/executor.py +129 -16
  35. claude_mpm/cli/helpers.py +1 -1
  36. claude_mpm/cli/interactive/__init__.py +10 -0
  37. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  38. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  39. claude_mpm/cli/interactive/skill_selector.py +481 -0
  40. claude_mpm/cli/parsers/base_parser.py +89 -1
  41. claude_mpm/cli/parsers/commander_parser.py +116 -0
  42. claude_mpm/cli/parsers/mcp_parser.py +79 -0
  43. claude_mpm/cli/parsers/oauth_parser.py +165 -0
  44. claude_mpm/cli/parsers/profile_parser.py +0 -1
  45. claude_mpm/cli/parsers/run_parser.py +10 -0
  46. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  47. claude_mpm/cli/parsers/skills_parser.py +2 -3
  48. claude_mpm/cli/startup.py +662 -524
  49. claude_mpm/cli/startup_display.py +76 -7
  50. claude_mpm/cli/startup_logging.py +2 -2
  51. claude_mpm/cli/utils.py +7 -3
  52. claude_mpm/commander/__init__.py +78 -0
  53. claude_mpm/commander/adapters/__init__.py +60 -0
  54. claude_mpm/commander/adapters/auggie.py +260 -0
  55. claude_mpm/commander/adapters/base.py +288 -0
  56. claude_mpm/commander/adapters/claude_code.py +392 -0
  57. claude_mpm/commander/adapters/codex.py +237 -0
  58. claude_mpm/commander/adapters/communication.py +366 -0
  59. claude_mpm/commander/adapters/example_usage.py +310 -0
  60. claude_mpm/commander/adapters/mpm.py +389 -0
  61. claude_mpm/commander/adapters/registry.py +204 -0
  62. claude_mpm/commander/api/__init__.py +16 -0
  63. claude_mpm/commander/api/app.py +121 -0
  64. claude_mpm/commander/api/errors.py +133 -0
  65. claude_mpm/commander/api/routes/__init__.py +8 -0
  66. claude_mpm/commander/api/routes/events.py +184 -0
  67. claude_mpm/commander/api/routes/inbox.py +171 -0
  68. claude_mpm/commander/api/routes/messages.py +148 -0
  69. claude_mpm/commander/api/routes/projects.py +271 -0
  70. claude_mpm/commander/api/routes/sessions.py +226 -0
  71. claude_mpm/commander/api/routes/work.py +296 -0
  72. claude_mpm/commander/api/schemas.py +186 -0
  73. claude_mpm/commander/chat/__init__.py +7 -0
  74. claude_mpm/commander/chat/cli.py +149 -0
  75. claude_mpm/commander/chat/commands.py +122 -0
  76. claude_mpm/commander/chat/repl.py +1821 -0
  77. claude_mpm/commander/config.py +51 -0
  78. claude_mpm/commander/config_loader.py +115 -0
  79. claude_mpm/commander/core/__init__.py +10 -0
  80. claude_mpm/commander/core/block_manager.py +325 -0
  81. claude_mpm/commander/core/response_manager.py +323 -0
  82. claude_mpm/commander/daemon.py +603 -0
  83. claude_mpm/commander/env_loader.py +59 -0
  84. claude_mpm/commander/events/__init__.py +26 -0
  85. claude_mpm/commander/events/manager.py +392 -0
  86. claude_mpm/commander/frameworks/__init__.py +12 -0
  87. claude_mpm/commander/frameworks/base.py +233 -0
  88. claude_mpm/commander/frameworks/claude_code.py +58 -0
  89. claude_mpm/commander/frameworks/mpm.py +57 -0
  90. claude_mpm/commander/git/__init__.py +5 -0
  91. claude_mpm/commander/git/worktree_manager.py +212 -0
  92. claude_mpm/commander/inbox/__init__.py +16 -0
  93. claude_mpm/commander/inbox/dedup.py +128 -0
  94. claude_mpm/commander/inbox/inbox.py +224 -0
  95. claude_mpm/commander/inbox/models.py +70 -0
  96. claude_mpm/commander/instance_manager.py +865 -0
  97. claude_mpm/commander/llm/__init__.py +6 -0
  98. claude_mpm/commander/llm/openrouter_client.py +167 -0
  99. claude_mpm/commander/llm/summarizer.py +70 -0
  100. claude_mpm/commander/memory/__init__.py +45 -0
  101. claude_mpm/commander/memory/compression.py +347 -0
  102. claude_mpm/commander/memory/embeddings.py +230 -0
  103. claude_mpm/commander/memory/entities.py +310 -0
  104. claude_mpm/commander/memory/example_usage.py +290 -0
  105. claude_mpm/commander/memory/integration.py +325 -0
  106. claude_mpm/commander/memory/search.py +381 -0
  107. claude_mpm/commander/memory/store.py +657 -0
  108. claude_mpm/commander/models/__init__.py +18 -0
  109. claude_mpm/commander/models/events.py +127 -0
  110. claude_mpm/commander/models/project.py +162 -0
  111. claude_mpm/commander/models/work.py +214 -0
  112. claude_mpm/commander/parsing/__init__.py +20 -0
  113. claude_mpm/commander/parsing/extractor.py +132 -0
  114. claude_mpm/commander/parsing/output_parser.py +270 -0
  115. claude_mpm/commander/parsing/patterns.py +100 -0
  116. claude_mpm/commander/persistence/__init__.py +11 -0
  117. claude_mpm/commander/persistence/event_store.py +274 -0
  118. claude_mpm/commander/persistence/state_store.py +403 -0
  119. claude_mpm/commander/persistence/work_store.py +164 -0
  120. claude_mpm/commander/polling/__init__.py +13 -0
  121. claude_mpm/commander/polling/event_detector.py +104 -0
  122. claude_mpm/commander/polling/output_buffer.py +49 -0
  123. claude_mpm/commander/polling/output_poller.py +153 -0
  124. claude_mpm/commander/project_session.py +268 -0
  125. claude_mpm/commander/proxy/__init__.py +12 -0
  126. claude_mpm/commander/proxy/formatter.py +89 -0
  127. claude_mpm/commander/proxy/output_handler.py +191 -0
  128. claude_mpm/commander/proxy/relay.py +155 -0
  129. claude_mpm/commander/registry.py +410 -0
  130. claude_mpm/commander/runtime/__init__.py +10 -0
  131. claude_mpm/commander/runtime/executor.py +191 -0
  132. claude_mpm/commander/runtime/monitor.py +346 -0
  133. claude_mpm/commander/session/__init__.py +6 -0
  134. claude_mpm/commander/session/context.py +81 -0
  135. claude_mpm/commander/session/manager.py +59 -0
  136. claude_mpm/commander/tmux_orchestrator.py +362 -0
  137. claude_mpm/commander/web/__init__.py +1 -0
  138. claude_mpm/commander/work/__init__.py +30 -0
  139. claude_mpm/commander/work/executor.py +207 -0
  140. claude_mpm/commander/work/queue.py +405 -0
  141. claude_mpm/commander/workflow/__init__.py +27 -0
  142. claude_mpm/commander/workflow/event_handler.py +241 -0
  143. claude_mpm/commander/workflow/notifier.py +146 -0
  144. claude_mpm/commands/mpm-config.md +8 -0
  145. claude_mpm/commands/mpm-doctor.md +8 -0
  146. claude_mpm/commands/mpm-help.md +8 -0
  147. claude_mpm/commands/mpm-init.md +8 -0
  148. claude_mpm/commands/mpm-monitor.md +8 -0
  149. claude_mpm/commands/mpm-organize.md +8 -0
  150. claude_mpm/commands/mpm-postmortem.md +8 -0
  151. claude_mpm/commands/mpm-session-resume.md +9 -1
  152. claude_mpm/commands/mpm-status.md +8 -0
  153. claude_mpm/commands/mpm-ticket-view.md +8 -0
  154. claude_mpm/commands/mpm-version.md +8 -0
  155. claude_mpm/commands/mpm.md +8 -0
  156. claude_mpm/config/agent_presets.py +8 -7
  157. claude_mpm/config/skill_sources.py +16 -0
  158. claude_mpm/constants.py +6 -0
  159. claude_mpm/core/claude_runner.py +154 -2
  160. claude_mpm/core/config.py +35 -22
  161. claude_mpm/core/config_constants.py +74 -9
  162. claude_mpm/core/constants.py +56 -12
  163. claude_mpm/core/hook_manager.py +53 -4
  164. claude_mpm/core/interactive_session.py +12 -11
  165. claude_mpm/core/logger.py +26 -9
  166. claude_mpm/core/logging_utils.py +39 -13
  167. claude_mpm/core/network_config.py +148 -0
  168. claude_mpm/core/oneshot_session.py +7 -6
  169. claude_mpm/core/optimized_startup.py +3 -1
  170. claude_mpm/core/output_style_manager.py +66 -18
  171. claude_mpm/core/shared/config_loader.py +3 -1
  172. claude_mpm/core/socketio_pool.py +47 -15
  173. claude_mpm/core/unified_config.py +54 -8
  174. claude_mpm/core/unified_paths.py +95 -90
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{N4qtv3Hx.js → DR8nis88.js} +2 -2
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  236. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.CAGBuiOw.js → 0.RgBboRvH.js} +1 -1
  237. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  238. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  239. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  240. claude_mpm/dashboard/static/svelte-build/index.html +11 -11
  241. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  242. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  243. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  244. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  245. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  246. claude_mpm/experimental/cli_enhancements.py +2 -1
  247. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  248. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  249. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  250. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  251. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  252. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  255. claude_mpm/hooks/claude_hooks/event_handlers.py +466 -136
  256. claude_mpm/hooks/claude_hooks/hook_handler.py +204 -104
  257. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  258. claude_mpm/hooks/claude_hooks/installer.py +291 -59
  259. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  260. claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
  261. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  262. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/connection_manager.py +41 -26
  269. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
  270. claude_mpm/hooks/claude_hooks/services/container.py +326 -0
  271. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  272. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  273. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
  274. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  275. claude_mpm/hooks/session_resume_hook.py +89 -1
  276. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  277. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  278. claude_mpm/init.py +224 -4
  279. claude_mpm/mcp/__init__.py +9 -0
  280. claude_mpm/mcp/google_workspace_server.py +610 -0
  281. claude_mpm/scripts/claude-hook-handler.sh +46 -19
  282. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  283. claude_mpm/services/agents/agent_selection_service.py +2 -2
  284. claude_mpm/services/agents/cache_git_manager.py +1 -1
  285. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
  286. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  287. claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
  288. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  289. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  290. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  291. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +36 -8
  292. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +50 -26
  293. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  294. claude_mpm/services/agents/git_source_manager.py +21 -2
  295. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  296. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  297. claude_mpm/services/agents/sources/git_source_sync_service.py +116 -5
  298. claude_mpm/services/agents/startup_sync.py +5 -2
  299. claude_mpm/services/cli/__init__.py +3 -0
  300. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  301. claude_mpm/services/cli/session_resume_helper.py +10 -2
  302. claude_mpm/services/command_deployment_service.py +44 -26
  303. claude_mpm/services/delegation_detector.py +175 -0
  304. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  305. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  306. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  307. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  308. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  309. claude_mpm/services/diagnostics/models.py +14 -1
  310. claude_mpm/services/event_log.py +325 -0
  311. claude_mpm/services/hook_installer_service.py +77 -8
  312. claude_mpm/services/infrastructure/__init__.py +4 -0
  313. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  314. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  315. claude_mpm/services/mcp_config_manager.py +99 -19
  316. claude_mpm/services/mcp_service_registry.py +294 -0
  317. claude_mpm/services/monitor/daemon_manager.py +15 -4
  318. claude_mpm/services/monitor/management/lifecycle.py +8 -3
  319. claude_mpm/services/monitor/server.py +111 -16
  320. claude_mpm/services/pm_skills_deployer.py +302 -94
  321. claude_mpm/services/profile_manager.py +10 -4
  322. claude_mpm/services/skills/git_skill_source_manager.py +192 -29
  323. claude_mpm/services/skills/selective_skill_deployer.py +211 -46
  324. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  325. claude_mpm/services/skills_deployer.py +192 -70
  326. claude_mpm/services/socketio/handlers/hook.py +14 -7
  327. claude_mpm/services/socketio/server/main.py +12 -4
  328. claude_mpm/skills/__init__.py +2 -1
  329. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  330. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  331. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  332. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  333. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  334. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  335. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  336. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  337. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  338. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  339. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  340. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  341. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  342. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  343. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  344. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  345. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  346. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  347. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  348. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  349. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  350. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  351. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  352. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  353. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  354. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  355. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  356. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  357. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  358. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  359. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  360. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  361. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  362. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  363. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  364. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  365. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  366. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  367. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  368. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  369. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  370. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  371. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  372. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  373. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  374. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  375. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  376. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  377. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  378. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  379. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  380. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  381. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  382. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  383. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  384. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  385. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  386. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  387. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  388. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  389. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  390. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  391. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  392. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  393. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  394. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  395. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  396. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  397. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  398. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  399. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  400. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  401. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  402. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  403. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  404. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  405. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  406. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  407. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  408. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  409. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  410. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  411. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  412. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  413. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  414. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  415. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  416. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  417. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  418. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  419. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  420. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  421. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  422. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  423. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  424. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  425. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  426. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  427. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  428. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  429. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  430. claude_mpm/skills/bundled/security-scanning.md +112 -0
  431. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  432. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  433. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  434. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  435. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  436. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  437. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  438. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  439. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  440. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  441. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  442. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  443. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  444. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  445. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  446. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  447. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  448. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  449. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  450. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  451. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  452. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  453. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  454. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  455. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  456. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  457. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  458. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  459. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  460. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  461. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  462. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  463. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  464. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  465. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  466. claude_mpm/skills/registry.py +295 -90
  467. claude_mpm/skills/skill_manager.py +29 -23
  468. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  469. claude_mpm/utils/agent_dependency_loader.py +103 -4
  470. claude_mpm/utils/robust_installer.py +45 -24
  471. claude_mpm-5.6.72.dist-info/METADATA +416 -0
  472. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/RECORD +477 -159
  473. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/WHEEL +1 -1
  474. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/entry_points.txt +2 -0
  475. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
  476. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
  477. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
  478. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
  479. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +0 -1
  480. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
  481. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
  482. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
  483. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
  484. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
  485. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  486. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  487. claude_mpm-5.4.41.dist-info/METADATA +0 -998
  488. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE +0 -0
  489. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  490. {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,669 @@
1
+ ---
2
+ name: tauri-performance
3
+ description: Performance optimization for Tauri apps including serialization, batching, caching, lazy loading, and profiling techniques
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Performance optimization: minimize serialization, batch commands, implement caching, lazy load resources, profile bottlenecks"
11
+ when_to_use: "Optimizing Tauri app performance, reducing IPC overhead, improving responsiveness, or debugging performance issues"
12
+ quick_start: "1. Batch IPC calls 2. Cache frequently accessed data 3. Stream large data 4. Lazy load resources 5. Profile with DevTools"
13
+ context_limit: 600
14
+ tags:
15
+ - tauri
16
+ - performance
17
+ - optimization
18
+ - profiling
19
+ - caching
20
+ requires_tools: []
21
+ ---
22
+
23
+ # Tauri Performance Optimization
24
+
25
+ ## IPC Optimization
26
+
27
+ ### Minimize Serialization Overhead
28
+
29
+ **Problem**: Each IPC call serializes data across the boundary
30
+
31
+ ```rust
32
+ // ❌ BAD - multiple IPC calls
33
+ #[tauri::command]
34
+ async fn get_file_name(path: String) -> Result<String, String> { /* ... */ }
35
+
36
+ #[tauri::command]
37
+ async fn get_file_size(path: String) -> Result<u64, String> { /* ... */ }
38
+
39
+ // Frontend makes 3 separate calls
40
+ const name = await invoke('get_file_name', { path });
41
+ const size = await invoke('get_file_size', { path });
42
+ const modified = await invoke('get_file_modified', { path });
43
+ ```
44
+
45
+ **Solution**: Batch data in single call
46
+
47
+ ```rust
48
+ // ✅ GOOD - single IPC call
49
+ #[derive(serde::Serialize)]
50
+ pub struct FileInfo {
51
+ name: String,
52
+ size: u64,
53
+ modified: u64,
54
+ is_dir: bool,
55
+ }
56
+
57
+ #[tauri::command]
58
+ async fn get_file_info(path: String) -> Result<FileInfo, String> {
59
+ let metadata = tokio::fs::metadata(&path)
60
+ .await
61
+ .map_err(|e| e.to_string())?;
62
+
63
+ Ok(FileInfo {
64
+ name: Path::new(&path)
65
+ .file_name()
66
+ .unwrap()
67
+ .to_string_lossy()
68
+ .to_string(),
69
+ size: metadata.len(),
70
+ modified: metadata.modified()
71
+ .unwrap()
72
+ .duration_since(UNIX_EPOCH)
73
+ .unwrap()
74
+ .as_secs(),
75
+ is_dir: metadata.is_dir(),
76
+ })
77
+ }
78
+
79
+ // Frontend makes 1 call
80
+ const info = await invoke('get_file_info', { path });
81
+ ```
82
+
83
+ ### Batch Operations
84
+
85
+ ```rust
86
+ // ❌ BAD - N IPC calls
87
+ for file in files {
88
+ await invoke('process_file', { file });
89
+ }
90
+
91
+ // ✅ GOOD - 1 IPC call
92
+ #[tauri::command]
93
+ async fn process_files_batch(files: Vec<String>) -> Result<Vec<ProcessResult>, String> {
94
+ let mut results = Vec::new();
95
+
96
+ for file in files {
97
+ let result = process_file_internal(&file).await;
98
+ results.push(result);
99
+ }
100
+
101
+ Ok(results)
102
+ }
103
+
104
+ await invoke('process_files_batch', { files });
105
+ ```
106
+
107
+ ### Stream Large Data
108
+
109
+ ```rust
110
+ use futures::stream::{self, StreamExt};
111
+
112
+ #[tauri::command]
113
+ async fn load_large_dataset(
114
+ window: tauri::Window,
115
+ ) -> Result<(), String> {
116
+ let data = fetch_large_dataset().await?;
117
+
118
+ // Stream in chunks instead of single payload
119
+ let chunks: Vec<_> = data.chunks(1000).collect();
120
+
121
+ for (index, chunk) in chunks.iter().enumerate() {
122
+ window.emit("data-chunk", serde_json::json!({
123
+ "index": index,
124
+ "data": chunk,
125
+ "total": chunks.len()
126
+ })).map_err(|e| e.to_string())?;
127
+
128
+ // Small delay to prevent overwhelming frontend
129
+ tokio::time::sleep(Duration::from_millis(10)).await;
130
+ }
131
+
132
+ window.emit("data-complete", ()).map_err(|e| e.to_string())?;
133
+
134
+ Ok(())
135
+ }
136
+ ```
137
+
138
+ **Frontend streaming handler**:
139
+ ```typescript
140
+ let allData: DataItem[] = [];
141
+
142
+ await listen('data-chunk', (event: { index: number; data: DataItem[]; total: number }) => {
143
+ allData = allData.concat(event.data);
144
+ updateProgress(event.index, event.total);
145
+ });
146
+
147
+ await listen('data-complete', () => {
148
+ renderData(allData);
149
+ });
150
+
151
+ await invoke('load_large_dataset');
152
+ ```
153
+
154
+ ## Caching Strategies
155
+
156
+ ### In-Memory Cache
157
+
158
+ ```rust
159
+ use std::sync::Arc;
160
+ use dashmap::DashMap;
161
+ use std::time::{SystemTime, Duration};
162
+
163
+ pub struct CachedValue<T> {
164
+ value: T,
165
+ expires_at: SystemTime,
166
+ }
167
+
168
+ pub struct Cache<T> {
169
+ store: Arc<DashMap<String, CachedValue<T>>>,
170
+ ttl: Duration,
171
+ }
172
+
173
+ impl<T: Clone> Cache<T> {
174
+ pub fn new(ttl_secs: u64) -> Self {
175
+ Self {
176
+ store: Arc::new(DashMap::new()),
177
+ ttl: Duration::from_secs(ttl_secs),
178
+ }
179
+ }
180
+
181
+ pub fn get(&self, key: &str) -> Option<T> {
182
+ self.store.get(key).and_then(|entry| {
183
+ if SystemTime::now() < entry.expires_at {
184
+ Some(entry.value.clone())
185
+ } else {
186
+ self.store.remove(key);
187
+ None
188
+ }
189
+ })
190
+ }
191
+
192
+ pub fn set(&self, key: String, value: T) {
193
+ self.store.insert(key, CachedValue {
194
+ value,
195
+ expires_at: SystemTime::now() + self.ttl,
196
+ });
197
+ }
198
+
199
+ pub fn clear(&self) {
200
+ self.store.clear();
201
+ }
202
+ }
203
+
204
+ // Usage in app state
205
+ pub struct AppState {
206
+ file_cache: Cache<String>,
207
+ }
208
+
209
+ #[tauri::command]
210
+ async fn read_file_cached(
211
+ path: String,
212
+ state: tauri::State<'_, AppState>,
213
+ ) -> Result<String, String> {
214
+ // Check cache first
215
+ if let Some(content) = state.file_cache.get(&path) {
216
+ return Ok(content);
217
+ }
218
+
219
+ // Cache miss - read from disk
220
+ let content = tokio::fs::read_to_string(&path)
221
+ .await
222
+ .map_err(|e| e.to_string())?;
223
+
224
+ // Store in cache
225
+ state.file_cache.set(path, content.clone());
226
+
227
+ Ok(content)
228
+ }
229
+ ```
230
+
231
+ ### LRU Cache
232
+
233
+ ```rust
234
+ use lru::LruCache;
235
+ use std::sync::Arc;
236
+ use tokio::sync::Mutex;
237
+ use std::num::NonZeroUsize;
238
+
239
+ pub struct AppState {
240
+ lru_cache: Arc<Mutex<LruCache<String, Vec<u8>>>>,
241
+ }
242
+
243
+ impl AppState {
244
+ pub fn new() -> Self {
245
+ Self {
246
+ lru_cache: Arc::new(Mutex::new(
247
+ LruCache::new(NonZeroUsize::new(100).unwrap())
248
+ )),
249
+ }
250
+ }
251
+ }
252
+
253
+ #[tauri::command]
254
+ async fn get_data_with_lru(
255
+ key: String,
256
+ state: tauri::State<'_, AppState>,
257
+ ) -> Result<Vec<u8>, String> {
258
+ let mut cache = state.lru_cache.lock().await;
259
+
260
+ if let Some(data) = cache.get(&key) {
261
+ return Ok(data.clone());
262
+ }
263
+
264
+ // Cache miss
265
+ drop(cache); // Release lock before expensive operation
266
+
267
+ let data = fetch_expensive_data(&key).await?;
268
+
269
+ let mut cache = state.lru_cache.lock().await;
270
+ cache.put(key, data.clone());
271
+
272
+ Ok(data)
273
+ }
274
+ ```
275
+
276
+ ### Persistent Cache
277
+
278
+ ```rust
279
+ use sled::Db;
280
+
281
+ pub struct AppState {
282
+ disk_cache: Db,
283
+ }
284
+
285
+ impl AppState {
286
+ pub fn new() -> Result<Self, String> {
287
+ let cache = sled::open("cache.db")
288
+ .map_err(|e| e.to_string())?;
289
+
290
+ Ok(Self {
291
+ disk_cache: cache,
292
+ })
293
+ }
294
+ }
295
+
296
+ #[tauri::command]
297
+ async fn get_cached_data(
298
+ key: String,
299
+ state: tauri::State<'_, AppState>,
300
+ ) -> Result<Option<String>, String> {
301
+ let data = state.disk_cache
302
+ .get(key.as_bytes())
303
+ .map_err(|e| e.to_string())?;
304
+
305
+ Ok(data.map(|bytes| String::from_utf8_lossy(&bytes).to_string()))
306
+ }
307
+
308
+ #[tauri::command]
309
+ async fn set_cached_data(
310
+ key: String,
311
+ value: String,
312
+ state: tauri::State<'_, AppState>,
313
+ ) -> Result<(), String> {
314
+ state.disk_cache
315
+ .insert(key.as_bytes(), value.as_bytes())
316
+ .map_err(|e| e.to_string())?;
317
+
318
+ Ok(())
319
+ }
320
+ ```
321
+
322
+ ## Lazy Loading
323
+
324
+ ### Lazy Component Loading
325
+
326
+ ```typescript
327
+ // React lazy loading
328
+ import { lazy, Suspense } from 'react';
329
+
330
+ const HeavyComponent = lazy(() => import('./HeavyComponent'));
331
+
332
+ function App() {
333
+ return (
334
+ <Suspense fallback={<div>Loading...</div>}>
335
+ <HeavyComponent />
336
+ </Suspense>
337
+ );
338
+ }
339
+ ```
340
+
341
+ ### Lazy Data Loading
342
+
343
+ ```rust
344
+ #[tauri::command]
345
+ async fn get_preview(path: String) -> Result<PreviewData, String> {
346
+ // Return lightweight preview first
347
+ let preview = PreviewData {
348
+ name: get_filename(&path),
349
+ size: get_filesize(&path).await?,
350
+ thumbnail: None, // Don't load heavy data yet
351
+ };
352
+
353
+ Ok(preview)
354
+ }
355
+
356
+ #[tauri::command]
357
+ async fn get_full_data(path: String) -> Result<FullData, String> {
358
+ // Load heavy data only when requested
359
+ let content = tokio::fs::read(&path)
360
+ .await
361
+ .map_err(|e| e.to_string())?;
362
+
363
+ let thumbnail = generate_thumbnail(&content)?;
364
+
365
+ Ok(FullData {
366
+ content,
367
+ thumbnail: Some(thumbnail),
368
+ })
369
+ }
370
+ ```
371
+
372
+ **Frontend**:
373
+ ```typescript
374
+ // Load preview immediately
375
+ const preview = await invoke('get_preview', { path });
376
+ showPreview(preview);
377
+
378
+ // Load full data on demand
379
+ button.onclick = async () => {
380
+ const fullData = await invoke('get_full_data', { path });
381
+ showFullData(fullData);
382
+ };
383
+ ```
384
+
385
+ ## Database Optimization
386
+
387
+ ### Connection Pooling
388
+
389
+ ```rust
390
+ use sqlx::{Pool, Sqlite, SqlitePool};
391
+
392
+ pub struct AppState {
393
+ db_pool: Pool<Sqlite>,
394
+ }
395
+
396
+ impl AppState {
397
+ pub async fn new() -> Result<Self, sqlx::Error> {
398
+ let pool = SqlitePool::connect("sqlite://data.db").await?;
399
+
400
+ Ok(Self { db_pool: pool })
401
+ }
402
+ }
403
+
404
+ #[tauri::command]
405
+ async fn query_users(
406
+ state: tauri::State<'_, AppState>,
407
+ ) -> Result<Vec<User>, String> {
408
+ let users = sqlx::query_as::<_, User>("SELECT * FROM users")
409
+ .fetch_all(&state.db_pool)
410
+ .await
411
+ .map_err(|e| e.to_string())?;
412
+
413
+ Ok(users)
414
+ }
415
+ ```
416
+
417
+ ### Prepared Statements
418
+
419
+ ```rust
420
+ use sqlx::{Sqlite, Statement};
421
+
422
+ pub struct PreparedStatements {
423
+ get_user: Statement<'static, Sqlite>,
424
+ insert_user: Statement<'static, Sqlite>,
425
+ }
426
+
427
+ impl PreparedStatements {
428
+ pub async fn new(pool: &Pool<Sqlite>) -> Result<Self, sqlx::Error> {
429
+ Ok(Self {
430
+ get_user: pool.prepare("SELECT * FROM users WHERE id = ?").await?,
431
+ insert_user: pool.prepare("INSERT INTO users (name, email) VALUES (?, ?)").await?,
432
+ })
433
+ }
434
+ }
435
+
436
+ // Use prepared statements for repeated queries
437
+ ```
438
+
439
+ ## Async Performance
440
+
441
+ ### Concurrent Operations
442
+
443
+ ```rust
444
+ use futures::future::join_all;
445
+
446
+ #[tauri::command]
447
+ async fn load_multiple_files(paths: Vec<String>) -> Result<Vec<FileData>, String> {
448
+ let tasks = paths.into_iter().map(|path| async move {
449
+ tokio::fs::read_to_string(&path)
450
+ .await
451
+ .map(|content| FileData { path, content })
452
+ });
453
+
454
+ let results = join_all(tasks).await;
455
+
456
+ let data: Vec<FileData> = results
457
+ .into_iter()
458
+ .filter_map(|r| r.ok())
459
+ .collect();
460
+
461
+ Ok(data)
462
+ }
463
+ ```
464
+
465
+ ### Parallel Processing with Rayon
466
+
467
+ ```rust
468
+ use rayon::prelude::*;
469
+
470
+ #[tauri::command]
471
+ async fn process_large_dataset(data: Vec<Item>) -> Result<Vec<ProcessedItem>, String> {
472
+ // Move to blocking thread pool for CPU-intensive work
473
+ let processed = tokio::task::spawn_blocking(move || {
474
+ data.par_iter()
475
+ .map(|item| process_item(item))
476
+ .collect::<Vec<_>>()
477
+ })
478
+ .await
479
+ .map_err(|e| e.to_string())?;
480
+
481
+ Ok(processed)
482
+ }
483
+ ```
484
+
485
+ ## Profiling and Debugging
486
+
487
+ ### Backend Profiling
488
+
489
+ ```rust
490
+ use std::time::Instant;
491
+
492
+ #[tauri::command]
493
+ async fn profiled_operation() -> Result<String, String> {
494
+ let start = Instant::now();
495
+
496
+ let result = expensive_operation().await?;
497
+
498
+ let duration = start.elapsed();
499
+ log::info!("Operation took {:?}", duration);
500
+
501
+ Ok(result)
502
+ }
503
+ ```
504
+
505
+ ### Conditional Logging
506
+
507
+ ```rust
508
+ #[cfg(debug_assertions)]
509
+ macro_rules! debug_time {
510
+ ($label:expr, $code:block) => {{
511
+ let start = std::time::Instant::now();
512
+ let result = $code;
513
+ let duration = start.elapsed();
514
+ log::debug!("{} took {:?}", $label, duration);
515
+ result
516
+ }};
517
+ }
518
+
519
+ #[cfg(not(debug_assertions))]
520
+ macro_rules! debug_time {
521
+ ($label:expr, $code:block) => {
522
+ $code
523
+ };
524
+ }
525
+
526
+ #[tauri::command]
527
+ async fn operation() -> Result<String, String> {
528
+ let result = debug_time!("Database query", {
529
+ query_database().await
530
+ })?;
531
+
532
+ Ok(result)
533
+ }
534
+ ```
535
+
536
+ ### Frontend Performance Monitoring
537
+
538
+ ```typescript
539
+ // Performance marks
540
+ performance.mark('command-start');
541
+ const result = await invoke('heavy_command');
542
+ performance.mark('command-end');
543
+
544
+ performance.measure('command-duration', 'command-start', 'command-end');
545
+
546
+ const measure = performance.getEntriesByName('command-duration')[0];
547
+ console.log(`Command took ${measure.duration}ms`);
548
+ ```
549
+
550
+ ## Memory Optimization
551
+
552
+ ### Avoid Cloning
553
+
554
+ ```rust
555
+ // ❌ BAD - unnecessary clone
556
+ #[tauri::command]
557
+ async fn process_data(data: String) -> Result<String, String> {
558
+ let processed = data.clone(); // Unnecessary
559
+ Ok(processed.to_uppercase())
560
+ }
561
+
562
+ // ✅ GOOD - consume owned value
563
+ #[tauri::command]
564
+ async fn process_data(data: String) -> Result<String, String> {
565
+ Ok(data.to_uppercase()) // Takes ownership
566
+ }
567
+ ```
568
+
569
+ ### Use References Where Possible
570
+
571
+ ```rust
572
+ async fn internal_processing(data: &str) -> String {
573
+ data.to_uppercase()
574
+ }
575
+
576
+ #[tauri::command]
577
+ async fn process(data: String) -> Result<String, String> {
578
+ Ok(internal_processing(&data))
579
+ }
580
+ ```
581
+
582
+ ### Drop Large Allocations Early
583
+
584
+ ```rust
585
+ #[tauri::command]
586
+ async fn process_file(path: String) -> Result<String, String> {
587
+ let large_buffer = tokio::fs::read(&path)
588
+ .await
589
+ .map_err(|e| e.to_string())?;
590
+
591
+ let summary = compute_summary(&large_buffer);
592
+
593
+ drop(large_buffer); // Free memory before waiting
594
+
595
+ tokio::time::sleep(Duration::from_secs(1)).await;
596
+
597
+ Ok(summary)
598
+ }
599
+ ```
600
+
601
+ ## Best Practices
602
+
603
+ 1. **Batch IPC calls** - Minimize serialization overhead
604
+ 2. **Cache aggressively** - In-memory, LRU, or persistent
605
+ 3. **Stream large data** - Chunk payloads instead of single large payload
606
+ 4. **Lazy load** - Only fetch data when needed
607
+ 5. **Use connection pools** - For database access
608
+ 6. **Concurrent operations** - Use join_all for parallel async
609
+ 7. **CPU-bound work** - Move to spawn_blocking or rayon
610
+ 8. **Profile regularly** - Identify bottlenecks with timing
611
+ 9. **Minimize cloning** - Use references or consume owned values
612
+ 10. **Drop early** - Free large allocations as soon as possible
613
+
614
+ ## Common Pitfalls
615
+
616
+ ❌ **Too many small IPC calls**:
617
+ ```typescript
618
+ // WRONG - 100 IPC calls
619
+ for (const file of files) {
620
+ await invoke('process_file', { file });
621
+ }
622
+
623
+ // CORRECT - 1 IPC call
624
+ await invoke('process_files_batch', { files });
625
+ ```
626
+
627
+ ❌ **Not caching expensive operations**:
628
+ ```rust
629
+ // WRONG - recomputes every time
630
+ #[tauri::command]
631
+ async fn get_config() -> Config {
632
+ parse_config().await // Expensive every call
633
+ }
634
+
635
+ // CORRECT - cache result
636
+ lazy_static! {
637
+ static ref CONFIG: Mutex<Option<Config>> = Mutex::new(None);
638
+ }
639
+ ```
640
+
641
+ ❌ **Blocking async runtime**:
642
+ ```rust
643
+ // WRONG - blocks async executor
644
+ #[tauri::command]
645
+ async fn cpu_intensive() -> String {
646
+ expensive_cpu_work() // Blocks entire runtime
647
+ }
648
+
649
+ // CORRECT - move to blocking thread
650
+ #[tauri::command]
651
+ async fn cpu_intensive() -> String {
652
+ tokio::task::spawn_blocking(|| expensive_cpu_work())
653
+ .await
654
+ .unwrap()
655
+ }
656
+ ```
657
+
658
+ ## Summary
659
+
660
+ - **Batch IPC calls** to minimize serialization overhead
661
+ - **Cache frequently accessed data** with TTL, LRU, or persistent
662
+ - **Stream large datasets** in chunks to prevent memory spikes
663
+ - **Lazy load resources** only when needed
664
+ - **Connection pooling** for database efficiency
665
+ - **Concurrent async** with join_all for parallel operations
666
+ - **CPU-bound work** on spawn_blocking or rayon
667
+ - **Profile performance** to identify bottlenecks
668
+ - **Minimize cloning** and drop large allocations early
669
+ - **Frontend monitoring** with Performance API