claude-mpm 5.0.9__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 (614) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +115 -0
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +13 -44
  11. claude_mpm/agents/base_agent.json +1 -1
  12. claude_mpm/agents/frontmatter_validator.py +70 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +457 -62
  14. claude_mpm/cli/__init__.py +5 -2
  15. claude_mpm/cli/__main__.py +4 -0
  16. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  17. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  18. claude_mpm/cli/commands/agents.py +177 -41
  19. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  20. claude_mpm/cli/commands/auto_configure.py +723 -236
  21. claude_mpm/cli/commands/autotodos.py +566 -0
  22. claude_mpm/cli/commands/commander.py +216 -0
  23. claude_mpm/cli/commands/config.py +88 -2
  24. claude_mpm/cli/commands/configure.py +1874 -170
  25. claude_mpm/cli/commands/configure_agent_display.py +27 -6
  26. claude_mpm/cli/commands/hook_errors.py +60 -60
  27. claude_mpm/cli/commands/monitor.py +2 -2
  28. claude_mpm/cli/commands/mpm_init/core.py +232 -46
  29. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  30. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  31. claude_mpm/cli/commands/postmortem.py +1 -1
  32. claude_mpm/cli/commands/profile.py +276 -0
  33. claude_mpm/cli/commands/run.py +35 -3
  34. claude_mpm/cli/commands/skill_source.py +51 -2
  35. claude_mpm/cli/commands/skills.py +379 -204
  36. claude_mpm/cli/commands/summarize.py +413 -0
  37. claude_mpm/cli/executor.py +141 -19
  38. claude_mpm/cli/interactive/__init__.py +10 -0
  39. claude_mpm/cli/interactive/agent_wizard.py +115 -60
  40. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  41. claude_mpm/cli/interactive/skill_selector.py +481 -0
  42. claude_mpm/cli/parsers/agents_parser.py +54 -9
  43. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  44. claude_mpm/cli/parsers/base_parser.py +88 -1
  45. claude_mpm/cli/parsers/commander_parser.py +116 -0
  46. claude_mpm/cli/parsers/config_parser.py +153 -83
  47. claude_mpm/cli/parsers/profile_parser.py +147 -0
  48. claude_mpm/cli/parsers/run_parser.py +10 -0
  49. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  50. claude_mpm/cli/parsers/skills_parser.py +1 -1
  51. claude_mpm/cli/startup.py +1017 -266
  52. claude_mpm/cli/startup_display.py +74 -6
  53. claude_mpm/cli/startup_logging.py +2 -2
  54. claude_mpm/cli/utils.py +7 -3
  55. claude_mpm/commander/__init__.py +78 -0
  56. claude_mpm/commander/adapters/__init__.py +60 -0
  57. claude_mpm/commander/adapters/auggie.py +260 -0
  58. claude_mpm/commander/adapters/base.py +288 -0
  59. claude_mpm/commander/adapters/claude_code.py +392 -0
  60. claude_mpm/commander/adapters/codex.py +237 -0
  61. claude_mpm/commander/adapters/communication.py +366 -0
  62. claude_mpm/commander/adapters/example_usage.py +310 -0
  63. claude_mpm/commander/adapters/mpm.py +389 -0
  64. claude_mpm/commander/adapters/registry.py +204 -0
  65. claude_mpm/commander/api/__init__.py +16 -0
  66. claude_mpm/commander/api/app.py +121 -0
  67. claude_mpm/commander/api/errors.py +133 -0
  68. claude_mpm/commander/api/routes/__init__.py +8 -0
  69. claude_mpm/commander/api/routes/events.py +184 -0
  70. claude_mpm/commander/api/routes/inbox.py +171 -0
  71. claude_mpm/commander/api/routes/messages.py +148 -0
  72. claude_mpm/commander/api/routes/projects.py +271 -0
  73. claude_mpm/commander/api/routes/sessions.py +226 -0
  74. claude_mpm/commander/api/routes/work.py +296 -0
  75. claude_mpm/commander/api/schemas.py +186 -0
  76. claude_mpm/commander/chat/__init__.py +7 -0
  77. claude_mpm/commander/chat/cli.py +146 -0
  78. claude_mpm/commander/chat/commands.py +96 -0
  79. claude_mpm/commander/chat/repl.py +310 -0
  80. claude_mpm/commander/config.py +51 -0
  81. claude_mpm/commander/config_loader.py +115 -0
  82. claude_mpm/commander/core/__init__.py +10 -0
  83. claude_mpm/commander/core/block_manager.py +325 -0
  84. claude_mpm/commander/core/response_manager.py +323 -0
  85. claude_mpm/commander/daemon.py +603 -0
  86. claude_mpm/commander/env_loader.py +59 -0
  87. claude_mpm/commander/events/__init__.py +26 -0
  88. claude_mpm/commander/events/manager.py +332 -0
  89. claude_mpm/commander/frameworks/__init__.py +12 -0
  90. claude_mpm/commander/frameworks/base.py +146 -0
  91. claude_mpm/commander/frameworks/claude_code.py +58 -0
  92. claude_mpm/commander/frameworks/mpm.py +62 -0
  93. claude_mpm/commander/inbox/__init__.py +16 -0
  94. claude_mpm/commander/inbox/dedup.py +128 -0
  95. claude_mpm/commander/inbox/inbox.py +224 -0
  96. claude_mpm/commander/inbox/models.py +70 -0
  97. claude_mpm/commander/instance_manager.py +450 -0
  98. claude_mpm/commander/llm/__init__.py +6 -0
  99. claude_mpm/commander/llm/openrouter_client.py +167 -0
  100. claude_mpm/commander/llm/summarizer.py +70 -0
  101. claude_mpm/commander/memory/__init__.py +45 -0
  102. claude_mpm/commander/memory/compression.py +347 -0
  103. claude_mpm/commander/memory/embeddings.py +230 -0
  104. claude_mpm/commander/memory/entities.py +310 -0
  105. claude_mpm/commander/memory/example_usage.py +290 -0
  106. claude_mpm/commander/memory/integration.py +325 -0
  107. claude_mpm/commander/memory/search.py +381 -0
  108. claude_mpm/commander/memory/store.py +657 -0
  109. claude_mpm/commander/models/__init__.py +18 -0
  110. claude_mpm/commander/models/events.py +121 -0
  111. claude_mpm/commander/models/project.py +162 -0
  112. claude_mpm/commander/models/work.py +214 -0
  113. claude_mpm/commander/parsing/__init__.py +20 -0
  114. claude_mpm/commander/parsing/extractor.py +132 -0
  115. claude_mpm/commander/parsing/output_parser.py +270 -0
  116. claude_mpm/commander/parsing/patterns.py +100 -0
  117. claude_mpm/commander/persistence/__init__.py +11 -0
  118. claude_mpm/commander/persistence/event_store.py +274 -0
  119. claude_mpm/commander/persistence/state_store.py +309 -0
  120. claude_mpm/commander/persistence/work_store.py +164 -0
  121. claude_mpm/commander/polling/__init__.py +13 -0
  122. claude_mpm/commander/polling/event_detector.py +104 -0
  123. claude_mpm/commander/polling/output_buffer.py +49 -0
  124. claude_mpm/commander/polling/output_poller.py +153 -0
  125. claude_mpm/commander/project_session.py +268 -0
  126. claude_mpm/commander/proxy/__init__.py +12 -0
  127. claude_mpm/commander/proxy/formatter.py +89 -0
  128. claude_mpm/commander/proxy/output_handler.py +191 -0
  129. claude_mpm/commander/proxy/relay.py +155 -0
  130. claude_mpm/commander/registry.py +410 -0
  131. claude_mpm/commander/runtime/__init__.py +10 -0
  132. claude_mpm/commander/runtime/executor.py +191 -0
  133. claude_mpm/commander/runtime/monitor.py +346 -0
  134. claude_mpm/commander/session/__init__.py +6 -0
  135. claude_mpm/commander/session/context.py +81 -0
  136. claude_mpm/commander/session/manager.py +59 -0
  137. claude_mpm/commander/tmux_orchestrator.py +361 -0
  138. claude_mpm/commander/web/__init__.py +1 -0
  139. claude_mpm/commander/work/__init__.py +30 -0
  140. claude_mpm/commander/work/executor.py +207 -0
  141. claude_mpm/commander/work/queue.py +405 -0
  142. claude_mpm/commander/workflow/__init__.py +27 -0
  143. claude_mpm/commander/workflow/event_handler.py +241 -0
  144. claude_mpm/commander/workflow/notifier.py +146 -0
  145. claude_mpm/commands/mpm-config.md +36 -0
  146. claude_mpm/commands/mpm-doctor.md +16 -21
  147. claude_mpm/commands/mpm-help.md +12 -286
  148. claude_mpm/commands/mpm-init.md +88 -506
  149. claude_mpm/commands/mpm-monitor.md +22 -401
  150. claude_mpm/commands/mpm-organize.md +128 -0
  151. claude_mpm/commands/mpm-postmortem.md +13 -107
  152. claude_mpm/commands/mpm-session-resume.md +20 -363
  153. claude_mpm/commands/mpm-status.md +13 -69
  154. claude_mpm/commands/mpm-ticket-view.md +60 -495
  155. claude_mpm/commands/mpm-version.md +13 -107
  156. claude_mpm/commands/mpm.md +8 -0
  157. claude_mpm/config/agent_presets.py +8 -7
  158. claude_mpm/config/agent_sources.py +27 -0
  159. claude_mpm/config/skill_sources.py +16 -0
  160. claude_mpm/constants.py +1 -0
  161. claude_mpm/core/claude_runner.py +154 -2
  162. claude_mpm/core/config.py +37 -26
  163. claude_mpm/core/config_constants.py +74 -9
  164. claude_mpm/core/constants.py +56 -12
  165. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  166. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  167. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  168. claude_mpm/core/framework_loader.py +4 -2
  169. claude_mpm/core/hook_manager.py +51 -3
  170. claude_mpm/core/interactive_session.py +12 -11
  171. claude_mpm/core/logger.py +39 -9
  172. claude_mpm/core/logging_utils.py +35 -11
  173. claude_mpm/core/network_config.py +148 -0
  174. claude_mpm/core/oneshot_session.py +7 -6
  175. claude_mpm/core/optimized_startup.py +61 -0
  176. claude_mpm/core/output_style_manager.py +219 -44
  177. claude_mpm/core/shared/config_loader.py +3 -1
  178. claude_mpm/core/socketio_pool.py +16 -8
  179. claude_mpm/core/unified_agent_registry.py +134 -16
  180. claude_mpm/core/unified_config.py +76 -8
  181. claude_mpm/core/unified_paths.py +95 -90
  182. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  236. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  237. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  238. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  239. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  240. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  241. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  242. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  248. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  249. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  250. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  251. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  252. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  253. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  254. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  255. claude_mpm/experimental/cli_enhancements.py +2 -1
  256. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  257. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  258. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  259. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  260. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  261. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  262. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  267. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  268. claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
  269. claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
  270. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  271. claude_mpm/hooks/claude_hooks/installer.py +149 -18
  272. claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
  273. claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
  274. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  275. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  276. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  277. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  278. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  279. claude_mpm/hooks/claude_hooks/services/connection_manager.py +69 -30
  280. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  281. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  282. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
  283. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  284. claude_mpm/hooks/memory_integration_hook.py +46 -1
  285. claude_mpm/hooks/session_resume_hook.py +89 -1
  286. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  287. claude_mpm/init.py +276 -19
  288. claude_mpm/models/agent_definition.py +7 -0
  289. claude_mpm/models/git_repository.py +3 -3
  290. claude_mpm/scripts/claude-hook-handler.sh +87 -20
  291. claude_mpm/scripts/launch_monitor.py +93 -13
  292. claude_mpm/scripts/start_activity_logging.py +0 -0
  293. claude_mpm/services/agents/agent_builder.py +3 -3
  294. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  295. claude_mpm/services/agents/agent_review_service.py +280 -0
  296. claude_mpm/services/agents/agent_selection_service.py +2 -2
  297. claude_mpm/services/agents/cache_git_manager.py +7 -7
  298. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  299. claude_mpm/services/agents/deployment/agent_discovery_service.py +6 -5
  300. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  301. claude_mpm/services/agents/deployment/agent_template_builder.py +42 -20
  302. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  303. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  304. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  305. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  306. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +348 -29
  307. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
  308. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  309. claude_mpm/services/agents/git_source_manager.py +57 -4
  310. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  311. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  312. claude_mpm/services/agents/recommender.py +5 -3
  313. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  314. claude_mpm/services/agents/sources/git_source_sync_service.py +129 -11
  315. claude_mpm/services/agents/startup_sync.py +27 -4
  316. claude_mpm/services/agents/toolchain_detector.py +10 -6
  317. claude_mpm/services/analysis/__init__.py +11 -1
  318. claude_mpm/services/analysis/clone_detector.py +1030 -0
  319. claude_mpm/services/cli/__init__.py +3 -0
  320. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  321. claude_mpm/services/cli/session_resume_helper.py +10 -2
  322. claude_mpm/services/command_deployment_service.py +81 -10
  323. claude_mpm/services/delegation_detector.py +175 -0
  324. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  325. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  326. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  327. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  328. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  329. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  330. claude_mpm/services/diagnostics/models.py +14 -1
  331. claude_mpm/services/event_bus/config.py +3 -1
  332. claude_mpm/services/event_log.py +325 -0
  333. claude_mpm/services/git/git_operations_service.py +101 -16
  334. claude_mpm/services/infrastructure/__init__.py +4 -0
  335. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  336. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  337. claude_mpm/services/monitor/daemon.py +9 -2
  338. claude_mpm/services/monitor/daemon_manager.py +54 -7
  339. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  340. claude_mpm/services/monitor/server.py +796 -30
  341. claude_mpm/services/pm_skills_deployer.py +884 -0
  342. claude_mpm/services/profile_manager.py +337 -0
  343. claude_mpm/services/project/project_organizer.py +4 -0
  344. claude_mpm/services/self_upgrade_service.py +120 -12
  345. claude_mpm/services/skills/__init__.py +3 -0
  346. claude_mpm/services/skills/git_skill_source_manager.py +303 -12
  347. claude_mpm/services/skills/selective_skill_deployer.py +869 -0
  348. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  349. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  350. claude_mpm/services/skills_deployer.py +294 -55
  351. claude_mpm/services/socketio/dashboard_server.py +1 -0
  352. claude_mpm/services/socketio/event_normalizer.py +51 -6
  353. claude_mpm/services/socketio/handlers/hook.py +14 -7
  354. claude_mpm/services/socketio/server/core.py +386 -108
  355. claude_mpm/services/socketio/server/main.py +12 -4
  356. claude_mpm/services/version_control/git_operations.py +103 -0
  357. claude_mpm/skills/__init__.py +2 -1
  358. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  359. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  360. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  361. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  362. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  363. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  364. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  365. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  366. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  367. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  368. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  369. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  370. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  371. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  372. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  373. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  374. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  375. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  376. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  377. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  378. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  379. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  380. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  381. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  382. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  383. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  384. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  385. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  386. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  387. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  388. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  389. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  390. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  391. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  392. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  393. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  394. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  395. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  396. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  397. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  398. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  399. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  400. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  401. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  402. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  403. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  404. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  405. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  406. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  407. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  408. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  409. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  410. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  411. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  412. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  413. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  414. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  415. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  416. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  417. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  418. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  419. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  420. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  422. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  423. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  424. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  425. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  426. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  427. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  428. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  429. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  430. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  431. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  432. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  433. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  434. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  435. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  436. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  437. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  438. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  439. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  440. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  441. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  442. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  443. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  444. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  445. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  446. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  447. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  448. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  449. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  450. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  451. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  459. claude_mpm/skills/bundled/security-scanning.md +112 -0
  460. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  461. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  462. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  463. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  464. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  465. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  466. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  467. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  468. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  469. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  470. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  495. claude_mpm/skills/registry.py +295 -90
  496. claude_mpm/skills/skill_manager.py +98 -3
  497. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  498. claude_mpm/utils/agent_dependency_loader.py +115 -4
  499. claude_mpm/utils/agent_filters.py +17 -44
  500. claude_mpm/utils/gitignore.py +3 -0
  501. claude_mpm/utils/migration.py +4 -4
  502. claude_mpm/utils/robust_installer.py +86 -21
  503. claude_mpm-5.6.23.dist-info/METADATA +393 -0
  504. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
  505. claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
  506. claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
  507. claude_mpm-5.6.23.dist-info/licenses/LICENSE-FAQ.md +153 -0
  508. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  509. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  510. claude_mpm/agents/BASE_OPS.md +0 -219
  511. claude_mpm/agents/BASE_PM.md +0 -480
  512. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  513. claude_mpm/agents/BASE_QA.md +0 -167
  514. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  515. claude_mpm/agents/OUTPUT_STYLE.md +0 -290
  516. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
  517. claude_mpm/agents/base_agent_loader.py +0 -601
  518. claude_mpm/cli/commands/agents_detect.py +0 -380
  519. claude_mpm/cli/commands/agents_recommend.py +0 -309
  520. claude_mpm/cli/ticket_cli.py +0 -35
  521. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  522. claude_mpm/commands/mpm-agents-detect.md +0 -177
  523. claude_mpm/commands/mpm-agents-list.md +0 -131
  524. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  525. claude_mpm/commands/mpm-config-view.md +0 -150
  526. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  527. claude_mpm/dashboard/analysis_runner.py +0 -455
  528. claude_mpm/dashboard/index.html +0 -13
  529. claude_mpm/dashboard/open_dashboard.py +0 -66
  530. claude_mpm/dashboard/static/css/activity.css +0 -1958
  531. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  532. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  533. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  534. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  535. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  536. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  537. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  538. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  539. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  540. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  541. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  542. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  543. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  544. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  545. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  546. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  547. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  548. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  549. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  550. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  551. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  552. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  553. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  554. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  555. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  556. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  557. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  558. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  559. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  560. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  561. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  562. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  563. claude_mpm/dashboard/templates/code_simple.html +0 -153
  564. claude_mpm/dashboard/templates/index.html +0 -606
  565. claude_mpm/dashboard/test_dashboard.html +0 -372
  566. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  567. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  568. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  569. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  570. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  571. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  572. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  573. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  574. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  575. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  576. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  577. claude_mpm/scripts/mcp_server.py +0 -75
  578. claude_mpm/scripts/mcp_wrapper.py +0 -39
  579. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  580. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  581. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  582. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  583. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  584. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  585. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  586. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  587. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  588. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  589. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  590. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  591. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  592. claude_mpm/services/mcp_gateway/main.py +0 -589
  593. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  594. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  595. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  596. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  597. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  598. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  599. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  600. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  601. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  602. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  603. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  604. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  605. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  606. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  607. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  608. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  609. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  610. claude_mpm-5.0.9.dist-info/METADATA +0 -1028
  611. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  612. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  613. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
  614. {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,767 @@
1
+ ---
2
+ name: tauri-frontend-integration
3
+ description: Frontend integration patterns for Tauri including TypeScript services, React hooks, Vue composition, Svelte stores, and framework-agnostic patterns
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Frontend patterns: TypeScript service layer, React hooks for commands/events, Vue/Svelte integration, type safety across IPC boundary"
11
+ when_to_use: "Building Tauri frontend with React, Vue, Svelte, or vanilla JS with proper TypeScript types and abstractions"
12
+ quick_start: "1. Create typed service layer 2. Framework-specific hooks/composables 3. Event handling 4. Error boundaries"
13
+ context_limit: 700
14
+ tags:
15
+ - tauri
16
+ - frontend
17
+ - react
18
+ - vue
19
+ - svelte
20
+ - typescript
21
+ - integration
22
+ requires_tools: []
23
+ ---
24
+
25
+ # Tauri Frontend Integration
26
+
27
+ ## TypeScript Service Layer
28
+
29
+ ### Type-Safe Command Service
30
+
31
+ ```typescript
32
+ // src/services/tauri.ts
33
+ import { invoke } from '@tauri-apps/api/core';
34
+
35
+ // Backend command types
36
+ export interface FileMetadata {
37
+ name: string;
38
+ size: number;
39
+ modified: number;
40
+ isDir: boolean;
41
+ }
42
+
43
+ export interface UserConfig {
44
+ theme: 'light' | 'dark';
45
+ language: string;
46
+ autoSave: boolean;
47
+ }
48
+
49
+ // Command service with full typing
50
+ export class TauriService {
51
+ static async readFile(path: string): Promise<string> {
52
+ return await invoke<string>('read_file', { path });
53
+ }
54
+
55
+ static async writeFile(path: string, content: string): Promise<void> {
56
+ await invoke('write_file', { path, content });
57
+ }
58
+
59
+ static async listFiles(directory: string): Promise<FileMetadata[]> {
60
+ return await invoke<FileMetadata[]>('list_files', { directory });
61
+ }
62
+
63
+ static async getConfig(): Promise<UserConfig> {
64
+ return await invoke<UserConfig>('get_config');
65
+ }
66
+
67
+ static async updateConfig(config: Partial<UserConfig>): Promise<void> {
68
+ await invoke('update_config', { config });
69
+ }
70
+
71
+ static async performSearch(query: string, caseSensitive: boolean): Promise<string[]> {
72
+ return await invoke<string[]>('perform_search', {
73
+ query,
74
+ caseSensitive
75
+ });
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### Result Type Pattern
81
+
82
+ ```typescript
83
+ // src/types/result.ts
84
+ export type Result<T, E = string> =
85
+ | { ok: true; value: T }
86
+ | { ok: false; error: E };
87
+
88
+ export function Ok<T>(value: T): Result<T> {
89
+ return { ok: true, value };
90
+ }
91
+
92
+ export function Err<E = string>(error: E): Result<never, E> {
93
+ return { ok: false, error };
94
+ }
95
+
96
+ // Service using Result type
97
+ export class SafeTauriService {
98
+ static async readFile(path: string): Promise<Result<string>> {
99
+ try {
100
+ const content = await invoke<string>('read_file', { path });
101
+ return Ok(content);
102
+ } catch (error) {
103
+ return Err(String(error));
104
+ }
105
+ }
106
+
107
+ static async writeFile(path: string, content: string): Promise<Result<void>> {
108
+ try {
109
+ await invoke('write_file', { path, content });
110
+ return Ok(undefined);
111
+ } catch (error) {
112
+ return Err(String(error));
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## React Integration
119
+
120
+ ### Custom Hooks for Commands
121
+
122
+ ```typescript
123
+ // src/hooks/useTauriCommand.ts
124
+ import { useState, useEffect } from 'react';
125
+ import { invoke } from '@tauri-apps/api/core';
126
+
127
+ export interface CommandState<T> {
128
+ data: T | null;
129
+ loading: boolean;
130
+ error: string | null;
131
+ }
132
+
133
+ export function useTauriCommand<T>(
134
+ command: string,
135
+ args?: Record<string, unknown>,
136
+ immediate: boolean = true
137
+ ): CommandState<T> & { refetch: () => Promise<void> } {
138
+ const [state, setState] = useState<CommandState<T>>({
139
+ data: null,
140
+ loading: immediate,
141
+ error: null
142
+ });
143
+
144
+ const execute = async () => {
145
+ setState(prev => ({ ...prev, loading: true, error: null }));
146
+
147
+ try {
148
+ const data = await invoke<T>(command, args);
149
+ setState({ data, loading: false, error: null });
150
+ } catch (error) {
151
+ setState({ data: null, loading: false, error: String(error) });
152
+ }
153
+ };
154
+
155
+ useEffect(() => {
156
+ if (immediate) {
157
+ execute();
158
+ }
159
+ }, [command, JSON.stringify(args)]);
160
+
161
+ return { ...state, refetch: execute };
162
+ }
163
+
164
+ // Usage
165
+ function FileList() {
166
+ const { data: files, loading, error, refetch } = useTauriCommand<FileMetadata[]>(
167
+ 'list_files',
168
+ { directory: '/home/user/documents' }
169
+ );
170
+
171
+ if (loading) return <div>Loading...</div>;
172
+ if (error) return <div>Error: {error}</div>;
173
+
174
+ return (
175
+ <div>
176
+ <button onClick={refetch}>Refresh</button>
177
+ {files?.map(file => (
178
+ <div key={file.name}>{file.name}</div>
179
+ ))}
180
+ </div>
181
+ );
182
+ }
183
+ ```
184
+
185
+ ### Event Hooks
186
+
187
+ ```typescript
188
+ // src/hooks/useTauriEvent.ts
189
+ import { useEffect, useState } from 'react';
190
+ import { listen, UnlistenFn } from '@tauri-apps/api/event';
191
+
192
+ export function useTauriEvent<T>(event: string): T | null {
193
+ const [data, setData] = useState<T | null>(null);
194
+
195
+ useEffect(() => {
196
+ let unlisten: UnlistenFn;
197
+
198
+ listen<T>(event, (e) => {
199
+ setData(e.payload);
200
+ }).then(fn => {
201
+ unlisten = fn;
202
+ });
203
+
204
+ return () => {
205
+ if (unlisten) unlisten();
206
+ };
207
+ }, [event]);
208
+
209
+ return data;
210
+ }
211
+
212
+ // Usage
213
+ function ProgressBar() {
214
+ const progress = useTauriEvent<{ current: number; total: number }>('download-progress');
215
+
216
+ if (!progress) return null;
217
+
218
+ const percentage = (progress.current / progress.total) * 100;
219
+
220
+ return (
221
+ <div className="progress-bar">
222
+ <div style={{ width: `${percentage}%` }} />
223
+ <span>{percentage.toFixed(0)}%</span>
224
+ </div>
225
+ );
226
+ }
227
+ ```
228
+
229
+ ### Bidirectional Event Hook
230
+
231
+ ```typescript
232
+ // src/hooks/useTauriEventEmitter.ts
233
+ import { useCallback, useEffect } from 'react';
234
+ import { listen, emit, UnlistenFn } from '@tauri-apps/api/event';
235
+
236
+ export function useTauriEventEmitter<T, R>(
237
+ emitEvent: string,
238
+ listenEvent: string,
239
+ handler: (data: R) => void
240
+ ) {
241
+ useEffect(() => {
242
+ let unlisten: UnlistenFn;
243
+
244
+ listen<R>(listenEvent, (e) => {
245
+ handler(e.payload);
246
+ }).then(fn => {
247
+ unlisten = fn;
248
+ });
249
+
250
+ return () => {
251
+ if (unlisten) unlisten();
252
+ };
253
+ }, [listenEvent, handler]);
254
+
255
+ const send = useCallback(async (data: T) => {
256
+ await emit(emitEvent, data);
257
+ }, [emitEvent]);
258
+
259
+ return send;
260
+ }
261
+
262
+ // Usage
263
+ function Chat() {
264
+ const [messages, setMessages] = useState<string[]>([]);
265
+
266
+ const sendMessage = useTauriEventEmitter<string, string>(
267
+ 'send-message',
268
+ 'receive-message',
269
+ (msg) => setMessages(prev => [...prev, msg])
270
+ );
271
+
272
+ return (
273
+ <div>
274
+ {messages.map((msg, i) => <div key={i}>{msg}</div>)}
275
+ <button onClick={() => sendMessage('Hello!')}>Send</button>
276
+ </div>
277
+ );
278
+ }
279
+ ```
280
+
281
+ ### Context Provider Pattern
282
+
283
+ ```typescript
284
+ // src/contexts/TauriContext.tsx
285
+ import React, { createContext, useContext, useState, useEffect } from 'react';
286
+ import { invoke } from '@tauri-apps/api/core';
287
+
288
+ interface AppState {
289
+ config: UserConfig | null;
290
+ updateConfig: (config: Partial<UserConfig>) => Promise<void>;
291
+ }
292
+
293
+ const TauriContext = createContext<AppState | undefined>(undefined);
294
+
295
+ export function TauriProvider({ children }: { children: React.ReactNode }) {
296
+ const [config, setConfig] = useState<UserConfig | null>(null);
297
+
298
+ useEffect(() => {
299
+ invoke<UserConfig>('get_config').then(setConfig);
300
+ }, []);
301
+
302
+ const updateConfig = async (newConfig: Partial<UserConfig>) => {
303
+ await invoke('update_config', { config: newConfig });
304
+ setConfig(prev => ({ ...prev!, ...newConfig }));
305
+ };
306
+
307
+ return (
308
+ <TauriContext.Provider value={{ config, updateConfig }}>
309
+ {children}
310
+ </TauriContext.Provider>
311
+ );
312
+ }
313
+
314
+ export function useTauri() {
315
+ const context = useContext(TauriContext);
316
+ if (!context) throw new Error('useTauri must be used within TauriProvider');
317
+ return context;
318
+ }
319
+
320
+ // Usage
321
+ function App() {
322
+ return (
323
+ <TauriProvider>
324
+ <SettingsPanel />
325
+ </TauriProvider>
326
+ );
327
+ }
328
+
329
+ function SettingsPanel() {
330
+ const { config, updateConfig } = useTauri();
331
+
332
+ return (
333
+ <div>
334
+ <label>
335
+ <input
336
+ type="checkbox"
337
+ checked={config?.autoSave}
338
+ onChange={(e) => updateConfig({ autoSave: e.target.checked })}
339
+ />
340
+ Auto Save
341
+ </label>
342
+ </div>
343
+ );
344
+ }
345
+ ```
346
+
347
+ ## Vue 3 Integration
348
+
349
+ ### Composition API Composables
350
+
351
+ ```typescript
352
+ // src/composables/useTauriCommand.ts
353
+ import { ref, Ref, onMounted } from 'vue';
354
+ import { invoke } from '@tauri-apps/api/core';
355
+
356
+ export function useTauriCommand<T>(
357
+ command: string,
358
+ args?: Record<string, unknown>,
359
+ immediate: boolean = true
360
+ ) {
361
+ const data: Ref<T | null> = ref(null);
362
+ const loading = ref(immediate);
363
+ const error: Ref<string | null> = ref(null);
364
+
365
+ const execute = async () => {
366
+ loading.value = true;
367
+ error.value = null;
368
+
369
+ try {
370
+ data.value = await invoke<T>(command, args);
371
+ } catch (e) {
372
+ error.value = String(e);
373
+ } finally {
374
+ loading.value = false;
375
+ }
376
+ };
377
+
378
+ if (immediate) {
379
+ onMounted(execute);
380
+ }
381
+
382
+ return { data, loading, error, refetch: execute };
383
+ }
384
+
385
+ // Usage in component
386
+ <script setup lang="ts">
387
+ import { useTauriCommand } from '@/composables/useTauriCommand';
388
+
389
+ const { data: files, loading, error } = useTauriCommand<FileMetadata[]>(
390
+ 'list_files',
391
+ { directory: '/home/user' }
392
+ );
393
+ </script>
394
+
395
+ <template>
396
+ <div v-if="loading">Loading...</div>
397
+ <div v-else-if="error">Error: {{ error }}</div>
398
+ <div v-else>
399
+ <div v-for="file in files" :key="file.name">
400
+ {{ file.name }}
401
+ </div>
402
+ </div>
403
+ </template>
404
+ ```
405
+
406
+ ### Event Composable
407
+
408
+ ```typescript
409
+ // src/composables/useTauriEvent.ts
410
+ import { ref, Ref, onMounted, onUnmounted } from 'vue';
411
+ import { listen, UnlistenFn } from '@tauri-apps/api/event';
412
+
413
+ export function useTauriEvent<T>(event: string): Ref<T | null> {
414
+ const data: Ref<T | null> = ref(null);
415
+ let unlisten: UnlistenFn;
416
+
417
+ onMounted(async () => {
418
+ unlisten = await listen<T>(event, (e) => {
419
+ data.value = e.payload;
420
+ });
421
+ });
422
+
423
+ onUnmounted(() => {
424
+ if (unlisten) unlisten();
425
+ });
426
+
427
+ return data;
428
+ }
429
+
430
+ // Usage
431
+ <script setup lang="ts">
432
+ const progress = useTauriEvent<{ current: number; total: number }>('download-progress');
433
+ </script>
434
+
435
+ <template>
436
+ <div v-if="progress">
437
+ {{ Math.floor((progress.current / progress.total) * 100) }}%
438
+ </div>
439
+ </template>
440
+ ```
441
+
442
+ ### Provide/Inject Pattern
443
+
444
+ ```typescript
445
+ // src/composables/useTauriApp.ts
446
+ import { provide, inject, InjectionKey, Ref, ref, onMounted } from 'vue';
447
+ import { invoke } from '@tauri-apps/api/core';
448
+
449
+ interface TauriApp {
450
+ config: Ref<UserConfig | null>;
451
+ updateConfig: (config: Partial<UserConfig>) => Promise<void>;
452
+ }
453
+
454
+ const TauriAppKey: InjectionKey<TauriApp> = Symbol('TauriApp');
455
+
456
+ export function provideTauriApp() {
457
+ const config = ref<UserConfig | null>(null);
458
+
459
+ onMounted(async () => {
460
+ config.value = await invoke<UserConfig>('get_config');
461
+ });
462
+
463
+ const updateConfig = async (newConfig: Partial<UserConfig>) => {
464
+ await invoke('update_config', { config: newConfig });
465
+ config.value = { ...config.value!, ...newConfig };
466
+ };
467
+
468
+ const app: TauriApp = { config, updateConfig };
469
+ provide(TauriAppKey, app);
470
+ }
471
+
472
+ export function useTauriApp(): TauriApp {
473
+ const app = inject(TauriAppKey);
474
+ if (!app) throw new Error('useTauriApp must be called within TauriApp provider');
475
+ return app;
476
+ }
477
+ ```
478
+
479
+ ## Svelte Integration
480
+
481
+ ### Svelte Stores
482
+
483
+ ```typescript
484
+ // src/stores/tauri.ts
485
+ import { writable, derived, Readable } from 'svelte/store';
486
+ import { invoke } from '@tauri-apps/api/core';
487
+ import { listen } from '@tauri-apps/api/event';
488
+
489
+ export function createCommandStore<T>(command: string, args?: Record<string, unknown>) {
490
+ const { subscribe, set } = writable<{
491
+ data: T | null;
492
+ loading: boolean;
493
+ error: string | null;
494
+ }>({
495
+ data: null,
496
+ loading: true,
497
+ error: null
498
+ });
499
+
500
+ const load = async () => {
501
+ set({ data: null, loading: true, error: null });
502
+
503
+ try {
504
+ const data = await invoke<T>(command, args);
505
+ set({ data, loading: false, error: null });
506
+ } catch (error) {
507
+ set({ data: null, loading: false, error: String(error) });
508
+ }
509
+ };
510
+
511
+ load();
512
+
513
+ return {
514
+ subscribe,
515
+ refetch: load
516
+ };
517
+ }
518
+
519
+ // Usage
520
+ <script lang="ts">
521
+ import { createCommandStore } from '$lib/stores/tauri';
522
+
523
+ const files = createCommandStore<FileMetadata[]>('list_files', {
524
+ directory: '/home/user'
525
+ });
526
+ </script>
527
+
528
+ {#if $files.loading}
529
+ <div>Loading...</div>
530
+ {:else if $files.error}
531
+ <div>Error: {$files.error}</div>
532
+ {:else}
533
+ {#each $files.data ?? [] as file}
534
+ <div>{file.name}</div>
535
+ {/each}
536
+ {/if}
537
+ ```
538
+
539
+ ### Event Store
540
+
541
+ ```typescript
542
+ // src/stores/events.ts
543
+ import { writable } from 'svelte/store';
544
+ import { listen, UnlistenFn } from '@tauri-apps/api/event';
545
+
546
+ export function createEventStore<T>(event: string) {
547
+ const { subscribe, set } = writable<T | null>(null);
548
+
549
+ let unlisten: UnlistenFn;
550
+
551
+ listen<T>(event, (e) => {
552
+ set(e.payload);
553
+ }).then(fn => {
554
+ unlisten = fn;
555
+ });
556
+
557
+ return {
558
+ subscribe,
559
+ cleanup: () => {
560
+ if (unlisten) unlisten();
561
+ }
562
+ };
563
+ }
564
+
565
+ // Usage
566
+ <script lang="ts">
567
+ import { onDestroy } from 'svelte';
568
+
569
+ const progress = createEventStore<{ current: number; total: number }>('download-progress');
570
+
571
+ onDestroy(() => {
572
+ progress.cleanup();
573
+ });
574
+ </script>
575
+
576
+ {#if $progress}
577
+ <div>
578
+ {Math.floor(($progress.current / $progress.total) * 100)}%
579
+ </div>
580
+ {/if}
581
+ ```
582
+
583
+ ## Framework-Agnostic Patterns
584
+
585
+ ### Observable Pattern
586
+
587
+ ```typescript
588
+ // src/utils/observable.ts
589
+ export class TauriObservable<T> {
590
+ private listeners: Set<(data: T) => void> = new Set();
591
+ private value: T | null = null;
592
+
593
+ subscribe(listener: (data: T) => void): () => void {
594
+ this.listeners.add(listener);
595
+ if (this.value !== null) listener(this.value);
596
+
597
+ return () => this.listeners.delete(listener);
598
+ }
599
+
600
+ emit(data: T) {
601
+ this.value = data;
602
+ this.listeners.forEach(listener => listener(data));
603
+ }
604
+
605
+ getValue(): T | null {
606
+ return this.value;
607
+ }
608
+ }
609
+
610
+ // Command observable
611
+ export function createCommandObservable<T>(
612
+ command: string,
613
+ args?: Record<string, unknown>
614
+ ): TauriObservable<T> {
615
+ const observable = new TauriObservable<T>();
616
+
617
+ invoke<T>(command, args)
618
+ .then(data => observable.emit(data))
619
+ .catch(err => console.error(err));
620
+
621
+ return observable;
622
+ }
623
+
624
+ // Event observable
625
+ export function createEventObservable<T>(event: string): TauriObservable<T> {
626
+ const observable = new TauriObservable<T>();
627
+
628
+ listen<T>(event, (e) => {
629
+ observable.emit(e.payload);
630
+ });
631
+
632
+ return observable;
633
+ }
634
+ ```
635
+
636
+ ## Error Boundaries
637
+
638
+ ### React Error Boundary
639
+
640
+ ```typescript
641
+ // src/components/TauriErrorBoundary.tsx
642
+ import React, { Component, ErrorInfo, ReactNode } from 'react';
643
+
644
+ interface Props {
645
+ children: ReactNode;
646
+ fallback?: (error: Error) => ReactNode;
647
+ }
648
+
649
+ interface State {
650
+ hasError: boolean;
651
+ error: Error | null;
652
+ }
653
+
654
+ export class TauriErrorBoundary extends Component<Props, State> {
655
+ state: State = {
656
+ hasError: false,
657
+ error: null
658
+ };
659
+
660
+ static getDerivedStateFromError(error: Error): State {
661
+ return { hasError: true, error };
662
+ }
663
+
664
+ componentDidCatch(error: Error, errorInfo: ErrorInfo) {
665
+ console.error('Tauri Error:', error, errorInfo);
666
+
667
+ // Log to backend
668
+ import('@tauri-apps/api/core').then(({ invoke }) => {
669
+ invoke('log_error', {
670
+ error: error.toString(),
671
+ info: errorInfo.componentStack
672
+ }).catch(console.error);
673
+ });
674
+ }
675
+
676
+ render() {
677
+ if (this.state.hasError && this.state.error) {
678
+ if (this.props.fallback) {
679
+ return this.props.fallback(this.state.error);
680
+ }
681
+
682
+ return (
683
+ <div className="error-boundary">
684
+ <h2>Something went wrong</h2>
685
+ <pre>{this.state.error.message}</pre>
686
+ </div>
687
+ );
688
+ }
689
+
690
+ return this.props.children;
691
+ }
692
+ }
693
+
694
+ // Usage
695
+ <TauriErrorBoundary>
696
+ <App />
697
+ </TauriErrorBoundary>
698
+ ```
699
+
700
+ ## Best Practices
701
+
702
+ 1. **Type everything** - Full TypeScript types across IPC boundary
703
+ 2. **Service layer** - Abstract Tauri commands into typed service
704
+ 3. **Framework hooks/composables** - Idiomatic patterns for each framework
705
+ 4. **Error boundaries** - Catch and log Tauri errors
706
+ 5. **Loading states** - Always handle loading/error states
707
+ 6. **Event cleanup** - Unlisten from events on unmount
708
+ 7. **Result types** - Use Result<T, E> for explicit error handling
709
+ 8. **Context/Provide** - Share Tauri state across component tree
710
+ 9. **Observable pattern** - Framework-agnostic state management
711
+ 10. **Async safety** - Handle race conditions and cancellation
712
+
713
+ ## Common Pitfalls
714
+
715
+ ❌ **Not unlistening from events**:
716
+ ```typescript
717
+ // WRONG - memory leak
718
+ useEffect(() => {
719
+ listen('my-event', handler);
720
+ }, []);
721
+
722
+ // CORRECT - cleanup
723
+ useEffect(() => {
724
+ let unlisten: UnlistenFn;
725
+ listen('my-event', handler).then(fn => unlisten = fn);
726
+ return () => { if (unlisten) unlisten(); };
727
+ }, []);
728
+ ```
729
+
730
+ ❌ **Missing loading/error states**:
731
+ ```typescript
732
+ // WRONG - no feedback
733
+ const data = await invoke('command');
734
+ return <div>{data}</div>;
735
+
736
+ // CORRECT - handle all states
737
+ const { data, loading, error } = useTauriCommand('command');
738
+ if (loading) return <div>Loading...</div>;
739
+ if (error) return <div>Error: {error}</div>;
740
+ return <div>{data}</div>;
741
+ ```
742
+
743
+ ❌ **Invoking in render**:
744
+ ```typescript
745
+ // WRONG - invokes every render
746
+ function Component() {
747
+ const data = invoke('command'); // DON'T DO THIS
748
+ }
749
+
750
+ // CORRECT - use hooks/effects
751
+ function Component() {
752
+ const { data } = useTauriCommand('command');
753
+ }
754
+ ```
755
+
756
+ ## Summary
757
+
758
+ - **TypeScript service layer** for type-safe command abstraction
759
+ - **React hooks** (useTauriCommand, useTauriEvent) for declarative data
760
+ - **Vue composables** with Composition API patterns
761
+ - **Svelte stores** for reactive command/event data
762
+ - **Framework-agnostic** observable pattern
763
+ - **Error boundaries** to catch and log Tauri errors
764
+ - **Result types** for explicit error handling
765
+ - **Context patterns** for shared Tauri state
766
+ - **Event cleanup** to prevent memory leaks
767
+ - **Type safety** across entire IPC boundary