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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +5 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +489 -177
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/frontmatter_validator.py +2 -2
- claude_mpm/cli/commands/configure_agent_display.py +12 -0
- claude_mpm/cli/commands/mpm_init/core.py +72 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/skills.py +14 -18
- claude_mpm/cli/executor.py +10 -0
- claude_mpm/cli/parsers/base_parser.py +7 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/skills_parser.py +0 -6
- claude_mpm/cli/startup.py +433 -147
- claude_mpm/commands/mpm-config.md +13 -250
- claude_mpm/commands/mpm-doctor.md +9 -22
- claude_mpm/commands/mpm-help.md +5 -206
- claude_mpm/commands/mpm-init.md +81 -507
- claude_mpm/commands/mpm-monitor.md +15 -402
- claude_mpm/commands/mpm-organize.md +61 -441
- claude_mpm/commands/mpm-postmortem.md +6 -108
- claude_mpm/commands/mpm-session-resume.md +12 -363
- claude_mpm/commands/mpm-status.md +5 -69
- claude_mpm/commands/mpm-ticket-view.md +52 -495
- claude_mpm/commands/mpm-version.md +5 -107
- claude_mpm/core/optimized_startup.py +61 -0
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CWc5urbQ.js → 4TdZjIqw.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{N4qtv3Hx.js → Vzk33B_K.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.CAGBuiOw.js → 0.m1gL8KXf.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
- claude_mpm/dashboard/static/svelte-build/index.html +10 -10
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/init.py +276 -0
- claude_mpm/services/agents/agent_builder.py +3 -3
- claude_mpm/services/agents/deployment/agent_deployment.py +22 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
- claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +149 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +47 -26
- claude_mpm/services/agents/git_source_manager.py +21 -2
- claude_mpm/services/agents/sources/git_source_sync_service.py +116 -5
- claude_mpm/services/monitor/management/lifecycle.py +7 -1
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/skills/git_skill_source_manager.py +148 -11
- claude_mpm/services/skills/selective_skill_deployer.py +97 -48
- claude_mpm/services/skills_deployer.py +161 -65
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +112 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/skill_manager.py +98 -3
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/METADATA +3 -2
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/RECORD +244 -68
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.36.dist-info → claude_mpm-5.4.62.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tauri-testing
|
|
3
|
+
description: Comprehensive testing strategies for Tauri apps including unit tests, integration tests, IPC mocking, and end-to-end testing
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: development
|
|
6
|
+
author: Claude MPM Team
|
|
7
|
+
license: MIT
|
|
8
|
+
progressive_disclosure:
|
|
9
|
+
entry_point:
|
|
10
|
+
summary: "Complete testing: unit tests for commands, integration tests for IPC, mocking patterns, E2E with WebDriver"
|
|
11
|
+
when_to_use: "Ensuring Tauri app quality with comprehensive test coverage for both Rust backend and frontend"
|
|
12
|
+
quick_start: "1. Unit test commands 2. Mock IPC in frontend 3. Integration test with MockRuntime 4. E2E with tauri-driver"
|
|
13
|
+
context_limit: 500
|
|
14
|
+
tags:
|
|
15
|
+
- tauri
|
|
16
|
+
- testing
|
|
17
|
+
- unit-tests
|
|
18
|
+
- integration-tests
|
|
19
|
+
- mocking
|
|
20
|
+
- e2e
|
|
21
|
+
requires_tools: []
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Tauri Testing Strategies
|
|
25
|
+
|
|
26
|
+
## Unit Testing Commands
|
|
27
|
+
|
|
28
|
+
```rust
|
|
29
|
+
// src-tauri/src/commands/files.rs
|
|
30
|
+
#[tauri::command]
|
|
31
|
+
pub async fn read_file_content(path: String) -> Result<String, String> {
|
|
32
|
+
tokio::fs::read_to_string(path)
|
|
33
|
+
.await
|
|
34
|
+
.map_err(|e| e.to_string())
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#[cfg(test)]
|
|
38
|
+
mod tests {
|
|
39
|
+
use super::*;
|
|
40
|
+
|
|
41
|
+
#[tokio::test]
|
|
42
|
+
async fn test_read_file_content() {
|
|
43
|
+
// Create temp file
|
|
44
|
+
let temp_dir = std::env::temp_dir();
|
|
45
|
+
let test_file = temp_dir.join("test.txt");
|
|
46
|
+
tokio::fs::write(&test_file, "test content").await.unwrap();
|
|
47
|
+
|
|
48
|
+
// Test command
|
|
49
|
+
let result = read_file_content(
|
|
50
|
+
test_file.to_string_lossy().to_string()
|
|
51
|
+
).await;
|
|
52
|
+
|
|
53
|
+
assert!(result.is_ok());
|
|
54
|
+
assert_eq!(result.unwrap(), "test content");
|
|
55
|
+
|
|
56
|
+
// Cleanup
|
|
57
|
+
tokio::fs::remove_file(test_file).await.unwrap();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[tokio::test]
|
|
61
|
+
async fn test_read_nonexistent_file() {
|
|
62
|
+
let result = read_file_content("/nonexistent/file.txt".to_string()).await;
|
|
63
|
+
assert!(result.is_err());
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Testing with State
|
|
69
|
+
|
|
70
|
+
```rust
|
|
71
|
+
use std::sync::Arc;
|
|
72
|
+
use tokio::sync::Mutex;
|
|
73
|
+
|
|
74
|
+
#[cfg(test)]
|
|
75
|
+
mod tests {
|
|
76
|
+
use super::*;
|
|
77
|
+
|
|
78
|
+
async fn create_test_state() -> AppState {
|
|
79
|
+
AppState {
|
|
80
|
+
database: Arc::new(Mutex::new(Database::new_in_memory())),
|
|
81
|
+
config: Arc::new(Mutex::new(Config::default())),
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[tokio::test]
|
|
86
|
+
async fn test_command_with_state() {
|
|
87
|
+
let state = create_test_state().await;
|
|
88
|
+
|
|
89
|
+
// Mock State wrapper
|
|
90
|
+
struct MockState(AppState);
|
|
91
|
+
|
|
92
|
+
impl<'r> tauri::State<'r, AppState> {
|
|
93
|
+
fn new_mock(state: AppState) -> Self {
|
|
94
|
+
// Use internal test API
|
|
95
|
+
unimplemented!("Use integration test instead")
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// For unit tests, call inner functions directly
|
|
100
|
+
let result = get_data_internal(&state).await;
|
|
101
|
+
assert!(result.is_ok());
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Frontend IPC Mocking
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// __mocks__/@tauri-apps/api/core.ts
|
|
110
|
+
export const invoke = jest.fn();
|
|
111
|
+
|
|
112
|
+
// Mock setup
|
|
113
|
+
import { invoke } from '@tauri-apps/api/core';
|
|
114
|
+
|
|
115
|
+
beforeEach(() => {
|
|
116
|
+
(invoke as jest.Mock).mockClear();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('calls read_file command', async () => {
|
|
120
|
+
(invoke as jest.Mock).mockResolvedValue('file content');
|
|
121
|
+
|
|
122
|
+
const content = await readFile('test.txt');
|
|
123
|
+
|
|
124
|
+
expect(invoke).toHaveBeenCalledWith('read_file', {
|
|
125
|
+
filename: 'test.txt'
|
|
126
|
+
});
|
|
127
|
+
expect(content).toBe('file content');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('handles command errors', async () => {
|
|
131
|
+
(invoke as jest.Mock).mockRejectedValue('File not found');
|
|
132
|
+
|
|
133
|
+
await expect(readFile('missing.txt')).rejects.toThrow('File not found');
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Integration Testing
|
|
138
|
+
|
|
139
|
+
```rust
|
|
140
|
+
// tests/integration_test.rs
|
|
141
|
+
#[cfg(test)]
|
|
142
|
+
mod tests {
|
|
143
|
+
use tauri::test::{mock_builder, MockRuntime, mock_context};
|
|
144
|
+
|
|
145
|
+
#[test]
|
|
146
|
+
fn test_app_creation() {
|
|
147
|
+
let app = mock_builder()
|
|
148
|
+
.invoke_handler(tauri::generate_handler![
|
|
149
|
+
my_command,
|
|
150
|
+
another_command,
|
|
151
|
+
])
|
|
152
|
+
.build(MockRuntime::default())
|
|
153
|
+
.expect("failed to build app");
|
|
154
|
+
|
|
155
|
+
assert!(app.get_window("main").is_some());
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
#[test]
|
|
159
|
+
fn test_command_invocation() {
|
|
160
|
+
let app = mock_builder()
|
|
161
|
+
.invoke_handler(tauri::generate_handler![test_command])
|
|
162
|
+
.build(MockRuntime::default())
|
|
163
|
+
.expect("failed to build app");
|
|
164
|
+
|
|
165
|
+
// Commands can be tested via window
|
|
166
|
+
let window = app.get_window("main").unwrap();
|
|
167
|
+
// Test window interactions
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## End-to-End Testing with WebDriver
|
|
173
|
+
|
|
174
|
+
### Setup
|
|
175
|
+
|
|
176
|
+
**Add to Cargo.toml**:
|
|
177
|
+
```toml
|
|
178
|
+
[dev-dependencies]
|
|
179
|
+
tauri-driver = "0.1"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Add test runner**:
|
|
183
|
+
```rust
|
|
184
|
+
// tests/webdriver.rs
|
|
185
|
+
use tauri_driver::test::*;
|
|
186
|
+
|
|
187
|
+
#[test]
|
|
188
|
+
fn run_webdriver_tests() {
|
|
189
|
+
let mut driver = DriverBuilder::native()
|
|
190
|
+
.build()
|
|
191
|
+
.expect("Failed to create driver");
|
|
192
|
+
|
|
193
|
+
// Navigate to app
|
|
194
|
+
driver.goto("tauri://localhost");
|
|
195
|
+
|
|
196
|
+
// Find element and click
|
|
197
|
+
let button = driver.find_element(By::Id("my-button"))
|
|
198
|
+
.expect("Button not found");
|
|
199
|
+
button.click().expect("Failed to click");
|
|
200
|
+
|
|
201
|
+
// Verify result
|
|
202
|
+
let result = driver.find_element(By::Id("result"))
|
|
203
|
+
.expect("Result not found");
|
|
204
|
+
assert_eq!(result.text().unwrap(), "Success");
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Mock Event System
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
// __mocks__/@tauri-apps/api/event.ts
|
|
212
|
+
type EventCallback = (event: any) => void;
|
|
213
|
+
const listeners = new Map<string, EventCallback[]>();
|
|
214
|
+
|
|
215
|
+
export const listen = jest.fn(async (event: string, callback: EventCallback) => {
|
|
216
|
+
if (!listeners.has(event)) {
|
|
217
|
+
listeners.set(event, []);
|
|
218
|
+
}
|
|
219
|
+
listeners.get(event)!.push(callback);
|
|
220
|
+
|
|
221
|
+
return jest.fn(() => {
|
|
222
|
+
const callbacks = listeners.get(event);
|
|
223
|
+
if (callbacks) {
|
|
224
|
+
const index = callbacks.indexOf(callback);
|
|
225
|
+
if (index > -1) {
|
|
226
|
+
callbacks.splice(index, 1);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
export const emit = jest.fn((event: string, payload: any) => {
|
|
233
|
+
const callbacks = listeners.get(event) || [];
|
|
234
|
+
callbacks.forEach(cb => cb({ payload }));
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Test usage
|
|
238
|
+
test('handles progress events', async () => {
|
|
239
|
+
const progressHandler = jest.fn();
|
|
240
|
+
const unlisten = await listen('progress', progressHandler);
|
|
241
|
+
|
|
242
|
+
emit('progress', { current: 50, total: 100 });
|
|
243
|
+
|
|
244
|
+
expect(progressHandler).toHaveBeenCalledWith({
|
|
245
|
+
payload: { current: 50, total: 100 }
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
unlisten();
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Testing Async Commands
|
|
253
|
+
|
|
254
|
+
```rust
|
|
255
|
+
#[cfg(test)]
|
|
256
|
+
mod tests {
|
|
257
|
+
use super::*;
|
|
258
|
+
use tokio::time::{timeout, Duration};
|
|
259
|
+
|
|
260
|
+
#[tokio::test]
|
|
261
|
+
async fn test_long_operation_completes() {
|
|
262
|
+
let result = timeout(
|
|
263
|
+
Duration::from_secs(5),
|
|
264
|
+
long_running_command()
|
|
265
|
+
).await;
|
|
266
|
+
|
|
267
|
+
assert!(result.is_ok());
|
|
268
|
+
assert!(result.unwrap().is_ok());
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
#[tokio::test]
|
|
272
|
+
async fn test_operation_with_progress() {
|
|
273
|
+
let (tx, mut rx) = tokio::sync::mpsc::channel(100);
|
|
274
|
+
|
|
275
|
+
tokio::spawn(async move {
|
|
276
|
+
// Simulate command emitting progress
|
|
277
|
+
for i in 0..10 {
|
|
278
|
+
tx.send(i).await.ok();
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
let mut count = 0;
|
|
283
|
+
while let Some(progress) = rx.recv().await {
|
|
284
|
+
assert_eq!(progress, count);
|
|
285
|
+
count += 1;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
assert_eq!(count, 10);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Frontend Component Testing
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
297
|
+
import '@testing-library/jest-dom';
|
|
298
|
+
import { invoke } from '@tauri-apps/api/core';
|
|
299
|
+
import { DocumentView } from './DocumentView';
|
|
300
|
+
|
|
301
|
+
jest.mock('@tauri-apps/api/core');
|
|
302
|
+
|
|
303
|
+
test('renders document content', async () => {
|
|
304
|
+
(invoke as jest.Mock).mockResolvedValue('Test content');
|
|
305
|
+
|
|
306
|
+
render(<DocumentView filename="test.txt" />);
|
|
307
|
+
|
|
308
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
309
|
+
|
|
310
|
+
await waitFor(() => {
|
|
311
|
+
expect(screen.getByText('Test content')).toBeInTheDocument();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test('displays error on failure', async () => {
|
|
316
|
+
(invoke as jest.Mock).mockRejectedValue('File not found');
|
|
317
|
+
|
|
318
|
+
render(<DocumentView filename="missing.txt" />);
|
|
319
|
+
|
|
320
|
+
await waitFor(() => {
|
|
321
|
+
expect(screen.getByText(/error/i)).toBeInTheDocument();
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Best Practices
|
|
327
|
+
|
|
328
|
+
1. **Unit test all commands** - Test logic without Tauri runtime
|
|
329
|
+
2. **Mock IPC in frontend** - Use jest.mock for @tauri-apps/api
|
|
330
|
+
3. **Test error paths** - Verify error handling works
|
|
331
|
+
4. **Use integration tests** - For command registration
|
|
332
|
+
5. **E2E for critical flows** - User workflows with WebDriver
|
|
333
|
+
6. **Test async operations** - With timeouts and proper await
|
|
334
|
+
7. **Mock external dependencies** - Databases, APIs, file system
|
|
335
|
+
8. **Test state management** - Concurrent access, race conditions
|
|
336
|
+
9. **Coverage targets** - Aim for >80% coverage
|
|
337
|
+
10. **CI integration** - Run tests on every commit
|
|
338
|
+
|
|
339
|
+
## Common Pitfalls
|
|
340
|
+
|
|
341
|
+
❌ **Forgetting async in tests**:
|
|
342
|
+
```rust
|
|
343
|
+
// WRONG
|
|
344
|
+
#[test]
|
|
345
|
+
fn test_async_command() {
|
|
346
|
+
let result = async_command().await; // Won't compile
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// CORRECT
|
|
350
|
+
#[tokio::test]
|
|
351
|
+
async fn test_async_command() {
|
|
352
|
+
let result = async_command().await;
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
❌ **Not cleaning up temp files**:
|
|
357
|
+
```rust
|
|
358
|
+
// WRONG - leaves files behind
|
|
359
|
+
#[tokio::test]
|
|
360
|
+
async fn test() {
|
|
361
|
+
tokio::fs::write("test.txt", "content").await.unwrap();
|
|
362
|
+
// Test... but never removes file
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// CORRECT
|
|
366
|
+
#[tokio::test]
|
|
367
|
+
async fn test() {
|
|
368
|
+
let file = "test.txt";
|
|
369
|
+
tokio::fs::write(file, "content").await.unwrap();
|
|
370
|
+
// Test...
|
|
371
|
+
tokio::fs::remove_file(file).await.unwrap();
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## Summary
|
|
376
|
+
|
|
377
|
+
- **Unit tests** for command logic
|
|
378
|
+
- **Integration tests** with MockRuntime
|
|
379
|
+
- **Mock IPC** in frontend tests
|
|
380
|
+
- **E2E tests** with tauri-driver
|
|
381
|
+
- **Test async** with #[tokio::test]
|
|
382
|
+
- **Mock events** for event testing
|
|
383
|
+
- **Test error paths** always
|
|
384
|
+
- **CI integration** for automation
|