claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (502) 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 +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -1,742 +0,0 @@
1
- # Development Workflow Reference
2
-
3
- ## Extension Development Setup
4
-
5
- ### Using ext-template
6
-
7
- The official ext-template provides the recommended structure for EspoCRM extensions.
8
-
9
- ```bash
10
- # Clone the template
11
- git clone https://github.com/espocrm/ext-template.git my-extension
12
- cd my-extension
13
-
14
- # Install dependencies
15
- composer install
16
- npm install
17
- ```
18
-
19
- ### Extension Directory Structure (EspoCRM 7.4+)
20
-
21
- ```
22
- my-extension/
23
- ├── src/
24
- │ ├── files/
25
- │ │ └── custom/Espo/Modules/MyModule/
26
- │ │ ├── Resources/
27
- │ │ │ ├── metadata/
28
- │ │ │ │ ├── entityDefs/
29
- │ │ │ │ ├── clientDefs/
30
- │ │ │ │ └── scopes/
31
- │ │ │ └── layouts/
32
- │ │ ├── Services/
33
- │ │ ├── Controllers/
34
- │ │ ├── Repositories/
35
- │ │ ├── Hooks/
36
- │ │ └── Entities/
37
- │ └── scripts/
38
- ├── tests/
39
- ├── package.json
40
- └── manifest.json
41
- ```
42
-
43
- ### Manifest File
44
-
45
- ```json
46
- {
47
- "name": "My Extension",
48
- "version": "1.0.0",
49
- "acceptableVersions": [">=7.4.0"],
50
- "author": "Your Name",
51
- "description": "Extension description",
52
- "license": "MIT",
53
- "releaseDate": "2024-01-01",
54
- "skipBackup": true
55
- }
56
- ```
57
-
58
- ### Building Extension
59
-
60
- ```bash
61
- # Build installable package
62
- npm run build
63
-
64
- # Output: build/MyExtension-1.0.0.zip
65
- ```
66
-
67
- ## Creating Custom Entities
68
-
69
- ### Step 1: Entity Definition
70
-
71
- Create `src/files/custom/Espo/Modules/MyModule/Resources/metadata/entityDefs/MyEntity.json`:
72
-
73
- ```json
74
- {
75
- "fields": {
76
- "name": {
77
- "type": "varchar",
78
- "required": true,
79
- "maxLength": 255,
80
- "trim": true,
81
- "view": "views/fields/varchar"
82
- },
83
- "description": {
84
- "type": "text",
85
- "rows": 4
86
- },
87
- "status": {
88
- "type": "enum",
89
- "options": ["New", "In Progress", "Complete", "Cancelled"],
90
- "default": "New",
91
- "required": true,
92
- "audited": true,
93
- "isSorted": true
94
- },
95
- "priority": {
96
- "type": "enum",
97
- "options": ["Low", "Normal", "High", "Urgent"],
98
- "default": "Normal",
99
- "audited": true
100
- },
101
- "dueDate": {
102
- "type": "date",
103
- "audited": true
104
- },
105
- "assignedUser": {
106
- "type": "link"
107
- },
108
- "account": {
109
- "type": "link"
110
- },
111
- "contacts": {
112
- "type": "linkMultiple"
113
- }
114
- },
115
- "links": {
116
- "assignedUser": {
117
- "type": "belongsTo",
118
- "entity": "User",
119
- "foreign": "myEntities"
120
- },
121
- "account": {
122
- "type": "belongsTo",
123
- "entity": "Account",
124
- "foreign": "myEntities"
125
- },
126
- "contacts": {
127
- "type": "hasMany",
128
- "entity": "Contact",
129
- "foreign": "myEntities",
130
- "layoutRelationshipsDisabled": true
131
- },
132
- "teams": {
133
- "type": "hasMany",
134
- "entity": "Team",
135
- "relationName": "EntityTeam",
136
- "layoutRelationshipsDisabled": true
137
- }
138
- },
139
- "collection": {
140
- "orderBy": "createdAt",
141
- "order": "desc"
142
- },
143
- "indexes": {
144
- "name": {
145
- "columns": ["name", "deleted"]
146
- },
147
- "assignedUser": {
148
- "columns": ["assignedUserId", "deleted"]
149
- }
150
- }
151
- }
152
- ```
153
-
154
- ### Step 2: Scope Definition
155
-
156
- Create `src/files/custom/Espo/Modules/MyModule/Resources/metadata/scopes/MyEntity.json`:
157
-
158
- ```json
159
- {
160
- "entity": true,
161
- "object": true,
162
- "layouts": true,
163
- "tab": true,
164
- "acl": true,
165
- "aclActionList": [
166
- "create",
167
- "read",
168
- "edit",
169
- "delete",
170
- "stream"
171
- ],
172
- "aclLevelList": [
173
- "all",
174
- "team",
175
- "own",
176
- "no"
177
- ],
178
- "aclPortal": true,
179
- "aclPortalLevelList": [
180
- "all",
181
- "account",
182
- "contact",
183
- "own",
184
- "no"
185
- ],
186
- "customizable": true,
187
- "type": "Base",
188
- "module": "MyModule",
189
- "stream": true,
190
- "activities": true,
191
- "historyDisabled": false,
192
- "importable": true,
193
- "notifications": true,
194
- "activityStatusList": ["Planned", "Held", "Not Held"]
195
- }
196
- ```
197
-
198
- ### Step 3: Client Definitions
199
-
200
- Create `src/files/custom/Espo/Modules/MyModule/Resources/metadata/clientDefs/MyEntity.json`:
201
-
202
- ```json
203
- {
204
- "controller": "controllers/record",
205
- "iconClass": "fas fa-tasks",
206
- "color": "#6FA8D6",
207
- "createDisabled": false,
208
- "dynamicLogic": {
209
- "fields": {
210
- "dueDate": {
211
- "required": {
212
- "conditionGroup": [
213
- {
214
- "type": "equals",
215
- "attribute": "status",
216
- "value": "In Progress"
217
- }
218
- ]
219
- }
220
- }
221
- }
222
- },
223
- "filterList": [
224
- "active",
225
- "completed"
226
- ],
227
- "boolFilterList": [
228
- "onlyMy"
229
- ],
230
- "defaultFilterData": {
231
- "primary": "active"
232
- },
233
- "sidePanels": {
234
- "detail": [
235
- {
236
- "name": "activities",
237
- "label": "Activities",
238
- "view": "crm:views/record/panels/activities",
239
- "aclScope": "Activities"
240
- }
241
- ]
242
- }
243
- }
244
- ```
245
-
246
- ### Step 4: Language Translations
247
-
248
- Create `src/files/custom/Espo/Modules/MyModule/Resources/i18n/en_US/MyEntity.json`:
249
-
250
- ```json
251
- {
252
- "fields": {
253
- "name": "Name",
254
- "description": "Description",
255
- "status": "Status",
256
- "priority": "Priority",
257
- "dueDate": "Due Date",
258
- "assignedUser": "Assigned To",
259
- "account": "Account",
260
- "contacts": "Contacts"
261
- },
262
- "links": {
263
- "assignedUser": "Assigned To",
264
- "account": "Account",
265
- "contacts": "Contacts"
266
- },
267
- "options": {
268
- "status": {
269
- "New": "New",
270
- "In Progress": "In Progress",
271
- "Complete": "Complete",
272
- "Cancelled": "Cancelled"
273
- },
274
- "priority": {
275
- "Low": "Low",
276
- "Normal": "Normal",
277
- "High": "High",
278
- "Urgent": "Urgent"
279
- }
280
- },
281
- "labels": {
282
- "Create MyEntity": "Create MyEntity"
283
- },
284
- "presetFilters": {
285
- "active": "Active",
286
- "completed": "Completed"
287
- },
288
- "boolFilters": {
289
- "onlyMy": "Only My"
290
- }
291
- }
292
- ```
293
-
294
- ### Step 5: Service Layer
295
-
296
- Create `src/files/custom/Espo/Modules/MyModule/Services/MyEntity.php`:
297
-
298
- ```php
299
- <?php
300
- namespace Espo\Modules\MyModule\Services;
301
-
302
- use Espo\Services\Record;
303
- use Espo\ORM\Entity;
304
-
305
- class MyEntity extends Record
306
- {
307
- protected function beforeCreateEntity(Entity $entity, array $data): void
308
- {
309
- parent::beforeCreateEntity($entity, $data);
310
-
311
- // Set default assigned user to creator if not specified
312
- if (!$entity->get('assignedUserId')) {
313
- $entity->set('assignedUserId', $this->user->getId());
314
- }
315
- }
316
-
317
- protected function beforeUpdateEntity(Entity $entity, array $data): void
318
- {
319
- parent::beforeUpdateEntity($entity, $data);
320
-
321
- // Auto-complete when status set to Complete
322
- if ($entity->isAttributeChanged('status') && $entity->get('status') === 'Complete') {
323
- $entity->set('completedAt', date('Y-m-d H:i:s'));
324
- }
325
- }
326
- }
327
- ```
328
-
329
- ### Step 6: Rebuild Cache
330
-
331
- ```bash
332
- bin/command rebuild
333
- ```
334
-
335
- ## Creating Custom Fields
336
-
337
- ### Custom Field Type Definition
338
-
339
- Create `src/files/custom/Espo/Modules/MyModule/Resources/metadata/fields/myFieldType.json`:
340
-
341
- ```json
342
- {
343
- "params": [
344
- {
345
- "name": "required",
346
- "type": "bool",
347
- "default": false
348
- },
349
- {
350
- "name": "maxLength",
351
- "type": "int"
352
- },
353
- {
354
- "name": "customParam",
355
- "type": "varchar"
356
- }
357
- ],
358
- "view": "custom:views/fields/my-field-type",
359
- "personalData": false
360
- }
361
- ```
362
-
363
- ### Custom Field Backend
364
-
365
- Create `src/files/custom/Espo/Modules/MyModule/Classes/FieldType/MyFieldTypeType.php`:
366
-
367
- ```php
368
- <?php
369
- namespace Espo\Modules\MyModule\Classes\FieldType;
370
-
371
- use Espo\ORM\Entity;
372
- use Espo\ORM\Type\AttributeType;
373
- use Espo\Core\Field\FieldType;
374
-
375
- class MyFieldTypeType implements FieldType
376
- {
377
- public function getAttributeParamList(): array
378
- {
379
- return [
380
- AttributeType::VARCHAR,
381
- ];
382
- }
383
-
384
- public function getActualAttributeParamList(Entity $entity, string $field): array
385
- {
386
- return [
387
- AttributeType::VARCHAR,
388
- ];
389
- }
390
- }
391
- ```
392
-
393
- ### Custom Field Frontend
394
-
395
- Create `client/custom/src/views/fields/my-field-type.js`:
396
-
397
- ```javascript
398
- define('custom:views/fields/my-field-type', ['views/fields/varchar'], function (Dep) {
399
-
400
- return Dep.extend({
401
-
402
- setup: function () {
403
- Dep.prototype.setup.call(this);
404
-
405
- // Custom setup logic
406
- this.customParam = this.params.customParam || '';
407
- },
408
-
409
- afterRender: function () {
410
- Dep.prototype.afterRender.call(this);
411
-
412
- // Custom rendering logic
413
- },
414
-
415
- validateRequired: function () {
416
- if (this.params.required) {
417
- if (!this.model.get(this.name)) {
418
- var msg = this.translate('fieldIsRequired', 'messages')
419
- .replace('{field}', this.getLabelText());
420
- this.showValidationMessage(msg);
421
- return true;
422
- }
423
- }
424
- },
425
-
426
- fetch: function () {
427
- var data = {};
428
- data[this.name] = this.$element.val() || null;
429
- return data;
430
- }
431
- });
432
- });
433
- ```
434
-
435
- ## Custom API Endpoints
436
-
437
- ### Step 1: Define Route
438
-
439
- Create `src/files/custom/Espo/Modules/MyModule/Resources/metadata/api.json`:
440
-
441
- ```json
442
- {
443
- "routes": [
444
- {
445
- "route": "/MyEntity/:id/customAction",
446
- "method": "post",
447
- "controller": "MyModule:MyEntity",
448
- "action": "customAction"
449
- }
450
- ]
451
- }
452
- ```
453
-
454
- ### Step 2: Create Controller
455
-
456
- Create `src/files/custom/Espo/Modules/MyModule/Controllers/MyEntity.php`:
457
-
458
- ```php
459
- <?php
460
- namespace Espo\Modules\MyModule\Controllers;
461
-
462
- use Espo\Core\Controllers\Record;
463
- use Espo\Core\Api\Request;
464
- use Espo\Core\Api\Response;
465
- use Espo\Core\Exceptions\BadRequest;
466
- use Espo\Core\Exceptions\Forbidden;
467
- use stdClass;
468
-
469
- class MyEntity extends Record
470
- {
471
- public function postActionCustomAction(Request $request, Response $response): stdClass
472
- {
473
- $id = $request->getRouteParam('id');
474
-
475
- if (!$id) {
476
- throw new BadRequest();
477
- }
478
-
479
- $data = $request->getParsedBody();
480
-
481
- if (!$this->acl->check($this->name, 'edit')) {
482
- throw new Forbidden();
483
- }
484
-
485
- // Delegate to service layer
486
- $service = $this->getRecordService();
487
- $result = $service->customAction($id, $data);
488
-
489
- return $result->getValueMap();
490
- }
491
- }
492
- ```
493
-
494
- ### Step 3: Implement Service Method
495
-
496
- ```php
497
- <?php
498
- namespace Espo\Modules\MyModule\Services;
499
-
500
- use Espo\Services\Record;
501
- use Espo\Core\Exceptions\NotFound;
502
- use stdClass;
503
-
504
- class MyEntity extends Record
505
- {
506
- public function customAction(string $id, stdClass $data): object
507
- {
508
- $entity = $this->getEntity($id);
509
-
510
- if (!$entity) {
511
- throw new NotFound();
512
- }
513
-
514
- // Business logic
515
- $entity->set('status', $data->status ?? 'In Progress');
516
- $entity->set('processedAt', date('Y-m-d H:i:s'));
517
-
518
- $this->entityManager->saveEntity($entity);
519
-
520
- return $entity;
521
- }
522
- }
523
- ```
524
-
525
- ### Step 4: Call from Frontend
526
-
527
- ```javascript
528
- this.ajaxPostRequest('MyEntity/' + id + '/customAction', {
529
- status: 'Complete'
530
- }).then(response => {
531
- console.log('Action completed', response);
532
- this.model.set(response);
533
- });
534
- ```
535
-
536
- ## Custom Repositories
537
-
538
- ### Creating Custom Repository
539
-
540
- Create `src/files/custom/Espo/Modules/MyModule/Repositories/MyEntity.php`:
541
-
542
- ```php
543
- <?php
544
- namespace Espo\Modules\MyModule\Repositories;
545
-
546
- use Espo\Core\Repositories\Database;
547
- use Espo\ORM\Entity;
548
-
549
- class MyEntity extends Database
550
- {
551
- protected function beforeSave(Entity $entity, array $options = []): void
552
- {
553
- parent::beforeSave($entity, $options);
554
-
555
- // Repository-level validation or data transformation
556
- if ($entity->isNew()) {
557
- $entity->set('customIdentifier', $this->generateIdentifier());
558
- }
559
- }
560
-
561
- private function generateIdentifier(): string
562
- {
563
- // Generate unique identifier
564
- $prefix = 'ME-';
565
- $number = $this->getNewNumber();
566
- return $prefix . str_pad($number, 6, '0', STR_PAD_LEFT);
567
- }
568
-
569
- private function getNewNumber(): int
570
- {
571
- $query = $this->entityManager
572
- ->getQueryBuilder()
573
- ->select()
574
- ->from('MyEntity')
575
- ->select('COUNT(*) as count')
576
- ->build();
577
-
578
- $sth = $this->entityManager->getQueryExecutor()->execute($query);
579
- $row = $sth->fetch();
580
-
581
- return ($row['count'] ?? 0) + 1;
582
- }
583
-
584
- public function findActive(): \Espo\ORM\Collection
585
- {
586
- return $this->where([
587
- 'status!=' => ['Complete', 'Cancelled']
588
- ])->find();
589
- }
590
- }
591
- ```
592
-
593
- ## Layouts
594
-
595
- ### List Layout
596
-
597
- Create `src/files/custom/Espo/Modules/MyModule/Resources/layouts/MyEntity/list.json`:
598
-
599
- ```json
600
- [
601
- {
602
- "name": "name",
603
- "width": "30"
604
- },
605
- {
606
- "name": "status",
607
- "width": "15"
608
- },
609
- {
610
- "name": "priority",
611
- "width": "15"
612
- },
613
- {
614
- "name": "assignedUser",
615
- "width": "15"
616
- },
617
- {
618
- "name": "dueDate",
619
- "width": "15"
620
- },
621
- {
622
- "name": "createdAt",
623
- "width": "10"
624
- }
625
- ]
626
- ```
627
-
628
- ### Detail Layout
629
-
630
- Create `src/files/custom/Espo/Modules/MyModule/Resources/layouts/MyEntity/detail.json`:
631
-
632
- ```json
633
- [
634
- {
635
- "label": "Overview",
636
- "rows": [
637
- [
638
- {"name": "name"},
639
- {"name": "status"}
640
- ],
641
- [
642
- {"name": "assignedUser"},
643
- {"name": "priority"}
644
- ],
645
- [
646
- {"name": "account"},
647
- {"name": "dueDate"}
648
- ],
649
- [
650
- {"name": "description", "fullWidth": true}
651
- ]
652
- ]
653
- },
654
- {
655
- "label": "Contacts",
656
- "rows": [
657
- [
658
- {"name": "contacts", "fullWidth": true}
659
- ]
660
- ]
661
- }
662
- ]
663
- ```
664
-
665
- ## Development Best Practices
666
-
667
- ### Cache Rebuild Workflow
668
-
669
- ```bash
670
- # After any metadata changes
671
- bin/command rebuild
672
-
673
- # Clear cache only (faster, but may miss some changes)
674
- bin/command clear-cache
675
-
676
- # Hard rebuild (if issues persist)
677
- rm -rf data/cache/*
678
- bin/command rebuild
679
- ```
680
-
681
- ### Testing Extension Installation
682
-
683
- ```bash
684
- # Build extension
685
- npm run build
686
-
687
- # Install in test EspoCRM instance
688
- # Administration > Extensions > Upload
689
- # Upload build/MyExtension-1.0.0.zip
690
-
691
- # After changes, rebuild extension and reinstall
692
- npm run build
693
- # Uninstall old version via Administration > Extensions
694
- # Install new version
695
- ```
696
-
697
- ### Version Compatibility
698
-
699
- ```php
700
- // Check EspoCRM version in code
701
- $version = $this->config->get('version');
702
-
703
- if (version_compare($version, '8.0.0', '>=')) {
704
- // EspoCRM 8.0+ features
705
- }
706
-
707
- // Use version-specific metadata
708
- // For EspoCRM 7.x
709
- custom/Espo/Modules/MyModule/Resources/metadata/entityDefs/MyEntity.json
710
-
711
- // For EspoCRM 8.x+
712
- custom/Espo/Modules/MyModule/Resources/metadata/entityDefs/MyEntity/MyEntity.json
713
- ```
714
-
715
- ### Debugging Development Issues
716
-
717
- ```bash
718
- # Enable debug mode
719
- # data/config.php
720
- 'logger' => [
721
- 'level' => 'DEBUG',
722
- ],
723
-
724
- # Check logs
725
- tail -f data/logs/espo-$(date +%Y-%m-%d).log
726
-
727
- # Check for PHP errors
728
- tail -f /var/log/apache2/error.log # or nginx error log
729
- ```
730
-
731
- ### Module Dependencies
732
-
733
- ```json
734
- // In manifest.json
735
- {
736
- "dependencies": {
737
- "Advanced Pack": {
738
- "version": ">=2.14.0"
739
- }
740
- }
741
- }
742
- ```