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.

Files changed (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,613 @@
1
+ ---
2
+ name: tauri-error-handling
3
+ description: Comprehensive error handling in Tauri using custom error types, thiserror, structured errors, and frontend error management
4
+ version: 1.0.0
5
+ category: development
6
+ author: Claude MPM Team
7
+ license: MIT
8
+ progressive_disclosure:
9
+ entry_point:
10
+ summary: "Production error handling: custom types with thiserror, structured errors, error context, frontend integration"
11
+ when_to_use: "Building production Tauri apps requiring robust error handling, debugging, and user-friendly error messages"
12
+ quick_start: "1. Define custom errors with thiserror 2. Convert to String for IPC 3. Handle in frontend 4. Log appropriately"
13
+ context_limit: 500
14
+ tags:
15
+ - tauri
16
+ - error-handling
17
+ - thiserror
18
+ - debugging
19
+ - production
20
+ requires_tools: []
21
+ ---
22
+
23
+ # Tauri Error Handling
24
+
25
+ ## Custom Error Types with thiserror
26
+
27
+ ### Basic Error Definition
28
+
29
+ ```rust
30
+ // src-tauri/src/error.rs
31
+ use thiserror::Error;
32
+
33
+ #[derive(Error, Debug)]
34
+ pub enum AppError {
35
+ #[error("File not found: {0}")]
36
+ FileNotFound(String),
37
+
38
+ #[error("Invalid input: {0}")]
39
+ InvalidInput(String),
40
+
41
+ #[error("Database error: {0}")]
42
+ DatabaseError(#[from] sqlx::Error),
43
+
44
+ #[error("IO error: {0}")]
45
+ IoError(#[from] std::io::Error),
46
+
47
+ #[error("Serialization error: {0}")]
48
+ SerdeError(#[from] serde_json::Error),
49
+
50
+ #[error("Permission denied: {0}")]
51
+ PermissionDenied(String),
52
+
53
+ #[error("Operation failed: {0}")]
54
+ OperationFailed(String),
55
+ }
56
+
57
+ // Convert to String for Tauri commands
58
+ impl From<AppError> for String {
59
+ fn from(error: AppError) -> Self {
60
+ error.to_string()
61
+ }
62
+ }
63
+ ```
64
+
65
+ ### Usage in Commands
66
+
67
+ ```rust
68
+ #[tauri::command]
69
+ async fn load_config(path: String) -> Result<Config, String> {
70
+ read_config(&path).await? // AppError auto-converts to String
71
+ }
72
+
73
+ async fn read_config(path: &str) -> Result<Config, AppError> {
74
+ let content = tokio::fs::read_to_string(path)
75
+ .await
76
+ .map_err(|_| AppError::FileNotFound(path.to_string()))?;
77
+
78
+ let config: Config = serde_json::from_str(&content)?; // Auto-converts SerdeError
79
+
80
+ Ok(config)
81
+ }
82
+ ```
83
+
84
+ ## Structured Error Returns
85
+
86
+ ### Error Response Type
87
+
88
+ ```rust
89
+ #[derive(serde::Serialize)]
90
+ #[serde(tag = "type")]
91
+ pub enum CommandResult<T> {
92
+ #[serde(rename = "success")]
93
+ Success {
94
+ data: T,
95
+ },
96
+ #[serde(rename = "error")]
97
+ Error {
98
+ code: String,
99
+ message: String,
100
+ details: Option<serde_json::Value>,
101
+ },
102
+ }
103
+
104
+ #[derive(serde::Serialize)]
105
+ pub struct ErrorDetails {
106
+ timestamp: u64,
107
+ operation: String,
108
+ context: Option<String>,
109
+ }
110
+
111
+ #[tauri::command]
112
+ async fn complex_operation() -> CommandResult<String> {
113
+ match perform_operation().await {
114
+ Ok(result) => CommandResult::Success { data: result },
115
+ Err(e) => CommandResult::Error {
116
+ code: "OPERATION_FAILED".to_string(),
117
+ message: e.to_string(),
118
+ details: Some(serde_json::json!({
119
+ "timestamp": std::time::SystemTime::now()
120
+ .duration_since(std::time::UNIX_EPOCH)
121
+ .unwrap()
122
+ .as_secs(),
123
+ "operation": "complex_operation"
124
+ })),
125
+ },
126
+ }
127
+ }
128
+ ```
129
+
130
+ **Frontend handling**:
131
+ ```typescript
132
+ type CommandResult<T> =
133
+ | { type: 'success'; data: T }
134
+ | { type: 'error'; code: string; message: string; details?: any };
135
+
136
+ const result = await invoke<CommandResult<string>>('complex_operation');
137
+
138
+ if (result.type === 'success') {
139
+ console.log('Data:', result.data);
140
+ } else {
141
+ console.error(`Error ${result.code}: ${result.message}`);
142
+ if (result.details) {
143
+ console.error('Details:', result.details);
144
+ }
145
+ }
146
+ ```
147
+
148
+ ## Error Context and Chaining
149
+
150
+ ### Adding Context to Errors
151
+
152
+ ```rust
153
+ use thiserror::Error;
154
+
155
+ #[derive(Error, Debug)]
156
+ pub enum AppError {
157
+ #[error("Failed to load user data: {0}")]
158
+ UserLoadError(#[source] Box<dyn std::error::Error + Send + Sync>),
159
+
160
+ #[error("Database connection failed: {0}")]
161
+ DatabaseError(String),
162
+ }
163
+
164
+ async fn load_user_with_context(id: u64) -> Result<User, AppError> {
165
+ let db = connect_db()
166
+ .await
167
+ .map_err(|e| AppError::DatabaseError(e.to_string()))?;
168
+
169
+ let user = db.query_user(id)
170
+ .await
171
+ .map_err(|e| AppError::UserLoadError(Box::new(e)))?;
172
+
173
+ Ok(user)
174
+ }
175
+ ```
176
+
177
+ ### Error Context Pattern
178
+
179
+ ```rust
180
+ pub trait ErrorContext<T> {
181
+ fn context(self, ctx: &str) -> Result<T, AppError>;
182
+ }
183
+
184
+ impl<T, E> ErrorContext<T> for Result<T, E>
185
+ where
186
+ E: std::error::Error + Send + Sync + 'static,
187
+ {
188
+ fn context(self, ctx: &str) -> Result<T, AppError> {
189
+ self.map_err(|e| AppError::OperationFailed(
190
+ format!("{}: {}", ctx, e)
191
+ ))
192
+ }
193
+ }
194
+
195
+ #[tauri::command]
196
+ async fn save_with_context(data: String) -> Result<(), String> {
197
+ let parsed = parse_data(&data)
198
+ .context("Failed to parse data")?;
199
+
200
+ write_to_disk(&parsed)
201
+ .await
202
+ .context("Failed to write to disk")?;
203
+
204
+ Ok(())
205
+ }
206
+ ```
207
+
208
+ ## Domain-Specific Error Types
209
+
210
+ ### Multiple Error Enums
211
+
212
+ ```rust
213
+ // Auth errors
214
+ #[derive(Error, Debug)]
215
+ pub enum AuthError {
216
+ #[error("Invalid credentials")]
217
+ InvalidCredentials,
218
+
219
+ #[error("Token expired")]
220
+ TokenExpired,
221
+
222
+ #[error("Insufficient permissions")]
223
+ InsufficientPermissions,
224
+ }
225
+
226
+ // File errors
227
+ #[derive(Error, Debug)]
228
+ pub enum FileError {
229
+ #[error("File not found: {0}")]
230
+ NotFound(String),
231
+
232
+ #[error("File already exists: {0}")]
233
+ AlreadyExists(String),
234
+
235
+ #[error("Invalid file format: {0}")]
236
+ InvalidFormat(String),
237
+ }
238
+
239
+ // Application error combines all
240
+ #[derive(Error, Debug)]
241
+ pub enum AppError {
242
+ #[error("Authentication error: {0}")]
243
+ Auth(#[from] AuthError),
244
+
245
+ #[error("File error: {0}")]
246
+ File(#[from] FileError),
247
+
248
+ #[error("IO error: {0}")]
249
+ Io(#[from] std::io::Error),
250
+ }
251
+
252
+ impl From<AppError> for String {
253
+ fn from(error: AppError) -> Self {
254
+ error.to_string()
255
+ }
256
+ }
257
+ ```
258
+
259
+ ### Using Domain Errors
260
+
261
+ ```rust
262
+ #[tauri::command]
263
+ async fn login(username: String, password: String) -> Result<String, String> {
264
+ authenticate(&username, &password).await? // AuthError auto-converts
265
+ }
266
+
267
+ async fn authenticate(username: &str, password: &str) -> Result<String, AuthError> {
268
+ if username.is_empty() || password.is_empty() {
269
+ return Err(AuthError::InvalidCredentials);
270
+ }
271
+
272
+ let token = verify_credentials(username, password)
273
+ .await
274
+ .ok_or(AuthError::InvalidCredentials)?;
275
+
276
+ if is_token_expired(&token) {
277
+ return Err(AuthError::TokenExpired);
278
+ }
279
+
280
+ Ok(token)
281
+ }
282
+ ```
283
+
284
+ ## Frontend Error Handling
285
+
286
+ ### Type-Safe Error Handling
287
+
288
+ ```typescript
289
+ // Define error types matching backend
290
+ type TauriError = string;
291
+
292
+ interface ErrorInfo {
293
+ code: string;
294
+ message: string;
295
+ recoverable: boolean;
296
+ }
297
+
298
+ function parseError(error: TauriError): ErrorInfo {
299
+ if (error.includes('File not found')) {
300
+ return {
301
+ code: 'FILE_NOT_FOUND',
302
+ message: 'The requested file could not be found',
303
+ recoverable: true
304
+ };
305
+ } else if (error.includes('Permission denied')) {
306
+ return {
307
+ code: 'PERMISSION_DENIED',
308
+ message: 'You do not have permission to perform this action',
309
+ recoverable: false
310
+ };
311
+ } else if (error.includes('Invalid input')) {
312
+ return {
313
+ code: 'INVALID_INPUT',
314
+ message: 'The provided input is invalid',
315
+ recoverable: true
316
+ };
317
+ } else {
318
+ return {
319
+ code: 'UNKNOWN_ERROR',
320
+ message: error,
321
+ recoverable: false
322
+ };
323
+ }
324
+ }
325
+
326
+ // Usage
327
+ async function loadDocument(filename: string) {
328
+ try {
329
+ const content = await invoke<string>('read_document', { filename });
330
+ return content;
331
+ } catch (error) {
332
+ const errorInfo = parseError(error as TauriError);
333
+
334
+ if (errorInfo.recoverable) {
335
+ showNotification(errorInfo.message, 'warning');
336
+ } else {
337
+ showNotification(errorInfo.message, 'error');
338
+ }
339
+
340
+ throw errorInfo;
341
+ }
342
+ }
343
+ ```
344
+
345
+ ### React Error Boundary Integration
346
+
347
+ ```typescript
348
+ import { useEffect, useState } from 'react';
349
+ import { invoke } from '@tauri-apps/api/core';
350
+
351
+ interface ErrorState {
352
+ hasError: boolean;
353
+ error: string | null;
354
+ }
355
+
356
+ function useTauriCommand<T>(command: string, args?: any) {
357
+ const [data, setData] = useState<T | null>(null);
358
+ const [error, setError] = useState<ErrorState>({ hasError: false, error: null });
359
+ const [loading, setLoading] = useState(true);
360
+
361
+ useEffect(() => {
362
+ invoke<T>(command, args)
363
+ .then(setData)
364
+ .catch((err) => {
365
+ setError({
366
+ hasError: true,
367
+ error: err.toString()
368
+ });
369
+ })
370
+ .finally(() => setLoading(false));
371
+ }, [command, JSON.stringify(args)]);
372
+
373
+ return { data, error, loading };
374
+ }
375
+
376
+ // Usage
377
+ function DocumentView({ filename }: { filename: string }) {
378
+ const { data, error, loading } = useTauriCommand<string>(
379
+ 'read_document',
380
+ { filename }
381
+ );
382
+
383
+ if (loading) return <div>Loading...</div>;
384
+ if (error.hasError) return <div>Error: {error.error}</div>;
385
+
386
+ return <div>{data}</div>;
387
+ }
388
+ ```
389
+
390
+ ## Error Logging and Debugging
391
+
392
+ ### Logging Errors
393
+
394
+ ```rust
395
+ use log::{error, warn, info};
396
+
397
+ #[tauri::command]
398
+ async fn operation_with_logging() -> Result<(), String> {
399
+ info!("Starting operation");
400
+
401
+ match perform_operation().await {
402
+ Ok(result) => {
403
+ info!("Operation completed successfully");
404
+ Ok(result)
405
+ }
406
+ Err(e) => {
407
+ error!("Operation failed: {}", e);
408
+ Err(e.to_string())
409
+ }
410
+ }
411
+ }
412
+
413
+ // Error with context logging
414
+ async fn load_config() -> Result<Config, AppError> {
415
+ match tokio::fs::read_to_string("config.json").await {
416
+ Ok(content) => {
417
+ info!("Config file loaded");
418
+ Ok(serde_json::from_str(&content)?)
419
+ }
420
+ Err(e) => {
421
+ error!("Failed to load config: {}", e);
422
+ warn!("Using default configuration");
423
+ Ok(Config::default())
424
+ }
425
+ }
426
+ }
427
+ ```
428
+
429
+ ### Error Reporting to Frontend
430
+
431
+ ```rust
432
+ #[tauri::command]
433
+ async fn operation_with_reporting(
434
+ window: tauri::Window,
435
+ ) -> Result<(), String> {
436
+ match risky_operation().await {
437
+ Ok(_) => Ok(()),
438
+ Err(e) => {
439
+ // Log error
440
+ log::error!("Operation failed: {}", e);
441
+
442
+ // Report to frontend
443
+ window.emit("error-occurred", serde_json::json!({
444
+ "message": e.to_string(),
445
+ "timestamp": chrono::Utc::now().to_rfc3339(),
446
+ "severity": "error"
447
+ })).ok();
448
+
449
+ Err(e.to_string())
450
+ }
451
+ }
452
+ }
453
+ ```
454
+
455
+ **Frontend error listener**:
456
+ ```typescript
457
+ import { listen } from '@tauri-apps/api/event';
458
+
459
+ listen('error-occurred', (event) => {
460
+ const { message, timestamp, severity } = event.payload;
461
+
462
+ console.error(`[${timestamp}] ${severity}: ${message}`);
463
+
464
+ // Show toast notification
465
+ showErrorToast(message);
466
+
467
+ // Log to error tracking service
468
+ trackError({ message, timestamp, severity });
469
+ });
470
+ ```
471
+
472
+ ## Retry and Recovery Patterns
473
+
474
+ ### Retry with Exponential Backoff
475
+
476
+ ```rust
477
+ use tokio::time::{sleep, Duration};
478
+
479
+ async fn retry_operation<F, T, E>(
480
+ mut operation: F,
481
+ max_attempts: u32,
482
+ ) -> Result<T, E>
483
+ where
484
+ F: FnMut() -> std::pin::Pin<Box<dyn Future<Output = Result<T, E>> + Send>>,
485
+ {
486
+ let mut attempt = 0;
487
+
488
+ loop {
489
+ attempt += 1;
490
+
491
+ match operation().await {
492
+ Ok(result) => return Ok(result),
493
+ Err(e) if attempt >= max_attempts => return Err(e),
494
+ Err(_) => {
495
+ let delay = Duration::from_millis(100 * 2u64.pow(attempt));
496
+ sleep(delay).await;
497
+ }
498
+ }
499
+ }
500
+ }
501
+
502
+ #[tauri::command]
503
+ async fn fetch_with_retry(url: String) -> Result<String, String> {
504
+ retry_operation(
505
+ || Box::pin(fetch_data(&url)),
506
+ 3
507
+ )
508
+ .await
509
+ .map_err(|e| e.to_string())
510
+ }
511
+ ```
512
+
513
+ ### Graceful Degradation
514
+
515
+ ```rust
516
+ #[tauri::command]
517
+ async fn load_data_with_fallback() -> Result<Data, String> {
518
+ // Try primary source
519
+ match load_from_primary().await {
520
+ Ok(data) => return Ok(data),
521
+ Err(e) => {
522
+ log::warn!("Primary source failed: {}, trying cache", e);
523
+ }
524
+ }
525
+
526
+ // Try cache
527
+ match load_from_cache().await {
528
+ Ok(data) => return Ok(data),
529
+ Err(e) => {
530
+ log::warn!("Cache failed: {}, using defaults", e);
531
+ }
532
+ }
533
+
534
+ // Use defaults
535
+ Ok(Data::default())
536
+ }
537
+ ```
538
+
539
+ ## Best Practices
540
+
541
+ 1. **Use thiserror for custom errors** - Clean, maintainable error definitions
542
+ 2. **Convert to String for IPC** - Tauri requires serializable errors
543
+ 3. **Add context to errors** - Include what operation failed
544
+ 4. **Log errors appropriately** - Use log levels (error, warn, info)
545
+ 5. **Provide user-friendly messages** - Don't expose technical details
546
+ 6. **Use domain-specific errors** - Organize by feature/module
547
+ 7. **Implement retry logic** - For transient failures
548
+ 8. **Report errors to frontend** - Via events for async operations
549
+ 9. **Test error paths** - Ensure proper error handling
550
+ 10. **Document error codes** - Help frontend developers
551
+
552
+ ## Common Pitfalls
553
+
554
+ ❌ **Using panic! instead of Result**:
555
+ ```rust
556
+ // WRONG - panic in library code
557
+ #[tauri::command]
558
+ fn bad_command(input: String) -> String {
559
+ if input.is_empty() {
560
+ panic!("Empty input!"); // Crashes app!
561
+ }
562
+ process(input)
563
+ }
564
+
565
+ // CORRECT - return Result
566
+ #[tauri::command]
567
+ fn good_command(input: String) -> Result<String, String> {
568
+ if input.is_empty() {
569
+ return Err("Empty input not allowed".to_string());
570
+ }
571
+ Ok(process(input))
572
+ }
573
+ ```
574
+
575
+ ❌ **Not implementing From<AppError> for String**:
576
+ ```rust
577
+ // WRONG - can't use ? operator
578
+ #[tauri::command]
579
+ async fn command() -> Result<Data, String> {
580
+ let data = load().await?; // AppError doesn't convert to String
581
+ Ok(data)
582
+ }
583
+
584
+ // CORRECT - implement conversion
585
+ impl From<AppError> for String {
586
+ fn from(error: AppError) -> Self {
587
+ error.to_string()
588
+ }
589
+ }
590
+ ```
591
+
592
+ ❌ **Exposing technical details in errors**:
593
+ ```rust
594
+ // WRONG - leaks implementation details
595
+ Err(format!("Database error: {}", e)) // Shows SQL errors to user
596
+
597
+ // CORRECT - user-friendly message
598
+ Err("Failed to load data. Please try again.".to_string())
599
+ // Log technical details separately
600
+ ```
601
+
602
+ ## Summary
603
+
604
+ - **thiserror** for clean custom error types
605
+ - **Convert to String** for Tauri IPC compatibility
606
+ - **Add context** to errors for debugging
607
+ - **Domain-specific errors** for better organization
608
+ - **Structured errors** for complex error information
609
+ - **Log appropriately** with proper severity levels
610
+ - **Frontend error handling** with type-safe parsing
611
+ - **Retry logic** for transient failures
612
+ - **Graceful degradation** when possible
613
+ - **User-friendly messages** without technical jargon