claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__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.
Files changed (484) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +11 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +10 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/interfaces/__init__.py +1 -3
  162. claude_mpm/services/core/interfaces/health.py +1 -4
  163. claude_mpm/services/core/models/__init__.py +2 -11
  164. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  165. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  166. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  167. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  168. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  169. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  171. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  172. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  173. claude_mpm/services/event_bus/direct_relay.py +3 -3
  174. claude_mpm/services/event_bus/event_bus.py +36 -3
  175. claude_mpm/services/events/consumers/logging.py +1 -2
  176. claude_mpm/services/git/__init__.py +21 -0
  177. claude_mpm/services/git/git_operations_service.py +494 -0
  178. claude_mpm/services/github/__init__.py +21 -0
  179. claude_mpm/services/github/github_cli_service.py +397 -0
  180. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  181. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  182. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  183. claude_mpm/services/instructions/__init__.py +9 -0
  184. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  185. claude_mpm/services/local_ops/__init__.py +3 -13
  186. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  187. claude_mpm/services/local_ops/health_manager.py +1 -4
  188. claude_mpm/services/local_ops/process_manager.py +1 -1
  189. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  190. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  191. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  192. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  193. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  194. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  195. claude_mpm/services/memory/optimizer.py +1 -1
  196. claude_mpm/services/model/model_router.py +8 -9
  197. claude_mpm/services/monitor/daemon.py +1 -1
  198. claude_mpm/services/monitor/server.py +2 -2
  199. claude_mpm/services/native_agent_converter.py +356 -0
  200. claude_mpm/services/port_manager.py +1 -1
  201. claude_mpm/services/pr/__init__.py +14 -0
  202. claude_mpm/services/pr/pr_template_service.py +329 -0
  203. claude_mpm/services/project/documentation_manager.py +2 -1
  204. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  205. claude_mpm/services/runner_configuration_service.py +1 -0
  206. claude_mpm/services/self_upgrade_service.py +165 -7
  207. claude_mpm/services/skills/__init__.py +18 -0
  208. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  209. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  210. claude_mpm/services/skills_config.py +547 -0
  211. claude_mpm/services/skills_deployer.py +955 -0
  212. claude_mpm/services/socketio/handlers/connection.py +1 -1
  213. claude_mpm/services/socketio/handlers/git.py +2 -2
  214. claude_mpm/services/socketio/server/core.py +1 -4
  215. claude_mpm/services/socketio/server/main.py +1 -3
  216. claude_mpm/services/system_instructions_service.py +1 -3
  217. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  218. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  219. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  220. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  221. claude_mpm/services/unified/unified_deployment.py +1 -5
  222. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  223. claude_mpm/services/visualization/__init__.py +1 -5
  224. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  225. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  226. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  227. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  228. claude_mpm/skills/skills_registry.py +0 -1
  229. claude_mpm/templates/questions/__init__.py +38 -0
  230. claude_mpm/templates/questions/base.py +193 -0
  231. claude_mpm/templates/questions/pr_strategy.py +311 -0
  232. claude_mpm/templates/questions/project_init.py +385 -0
  233. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  234. claude_mpm/tools/__main__.py +8 -8
  235. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  236. claude_mpm/utils/agent_dependency_loader.py +80 -13
  237. claude_mpm/utils/dependency_cache.py +3 -1
  238. claude_mpm/utils/gitignore.py +241 -0
  239. claude_mpm/utils/log_cleanup.py +3 -3
  240. claude_mpm/utils/progress.py +383 -0
  241. claude_mpm/utils/robust_installer.py +3 -5
  242. claude_mpm/utils/structured_questions.py +619 -0
  243. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  244. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
  245. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  246. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  247. claude_mpm/agents/templates/agent-manager.json +0 -273
  248. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  249. claude_mpm/agents/templates/api_qa.json +0 -180
  250. claude_mpm/agents/templates/clerk-ops.json +0 -235
  251. claude_mpm/agents/templates/code_analyzer.json +0 -101
  252. claude_mpm/agents/templates/content-agent.json +0 -358
  253. claude_mpm/agents/templates/dart_engineer.json +0 -307
  254. claude_mpm/agents/templates/data_engineer.json +0 -225
  255. claude_mpm/agents/templates/documentation.json +0 -211
  256. claude_mpm/agents/templates/engineer.json +0 -210
  257. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  258. claude_mpm/agents/templates/golang_engineer.json +0 -270
  259. claude_mpm/agents/templates/imagemagick.json +0 -264
  260. claude_mpm/agents/templates/java_engineer.json +0 -346
  261. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  262. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  263. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  264. claude_mpm/agents/templates/memory_manager.json +0 -158
  265. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  266. claude_mpm/agents/templates/ops.json +0 -185
  267. claude_mpm/agents/templates/php-engineer.json +0 -287
  268. claude_mpm/agents/templates/product_owner.json +0 -338
  269. claude_mpm/agents/templates/project_organizer.json +0 -140
  270. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  271. claude_mpm/agents/templates/python_engineer.json +0 -387
  272. claude_mpm/agents/templates/qa.json +0 -242
  273. claude_mpm/agents/templates/react_engineer.json +0 -238
  274. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  275. claude_mpm/agents/templates/research.json +0 -188
  276. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  277. claude_mpm/agents/templates/rust_engineer.json +0 -275
  278. claude_mpm/agents/templates/security.json +0 -202
  279. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  280. claude_mpm/agents/templates/ticketing.json +0 -177
  281. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  282. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  283. claude_mpm/agents/templates/version_control.json +0 -157
  284. claude_mpm/agents/templates/web_qa.json +0 -399
  285. claude_mpm/agents/templates/web_ui.json +0 -189
  286. claude_mpm/commands/mpm-tickets.md +0 -102
  287. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  288. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  289. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  290. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  291. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  292. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  293. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  294. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  295. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  296. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  297. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  298. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  299. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  300. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  301. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  302. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  303. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  304. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  305. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  306. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  307. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  308. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  309. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  310. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  311. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  312. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  313. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  314. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  315. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  316. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  317. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  318. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  319. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  320. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  321. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  322. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  323. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  324. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  325. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  326. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  327. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  328. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  329. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  330. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  332. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  333. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  334. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  335. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  337. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  338. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  339. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  340. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  341. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  342. claude_mpm/dashboard/static/built/react/events.js +0 -30
  343. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  344. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  345. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  346. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  347. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  348. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  349. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  350. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  351. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  352. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  353. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  354. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  355. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  356. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  357. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  358. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  359. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  370. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  371. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  372. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  373. claude_mpm/dashboard/static/events.html +0 -607
  374. claude_mpm/dashboard/static/index.html +0 -635
  375. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  376. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  377. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  378. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  379. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  380. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  381. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  382. claude_mpm/dashboard/static/legacy/files.html +0 -747
  383. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  384. claude_mpm/dashboard/static/monitors.html +0 -431
  385. claude_mpm/dashboard/static/production/events.html +0 -659
  386. claude_mpm/dashboard/static/production/main.html +0 -698
  387. claude_mpm/dashboard/static/production/monitors.html +0 -483
  388. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  389. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  390. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  391. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  392. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  393. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  394. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  395. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  396. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  397. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  398. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  399. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  400. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  401. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  402. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  403. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  404. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  405. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  406. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  407. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  408. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  409. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  410. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  411. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  412. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  413. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  414. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  415. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  416. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  417. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  418. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  419. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  420. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  421. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  422. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  423. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  424. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  425. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  426. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  427. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  428. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  429. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  430. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  431. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  435. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  436. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  437. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  452. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  458. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  459. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  460. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  461. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  462. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  463. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  464. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  465. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  467. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  468. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  469. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  470. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  471. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  472. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  473. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  474. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  475. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  476. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  477. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  478. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  479. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  480. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  481. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  482. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  483. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  484. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -1,901 +0,0 @@
1
- # Architecture Patterns
2
-
3
- Desktop-specific architectural patterns for building maintainable, scalable Rust applications with clear separation of concerns.
4
-
5
- ## Core Architectural Patterns
6
-
7
- ### MVC (Model-View-Controller)
8
-
9
- Traditional pattern adapted for desktop applications.
10
-
11
- ```rust
12
- // Model - Application state and business logic
13
- mod model {
14
- use serde::{Deserialize, Serialize};
15
-
16
- #[derive(Clone, Debug, Serialize, Deserialize)]
17
- pub struct User {
18
- pub id: u64,
19
- pub name: String,
20
- pub email: String,
21
- }
22
-
23
- #[derive(Clone, Debug)]
24
- pub struct UserModel {
25
- users: Vec<User>,
26
- }
27
-
28
- impl UserModel {
29
- pub fn new() -> Self {
30
- Self { users: Vec::new() }
31
- }
32
-
33
- pub fn add_user(&mut self, user: User) {
34
- self.users.push(user);
35
- }
36
-
37
- pub fn remove_user(&mut self, id: u64) {
38
- self.users.retain(|u| u.id != id);
39
- }
40
-
41
- pub fn get_users(&self) -> &[User] {
42
- &self.users
43
- }
44
-
45
- pub fn find_user(&self, id: u64) -> Option<&User> {
46
- self.users.iter().find(|u| u.id == id)
47
- }
48
- }
49
- }
50
-
51
- // Controller - Handles user input and updates model
52
- mod controller {
53
- use super::model::{User, UserModel};
54
-
55
- pub struct UserController {
56
- model: UserModel,
57
- }
58
-
59
- impl UserController {
60
- pub fn new(model: UserModel) -> Self {
61
- Self { model }
62
- }
63
-
64
- pub fn create_user(&mut self, name: String, email: String) -> Result<(), String> {
65
- // Validation
66
- if name.is_empty() {
67
- return Err("Name cannot be empty".to_string());
68
- }
69
-
70
- let id = self.model.get_users().len() as u64 + 1;
71
- let user = User { id, name, email };
72
-
73
- self.model.add_user(user);
74
- Ok(())
75
- }
76
-
77
- pub fn delete_user(&mut self, id: u64) -> Result<(), String> {
78
- if self.model.find_user(id).is_none() {
79
- return Err("User not found".to_string());
80
- }
81
-
82
- self.model.remove_user(id);
83
- Ok(())
84
- }
85
-
86
- pub fn get_model(&self) -> &UserModel {
87
- &self.model
88
- }
89
- }
90
- }
91
-
92
- // View - UI rendering (Tauri example)
93
- #[tauri::command]
94
- fn get_users(controller: tauri::State<UserController>) -> Vec<User> {
95
- controller.get_model().get_users().to_vec()
96
- }
97
-
98
- #[tauri::command]
99
- fn create_user(
100
- controller: tauri::State<UserController>,
101
- name: String,
102
- email: String,
103
- ) -> Result<(), String> {
104
- controller.inner().lock().unwrap().create_user(name, email)
105
- }
106
- ```
107
-
108
- ### MVVM (Model-View-ViewModel)
109
-
110
- Better for reactive UIs with two-way data binding.
111
-
112
- ```rust
113
- use std::sync::{Arc, Mutex};
114
- use tokio::sync::broadcast;
115
-
116
- // Model - Business data
117
- #[derive(Clone, Debug)]
118
- pub struct TodoItem {
119
- pub id: u64,
120
- pub title: String,
121
- pub completed: bool,
122
- }
123
-
124
- pub struct TodoModel {
125
- items: Vec<TodoItem>,
126
- next_id: u64,
127
- }
128
-
129
- impl TodoModel {
130
- pub fn new() -> Self {
131
- Self {
132
- items: Vec::new(),
133
- next_id: 1,
134
- }
135
- }
136
-
137
- pub fn add_item(&mut self, title: String) -> TodoItem {
138
- let item = TodoItem {
139
- id: self.next_id,
140
- title,
141
- completed: false,
142
- };
143
- self.next_id += 1;
144
- self.items.push(item.clone());
145
- item
146
- }
147
-
148
- pub fn toggle_item(&mut self, id: u64) -> Option<bool> {
149
- self.items
150
- .iter_mut()
151
- .find(|item| item.id == id)
152
- .map(|item| {
153
- item.completed = !item.completed;
154
- item.completed
155
- })
156
- }
157
-
158
- pub fn get_items(&self) -> &[TodoItem] {
159
- &self.items
160
- }
161
- }
162
-
163
- // ViewModel - Presentation logic and state
164
- pub struct TodoViewModel {
165
- model: Arc<Mutex<TodoModel>>,
166
- change_notifier: broadcast::Sender<ViewModelEvent>,
167
- }
168
-
169
- #[derive(Clone, Debug)]
170
- pub enum ViewModelEvent {
171
- ItemAdded(TodoItem),
172
- ItemToggled(u64, bool),
173
- ItemsChanged,
174
- }
175
-
176
- impl TodoViewModel {
177
- pub fn new() -> Self {
178
- let (tx, _rx) = broadcast::channel(100);
179
- Self {
180
- model: Arc::new(Mutex::new(TodoModel::new())),
181
- change_notifier: tx,
182
- }
183
- }
184
-
185
- pub fn add_todo(&self, title: String) -> Result<(), String> {
186
- if title.trim().is_empty() {
187
- return Err("Title cannot be empty".to_string());
188
- }
189
-
190
- let mut model = self.model.lock().unwrap();
191
- let item = model.add_item(title);
192
- drop(model);
193
-
194
- let _ = self.change_notifier.send(ViewModelEvent::ItemAdded(item));
195
- Ok(())
196
- }
197
-
198
- pub fn toggle_todo(&self, id: u64) -> Result<(), String> {
199
- let mut model = self.model.lock().unwrap();
200
- let completed = model
201
- .toggle_item(id)
202
- .ok_or("Item not found".to_string())?;
203
- drop(model);
204
-
205
- let _ = self
206
- .change_notifier
207
- .send(ViewModelEvent::ItemToggled(id, completed));
208
- Ok(())
209
- }
210
-
211
- pub fn get_todos(&self) -> Vec<TodoItem> {
212
- self.model.lock().unwrap().get_items().to_vec()
213
- }
214
-
215
- pub fn subscribe(&self) -> broadcast::Receiver<ViewModelEvent> {
216
- self.change_notifier.subscribe()
217
- }
218
- }
219
-
220
- // View - Tauri commands
221
- #[tauri::command]
222
- async fn add_todo(viewmodel: tauri::State<'_, TodoViewModel>, title: String) -> Result<(), String> {
223
- viewmodel.add_todo(title)
224
- }
225
-
226
- #[tauri::command]
227
- async fn toggle_todo(viewmodel: tauri::State<'_, TodoViewModel>, id: u64) -> Result<(), String> {
228
- viewmodel.toggle_todo(id)
229
- }
230
-
231
- #[tauri::command]
232
- async fn get_todos(viewmodel: tauri::State<'_, TodoViewModel>) -> Vec<TodoItem> {
233
- viewmodel.get_todos()
234
- }
235
-
236
- // Setup with change notifications
237
- fn main() {
238
- let viewmodel = TodoViewModel::new();
239
- let mut rx = viewmodel.subscribe();
240
-
241
- // Background task to push updates to frontend
242
- tokio::spawn(async move {
243
- while let Ok(event) = rx.recv().await {
244
- // Emit event to frontend
245
- println!("ViewModel changed: {:?}", event);
246
- }
247
- });
248
-
249
- tauri::Builder::default()
250
- .manage(viewmodel)
251
- .invoke_handler(tauri::generate_handler![add_todo, toggle_todo, get_todos])
252
- .run(tauri::generate_context!())
253
- .expect("error while running tauri application");
254
- }
255
- ```
256
-
257
- ### Command Pattern
258
-
259
- Encapsulate actions as objects for undo/redo functionality.
260
-
261
- ```rust
262
- use std::fmt;
263
-
264
- // Command trait
265
- pub trait Command: fmt::Debug {
266
- fn execute(&mut self, app: &mut Application) -> Result<(), String>;
267
- fn undo(&mut self, app: &mut Application) -> Result<(), String>;
268
- fn description(&self) -> String;
269
- }
270
-
271
- // Application state
272
- pub struct Application {
273
- pub text: String,
274
- pub cursor: usize,
275
- }
276
-
277
- // Concrete commands
278
- #[derive(Debug)]
279
- pub struct InsertTextCommand {
280
- text: String,
281
- position: usize,
282
- }
283
-
284
- impl Command for InsertTextCommand {
285
- fn execute(&mut self, app: &mut Application) -> Result<(), String> {
286
- app.text.insert_str(self.position, &self.text);
287
- app.cursor = self.position + self.text.len();
288
- Ok(())
289
- }
290
-
291
- fn undo(&mut self, app: &mut Application) -> Result<(), String> {
292
- let start = self.position;
293
- let end = self.position + self.text.len();
294
- app.text.drain(start..end);
295
- app.cursor = self.position;
296
- Ok(())
297
- }
298
-
299
- fn description(&self) -> String {
300
- format!("Insert '{}'", self.text)
301
- }
302
- }
303
-
304
- #[derive(Debug)]
305
- pub struct DeleteTextCommand {
306
- deleted_text: String,
307
- position: usize,
308
- length: usize,
309
- }
310
-
311
- impl Command for DeleteTextCommand {
312
- fn execute(&mut self, app: &mut Application) -> Result<(), String> {
313
- let start = self.position;
314
- let end = self.position + self.length;
315
- self.deleted_text = app.text.drain(start..end).collect();
316
- app.cursor = self.position;
317
- Ok(())
318
- }
319
-
320
- fn undo(&mut self, app: &mut Application) -> Result<(), String> {
321
- app.text.insert_str(self.position, &self.deleted_text);
322
- app.cursor = self.position + self.deleted_text.len();
323
- Ok(())
324
- }
325
-
326
- fn description(&self) -> String {
327
- format!("Delete {} characters", self.length)
328
- }
329
- }
330
-
331
- // Command manager with undo/redo
332
- pub struct CommandManager {
333
- history: Vec<Box<dyn Command>>,
334
- current: usize,
335
- }
336
-
337
- impl CommandManager {
338
- pub fn new() -> Self {
339
- Self {
340
- history: Vec::new(),
341
- current: 0,
342
- }
343
- }
344
-
345
- pub fn execute(&mut self, mut command: Box<dyn Command>, app: &mut Application) -> Result<(), String> {
346
- command.execute(app)?;
347
-
348
- // Clear redo history
349
- self.history.truncate(self.current);
350
- self.history.push(command);
351
- self.current += 1;
352
-
353
- Ok(())
354
- }
355
-
356
- pub fn undo(&mut self, app: &mut Application) -> Result<(), String> {
357
- if self.current == 0 {
358
- return Err("Nothing to undo".to_string());
359
- }
360
-
361
- self.current -= 1;
362
- self.history[self.current].undo(app)?;
363
- Ok(())
364
- }
365
-
366
- pub fn redo(&mut self, app: &mut Application) -> Result<(), String> {
367
- if self.current >= self.history.len() {
368
- return Err("Nothing to redo".to_string());
369
- }
370
-
371
- self.history[self.current].execute(app)?;
372
- self.current += 1;
373
- Ok(())
374
- }
375
-
376
- pub fn can_undo(&self) -> bool {
377
- self.current > 0
378
- }
379
-
380
- pub fn can_redo(&self) -> bool {
381
- self.current < self.history.len()
382
- }
383
-
384
- pub fn get_history(&self) -> Vec<String> {
385
- self.history
386
- .iter()
387
- .take(self.current)
388
- .map(|cmd| cmd.description())
389
- .collect()
390
- }
391
- }
392
-
393
- // Tauri integration
394
- use std::sync::Mutex;
395
-
396
- struct AppState {
397
- app: Mutex<Application>,
398
- commands: Mutex<CommandManager>,
399
- }
400
-
401
- #[tauri::command]
402
- fn insert_text(state: tauri::State<AppState>, text: String, position: usize) -> Result<(), String> {
403
- let mut app = state.app.lock().unwrap();
404
- let mut commands = state.commands.lock().unwrap();
405
-
406
- let command = Box::new(InsertTextCommand { text, position });
407
- commands.execute(command, &mut app)
408
- }
409
-
410
- #[tauri::command]
411
- fn undo(state: tauri::State<AppState>) -> Result<(), String> {
412
- let mut app = state.app.lock().unwrap();
413
- let mut commands = state.commands.lock().unwrap();
414
- commands.undo(&mut app)
415
- }
416
-
417
- #[tauri::command]
418
- fn redo(state: tauri::State<AppState>) -> Result<(), String> {
419
- let mut app = state.app.lock().unwrap();
420
- let mut commands = state.commands.lock().unwrap();
421
- commands.redo(&mut app)
422
- }
423
- ```
424
-
425
- ## Event-Driven Architecture
426
-
427
- ### Event Bus Pattern
428
-
429
- ```rust
430
- use std::collections::HashMap;
431
- use std::sync::{Arc, Mutex};
432
- use tokio::sync::mpsc;
433
-
434
- // Event types
435
- #[derive(Clone, Debug)]
436
- pub enum AppEvent {
437
- UserLoggedIn { user_id: u64, username: String },
438
- FileOpened { path: String },
439
- DataChanged { entity: String, id: u64 },
440
- ErrorOccurred { message: String },
441
- }
442
-
443
- // Event handler trait
444
- pub trait EventHandler: Send + Sync {
445
- fn handle(&self, event: &AppEvent);
446
- }
447
-
448
- // Event bus
449
- pub struct EventBus {
450
- handlers: Arc<Mutex<HashMap<String, Vec<Arc<dyn EventHandler>>>>>,
451
- sender: mpsc::UnboundedSender<AppEvent>,
452
- }
453
-
454
- impl EventBus {
455
- pub fn new() -> Self {
456
- let handlers = Arc::new(Mutex::new(HashMap::new()));
457
- let handlers_clone = handlers.clone();
458
-
459
- let (sender, mut receiver) = mpsc::unbounded_channel();
460
-
461
- // Background task to dispatch events
462
- tokio::spawn(async move {
463
- while let Some(event) = receiver.recv().await {
464
- let event_type = format!("{:?}", event).split('{').next().unwrap().trim().to_string();
465
- let handlers = handlers_clone.lock().unwrap();
466
-
467
- if let Some(handlers_list) = handlers.get(&event_type) {
468
- for handler in handlers_list {
469
- handler.handle(&event);
470
- }
471
- }
472
- }
473
- });
474
-
475
- Self { handlers, sender }
476
- }
477
-
478
- pub fn subscribe(&self, event_type: &str, handler: Arc<dyn EventHandler>) {
479
- let mut handlers = self.handlers.lock().unwrap();
480
- handlers
481
- .entry(event_type.to_string())
482
- .or_insert_with(Vec::new)
483
- .push(handler);
484
- }
485
-
486
- pub fn publish(&self, event: AppEvent) {
487
- let _ = self.sender.send(event);
488
- }
489
- }
490
-
491
- // Example handlers
492
- struct LoggingHandler;
493
-
494
- impl EventHandler for LoggingHandler {
495
- fn handle(&self, event: &AppEvent) {
496
- println!("[LOG] Event: {:?}", event);
497
- }
498
- }
499
-
500
- struct AnalyticsHandler;
501
-
502
- impl EventHandler for AnalyticsHandler {
503
- fn handle(&self, event: &AppEvent) {
504
- // Send to analytics service
505
- println!("[ANALYTICS] Tracking: {:?}", event);
506
- }
507
- }
508
-
509
- // Usage
510
- fn setup_event_bus() -> EventBus {
511
- let event_bus = EventBus::new();
512
-
513
- event_bus.subscribe("UserLoggedIn", Arc::new(LoggingHandler));
514
- event_bus.subscribe("UserLoggedIn", Arc::new(AnalyticsHandler));
515
-
516
- event_bus
517
- }
518
-
519
- #[tauri::command]
520
- fn login_user(
521
- event_bus: tauri::State<EventBus>,
522
- user_id: u64,
523
- username: String,
524
- ) -> Result<(), String> {
525
- // Perform login logic...
526
-
527
- event_bus.publish(AppEvent::UserLoggedIn { user_id, username });
528
-
529
- Ok(())
530
- }
531
- ```
532
-
533
- ## Plugin System
534
-
535
- ### Dynamic Plugin Architecture
536
-
537
- ```rust
538
- use std::collections::HashMap;
539
- use std::sync::Arc;
540
-
541
- // Plugin trait
542
- pub trait Plugin: Send + Sync {
543
- fn name(&self) -> &str;
544
- fn version(&self) -> &str;
545
- fn initialize(&mut self, context: &PluginContext) -> Result<(), String>;
546
- fn shutdown(&mut self) -> Result<(), String>;
547
- fn execute(&self, command: &str, args: Vec<String>) -> Result<String, String>;
548
- }
549
-
550
- // Plugin context (shared resources)
551
- pub struct PluginContext {
552
- pub app_name: String,
553
- pub config_dir: String,
554
- }
555
-
556
- // Plugin manager
557
- pub struct PluginManager {
558
- plugins: HashMap<String, Box<dyn Plugin>>,
559
- context: Arc<PluginContext>,
560
- }
561
-
562
- impl PluginManager {
563
- pub fn new(context: PluginContext) -> Self {
564
- Self {
565
- plugins: HashMap::new(),
566
- context: Arc::new(context),
567
- }
568
- }
569
-
570
- pub fn register(&mut self, mut plugin: Box<dyn Plugin>) -> Result<(), String> {
571
- let name = plugin.name().to_string();
572
-
573
- plugin.initialize(&self.context)?;
574
- self.plugins.insert(name.clone(), plugin);
575
-
576
- println!("Plugin registered: {}", name);
577
- Ok(())
578
- }
579
-
580
- pub fn execute(
581
- &self,
582
- plugin_name: &str,
583
- command: &str,
584
- args: Vec<String>,
585
- ) -> Result<String, String> {
586
- self.plugins
587
- .get(plugin_name)
588
- .ok_or_else(|| format!("Plugin '{}' not found", plugin_name))?
589
- .execute(command, args)
590
- }
591
-
592
- pub fn list_plugins(&self) -> Vec<(String, String)> {
593
- self.plugins
594
- .values()
595
- .map(|p| (p.name().to_string(), p.version().to_string()))
596
- .collect()
597
- }
598
-
599
- pub fn shutdown_all(&mut self) -> Result<(), String> {
600
- for (name, plugin) in self.plugins.iter_mut() {
601
- plugin.shutdown().map_err(|e| {
602
- format!("Failed to shutdown plugin '{}': {}", name, e)
603
- })?;
604
- }
605
- Ok(())
606
- }
607
- }
608
-
609
- // Example plugin
610
- struct MarkdownPlugin {
611
- enabled: bool,
612
- }
613
-
614
- impl Plugin for MarkdownPlugin {
615
- fn name(&self) -> &str {
616
- "markdown"
617
- }
618
-
619
- fn version(&self) -> &str {
620
- "1.0.0"
621
- }
622
-
623
- fn initialize(&mut self, _context: &PluginContext) -> Result<(), String> {
624
- self.enabled = true;
625
- println!("Markdown plugin initialized");
626
- Ok(())
627
- }
628
-
629
- fn shutdown(&mut self) -> Result<(), String> {
630
- self.enabled = false;
631
- println!("Markdown plugin shutdown");
632
- Ok(())
633
- }
634
-
635
- fn execute(&self, command: &str, args: Vec<String>) -> Result<String, String> {
636
- if !self.enabled {
637
- return Err("Plugin not enabled".to_string());
638
- }
639
-
640
- match command {
641
- "render" => {
642
- if args.is_empty() {
643
- return Err("No markdown text provided".to_string());
644
- }
645
- // Simplified markdown rendering
646
- Ok(format!("<html>{}</html>", args[0]))
647
- }
648
- _ => Err(format!("Unknown command: {}", command)),
649
- }
650
- }
651
- }
652
-
653
- // Tauri integration
654
- #[tauri::command]
655
- fn execute_plugin(
656
- manager: tauri::State<PluginManager>,
657
- plugin: String,
658
- command: String,
659
- args: Vec<String>,
660
- ) -> Result<String, String> {
661
- manager.execute(&plugin, &command, args)
662
- }
663
-
664
- #[tauri::command]
665
- fn list_plugins(manager: tauri::State<PluginManager>) -> Vec<(String, String)> {
666
- manager.list_plugins()
667
- }
668
- ```
669
-
670
- ## Resource Management
671
-
672
- ### Resource Pool Pattern
673
-
674
- ```rust
675
- use std::sync::{Arc, Mutex};
676
- use std::collections::VecDeque;
677
-
678
- pub struct ResourcePool<T> {
679
- resources: Arc<Mutex<VecDeque<T>>>,
680
- factory: Arc<dyn Fn() -> T + Send + Sync>,
681
- max_size: usize,
682
- }
683
-
684
- impl<T: Send + 'static> ResourcePool<T> {
685
- pub fn new<F>(factory: F, max_size: usize) -> Self
686
- where
687
- F: Fn() -> T + Send + Sync + 'static,
688
- {
689
- Self {
690
- resources: Arc::new(Mutex::new(VecDeque::new())),
691
- factory: Arc::new(factory),
692
- max_size,
693
- }
694
- }
695
-
696
- pub fn acquire(&self) -> PooledResource<T> {
697
- let resource = {
698
- let mut pool = self.resources.lock().unwrap();
699
- pool.pop_front().unwrap_or_else(|| (self.factory)())
700
- };
701
-
702
- PooledResource {
703
- resource: Some(resource),
704
- pool: self.resources.clone(),
705
- max_size: self.max_size,
706
- }
707
- }
708
-
709
- pub fn size(&self) -> usize {
710
- self.resources.lock().unwrap().len()
711
- }
712
- }
713
-
714
- pub struct PooledResource<T> {
715
- resource: Option<T>,
716
- pool: Arc<Mutex<VecDeque<T>>>,
717
- max_size: usize,
718
- }
719
-
720
- impl<T> PooledResource<T> {
721
- pub fn get(&self) -> &T {
722
- self.resource.as_ref().unwrap()
723
- }
724
-
725
- pub fn get_mut(&mut self) -> &mut T {
726
- self.resource.as_mut().unwrap()
727
- }
728
- }
729
-
730
- impl<T> Drop for PooledResource<T> {
731
- fn drop(&mut self) {
732
- if let Some(resource) = self.resource.take() {
733
- let mut pool = self.pool.lock().unwrap();
734
- if pool.len() < self.max_size {
735
- pool.push_back(resource);
736
- }
737
- }
738
- }
739
- }
740
-
741
- // Example: Database connection pool
742
- use sqlx::{SqlitePool, SqliteConnection};
743
-
744
- pub struct DatabasePool {
745
- pool: ResourcePool<SqliteConnection>,
746
- }
747
-
748
- impl DatabasePool {
749
- pub async fn new(database_url: &str, max_size: usize) -> Self {
750
- let url = database_url.to_string();
751
- Self {
752
- pool: ResourcePool::new(
753
- move || {
754
- // This would need to be async in real implementation
755
- unimplemented!("Use sqlx::SqlitePool instead")
756
- },
757
- max_size,
758
- ),
759
- }
760
- }
761
- }
762
- ```
763
-
764
- ## Error Handling Strategies
765
-
766
- ### Application-Level Error Types
767
-
768
- ```rust
769
- use thiserror::Error;
770
-
771
- #[derive(Error, Debug)]
772
- pub enum AppError {
773
- #[error("Database error: {0}")]
774
- Database(#[from] sqlx::Error),
775
-
776
- #[error("IO error: {0}")]
777
- Io(#[from] std::io::Error),
778
-
779
- #[error("Serialization error: {0}")]
780
- Serialization(#[from] serde_json::Error),
781
-
782
- #[error("Not found: {0}")]
783
- NotFound(String),
784
-
785
- #[error("Validation error: {0}")]
786
- Validation(String),
787
-
788
- #[error("Permission denied: {0}")]
789
- PermissionDenied(String),
790
-
791
- #[error("Internal error: {0}")]
792
- Internal(String),
793
- }
794
-
795
- // Convert to Tauri-compatible error
796
- impl From<AppError> for String {
797
- fn from(error: AppError) -> Self {
798
- error.to_string()
799
- }
800
- }
801
-
802
- // Result type alias
803
- pub type AppResult<T> = Result<T, AppError>;
804
-
805
- // Usage in commands
806
- #[tauri::command]
807
- async fn save_data(data: String) -> Result<(), String> {
808
- perform_save(&data)
809
- .await
810
- .map_err(|e: AppError| e.to_string())
811
- }
812
-
813
- async fn perform_save(data: &str) -> AppResult<()> {
814
- // Validation
815
- if data.is_empty() {
816
- return Err(AppError::Validation("Data cannot be empty".to_string()));
817
- }
818
-
819
- // IO operation
820
- std::fs::write("data.txt", data)?;
821
-
822
- Ok(())
823
- }
824
- ```
825
-
826
- ### Error Recovery Pattern
827
-
828
- ```rust
829
- use std::time::Duration;
830
- use tokio::time::sleep;
831
-
832
- pub struct RetryPolicy {
833
- max_attempts: u32,
834
- delay: Duration,
835
- exponential_backoff: bool,
836
- }
837
-
838
- impl RetryPolicy {
839
- pub fn new(max_attempts: u32, delay: Duration) -> Self {
840
- Self {
841
- max_attempts,
842
- delay,
843
- exponential_backoff: false,
844
- }
845
- }
846
-
847
- pub fn with_exponential_backoff(mut self) -> Self {
848
- self.exponential_backoff = true;
849
- self
850
- }
851
-
852
- pub async fn execute<F, T, E>(&self, mut operation: F) -> Result<T, E>
853
- where
854
- F: FnMut() -> Result<T, E>,
855
- E: std::fmt::Display,
856
- {
857
- let mut attempt = 0;
858
- let mut delay = self.delay;
859
-
860
- loop {
861
- attempt += 1;
862
-
863
- match operation() {
864
- Ok(result) => return Ok(result),
865
- Err(error) => {
866
- if attempt >= self.max_attempts {
867
- println!("Operation failed after {} attempts", attempt);
868
- return Err(error);
869
- }
870
-
871
- println!(
872
- "Attempt {} failed: {}. Retrying in {:?}...",
873
- attempt, error, delay
874
- );
875
-
876
- sleep(delay).await;
877
-
878
- if self.exponential_backoff {
879
- delay *= 2;
880
- }
881
- }
882
- }
883
- }
884
- }
885
- }
886
-
887
- // Usage
888
- async fn fetch_with_retry(url: &str) -> Result<String, String> {
889
- let policy = RetryPolicy::new(3, Duration::from_secs(1))
890
- .with_exponential_backoff();
891
-
892
- policy
893
- .execute(|| {
894
- // Attempt operation
895
- Ok("data".to_string())
896
- })
897
- .await
898
- }
899
- ```
900
-
901
- These patterns provide a solid foundation for building maintainable desktop applications. Choose and combine based on application complexity and requirements.