claude-mpm 5.4.36__py3-none-any.whl → 5.4.62__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 (254) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +5 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +489 -177
  4. claude_mpm/agents/base_agent.json +1 -1
  5. claude_mpm/agents/frontmatter_validator.py +2 -2
  6. claude_mpm/cli/commands/configure_agent_display.py +12 -0
  7. claude_mpm/cli/commands/mpm_init/core.py +72 -0
  8. claude_mpm/cli/commands/profile.py +276 -0
  9. claude_mpm/cli/commands/skills.py +14 -18
  10. claude_mpm/cli/executor.py +10 -0
  11. claude_mpm/cli/parsers/base_parser.py +7 -0
  12. claude_mpm/cli/parsers/profile_parser.py +147 -0
  13. claude_mpm/cli/parsers/skills_parser.py +0 -6
  14. claude_mpm/cli/startup.py +433 -147
  15. claude_mpm/commands/mpm-config.md +13 -250
  16. claude_mpm/commands/mpm-doctor.md +9 -22
  17. claude_mpm/commands/mpm-help.md +5 -206
  18. claude_mpm/commands/mpm-init.md +81 -507
  19. claude_mpm/commands/mpm-monitor.md +15 -402
  20. claude_mpm/commands/mpm-organize.md +61 -441
  21. claude_mpm/commands/mpm-postmortem.md +6 -108
  22. claude_mpm/commands/mpm-session-resume.md +12 -363
  23. claude_mpm/commands/mpm-status.md +5 -69
  24. claude_mpm/commands/mpm-ticket-view.md +52 -495
  25. claude_mpm/commands/mpm-version.md +5 -107
  26. claude_mpm/core/optimized_startup.py +61 -0
  27. claude_mpm/core/shared/config_loader.py +3 -1
  28. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  29. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  30. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CWc5urbQ.js → 4TdZjIqw.js} +1 -1
  31. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  32. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  33. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  34. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  35. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  36. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  37. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  38. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  39. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
  40. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  41. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  42. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  43. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  44. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  45. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  46. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  47. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  48. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  49. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  50. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  51. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  52. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  53. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  54. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  55. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  56. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  57. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  58. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  59. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  60. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  74. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  75. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  76. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  77. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
  78. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  79. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{N4qtv3Hx.js → Vzk33B_K.js} +1 -1
  80. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  81. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  82. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  83. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  84. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  85. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  86. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  87. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  88. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  89. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.CAGBuiOw.js → 0.m1gL8KXf.js} +1 -1
  90. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  91. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  92. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  93. claude_mpm/dashboard/static/svelte-build/index.html +10 -10
  94. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  95. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  96. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  97. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  98. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  99. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  100. claude_mpm/init.py +276 -0
  101. claude_mpm/services/agents/agent_builder.py +3 -3
  102. claude_mpm/services/agents/deployment/agent_deployment.py +22 -0
  103. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
  104. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  105. claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
  106. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  107. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  108. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +149 -4
  109. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +47 -26
  110. claude_mpm/services/agents/git_source_manager.py +21 -2
  111. claude_mpm/services/agents/sources/git_source_sync_service.py +116 -5
  112. claude_mpm/services/monitor/management/lifecycle.py +7 -1
  113. claude_mpm/services/pm_skills_deployer.py +711 -0
  114. claude_mpm/services/profile_manager.py +337 -0
  115. claude_mpm/services/skills/git_skill_source_manager.py +148 -11
  116. claude_mpm/services/skills/selective_skill_deployer.py +97 -48
  117. claude_mpm/services/skills_deployer.py +161 -65
  118. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  119. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  120. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  121. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  122. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  123. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  124. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  125. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  126. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  127. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  128. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  129. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  130. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  131. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  132. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  133. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  134. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  135. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  136. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  137. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  138. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  139. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  140. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  141. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  142. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  143. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  144. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  145. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  146. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  147. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  148. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  149. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  150. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  151. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  152. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  153. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  154. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  155. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  156. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  157. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  158. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  159. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  160. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  161. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  162. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  163. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  164. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  165. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  166. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  167. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  168. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  169. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  170. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  171. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  172. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  173. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  174. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  175. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  176. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  177. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  178. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  179. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  180. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  181. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  182. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  183. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  184. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  185. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  186. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  187. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  188. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  189. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  190. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  191. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  192. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  193. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  194. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  195. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  196. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  197. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  198. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  199. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  200. claude_mpm/skills/bundled/security-scanning.md +112 -0
  201. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  202. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  203. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  204. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  205. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  206. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  207. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  208. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  209. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  210. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  211. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  212. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  213. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  214. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  215. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  216. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  217. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  218. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  219. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  220. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  221. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  222. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  223. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  224. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  225. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  226. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  227. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  228. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  229. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  231. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  232. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  233. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  234. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  235. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  236. claude_mpm/skills/skill_manager.py +98 -3
  237. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  238. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/METADATA +3 -2
  239. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/RECORD +244 -68
  240. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
  241. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
  242. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
  243. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
  249. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  250. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/WHEEL +0 -0
  251. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/entry_points.txt +0 -0
  252. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE +0 -0
  253. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  254. {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,628 @@
1
+ ---
2
+ name: tauri-window-management
3
+ description: Advanced window management in Tauri including multi-window apps, window creation, communication, lifecycle, and window-specific state
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Multi-window management: creation, communication, lifecycle, window-specific state, modals, and inter-window messaging"
11
+ when_to_use: "Building apps with multiple windows, settings dialogs, modal windows, or complex window layouts"
12
+ quick_start: "1. Create windows with WindowBuilder 2. Use window labels 3. Emit events between windows 4. Manage window state"
13
+ context_limit: 600
14
+ tags:
15
+ - tauri
16
+ - windows
17
+ - multi-window
18
+ - window-management
19
+ - modals
20
+ requires_tools: []
21
+ ---
22
+
23
+ # Tauri Window Management
24
+
25
+ ## Window Creation
26
+
27
+ ### Basic Window Creation
28
+
29
+ ```rust
30
+ use tauri::{Manager, WindowBuilder, WindowUrl};
31
+
32
+ #[tauri::command]
33
+ async fn open_settings(app: tauri::AppHandle) -> Result<(), String> {
34
+ // Check if window already exists
35
+ if app.get_window("settings").is_some() {
36
+ return Err("Settings window already open".to_string());
37
+ }
38
+
39
+ WindowBuilder::new(
40
+ &app,
41
+ "settings", // Unique window label
42
+ WindowUrl::App("settings.html".into())
43
+ )
44
+ .title("Settings")
45
+ .inner_size(800.0, 600.0)
46
+ .resizable(true)
47
+ .center()
48
+ .build()
49
+ .map_err(|e| e.to_string())?;
50
+
51
+ Ok(())
52
+ }
53
+ ```
54
+
55
+ ### Advanced Window Configuration
56
+
57
+ ```rust
58
+ #[tauri::command]
59
+ async fn create_editor_window(
60
+ filepath: String,
61
+ app: tauri::AppHandle,
62
+ ) -> Result<String, String> {
63
+ use tauri::WindowBuilder;
64
+
65
+ let window_label = format!("editor-{}", uuid::Uuid::new_v4());
66
+
67
+ let window = WindowBuilder::new(
68
+ &app,
69
+ window_label.clone(),
70
+ WindowUrl::App("editor.html".into())
71
+ )
72
+ .title(format!("Editing: {}", filepath))
73
+ .inner_size(1200.0, 800.0)
74
+ .min_inner_size(400.0, 300.0)
75
+ .resizable(true)
76
+ .decorations(true)
77
+ .always_on_top(false)
78
+ .skip_taskbar(false)
79
+ .visible(false) // Start hidden, show after load
80
+ .center()
81
+ .build()
82
+ .map_err(|e| e.to_string())?;
83
+
84
+ // Store filepath in window config
85
+ window.set_title(&format!("Editing: {}", filepath))
86
+ .map_err(|e| e.to_string())?;
87
+
88
+ // Show window after creation
89
+ window.show().map_err(|e| e.to_string())?;
90
+
91
+ Ok(window_label)
92
+ }
93
+ ```
94
+
95
+ ### Modal/Dialog Windows
96
+
97
+ ```rust
98
+ #[tauri::command]
99
+ async fn open_modal_dialog(
100
+ app: tauri::AppHandle,
101
+ parent_label: String,
102
+ ) -> Result<(), String> {
103
+ let parent = app.get_window(&parent_label)
104
+ .ok_or("Parent window not found")?;
105
+
106
+ WindowBuilder::new(
107
+ &app,
108
+ "modal-dialog",
109
+ WindowUrl::App("dialog.html".into())
110
+ )
111
+ .title("Confirm Action")
112
+ .inner_size(400.0, 200.0)
113
+ .resizable(false)
114
+ .decorations(true)
115
+ .always_on_top(true) // Stay on top
116
+ .skip_taskbar(true) // Don't show in taskbar
117
+ .center()
118
+ .parent_window(parent.hwnd().map_err(|e| e.to_string())?)
119
+ .build()
120
+ .map_err(|e| e.to_string())?;
121
+
122
+ Ok(())
123
+ }
124
+ ```
125
+
126
+ ## Window Communication
127
+
128
+ ### Targeted Window Messaging
129
+
130
+ ```rust
131
+ #[tauri::command]
132
+ async fn send_to_window(
133
+ target_label: String,
134
+ message: String,
135
+ app: tauri::AppHandle,
136
+ ) -> Result<(), String> {
137
+ if let Some(window) = app.get_window(&target_label) {
138
+ window.emit("message", message)
139
+ .map_err(|e| e.to_string())?;
140
+ Ok(())
141
+ } else {
142
+ Err(format!("Window '{}' not found", target_label))
143
+ }
144
+ }
145
+
146
+ #[tauri::command]
147
+ async fn broadcast_to_all(
148
+ message: String,
149
+ app: tauri::AppHandle,
150
+ ) -> Result<(), String> {
151
+ app.emit_all("broadcast", message)
152
+ .map_err(|e| e.to_string())
153
+ }
154
+ ```
155
+
156
+ ### Window-to-Window Relay
157
+
158
+ ```rust
159
+ #[derive(serde::Deserialize)]
160
+ struct WindowMessage {
161
+ target: String,
162
+ payload: serde_json::Value,
163
+ }
164
+
165
+ #[tauri::command]
166
+ async fn relay_message(
167
+ msg: WindowMessage,
168
+ app: tauri::AppHandle,
169
+ ) -> Result<(), String> {
170
+ if let Some(target_window) = app.get_window(&msg.target) {
171
+ target_window.emit("relay", msg.payload)
172
+ .map_err(|e| e.to_string())?;
173
+ Ok(())
174
+ } else {
175
+ Err(format!("Target window '{}' not found", msg.target))
176
+ }
177
+ }
178
+ ```
179
+
180
+ **Frontend sender**:
181
+ ```typescript
182
+ import { invoke } from '@tauri-apps/api/core';
183
+
184
+ async function sendToWindow(target: string, data: any) {
185
+ await invoke('relay_message', {
186
+ msg: {
187
+ target,
188
+ payload: data
189
+ }
190
+ });
191
+ }
192
+ ```
193
+
194
+ **Frontend receiver**:
195
+ ```typescript
196
+ import { listen } from '@tauri-apps/api/event';
197
+
198
+ listen('relay', (event) => {
199
+ console.log('Received from another window:', event.payload);
200
+ });
201
+ ```
202
+
203
+ ## Window Lifecycle
204
+
205
+ ### Window Close Handling
206
+
207
+ ```rust
208
+ use tauri::Manager;
209
+
210
+ fn main() {
211
+ tauri::Builder::default()
212
+ .on_window_event(|event| {
213
+ match event.event() {
214
+ tauri::WindowEvent::CloseRequested { api, .. } => {
215
+ let window = event.window();
216
+
217
+ // Prevent close and show confirmation
218
+ api.prevent_close();
219
+
220
+ // Emit event to frontend for confirmation
221
+ window.emit("close-requested", ()).unwrap();
222
+ }
223
+ tauri::WindowEvent::Destroyed => {
224
+ println!("Window {} destroyed", event.window().label());
225
+ }
226
+ _ => {}
227
+ }
228
+ })
229
+ .run(tauri::generate_context!())
230
+ .expect("error while running tauri application");
231
+ }
232
+ ```
233
+
234
+ **Frontend close confirmation**:
235
+ ```typescript
236
+ import { listen } from '@tauri-apps/api/event';
237
+ import { getCurrent } from '@tauri-apps/api/window';
238
+
239
+ listen('close-requested', async () => {
240
+ const confirmed = confirm('Are you sure you want to close?');
241
+
242
+ if (confirmed) {
243
+ const window = getCurrent();
244
+ await window.close();
245
+ }
246
+ });
247
+ ```
248
+
249
+ ### Window Focus Management
250
+
251
+ ```rust
252
+ #[tauri::command]
253
+ async fn focus_window(
254
+ label: String,
255
+ app: tauri::AppHandle,
256
+ ) -> Result<(), String> {
257
+ if let Some(window) = app.get_window(&label) {
258
+ window.set_focus().map_err(|e| e.to_string())?;
259
+ Ok(())
260
+ } else {
261
+ Err(format!("Window '{}' not found", label))
262
+ }
263
+ }
264
+
265
+ #[tauri::command]
266
+ async fn minimize_window(
267
+ label: String,
268
+ app: tauri::AppHandle,
269
+ ) -> Result<(), String> {
270
+ if let Some(window) = app.get_window(&label) {
271
+ window.minimize().map_err(|e| e.to_string())?;
272
+ Ok(())
273
+ } else {
274
+ Err("Window not found".to_string())
275
+ }
276
+ }
277
+
278
+ #[tauri::command]
279
+ async fn maximize_window(
280
+ label: String,
281
+ app: tauri::AppHandle,
282
+ ) -> Result<(), String> {
283
+ if let Some(window) = app.get_window(&label) {
284
+ window.maximize().map_err(|e| e.to_string())?;
285
+ Ok(())
286
+ } else {
287
+ Err("Window not found".to_string())
288
+ }
289
+ }
290
+ ```
291
+
292
+ ## Window-Specific State
293
+
294
+ ### Per-Window Data Management
295
+
296
+ ```rust
297
+ use std::sync::Arc;
298
+ use dashmap::DashMap;
299
+
300
+ pub struct WindowData {
301
+ pub filepath: Option<String>,
302
+ pub modified: bool,
303
+ pub cursor_position: (usize, usize),
304
+ }
305
+
306
+ pub struct AppState {
307
+ pub window_data: Arc<DashMap<String, WindowData>>,
308
+ }
309
+
310
+ #[tauri::command]
311
+ async fn set_window_data(
312
+ window: tauri::Window,
313
+ filepath: String,
314
+ state: tauri::State<'_, AppState>,
315
+ ) -> Result<(), String> {
316
+ let label = window.label().to_string();
317
+
318
+ state.window_data.insert(label, WindowData {
319
+ filepath: Some(filepath),
320
+ modified: false,
321
+ cursor_position: (0, 0),
322
+ });
323
+
324
+ Ok(())
325
+ }
326
+
327
+ #[tauri::command]
328
+ async fn get_window_data(
329
+ window: tauri::Window,
330
+ state: tauri::State<'_, AppState>,
331
+ ) -> Result<Option<WindowData>, String> {
332
+ let label = window.label();
333
+
334
+ Ok(state.window_data.get(label)
335
+ .map(|entry| entry.value().clone()))
336
+ }
337
+
338
+ #[tauri::command]
339
+ async fn mark_window_modified(
340
+ window: tauri::Window,
341
+ state: tauri::State<'_, AppState>,
342
+ ) -> Result<(), String> {
343
+ let label = window.label();
344
+
345
+ if let Some(mut entry) = state.window_data.get_mut(label) {
346
+ entry.modified = true;
347
+
348
+ // Update window title to show modified
349
+ window.set_title(&format!("{}*", entry.filepath.as_deref().unwrap_or("Untitled")))
350
+ .map_err(|e| e.to_string())?;
351
+ }
352
+
353
+ Ok(())
354
+ }
355
+ ```
356
+
357
+ ## Window Management Patterns
358
+
359
+ ### Window Registry
360
+
361
+ ```rust
362
+ use std::collections::HashMap;
363
+
364
+ pub struct WindowRegistry {
365
+ windows: Arc<Mutex<HashMap<String, WindowMetadata>>>,
366
+ }
367
+
368
+ #[derive(Clone)]
369
+ struct WindowMetadata {
370
+ label: String,
371
+ window_type: WindowType,
372
+ created_at: SystemTime,
373
+ parent: Option<String>,
374
+ }
375
+
376
+ #[derive(Clone)]
377
+ enum WindowType {
378
+ Main,
379
+ Editor,
380
+ Settings,
381
+ Dialog,
382
+ }
383
+
384
+ impl WindowRegistry {
385
+ pub async fn register(&self, label: String, window_type: WindowType) {
386
+ let mut windows = self.windows.lock().await;
387
+ windows.insert(label.clone(), WindowMetadata {
388
+ label,
389
+ window_type,
390
+ created_at: SystemTime::now(),
391
+ parent: None,
392
+ });
393
+ }
394
+
395
+ pub async fn unregister(&self, label: &str) {
396
+ let mut windows = self.windows.lock().await;
397
+ windows.remove(label);
398
+ }
399
+
400
+ pub async fn get_windows_by_type(&self, window_type: WindowType) -> Vec<String> {
401
+ let windows = self.windows.lock().await;
402
+ windows.values()
403
+ .filter(|m| matches!(m.window_type, window_type))
404
+ .map(|m| m.label.clone())
405
+ .collect()
406
+ }
407
+ }
408
+ ```
409
+
410
+ ### Single Instance Window Pattern
411
+
412
+ ```rust
413
+ use std::sync::Arc;
414
+ use tokio::sync::Mutex;
415
+
416
+ pub struct SingletonWindows {
417
+ settings: Arc<Mutex<Option<String>>>,
418
+ about: Arc<Mutex<Option<String>>>,
419
+ }
420
+
421
+ #[tauri::command]
422
+ async fn open_settings_singleton(
423
+ app: tauri::AppHandle,
424
+ state: tauri::State<'_, SingletonWindows>,
425
+ ) -> Result<(), String> {
426
+ let mut settings_lock = state.settings.lock().await;
427
+
428
+ // Check if window already exists
429
+ if let Some(label) = settings_lock.as_ref() {
430
+ if let Some(window) = app.get_window(label) {
431
+ // Focus existing window
432
+ window.set_focus().map_err(|e| e.to_string())?;
433
+ return Ok(());
434
+ }
435
+ }
436
+
437
+ // Create new window
438
+ let label = "settings".to_string();
439
+ WindowBuilder::new(
440
+ &app,
441
+ label.clone(),
442
+ WindowUrl::App("settings.html".into())
443
+ )
444
+ .title("Settings")
445
+ .build()
446
+ .map_err(|e| e.to_string())?;
447
+
448
+ *settings_lock = Some(label);
449
+
450
+ Ok(())
451
+ }
452
+ ```
453
+
454
+ ## Frontend Window API
455
+
456
+ ### Getting Current Window
457
+
458
+ ```typescript
459
+ import { getCurrent, Window } from '@tauri-apps/api/window';
460
+
461
+ const currentWindow = getCurrent();
462
+ console.log('Current window label:', currentWindow.label);
463
+
464
+ // Window operations
465
+ await currentWindow.minimize();
466
+ await currentWindow.maximize();
467
+ await currentWindow.setTitle('New Title');
468
+ await currentWindow.close();
469
+ ```
470
+
471
+ ### Creating Windows from Frontend
472
+
473
+ ```typescript
474
+ import { WebviewWindow } from '@tauri-apps/api/window';
475
+
476
+ async function createNewEditor() {
477
+ const webview = new WebviewWindow('editor-1', {
478
+ url: 'editor.html',
479
+ title: 'Editor',
480
+ width: 800,
481
+ height: 600,
482
+ center: true,
483
+ });
484
+
485
+ // Wait for window to load
486
+ await webview.once('tauri://created', () => {
487
+ console.log('Window created');
488
+ });
489
+
490
+ await webview.once('tauri://error', (e) => {
491
+ console.error('Window creation error:', e);
492
+ });
493
+ }
494
+ ```
495
+
496
+ ### Window Events
497
+
498
+ ```typescript
499
+ import { getCurrent } from '@tauri-apps/api/window';
500
+
501
+ const window = getCurrent();
502
+
503
+ // Listen for window events
504
+ await window.listen('tauri://focus', () => {
505
+ console.log('Window focused');
506
+ });
507
+
508
+ await window.listen('tauri://blur', () => {
509
+ console.log('Window lost focus');
510
+ });
511
+
512
+ await window.listen('tauri://resize', (event) => {
513
+ console.log('Window resized:', event.payload);
514
+ });
515
+ ```
516
+
517
+ ## Best Practices
518
+
519
+ 1. **Use unique window labels** - Prevents collisions
520
+ 2. **Check window existence** - Before creating duplicates
521
+ 3. **Clean up window state** - When windows close
522
+ 4. **Focus existing windows** - Instead of creating duplicates
523
+ 5. **Use parent windows** - For modal dialogs
524
+ 6. **Handle close requests** - Prevent data loss
525
+ 7. **Emit events for communication** - Not direct window access
526
+ 8. **Store window-specific data** - In centralized state
527
+ 9. **Use skip_taskbar for dialogs** - Better UX
528
+ 10. **Center dialogs** - Always center modal windows
529
+
530
+ ## Common Patterns
531
+
532
+ ### Settings Window Pattern
533
+
534
+ ```rust
535
+ #[tauri::command]
536
+ async fn toggle_settings(app: tauri::AppHandle) -> Result<(), String> {
537
+ if let Some(window) = app.get_window("settings") {
538
+ // Close if open
539
+ window.close().map_err(|e| e.to_string())?;
540
+ } else {
541
+ // Open if closed
542
+ WindowBuilder::new(&app, "settings", WindowUrl::App("settings.html".into()))
543
+ .title("Settings")
544
+ .inner_size(600.0, 400.0)
545
+ .center()
546
+ .build()
547
+ .map_err(|e| e.to_string())?;
548
+ }
549
+ Ok(())
550
+ }
551
+ ```
552
+
553
+ ### Multi-Document Interface (MDI)
554
+
555
+ ```rust
556
+ use std::sync::atomic::{AtomicUsize, Ordering};
557
+
558
+ static EDITOR_COUNTER: AtomicUsize = AtomicUsize::new(0);
559
+
560
+ #[tauri::command]
561
+ async fn new_document(app: tauri::AppHandle) -> Result<String, String> {
562
+ let id = EDITOR_COUNTER.fetch_add(1, Ordering::SeqCst);
563
+ let label = format!("editor-{}", id);
564
+
565
+ WindowBuilder::new(
566
+ &app,
567
+ label.clone(),
568
+ WindowUrl::App("editor.html".into())
569
+ )
570
+ .title(format!("Untitled {}", id))
571
+ .inner_size(800.0, 600.0)
572
+ .build()
573
+ .map_err(|e| e.to_string())?;
574
+
575
+ Ok(label)
576
+ }
577
+ ```
578
+
579
+ ## Common Pitfalls
580
+
581
+ ❌ **Creating duplicate windows without checking**:
582
+ ```rust
583
+ // WRONG - may create multiple settings windows
584
+ WindowBuilder::new(&app, "settings", url).build()?;
585
+
586
+ // CORRECT - check first
587
+ if app.get_window("settings").is_none() {
588
+ WindowBuilder::new(&app, "settings", url).build()?;
589
+ }
590
+ ```
591
+
592
+ ❌ **Not cleaning up window state**:
593
+ ```rust
594
+ // WRONG - state persists after window closes
595
+
596
+ // CORRECT - clean up in on_window_event
597
+ .on_window_event(|event| {
598
+ if let tauri::WindowEvent::Destroyed = event.event() {
599
+ let label = event.window().label();
600
+ // Clean up window-specific state
601
+ }
602
+ })
603
+ ```
604
+
605
+ ❌ **Forgetting to show hidden windows**:
606
+ ```rust
607
+ // WRONG - window created but invisible
608
+ let window = WindowBuilder::new(&app, label, url)
609
+ .visible(false)
610
+ .build()?;
611
+ // User sees nothing!
612
+
613
+ // CORRECT - show after creation
614
+ window.show()?;
615
+ ```
616
+
617
+ ## Summary
618
+
619
+ - **WindowBuilder** creates new windows with configuration
620
+ - **Window labels** must be unique identifiers
621
+ - **get_window()** retrieves existing window by label
622
+ - **emit()** sends events to specific windows
623
+ - **emit_all()** broadcasts to all windows
624
+ - **Window lifecycle** handled via on_window_event
625
+ - **Window-specific state** stored in DashMap with label as key
626
+ - **Singleton pattern** prevents duplicate utility windows
627
+ - **Modal dialogs** use parent_window and always_on_top
628
+ - **Frontend API** provides window control from JavaScript