claude-mpm 4.21.0__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 (497) 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 +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -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/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.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.