claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__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/BASE_PM.md +23 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +522 -34
- claude_mpm/cli/executor.py +56 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +28 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/startup.py +111 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-init.md +19 -3
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +8 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/templates/README.md +180 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/templates/settings.json.example +147 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +3 -1
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
- 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 +46 -41
- 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 +36 -73
- 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 +100 -125
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -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/verification-before-completion/SKILL.md +28 -72
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -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 +272 -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/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
- 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/main/skill-creator/scripts/init_skill.py +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -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/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/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 +21 -25
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -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 +86 -250
- 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/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- 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/scripts/with_server.py +37 -15
- 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/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +3 -3
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2093
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tauri-performance
|
|
3
|
+
description: Performance optimization for Tauri apps including serialization, batching, caching, lazy loading, and profiling techniques
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: development
|
|
6
|
+
author: Claude MPM Team
|
|
7
|
+
license: MIT
|
|
8
|
+
progressive_disclosure:
|
|
9
|
+
entry_point:
|
|
10
|
+
summary: "Performance optimization: minimize serialization, batch commands, implement caching, lazy load resources, profile bottlenecks"
|
|
11
|
+
when_to_use: "Optimizing Tauri app performance, reducing IPC overhead, improving responsiveness, or debugging performance issues"
|
|
12
|
+
quick_start: "1. Batch IPC calls 2. Cache frequently accessed data 3. Stream large data 4. Lazy load resources 5. Profile with DevTools"
|
|
13
|
+
context_limit: 600
|
|
14
|
+
tags:
|
|
15
|
+
- tauri
|
|
16
|
+
- performance
|
|
17
|
+
- optimization
|
|
18
|
+
- profiling
|
|
19
|
+
- caching
|
|
20
|
+
requires_tools: []
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Tauri Performance Optimization
|
|
24
|
+
|
|
25
|
+
## IPC Optimization
|
|
26
|
+
|
|
27
|
+
### Minimize Serialization Overhead
|
|
28
|
+
|
|
29
|
+
**Problem**: Each IPC call serializes data across the boundary
|
|
30
|
+
|
|
31
|
+
```rust
|
|
32
|
+
// ❌ BAD - multiple IPC calls
|
|
33
|
+
#[tauri::command]
|
|
34
|
+
async fn get_file_name(path: String) -> Result<String, String> { /* ... */ }
|
|
35
|
+
|
|
36
|
+
#[tauri::command]
|
|
37
|
+
async fn get_file_size(path: String) -> Result<u64, String> { /* ... */ }
|
|
38
|
+
|
|
39
|
+
// Frontend makes 3 separate calls
|
|
40
|
+
const name = await invoke('get_file_name', { path });
|
|
41
|
+
const size = await invoke('get_file_size', { path });
|
|
42
|
+
const modified = await invoke('get_file_modified', { path });
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Solution**: Batch data in single call
|
|
46
|
+
|
|
47
|
+
```rust
|
|
48
|
+
// ✅ GOOD - single IPC call
|
|
49
|
+
#[derive(serde::Serialize)]
|
|
50
|
+
pub struct FileInfo {
|
|
51
|
+
name: String,
|
|
52
|
+
size: u64,
|
|
53
|
+
modified: u64,
|
|
54
|
+
is_dir: bool,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#[tauri::command]
|
|
58
|
+
async fn get_file_info(path: String) -> Result<FileInfo, String> {
|
|
59
|
+
let metadata = tokio::fs::metadata(&path)
|
|
60
|
+
.await
|
|
61
|
+
.map_err(|e| e.to_string())?;
|
|
62
|
+
|
|
63
|
+
Ok(FileInfo {
|
|
64
|
+
name: Path::new(&path)
|
|
65
|
+
.file_name()
|
|
66
|
+
.unwrap()
|
|
67
|
+
.to_string_lossy()
|
|
68
|
+
.to_string(),
|
|
69
|
+
size: metadata.len(),
|
|
70
|
+
modified: metadata.modified()
|
|
71
|
+
.unwrap()
|
|
72
|
+
.duration_since(UNIX_EPOCH)
|
|
73
|
+
.unwrap()
|
|
74
|
+
.as_secs(),
|
|
75
|
+
is_dir: metadata.is_dir(),
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Frontend makes 1 call
|
|
80
|
+
const info = await invoke('get_file_info', { path });
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Batch Operations
|
|
84
|
+
|
|
85
|
+
```rust
|
|
86
|
+
// ❌ BAD - N IPC calls
|
|
87
|
+
for file in files {
|
|
88
|
+
await invoke('process_file', { file });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ✅ GOOD - 1 IPC call
|
|
92
|
+
#[tauri::command]
|
|
93
|
+
async fn process_files_batch(files: Vec<String>) -> Result<Vec<ProcessResult>, String> {
|
|
94
|
+
let mut results = Vec::new();
|
|
95
|
+
|
|
96
|
+
for file in files {
|
|
97
|
+
let result = process_file_internal(&file).await;
|
|
98
|
+
results.push(result);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Ok(results)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
await invoke('process_files_batch', { files });
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Stream Large Data
|
|
108
|
+
|
|
109
|
+
```rust
|
|
110
|
+
use futures::stream::{self, StreamExt};
|
|
111
|
+
|
|
112
|
+
#[tauri::command]
|
|
113
|
+
async fn load_large_dataset(
|
|
114
|
+
window: tauri::Window,
|
|
115
|
+
) -> Result<(), String> {
|
|
116
|
+
let data = fetch_large_dataset().await?;
|
|
117
|
+
|
|
118
|
+
// Stream in chunks instead of single payload
|
|
119
|
+
let chunks: Vec<_> = data.chunks(1000).collect();
|
|
120
|
+
|
|
121
|
+
for (index, chunk) in chunks.iter().enumerate() {
|
|
122
|
+
window.emit("data-chunk", serde_json::json!({
|
|
123
|
+
"index": index,
|
|
124
|
+
"data": chunk,
|
|
125
|
+
"total": chunks.len()
|
|
126
|
+
})).map_err(|e| e.to_string())?;
|
|
127
|
+
|
|
128
|
+
// Small delay to prevent overwhelming frontend
|
|
129
|
+
tokio::time::sleep(Duration::from_millis(10)).await;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
window.emit("data-complete", ()).map_err(|e| e.to_string())?;
|
|
133
|
+
|
|
134
|
+
Ok(())
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Frontend streaming handler**:
|
|
139
|
+
```typescript
|
|
140
|
+
let allData: DataItem[] = [];
|
|
141
|
+
|
|
142
|
+
await listen('data-chunk', (event: { index: number; data: DataItem[]; total: number }) => {
|
|
143
|
+
allData = allData.concat(event.data);
|
|
144
|
+
updateProgress(event.index, event.total);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
await listen('data-complete', () => {
|
|
148
|
+
renderData(allData);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
await invoke('load_large_dataset');
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Caching Strategies
|
|
155
|
+
|
|
156
|
+
### In-Memory Cache
|
|
157
|
+
|
|
158
|
+
```rust
|
|
159
|
+
use std::sync::Arc;
|
|
160
|
+
use dashmap::DashMap;
|
|
161
|
+
use std::time::{SystemTime, Duration};
|
|
162
|
+
|
|
163
|
+
pub struct CachedValue<T> {
|
|
164
|
+
value: T,
|
|
165
|
+
expires_at: SystemTime,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
pub struct Cache<T> {
|
|
169
|
+
store: Arc<DashMap<String, CachedValue<T>>>,
|
|
170
|
+
ttl: Duration,
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
impl<T: Clone> Cache<T> {
|
|
174
|
+
pub fn new(ttl_secs: u64) -> Self {
|
|
175
|
+
Self {
|
|
176
|
+
store: Arc::new(DashMap::new()),
|
|
177
|
+
ttl: Duration::from_secs(ttl_secs),
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
pub fn get(&self, key: &str) -> Option<T> {
|
|
182
|
+
self.store.get(key).and_then(|entry| {
|
|
183
|
+
if SystemTime::now() < entry.expires_at {
|
|
184
|
+
Some(entry.value.clone())
|
|
185
|
+
} else {
|
|
186
|
+
self.store.remove(key);
|
|
187
|
+
None
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
pub fn set(&self, key: String, value: T) {
|
|
193
|
+
self.store.insert(key, CachedValue {
|
|
194
|
+
value,
|
|
195
|
+
expires_at: SystemTime::now() + self.ttl,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
pub fn clear(&self) {
|
|
200
|
+
self.store.clear();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Usage in app state
|
|
205
|
+
pub struct AppState {
|
|
206
|
+
file_cache: Cache<String>,
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
#[tauri::command]
|
|
210
|
+
async fn read_file_cached(
|
|
211
|
+
path: String,
|
|
212
|
+
state: tauri::State<'_, AppState>,
|
|
213
|
+
) -> Result<String, String> {
|
|
214
|
+
// Check cache first
|
|
215
|
+
if let Some(content) = state.file_cache.get(&path) {
|
|
216
|
+
return Ok(content);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Cache miss - read from disk
|
|
220
|
+
let content = tokio::fs::read_to_string(&path)
|
|
221
|
+
.await
|
|
222
|
+
.map_err(|e| e.to_string())?;
|
|
223
|
+
|
|
224
|
+
// Store in cache
|
|
225
|
+
state.file_cache.set(path, content.clone());
|
|
226
|
+
|
|
227
|
+
Ok(content)
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### LRU Cache
|
|
232
|
+
|
|
233
|
+
```rust
|
|
234
|
+
use lru::LruCache;
|
|
235
|
+
use std::sync::Arc;
|
|
236
|
+
use tokio::sync::Mutex;
|
|
237
|
+
use std::num::NonZeroUsize;
|
|
238
|
+
|
|
239
|
+
pub struct AppState {
|
|
240
|
+
lru_cache: Arc<Mutex<LruCache<String, Vec<u8>>>>,
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
impl AppState {
|
|
244
|
+
pub fn new() -> Self {
|
|
245
|
+
Self {
|
|
246
|
+
lru_cache: Arc::new(Mutex::new(
|
|
247
|
+
LruCache::new(NonZeroUsize::new(100).unwrap())
|
|
248
|
+
)),
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#[tauri::command]
|
|
254
|
+
async fn get_data_with_lru(
|
|
255
|
+
key: String,
|
|
256
|
+
state: tauri::State<'_, AppState>,
|
|
257
|
+
) -> Result<Vec<u8>, String> {
|
|
258
|
+
let mut cache = state.lru_cache.lock().await;
|
|
259
|
+
|
|
260
|
+
if let Some(data) = cache.get(&key) {
|
|
261
|
+
return Ok(data.clone());
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Cache miss
|
|
265
|
+
drop(cache); // Release lock before expensive operation
|
|
266
|
+
|
|
267
|
+
let data = fetch_expensive_data(&key).await?;
|
|
268
|
+
|
|
269
|
+
let mut cache = state.lru_cache.lock().await;
|
|
270
|
+
cache.put(key, data.clone());
|
|
271
|
+
|
|
272
|
+
Ok(data)
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Persistent Cache
|
|
277
|
+
|
|
278
|
+
```rust
|
|
279
|
+
use sled::Db;
|
|
280
|
+
|
|
281
|
+
pub struct AppState {
|
|
282
|
+
disk_cache: Db,
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
impl AppState {
|
|
286
|
+
pub fn new() -> Result<Self, String> {
|
|
287
|
+
let cache = sled::open("cache.db")
|
|
288
|
+
.map_err(|e| e.to_string())?;
|
|
289
|
+
|
|
290
|
+
Ok(Self {
|
|
291
|
+
disk_cache: cache,
|
|
292
|
+
})
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#[tauri::command]
|
|
297
|
+
async fn get_cached_data(
|
|
298
|
+
key: String,
|
|
299
|
+
state: tauri::State<'_, AppState>,
|
|
300
|
+
) -> Result<Option<String>, String> {
|
|
301
|
+
let data = state.disk_cache
|
|
302
|
+
.get(key.as_bytes())
|
|
303
|
+
.map_err(|e| e.to_string())?;
|
|
304
|
+
|
|
305
|
+
Ok(data.map(|bytes| String::from_utf8_lossy(&bytes).to_string()))
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
#[tauri::command]
|
|
309
|
+
async fn set_cached_data(
|
|
310
|
+
key: String,
|
|
311
|
+
value: String,
|
|
312
|
+
state: tauri::State<'_, AppState>,
|
|
313
|
+
) -> Result<(), String> {
|
|
314
|
+
state.disk_cache
|
|
315
|
+
.insert(key.as_bytes(), value.as_bytes())
|
|
316
|
+
.map_err(|e| e.to_string())?;
|
|
317
|
+
|
|
318
|
+
Ok(())
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Lazy Loading
|
|
323
|
+
|
|
324
|
+
### Lazy Component Loading
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
// React lazy loading
|
|
328
|
+
import { lazy, Suspense } from 'react';
|
|
329
|
+
|
|
330
|
+
const HeavyComponent = lazy(() => import('./HeavyComponent'));
|
|
331
|
+
|
|
332
|
+
function App() {
|
|
333
|
+
return (
|
|
334
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
335
|
+
<HeavyComponent />
|
|
336
|
+
</Suspense>
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Lazy Data Loading
|
|
342
|
+
|
|
343
|
+
```rust
|
|
344
|
+
#[tauri::command]
|
|
345
|
+
async fn get_preview(path: String) -> Result<PreviewData, String> {
|
|
346
|
+
// Return lightweight preview first
|
|
347
|
+
let preview = PreviewData {
|
|
348
|
+
name: get_filename(&path),
|
|
349
|
+
size: get_filesize(&path).await?,
|
|
350
|
+
thumbnail: None, // Don't load heavy data yet
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
Ok(preview)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
#[tauri::command]
|
|
357
|
+
async fn get_full_data(path: String) -> Result<FullData, String> {
|
|
358
|
+
// Load heavy data only when requested
|
|
359
|
+
let content = tokio::fs::read(&path)
|
|
360
|
+
.await
|
|
361
|
+
.map_err(|e| e.to_string())?;
|
|
362
|
+
|
|
363
|
+
let thumbnail = generate_thumbnail(&content)?;
|
|
364
|
+
|
|
365
|
+
Ok(FullData {
|
|
366
|
+
content,
|
|
367
|
+
thumbnail: Some(thumbnail),
|
|
368
|
+
})
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**Frontend**:
|
|
373
|
+
```typescript
|
|
374
|
+
// Load preview immediately
|
|
375
|
+
const preview = await invoke('get_preview', { path });
|
|
376
|
+
showPreview(preview);
|
|
377
|
+
|
|
378
|
+
// Load full data on demand
|
|
379
|
+
button.onclick = async () => {
|
|
380
|
+
const fullData = await invoke('get_full_data', { path });
|
|
381
|
+
showFullData(fullData);
|
|
382
|
+
};
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Database Optimization
|
|
386
|
+
|
|
387
|
+
### Connection Pooling
|
|
388
|
+
|
|
389
|
+
```rust
|
|
390
|
+
use sqlx::{Pool, Sqlite, SqlitePool};
|
|
391
|
+
|
|
392
|
+
pub struct AppState {
|
|
393
|
+
db_pool: Pool<Sqlite>,
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
impl AppState {
|
|
397
|
+
pub async fn new() -> Result<Self, sqlx::Error> {
|
|
398
|
+
let pool = SqlitePool::connect("sqlite://data.db").await?;
|
|
399
|
+
|
|
400
|
+
Ok(Self { db_pool: pool })
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
#[tauri::command]
|
|
405
|
+
async fn query_users(
|
|
406
|
+
state: tauri::State<'_, AppState>,
|
|
407
|
+
) -> Result<Vec<User>, String> {
|
|
408
|
+
let users = sqlx::query_as::<_, User>("SELECT * FROM users")
|
|
409
|
+
.fetch_all(&state.db_pool)
|
|
410
|
+
.await
|
|
411
|
+
.map_err(|e| e.to_string())?;
|
|
412
|
+
|
|
413
|
+
Ok(users)
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Prepared Statements
|
|
418
|
+
|
|
419
|
+
```rust
|
|
420
|
+
use sqlx::{Sqlite, Statement};
|
|
421
|
+
|
|
422
|
+
pub struct PreparedStatements {
|
|
423
|
+
get_user: Statement<'static, Sqlite>,
|
|
424
|
+
insert_user: Statement<'static, Sqlite>,
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
impl PreparedStatements {
|
|
428
|
+
pub async fn new(pool: &Pool<Sqlite>) -> Result<Self, sqlx::Error> {
|
|
429
|
+
Ok(Self {
|
|
430
|
+
get_user: pool.prepare("SELECT * FROM users WHERE id = ?").await?,
|
|
431
|
+
insert_user: pool.prepare("INSERT INTO users (name, email) VALUES (?, ?)").await?,
|
|
432
|
+
})
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Use prepared statements for repeated queries
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Async Performance
|
|
440
|
+
|
|
441
|
+
### Concurrent Operations
|
|
442
|
+
|
|
443
|
+
```rust
|
|
444
|
+
use futures::future::join_all;
|
|
445
|
+
|
|
446
|
+
#[tauri::command]
|
|
447
|
+
async fn load_multiple_files(paths: Vec<String>) -> Result<Vec<FileData>, String> {
|
|
448
|
+
let tasks = paths.into_iter().map(|path| async move {
|
|
449
|
+
tokio::fs::read_to_string(&path)
|
|
450
|
+
.await
|
|
451
|
+
.map(|content| FileData { path, content })
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
let results = join_all(tasks).await;
|
|
455
|
+
|
|
456
|
+
let data: Vec<FileData> = results
|
|
457
|
+
.into_iter()
|
|
458
|
+
.filter_map(|r| r.ok())
|
|
459
|
+
.collect();
|
|
460
|
+
|
|
461
|
+
Ok(data)
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### Parallel Processing with Rayon
|
|
466
|
+
|
|
467
|
+
```rust
|
|
468
|
+
use rayon::prelude::*;
|
|
469
|
+
|
|
470
|
+
#[tauri::command]
|
|
471
|
+
async fn process_large_dataset(data: Vec<Item>) -> Result<Vec<ProcessedItem>, String> {
|
|
472
|
+
// Move to blocking thread pool for CPU-intensive work
|
|
473
|
+
let processed = tokio::task::spawn_blocking(move || {
|
|
474
|
+
data.par_iter()
|
|
475
|
+
.map(|item| process_item(item))
|
|
476
|
+
.collect::<Vec<_>>()
|
|
477
|
+
})
|
|
478
|
+
.await
|
|
479
|
+
.map_err(|e| e.to_string())?;
|
|
480
|
+
|
|
481
|
+
Ok(processed)
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
## Profiling and Debugging
|
|
486
|
+
|
|
487
|
+
### Backend Profiling
|
|
488
|
+
|
|
489
|
+
```rust
|
|
490
|
+
use std::time::Instant;
|
|
491
|
+
|
|
492
|
+
#[tauri::command]
|
|
493
|
+
async fn profiled_operation() -> Result<String, String> {
|
|
494
|
+
let start = Instant::now();
|
|
495
|
+
|
|
496
|
+
let result = expensive_operation().await?;
|
|
497
|
+
|
|
498
|
+
let duration = start.elapsed();
|
|
499
|
+
log::info!("Operation took {:?}", duration);
|
|
500
|
+
|
|
501
|
+
Ok(result)
|
|
502
|
+
}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### Conditional Logging
|
|
506
|
+
|
|
507
|
+
```rust
|
|
508
|
+
#[cfg(debug_assertions)]
|
|
509
|
+
macro_rules! debug_time {
|
|
510
|
+
($label:expr, $code:block) => {{
|
|
511
|
+
let start = std::time::Instant::now();
|
|
512
|
+
let result = $code;
|
|
513
|
+
let duration = start.elapsed();
|
|
514
|
+
log::debug!("{} took {:?}", $label, duration);
|
|
515
|
+
result
|
|
516
|
+
}};
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
#[cfg(not(debug_assertions))]
|
|
520
|
+
macro_rules! debug_time {
|
|
521
|
+
($label:expr, $code:block) => {
|
|
522
|
+
$code
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
#[tauri::command]
|
|
527
|
+
async fn operation() -> Result<String, String> {
|
|
528
|
+
let result = debug_time!("Database query", {
|
|
529
|
+
query_database().await
|
|
530
|
+
})?;
|
|
531
|
+
|
|
532
|
+
Ok(result)
|
|
533
|
+
}
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### Frontend Performance Monitoring
|
|
537
|
+
|
|
538
|
+
```typescript
|
|
539
|
+
// Performance marks
|
|
540
|
+
performance.mark('command-start');
|
|
541
|
+
const result = await invoke('heavy_command');
|
|
542
|
+
performance.mark('command-end');
|
|
543
|
+
|
|
544
|
+
performance.measure('command-duration', 'command-start', 'command-end');
|
|
545
|
+
|
|
546
|
+
const measure = performance.getEntriesByName('command-duration')[0];
|
|
547
|
+
console.log(`Command took ${measure.duration}ms`);
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
## Memory Optimization
|
|
551
|
+
|
|
552
|
+
### Avoid Cloning
|
|
553
|
+
|
|
554
|
+
```rust
|
|
555
|
+
// ❌ BAD - unnecessary clone
|
|
556
|
+
#[tauri::command]
|
|
557
|
+
async fn process_data(data: String) -> Result<String, String> {
|
|
558
|
+
let processed = data.clone(); // Unnecessary
|
|
559
|
+
Ok(processed.to_uppercase())
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// ✅ GOOD - consume owned value
|
|
563
|
+
#[tauri::command]
|
|
564
|
+
async fn process_data(data: String) -> Result<String, String> {
|
|
565
|
+
Ok(data.to_uppercase()) // Takes ownership
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### Use References Where Possible
|
|
570
|
+
|
|
571
|
+
```rust
|
|
572
|
+
async fn internal_processing(data: &str) -> String {
|
|
573
|
+
data.to_uppercase()
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
#[tauri::command]
|
|
577
|
+
async fn process(data: String) -> Result<String, String> {
|
|
578
|
+
Ok(internal_processing(&data))
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### Drop Large Allocations Early
|
|
583
|
+
|
|
584
|
+
```rust
|
|
585
|
+
#[tauri::command]
|
|
586
|
+
async fn process_file(path: String) -> Result<String, String> {
|
|
587
|
+
let large_buffer = tokio::fs::read(&path)
|
|
588
|
+
.await
|
|
589
|
+
.map_err(|e| e.to_string())?;
|
|
590
|
+
|
|
591
|
+
let summary = compute_summary(&large_buffer);
|
|
592
|
+
|
|
593
|
+
drop(large_buffer); // Free memory before waiting
|
|
594
|
+
|
|
595
|
+
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
596
|
+
|
|
597
|
+
Ok(summary)
|
|
598
|
+
}
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
## Best Practices
|
|
602
|
+
|
|
603
|
+
1. **Batch IPC calls** - Minimize serialization overhead
|
|
604
|
+
2. **Cache aggressively** - In-memory, LRU, or persistent
|
|
605
|
+
3. **Stream large data** - Chunk payloads instead of single large payload
|
|
606
|
+
4. **Lazy load** - Only fetch data when needed
|
|
607
|
+
5. **Use connection pools** - For database access
|
|
608
|
+
6. **Concurrent operations** - Use join_all for parallel async
|
|
609
|
+
7. **CPU-bound work** - Move to spawn_blocking or rayon
|
|
610
|
+
8. **Profile regularly** - Identify bottlenecks with timing
|
|
611
|
+
9. **Minimize cloning** - Use references or consume owned values
|
|
612
|
+
10. **Drop early** - Free large allocations as soon as possible
|
|
613
|
+
|
|
614
|
+
## Common Pitfalls
|
|
615
|
+
|
|
616
|
+
❌ **Too many small IPC calls**:
|
|
617
|
+
```typescript
|
|
618
|
+
// WRONG - 100 IPC calls
|
|
619
|
+
for (const file of files) {
|
|
620
|
+
await invoke('process_file', { file });
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// CORRECT - 1 IPC call
|
|
624
|
+
await invoke('process_files_batch', { files });
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
❌ **Not caching expensive operations**:
|
|
628
|
+
```rust
|
|
629
|
+
// WRONG - recomputes every time
|
|
630
|
+
#[tauri::command]
|
|
631
|
+
async fn get_config() -> Config {
|
|
632
|
+
parse_config().await // Expensive every call
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
// CORRECT - cache result
|
|
636
|
+
lazy_static! {
|
|
637
|
+
static ref CONFIG: Mutex<Option<Config>> = Mutex::new(None);
|
|
638
|
+
}
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
❌ **Blocking async runtime**:
|
|
642
|
+
```rust
|
|
643
|
+
// WRONG - blocks async executor
|
|
644
|
+
#[tauri::command]
|
|
645
|
+
async fn cpu_intensive() -> String {
|
|
646
|
+
expensive_cpu_work() // Blocks entire runtime
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// CORRECT - move to blocking thread
|
|
650
|
+
#[tauri::command]
|
|
651
|
+
async fn cpu_intensive() -> String {
|
|
652
|
+
tokio::task::spawn_blocking(|| expensive_cpu_work())
|
|
653
|
+
.await
|
|
654
|
+
.unwrap()
|
|
655
|
+
}
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
## Summary
|
|
659
|
+
|
|
660
|
+
- **Batch IPC calls** to minimize serialization overhead
|
|
661
|
+
- **Cache frequently accessed data** with TTL, LRU, or persistent
|
|
662
|
+
- **Stream large datasets** in chunks to prevent memory spikes
|
|
663
|
+
- **Lazy load resources** only when needed
|
|
664
|
+
- **Connection pooling** for database efficiency
|
|
665
|
+
- **Concurrent async** with join_all for parallel operations
|
|
666
|
+
- **CPU-bound work** on spawn_blocking or rayon
|
|
667
|
+
- **Profile performance** to identify bottlenecks
|
|
668
|
+
- **Minimize cloning** and drop large allocations early
|
|
669
|
+
- **Frontend monitoring** with Performance API
|