claude-mpm 4.21.3__py3-none-any.whl → 5.1.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 (517) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  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 +69 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  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 +37 -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 +1128 -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 +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +935 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  41. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  42. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  43. claude_mpm/cli/commands/postmortem.py +401 -0
  44. claude_mpm/cli/commands/run.py +125 -167
  45. claude_mpm/cli/commands/skill_source.py +694 -0
  46. claude_mpm/cli/commands/skills.py +757 -20
  47. claude_mpm/cli/executor.py +78 -3
  48. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  49. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  50. claude_mpm/cli/parsers/agents_parser.py +310 -4
  51. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  52. claude_mpm/cli/parsers/base_parser.py +53 -0
  53. claude_mpm/cli/parsers/config_parser.py +96 -43
  54. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  55. claude_mpm/cli/parsers/skills_parser.py +145 -0
  56. claude_mpm/cli/parsers/source_parser.py +138 -0
  57. claude_mpm/cli/startup.py +564 -108
  58. claude_mpm/cli/startup_display.py +480 -0
  59. claude_mpm/cli/utils.py +1 -1
  60. claude_mpm/cli_module/commands.py +1 -1
  61. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  62. claude_mpm/commands/mpm-agents-detect.md +9 -0
  63. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  64. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  65. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  66. claude_mpm/commands/mpm-doctor.md +9 -0
  67. claude_mpm/commands/mpm-help.md +14 -2
  68. claude_mpm/commands/mpm-init.md +27 -2
  69. claude_mpm/commands/mpm-monitor.md +9 -0
  70. claude_mpm/commands/mpm-postmortem.md +123 -0
  71. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  72. claude_mpm/commands/mpm-status.md +9 -0
  73. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  74. claude_mpm/commands/mpm-ticket-view.md +552 -0
  75. claude_mpm/commands/mpm-version.md +9 -0
  76. claude_mpm/commands/mpm.md +10 -0
  77. claude_mpm/config/agent_presets.py +488 -0
  78. claude_mpm/config/agent_sources.py +325 -0
  79. claude_mpm/config/skill_presets.py +392 -0
  80. claude_mpm/config/skill_sources.py +590 -0
  81. claude_mpm/constants.py +13 -0
  82. claude_mpm/core/api_validator.py +1 -1
  83. claude_mpm/core/claude_runner.py +19 -35
  84. claude_mpm/core/config.py +24 -0
  85. claude_mpm/core/constants.py +1 -1
  86. claude_mpm/core/framework/__init__.py +3 -16
  87. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  88. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  89. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  90. claude_mpm/core/hook_error_memory.py +381 -0
  91. claude_mpm/core/hook_manager.py +41 -2
  92. claude_mpm/core/interactive_session.py +131 -10
  93. claude_mpm/core/logger.py +3 -1
  94. claude_mpm/core/oneshot_session.py +110 -8
  95. claude_mpm/core/output_style_manager.py +173 -43
  96. claude_mpm/core/protocols/__init__.py +23 -0
  97. claude_mpm/core/protocols/runner_protocol.py +103 -0
  98. claude_mpm/core/protocols/session_protocol.py +131 -0
  99. claude_mpm/core/shared/singleton_manager.py +11 -4
  100. claude_mpm/core/system_context.py +38 -0
  101. claude_mpm/core/unified_agent_registry.py +129 -1
  102. claude_mpm/core/unified_config.py +22 -0
  103. claude_mpm/dashboard/static/css/activity.css +69 -69
  104. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  105. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  106. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  107. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  108. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  109. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  110. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  111. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  112. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  113. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  114. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  115. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  116. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  117. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  118. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  119. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  120. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  121. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  122. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  123. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  124. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  125. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  126. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  127. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  128. claude_mpm/dashboard/templates/code_simple.html +23 -23
  129. claude_mpm/dashboard/templates/index.html +18 -18
  130. claude_mpm/experimental/cli_enhancements.py +1 -5
  131. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  132. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  133. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  134. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  135. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  136. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  137. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  139. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  140. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  141. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  142. claude_mpm/models/agent_definition.py +7 -0
  143. claude_mpm/models/git_repository.py +198 -0
  144. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  145. claude_mpm/scripts/start_activity_logging.py +3 -1
  146. claude_mpm/services/agents/agent_builder.py +45 -9
  147. claude_mpm/services/agents/agent_preset_service.py +238 -0
  148. claude_mpm/services/agents/agent_selection_service.py +484 -0
  149. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  150. claude_mpm/services/agents/cache_git_manager.py +621 -0
  151. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  152. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  153. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  154. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  155. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  156. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  157. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  158. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  159. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  161. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
  162. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  163. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  164. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
  165. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  166. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  167. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  168. claude_mpm/services/agents/git_source_manager.py +629 -0
  169. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  170. claude_mpm/services/agents/local_template_manager.py +50 -10
  171. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  172. claude_mpm/services/agents/sources/__init__.py +13 -0
  173. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  174. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  175. claude_mpm/services/agents/startup_sync.py +239 -0
  176. claude_mpm/services/agents/toolchain_detector.py +474 -0
  177. claude_mpm/services/analysis/__init__.py +25 -0
  178. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  179. claude_mpm/services/analysis/postmortem_service.py +765 -0
  180. claude_mpm/services/cli/session_pause_manager.py +1 -1
  181. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  182. claude_mpm/services/command_deployment_service.py +200 -6
  183. claude_mpm/services/core/base.py +7 -2
  184. claude_mpm/services/core/interfaces/__init__.py +1 -3
  185. claude_mpm/services/core/interfaces/health.py +1 -4
  186. claude_mpm/services/core/models/__init__.py +2 -11
  187. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  188. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  189. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  190. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  191. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  192. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  193. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  194. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  195. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  196. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  197. claude_mpm/services/event_bus/direct_relay.py +3 -3
  198. claude_mpm/services/event_bus/event_bus.py +36 -3
  199. claude_mpm/services/events/consumers/logging.py +1 -2
  200. claude_mpm/services/git/__init__.py +21 -0
  201. claude_mpm/services/git/git_operations_service.py +494 -0
  202. claude_mpm/services/github/__init__.py +21 -0
  203. claude_mpm/services/github/github_cli_service.py +397 -0
  204. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  205. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  206. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  207. claude_mpm/services/instructions/__init__.py +9 -0
  208. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  209. claude_mpm/services/local_ops/__init__.py +3 -13
  210. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  211. claude_mpm/services/local_ops/health_manager.py +1 -4
  212. claude_mpm/services/local_ops/process_manager.py +1 -1
  213. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  214. claude_mpm/services/mcp_config_manager.py +75 -145
  215. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  216. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  217. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  218. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  219. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  220. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  221. claude_mpm/services/mcp_service_verifier.py +6 -3
  222. claude_mpm/services/memory/optimizer.py +1 -1
  223. claude_mpm/services/model/model_router.py +8 -9
  224. claude_mpm/services/monitor/daemon.py +29 -9
  225. claude_mpm/services/monitor/daemon_manager.py +96 -19
  226. claude_mpm/services/monitor/server.py +2 -2
  227. claude_mpm/services/native_agent_converter.py +356 -0
  228. claude_mpm/services/port_manager.py +1 -1
  229. claude_mpm/services/pr/__init__.py +14 -0
  230. claude_mpm/services/pr/pr_template_service.py +329 -0
  231. claude_mpm/services/project/documentation_manager.py +2 -1
  232. claude_mpm/services/project/project_organizer.py +4 -0
  233. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  234. claude_mpm/services/runner_configuration_service.py +17 -3
  235. claude_mpm/services/self_upgrade_service.py +165 -7
  236. claude_mpm/services/session_management_service.py +16 -4
  237. claude_mpm/services/skills/__init__.py +18 -0
  238. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  239. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  240. claude_mpm/services/skills_config.py +547 -0
  241. claude_mpm/services/skills_deployer.py +955 -0
  242. claude_mpm/services/socketio/handlers/connection.py +1 -1
  243. claude_mpm/services/socketio/handlers/git.py +2 -2
  244. claude_mpm/services/socketio/server/core.py +1 -4
  245. claude_mpm/services/socketio/server/main.py +1 -3
  246. claude_mpm/services/system_instructions_service.py +1 -3
  247. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  248. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  249. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  250. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  251. claude_mpm/services/unified/unified_deployment.py +1 -5
  252. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  253. claude_mpm/services/visualization/__init__.py +1 -5
  254. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  255. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  256. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  257. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  258. claude_mpm/skills/skills_registry.py +0 -1
  259. claude_mpm/templates/questions/__init__.py +38 -0
  260. claude_mpm/templates/questions/base.py +193 -0
  261. claude_mpm/templates/questions/pr_strategy.py +311 -0
  262. claude_mpm/templates/questions/project_init.py +385 -0
  263. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  264. claude_mpm/tools/__main__.py +8 -8
  265. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  266. claude_mpm/utils/agent_dependency_loader.py +80 -13
  267. claude_mpm/utils/agent_filters.py +288 -0
  268. claude_mpm/utils/dependency_cache.py +3 -1
  269. claude_mpm/utils/gitignore.py +244 -0
  270. claude_mpm/utils/log_cleanup.py +3 -3
  271. claude_mpm/utils/migration.py +372 -0
  272. claude_mpm/utils/progress.py +387 -0
  273. claude_mpm/utils/robust_installer.py +3 -5
  274. claude_mpm/utils/structured_questions.py +619 -0
  275. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
  276. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
  277. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  278. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  279. claude_mpm/agents/templates/agent-manager.json +0 -273
  280. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  281. claude_mpm/agents/templates/api_qa.json +0 -180
  282. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  283. claude_mpm/agents/templates/clerk-ops.json +0 -235
  284. claude_mpm/agents/templates/code_analyzer.json +0 -101
  285. claude_mpm/agents/templates/content-agent.json +0 -358
  286. claude_mpm/agents/templates/dart_engineer.json +0 -307
  287. claude_mpm/agents/templates/data_engineer.json +0 -225
  288. claude_mpm/agents/templates/documentation.json +0 -211
  289. claude_mpm/agents/templates/engineer.json +0 -210
  290. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  291. claude_mpm/agents/templates/golang_engineer.json +0 -270
  292. claude_mpm/agents/templates/imagemagick.json +0 -264
  293. claude_mpm/agents/templates/java_engineer.json +0 -346
  294. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  295. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  296. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  297. claude_mpm/agents/templates/memory_manager.json +0 -158
  298. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  299. claude_mpm/agents/templates/ops.json +0 -185
  300. claude_mpm/agents/templates/php-engineer.json +0 -287
  301. claude_mpm/agents/templates/product_owner.json +0 -338
  302. claude_mpm/agents/templates/project_organizer.json +0 -140
  303. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  304. claude_mpm/agents/templates/python_engineer.json +0 -387
  305. claude_mpm/agents/templates/qa.json +0 -242
  306. claude_mpm/agents/templates/react_engineer.json +0 -238
  307. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  308. claude_mpm/agents/templates/research.json +0 -188
  309. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  310. claude_mpm/agents/templates/rust_engineer.json +0 -275
  311. claude_mpm/agents/templates/security.json +0 -202
  312. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  313. claude_mpm/agents/templates/ticketing.json +0 -177
  314. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  315. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  316. claude_mpm/agents/templates/version_control.json +0 -157
  317. claude_mpm/agents/templates/web_qa.json +0 -399
  318. claude_mpm/agents/templates/web_ui.json +0 -189
  319. claude_mpm/commands/mpm-tickets.md +0 -102
  320. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  321. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  322. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  323. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  324. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  325. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  326. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  327. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  328. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  329. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  330. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  331. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  332. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  333. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  334. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  335. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  336. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  337. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  338. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  339. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  340. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  341. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  342. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  343. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  344. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  345. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  346. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  347. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  348. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  349. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  350. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  351. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  352. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  353. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  354. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  355. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  357. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  358. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  359. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  366. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  367. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  368. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  369. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  370. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  371. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  372. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  373. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  374. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  375. claude_mpm/dashboard/static/built/react/events.js +0 -30
  376. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  377. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  378. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  379. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  380. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  381. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  382. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  383. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  384. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  385. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  390. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  391. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  392. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  393. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  394. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  395. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  396. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  397. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  398. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  399. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  400. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  401. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  402. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  403. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  404. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  405. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  406. claude_mpm/dashboard/static/events.html +0 -607
  407. claude_mpm/dashboard/static/index.html +0 -635
  408. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  409. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  410. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  411. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  412. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  413. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  414. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  415. claude_mpm/dashboard/static/legacy/files.html +0 -747
  416. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  417. claude_mpm/dashboard/static/monitors.html +0 -431
  418. claude_mpm/dashboard/static/production/events.html +0 -659
  419. claude_mpm/dashboard/static/production/main.html +0 -698
  420. claude_mpm/dashboard/static/production/monitors.html +0 -483
  421. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  422. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  423. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  424. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  425. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  426. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  427. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  428. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  429. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  430. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  431. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  432. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  433. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  434. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  435. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  436. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  437. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  438. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  439. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  440. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  441. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  442. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  443. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  444. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  445. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  446. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  447. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  448. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  449. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  450. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  451. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  452. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  453. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  454. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  455. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  456. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  457. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  458. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  459. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  460. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  461. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  462. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  463. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  464. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  465. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  466. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  467. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  468. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  469. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  470. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  471. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  472. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  473. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  474. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  475. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  476. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  477. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  478. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  479. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  480. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  481. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  482. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  483. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  484. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  485. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  486. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  487. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  488. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  489. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  490. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  491. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  492. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  493. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  494. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  495. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  496. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  497. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  498. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  499. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  500. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  501. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  502. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  503. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  504. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  505. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  506. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  507. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  508. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  509. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  510. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  511. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  512. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  513. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  514. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
  515. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
  516. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
  517. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
@@ -80,18 +80,20 @@ class DaemonManager:
80
80
  self.startup_status_file = None
81
81
 
82
82
  def _get_default_pid_file(self) -> Path:
83
- """Get default PID file path."""
83
+ """Get default PID file path with port number to support multiple daemons."""
84
84
  project_root = Path.cwd()
85
85
  claude_mpm_dir = project_root / ".claude-mpm"
86
86
  claude_mpm_dir.mkdir(exist_ok=True)
87
- return claude_mpm_dir / "monitor-daemon.pid"
87
+ # Include port in filename to support multiple daemon instances
88
+ return claude_mpm_dir / f"monitor-daemon-{self.port}.pid"
88
89
 
89
90
  def _get_default_log_file(self) -> Path:
90
- """Get default log file path."""
91
+ """Get default log file path with port number to support multiple daemons."""
91
92
  project_root = Path.cwd()
92
93
  claude_mpm_dir = project_root / ".claude-mpm"
93
94
  claude_mpm_dir.mkdir(exist_ok=True)
94
- return claude_mpm_dir / "monitor-daemon.log"
95
+ # Include port in filename to support multiple daemon instances
96
+ return claude_mpm_dir / f"monitor-daemon-{self.port}.log"
95
97
 
96
98
  def cleanup_port_conflicts(self, max_retries: int = 3) -> bool:
97
99
  """Clean up any processes using the daemon port.
@@ -471,6 +473,55 @@ class DaemonManager:
471
473
 
472
474
  return None
473
475
 
476
+ def _verify_daemon_health(self, max_attempts: int = 3) -> bool:
477
+ """Verify daemon is healthy by checking HTTP health endpoint.
478
+
479
+ Args:
480
+ max_attempts: Maximum number of connection attempts
481
+
482
+ Returns:
483
+ True if health check passes, False otherwise
484
+ """
485
+ try:
486
+ import requests
487
+
488
+ for attempt in range(max_attempts):
489
+ try:
490
+ # Try to connect to health endpoint
491
+ response = requests.get(
492
+ f"http://{self.host}:{self.port}/health", timeout=2
493
+ )
494
+
495
+ if response.status_code == 200:
496
+ self.logger.debug(
497
+ f"Health check passed on attempt {attempt + 1}/{max_attempts}"
498
+ )
499
+ return True
500
+
501
+ self.logger.debug(
502
+ f"Health check returned status {response.status_code} on attempt {attempt + 1}/{max_attempts}"
503
+ )
504
+
505
+ except requests.exceptions.RequestException as e:
506
+ self.logger.debug(
507
+ f"Health check attempt {attempt + 1}/{max_attempts} failed: {e}"
508
+ )
509
+
510
+ # Wait before retry (except on last attempt)
511
+ if attempt < max_attempts - 1:
512
+ time.sleep(1)
513
+
514
+ self.logger.debug(f"Health check failed after {max_attempts} attempts")
515
+ return False
516
+
517
+ except ImportError:
518
+ # requests not available, skip health check
519
+ self.logger.debug("requests library not available, skipping health check")
520
+ return True
521
+ except Exception as e:
522
+ self.logger.debug(f"Health check error: {e}")
523
+ return False
524
+
474
525
  def start_daemon(self, force_restart: bool = False) -> bool:
475
526
  """Start the daemon with automatic cleanup and retry.
476
527
 
@@ -588,36 +639,62 @@ class DaemonManager:
588
639
  pid = process.pid
589
640
  self.logger.info(f"Monitor subprocess started with PID {pid}")
590
641
 
591
- # Wait for the subprocess to write its PID file
642
+ # Wait for the subprocess to write its PID file and bind to port
592
643
  # The subprocess will write the PID file after it starts successfully
593
644
  max_wait = 10 # seconds
594
645
  start_time = time.time()
646
+ pid_file_found = False
647
+ port_bound = False
648
+
649
+ self.logger.debug(f"Waiting up to {max_wait}s for daemon to start...")
595
650
 
596
651
  while time.time() - start_time < max_wait:
597
652
  # Check if process is still running
598
- if process.poll() is not None:
599
- # Process exited
653
+ returncode = process.poll()
654
+ if returncode is not None:
655
+ # Process exited - this is the bug we're fixing!
656
+ self.logger.error(
657
+ f"Monitor daemon subprocess exited prematurely with code {returncode}"
658
+ )
600
659
  self.logger.error(
601
- f"Monitor daemon exited with code {process.returncode}"
660
+ f"Port {self.port} daemon failed to start. Check {self.log_file} for details."
602
661
  )
603
662
  return False
604
663
 
605
664
  # Check if PID file was written
606
- if self.pid_file.exists():
665
+ if not pid_file_found and self.pid_file.exists():
607
666
  try:
608
667
  with self.pid_file.open() as f:
609
668
  written_pid = int(f.read().strip())
610
669
  if written_pid == pid:
611
- # PID file written correctly, check port
612
- if (
613
- not self._is_port_available()
614
- ): # Port NOT available means it's in use (good!)
615
- self.logger.info(
616
- f"Monitor daemon successfully started on port {self.port}"
617
- )
618
- return True
619
- except Exception:
620
- pass # PID file not ready yet
670
+ pid_file_found = True
671
+ self.logger.debug(
672
+ f"PID file found with correct PID {pid}"
673
+ )
674
+ except Exception as e:
675
+ self.logger.debug(f"Error reading PID file: {e}")
676
+
677
+ # Check if port is bound (health check)
678
+ if not port_bound and not self._is_port_available():
679
+ # Port NOT available means it's in use (good!)
680
+ port_bound = True
681
+ self.logger.debug(f"Port {self.port} is now bound")
682
+
683
+ # Success criteria: both PID file exists and port is bound
684
+ if pid_file_found and port_bound:
685
+ self.logger.info(
686
+ f"Monitor daemon successfully started on port {self.port} (PID: {pid})"
687
+ )
688
+ # Additional health check: verify we can connect
689
+ if self._verify_daemon_health(max_attempts=3):
690
+ self.logger.info("Daemon health check passed")
691
+ return True
692
+ self.logger.warning(
693
+ "Daemon started but health check failed - may still be initializing"
694
+ )
695
+ return (
696
+ True # Return success anyway if PID file and port are good
697
+ )
621
698
 
622
699
  time.sleep(0.5)
623
700
 
@@ -203,8 +203,8 @@ class UnifiedMonitorServer:
203
203
  # Create Socket.IO server with proper ping configuration
204
204
  self.sio = socketio.AsyncServer(
205
205
  cors_allowed_origins="*",
206
- logger=False,
207
- engineio_logger=False,
206
+ logger=True, # Enable to see Socket.IO events and connection lifecycle
207
+ engineio_logger=True, # Enable to see Engine.IO protocol handshake details
208
208
  ping_interval=30, # 30 seconds ping interval (matches client expectation)
209
209
  ping_timeout=60, # 60 seconds ping timeout (generous for stability)
210
210
  )
@@ -0,0 +1,356 @@
1
+ """Native Agent Converter Service
2
+
3
+ Converts MPM agent JSON definitions to Claude Code --agents flag format.
4
+
5
+ WHY: Claude Code 1.0.83+ supports native --agents flag for dynamic agent definition.
6
+ This allows agents to be passed directly via CLI instead of deployed to .claude/agents/.
7
+
8
+ DESIGN: Converts MPM agent schema → Claude native schema with field mappings:
9
+ - description → description (agent selection hint)
10
+ - system_instructions → prompt (agent behavior)
11
+ - allowed_tools → tools (tool limitations)
12
+ - model_tier → model (model selection)
13
+
14
+ USAGE:
15
+ converter = NativeAgentConverter()
16
+ agents_flag = converter.build_agents_flag(agent_configs)
17
+ # Returns: --agents '{"agent-name": {...}, ...}'
18
+ """
19
+
20
+ import json
21
+ from pathlib import Path
22
+ from typing import Any, Dict, List, Optional
23
+
24
+ from claude_mpm.core.logging_config import get_logger
25
+
26
+
27
+ class NativeAgentConverter:
28
+ """Converts MPM agent configurations to Claude Code --agents format."""
29
+
30
+ # Map MPM model tiers to Claude model names
31
+ MODEL_TIER_MAP = {
32
+ "opus": "opus",
33
+ "sonnet": "sonnet",
34
+ "haiku": "haiku",
35
+ "claude-3-opus": "opus",
36
+ "claude-3-sonnet": "sonnet",
37
+ "claude-3-haiku": "haiku",
38
+ "claude-3.5-sonnet": "sonnet",
39
+ "claude-4-sonnet": "sonnet",
40
+ "claude-4-opus": "opus",
41
+ }
42
+
43
+ # Map MPM tool names to Claude tool names
44
+ TOOL_NAME_MAP = {
45
+ "Read": "Read",
46
+ "Write": "Write",
47
+ "Edit": "Edit",
48
+ "MultiEdit": "MultiEdit",
49
+ "Bash": "Bash",
50
+ "Grep": "Grep",
51
+ "Glob": "Glob",
52
+ "LS": "LS",
53
+ "WebSearch": "WebSearch",
54
+ "WebFetch": "WebFetch",
55
+ "TodoWrite": "TodoWrite",
56
+ "NotebookEdit": "NotebookEdit",
57
+ "BashOutput": "BashOutput",
58
+ "KillShell": "KillShell",
59
+ "AskUserQuestion": "AskUserQuestion",
60
+ }
61
+
62
+ def __init__(self):
63
+ """Initialize the native agent converter."""
64
+ self.logger = get_logger(__name__)
65
+
66
+ def convert_mpm_agent_to_native(
67
+ self, agent_config: Dict[str, Any], agent_id: Optional[str] = None
68
+ ) -> Dict[str, Any]:
69
+ """Convert a single MPM agent config to Claude native format.
70
+
71
+ Args:
72
+ agent_config: MPM agent JSON configuration
73
+ agent_id: Optional agent ID (falls back to agent_config['agent_id'])
74
+
75
+ Returns:
76
+ Dict with Claude native agent format:
77
+ {
78
+ "description": "...",
79
+ "prompt": "...",
80
+ "tools": [...],
81
+ "model": "sonnet"
82
+ }
83
+ """
84
+ try:
85
+ # Extract agent ID
86
+ if not agent_id:
87
+ agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
88
+
89
+ # Extract description (for agent selection)
90
+ description = agent_config.get("description", "")
91
+ if not description and "metadata" in agent_config:
92
+ description = agent_config["metadata"].get("description", "")
93
+
94
+ # Build prompt from instructions and BASE_*.md reference
95
+ prompt = self._build_agent_prompt(agent_config)
96
+
97
+ # Extract and map tools
98
+ tools = self._extract_and_map_tools(agent_config)
99
+
100
+ # Map model tier
101
+ model = self._map_model_tier(agent_config)
102
+
103
+ native_config = {
104
+ "description": description,
105
+ "prompt": prompt,
106
+ "tools": tools,
107
+ "model": model,
108
+ }
109
+
110
+ self.logger.debug(f"Converted agent '{agent_id}' to native format")
111
+ return native_config
112
+
113
+ except Exception as e:
114
+ self.logger.error(f"Error converting agent {agent_id}: {e}")
115
+ # Return minimal valid config as fallback
116
+ return {
117
+ "description": f"Agent {agent_id}",
118
+ "prompt": agent_config.get("instructions", ""),
119
+ "tools": [],
120
+ "model": "sonnet",
121
+ }
122
+
123
+ def _build_agent_prompt(self, agent_config: Dict[str, Any]) -> str:
124
+ """Build agent prompt from instructions and BASE_*.md reference.
125
+
126
+ OPTIMIZATION: Keep prompts concise for CLI argument length limits.
127
+ The BASE_*.md files contain full instructions, so we only need:
128
+ 1. Reference to BASE file
129
+ 2. Brief specialization note
130
+
131
+ Args:
132
+ agent_config: MPM agent configuration
133
+
134
+ Returns:
135
+ Concise prompt string
136
+ """
137
+ prompt_parts = []
138
+
139
+ # Add base instructions reference if available (most important)
140
+ if "knowledge" in agent_config:
141
+ base_file = agent_config["knowledge"].get("base_instructions_file")
142
+ if base_file:
143
+ prompt_parts.append(f"Follow {base_file} for all protocols.")
144
+
145
+ # Add main instructions (keep brief)
146
+ instructions = agent_config.get("instructions", "")
147
+ if instructions:
148
+ # Limit instruction length to avoid bloat
149
+ if len(instructions) > 300:
150
+ instructions = instructions[:300] + "..."
151
+ prompt_parts.append(instructions)
152
+
153
+ # Skip domain expertise and best practices for CLI mode
154
+ # These are already in BASE_*.md files referenced above
155
+ # Adding them here just bloats the JSON unnecessarily
156
+
157
+ return "\n".join(str(part) for part in prompt_parts if part)
158
+
159
+ def _extract_and_map_tools(self, agent_config: Dict[str, Any]) -> List[str]:
160
+ """Extract and map tools from MPM config to Claude tool names.
161
+
162
+ Args:
163
+ agent_config: MPM agent configuration
164
+
165
+ Returns:
166
+ List of Claude tool names
167
+ """
168
+ tools = []
169
+
170
+ # Check capabilities.tools
171
+ if "capabilities" in agent_config and "tools" in agent_config["capabilities"]:
172
+ mpm_tools = agent_config["capabilities"]["tools"]
173
+ for tool in mpm_tools:
174
+ mapped_tool = self.TOOL_NAME_MAP.get(tool, tool)
175
+ if mapped_tool not in tools:
176
+ tools.append(mapped_tool)
177
+
178
+ # If no tools specified, provide reasonable defaults
179
+ if not tools:
180
+ tools = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
181
+
182
+ return tools
183
+
184
+ def _map_model_tier(self, agent_config: Dict[str, Any]) -> str:
185
+ """Map MPM model tier to Claude model name.
186
+
187
+ Args:
188
+ agent_config: MPM agent configuration
189
+
190
+ Returns:
191
+ Claude model name (opus, sonnet, haiku)
192
+ """
193
+ # Check capabilities.model
194
+ if "capabilities" in agent_config and "model" in agent_config["capabilities"]:
195
+ model_tier = agent_config["capabilities"]["model"]
196
+ return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
197
+
198
+ # Check metadata.model_preference
199
+ if (
200
+ "metadata" in agent_config
201
+ and "model_preference" in agent_config["metadata"]
202
+ ):
203
+ model_tier = agent_config["metadata"]["model_preference"]
204
+ return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
205
+
206
+ # Default to sonnet
207
+ return "sonnet"
208
+
209
+ def generate_agents_json(self, agents: List[Dict[str, Any]]) -> str:
210
+ """Generate complete --agents JSON string from list of agent configs.
211
+
212
+ Args:
213
+ agents: List of MPM agent configurations
214
+
215
+ Returns:
216
+ JSON string for --agents flag
217
+ """
218
+ native_agents = {}
219
+
220
+ for agent_config in agents:
221
+ agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
222
+ if not agent_id:
223
+ self.logger.warning("Skipping agent without ID")
224
+ continue
225
+
226
+ # Skip PM agent (main Claude instance)
227
+ if agent_id.lower() in ["pm", "project_manager"]:
228
+ self.logger.debug(f"Skipping PM agent: {agent_id}")
229
+ continue
230
+
231
+ native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
232
+ native_agents[agent_id] = native_config
233
+
234
+ return json.dumps(native_agents, separators=(",", ":"))
235
+
236
+ def build_agents_flag(
237
+ self, agents: List[Dict[str, Any]], escape_for_shell: bool = True
238
+ ) -> str:
239
+ """Build complete --agents flag for CLI.
240
+
241
+ Args:
242
+ agents: List of MPM agent configurations
243
+ escape_for_shell: Whether to escape JSON for shell
244
+
245
+ Returns:
246
+ Complete flag string: --agents '{"agent1": {...}, ...}'
247
+ """
248
+ agents_json = self.generate_agents_json(agents)
249
+
250
+ # Check length (Claude CLI has argument length limits)
251
+ if len(agents_json) > 50000: # Conservative limit
252
+ self.logger.warning(
253
+ f"Agents JSON is very large ({len(agents_json)} chars). "
254
+ "Consider using file-based deployment."
255
+ )
256
+
257
+ if escape_for_shell:
258
+ # Escape for shell - wrap in single quotes
259
+ return f"--agents '{agents_json}'"
260
+
261
+ return f"--agents {agents_json}"
262
+
263
+ def load_agents_from_templates(
264
+ self, templates_dir: Optional[Path] = None
265
+ ) -> List[Dict[str, Any]]:
266
+ """Load all agent configs from templates directory.
267
+
268
+ Args:
269
+ templates_dir: Path to templates directory (defaults to MPM agents)
270
+
271
+ Returns:
272
+ List of agent configurations
273
+ """
274
+ if not templates_dir:
275
+ # Default to MPM agents directory
276
+ mpm_package_dir = Path(__file__).parent.parent / "agents" / "templates"
277
+ templates_dir = mpm_package_dir
278
+
279
+ if not templates_dir.exists():
280
+ self.logger.warning(f"Templates directory not found: {templates_dir}")
281
+ return []
282
+
283
+ agents = []
284
+ json_files = list(templates_dir.glob("*.json"))
285
+
286
+ self.logger.info(
287
+ f"Loading {len(json_files)} agent templates from {templates_dir}"
288
+ )
289
+
290
+ for json_file in json_files:
291
+ try:
292
+ # Skip base_agent.json
293
+ if json_file.stem == "base_agent":
294
+ continue
295
+
296
+ agent_config = json.loads(json_file.read_text())
297
+ agents.append(agent_config)
298
+ self.logger.debug(f"Loaded agent: {json_file.stem}")
299
+
300
+ except Exception as e:
301
+ self.logger.error(f"Error loading agent {json_file.name}: {e}")
302
+ continue
303
+
304
+ return agents
305
+
306
+ def estimate_json_size(self, agents: List[Dict[str, Any]]) -> int:
307
+ """Estimate the size of --agents JSON output.
308
+
309
+ Args:
310
+ agents: List of agent configurations
311
+
312
+ Returns:
313
+ Estimated size in bytes
314
+ """
315
+ agents_json = self.generate_agents_json(agents)
316
+ return len(agents_json.encode("utf-8"))
317
+
318
+ def get_conversion_summary(self, agents: List[Dict[str, Any]]) -> Dict[str, Any]:
319
+ """Get summary of agent conversion for reporting.
320
+
321
+ Args:
322
+ agents: List of agent configurations
323
+
324
+ Returns:
325
+ Summary dict with counts and size info
326
+ """
327
+ native_agents = {}
328
+ model_counts = {"opus": 0, "sonnet": 0, "haiku": 0}
329
+ tool_usage = {}
330
+
331
+ for agent_config in agents:
332
+ agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
333
+ if not agent_id or agent_id.lower() in ["pm", "project_manager"]:
334
+ continue
335
+
336
+ native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
337
+ native_agents[agent_id] = native_config
338
+
339
+ # Count models
340
+ model = native_config.get("model", "sonnet")
341
+ model_counts[model] = model_counts.get(model, 0) + 1
342
+
343
+ # Count tools
344
+ for tool in native_config.get("tools", []):
345
+ tool_usage[tool] = tool_usage.get(tool, 0) + 1
346
+
347
+ json_size = len(json.dumps(native_agents, separators=(",", ":")))
348
+
349
+ return {
350
+ "total_agents": len(native_agents),
351
+ "json_size": json_size,
352
+ "json_size_kb": round(json_size / 1024, 2),
353
+ "model_distribution": model_counts,
354
+ "tool_usage": tool_usage,
355
+ "agents": list(native_agents.keys()),
356
+ }
@@ -431,7 +431,7 @@ class PortManager:
431
431
  return port
432
432
 
433
433
  self.logger.error(
434
- f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop-1}"
434
+ f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop - 1}"
435
435
  )
436
436
  return None
437
437
 
@@ -0,0 +1,14 @@
1
+ """
2
+ Pull Request Services Package
3
+ ==============================
4
+
5
+ Provides PR template generation and workflow automation.
6
+ Used by agent-improver and skills-manager agents.
7
+ """
8
+
9
+ from .pr_template_service import PRTemplateService, PRType
10
+
11
+ __all__ = [
12
+ "PRTemplateService",
13
+ "PRType",
14
+ ]