claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__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 (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  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 +1 -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 +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 +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 +924 -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/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -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
+ ]
@@ -0,0 +1,329 @@
1
+ """
2
+ Pull Request Template Service
3
+ ==============================
4
+
5
+ Generates consistent PR titles and descriptions for agent/skill improvements.
6
+
7
+ Design Decisions:
8
+ - Follows conventional commit format
9
+ - Generates comprehensive PR descriptions with testing checklists
10
+ - Supports both agent and skill PR types
11
+ - Validates conventional commit message format
12
+
13
+ Example:
14
+ >>> service = PRTemplateService()
15
+ >>> title = service.generate_pr_title("research", "improve memory efficiency", PRType.AGENT)
16
+ >>> print(title)
17
+ feat(agent): improve research - improve memory efficiency
18
+
19
+ >>> body = service.generate_agent_pr_body(
20
+ ... agent_name="research",
21
+ ... problem="Memory exhaustion with >50 files",
22
+ ... solution="Add hard limit of 5 files per session",
23
+ ... testing_notes="Tested with 100-file codebase",
24
+ ... related_issues=["#157"]
25
+ ... )
26
+ """
27
+
28
+ from enum import Enum
29
+ from typing import List, Optional
30
+
31
+
32
+ class PRType(Enum):
33
+ """Type of pull request."""
34
+
35
+ AGENT = "agent"
36
+ SKILL = "skill"
37
+
38
+
39
+ class PRTemplateService:
40
+ """
41
+ Service for generating PR templates.
42
+
43
+ Generates consistent PR titles and descriptions following
44
+ conventional commit format and best practices.
45
+ """
46
+
47
+ # Conventional commit types
48
+ COMMIT_TYPES = {
49
+ "feat": "New feature or enhancement",
50
+ "fix": "Bug fix",
51
+ "docs": "Documentation changes",
52
+ "refactor": "Code refactoring without feature changes",
53
+ "test": "Adding or updating tests",
54
+ "chore": "Maintenance tasks",
55
+ }
56
+
57
+ def generate_pr_title(
58
+ self,
59
+ item_name: str,
60
+ brief_description: str,
61
+ pr_type: PRType,
62
+ commit_type: str = "feat",
63
+ ) -> str:
64
+ """
65
+ Generate PR title in conventional commit format.
66
+
67
+ Format: {commit_type}({scope}): {item} - {brief_description}
68
+
69
+ Args:
70
+ item_name: Agent or skill name (e.g., "research", "fastapi-testing")
71
+ brief_description: Brief description (e.g., "improve memory handling")
72
+ pr_type: Type of PR (agent or skill)
73
+ commit_type: Conventional commit type (default: "feat")
74
+
75
+ Returns:
76
+ Formatted PR title
77
+
78
+ Example:
79
+ >>> service = PRTemplateService()
80
+ >>> service.generate_pr_title("research", "improve memory handling", PRType.AGENT)
81
+ 'feat(agent): improve research - improve memory handling'
82
+ """
83
+ scope = pr_type.value
84
+ return f"{commit_type}({scope}): improve {item_name} - {brief_description}"
85
+
86
+ def generate_agent_pr_body(
87
+ self,
88
+ agent_name: str,
89
+ problem: str,
90
+ solution: str,
91
+ testing_notes: str,
92
+ related_issues: Optional[List[str]] = None,
93
+ ) -> str:
94
+ """
95
+ Generate PR body for agent improvements.
96
+
97
+ Args:
98
+ agent_name: Agent name (e.g., "research")
99
+ problem: Problem statement (what wasn't working)
100
+ solution: Solution overview (what was changed)
101
+ testing_notes: Testing performed
102
+ related_issues: Related issue numbers (e.g., ["#157", "#142"])
103
+
104
+ Returns:
105
+ Formatted PR body in markdown
106
+
107
+ Example:
108
+ >>> service = PRTemplateService()
109
+ >>> body = service.generate_agent_pr_body(
110
+ ... agent_name="research",
111
+ ... problem="Memory exhaustion when analyzing >50 files",
112
+ ... solution="Add hard limit of 5 files per session with MCP summarizer",
113
+ ... testing_notes="Tested with 100-file codebase, memory stayed under 4GB",
114
+ ... related_issues=["#157"]
115
+ ... )
116
+ """
117
+ related_section = ""
118
+ if related_issues:
119
+ related_section = "\n\n## Related Issues\n\n"
120
+ for issue in related_issues:
121
+ # Check if it's just a number or already has #
122
+ issue_ref = issue if issue.startswith("#") else f"#{issue}"
123
+ related_section += f"Closes {issue_ref}\n"
124
+
125
+ return f"""## Problem Statement
126
+
127
+ {problem}
128
+
129
+ ## Proposed Solution
130
+
131
+ {solution}
132
+
133
+ ## Changes Made
134
+
135
+ **Agent:** `{agent_name}`
136
+
137
+ {self._format_changes_placeholder()}
138
+
139
+ ## Testing Performed
140
+
141
+ {testing_notes}
142
+
143
+ - [x] Validated YAML frontmatter syntax
144
+ - [x] Tested agent with sample tasks
145
+ - [x] Verified no regression in existing behavior
146
+ {related_section}
147
+ ## Checklist
148
+
149
+ - [x] Instructions are clear and unambiguous
150
+ - [x] No conflicting guidance
151
+ - [x] Follows agent architecture best practices
152
+ - [x] Documentation updated if needed
153
+
154
+ ---
155
+ 🤖 Generated with Claude MPM Agent Improver
156
+ Co-Authored-By: agent-improver <noreply@anthropic.com>
157
+ """
158
+
159
+ def generate_skill_pr_body(
160
+ self,
161
+ skill_name: str,
162
+ improvements: str,
163
+ justification: str,
164
+ examples: str,
165
+ related_issues: Optional[List[str]] = None,
166
+ ) -> str:
167
+ """
168
+ Generate PR body for skill improvements.
169
+
170
+ Args:
171
+ skill_name: Skill name (e.g., "fastapi-testing")
172
+ improvements: Description of improvements made
173
+ justification: Why these improvements were needed
174
+ examples: Examples added or updated
175
+ related_issues: Related issue numbers
176
+
177
+ Returns:
178
+ Formatted PR body in markdown
179
+
180
+ Example:
181
+ >>> service = PRTemplateService()
182
+ >>> body = service.generate_skill_pr_body(
183
+ ... skill_name="fastapi-testing",
184
+ ... improvements="Added async test patterns and database handling",
185
+ ... justification="Users struggled with async endpoint testing",
186
+ ... examples="pytest-asyncio config, AsyncClient usage, DB rollback patterns",
187
+ ... related_issues=["#203"]
188
+ ... )
189
+ """
190
+ related_section = ""
191
+ if related_issues:
192
+ related_section = "\n\n## Related Issues\n\n"
193
+ for issue in related_issues:
194
+ issue_ref = issue if issue.startswith("#") else f"#{issue}"
195
+ related_section += f"Requested by: Issue {issue_ref}\n"
196
+
197
+ return f"""## Skill Enhancement
198
+
199
+ **Skill:** `{skill_name}`
200
+
201
+ ## Motivation
202
+
203
+ {justification}
204
+
205
+ ## Improvements
206
+
207
+ {improvements}
208
+
209
+ ## Examples Added
210
+
211
+ {examples}
212
+
213
+ ## Testing
214
+
215
+ - [x] Validated YAML frontmatter
216
+ - [x] Verified skill syntax
217
+ - [x] Tested examples in relevant project
218
+ - [x] No conflicts with existing skills
219
+ {related_section}
220
+ ---
221
+ 🤖 Generated with Claude MPM Skills Manager
222
+ Co-Authored-By: skills-manager <noreply@anthropic.com>
223
+ """
224
+
225
+ def validate_conventional_commit(self, message: str) -> bool:
226
+ """
227
+ Validate that message follows conventional commit format.
228
+
229
+ Format: type(scope): description
230
+
231
+ Args:
232
+ message: Commit message to validate
233
+
234
+ Returns:
235
+ True if message follows conventional commit format
236
+
237
+ Example:
238
+ >>> service = PRTemplateService()
239
+ >>> service.validate_conventional_commit("feat(agent): improve research")
240
+ True
241
+ >>> service.validate_conventional_commit("improve research agent")
242
+ False
243
+ """
244
+ if not message:
245
+ return False
246
+
247
+ # Extract first line (title)
248
+ first_line = message.split("\n")[0]
249
+
250
+ # Check basic format: type(scope): description
251
+ if ":" not in first_line:
252
+ return False
253
+
254
+ # Split into type/scope and description
255
+ parts = first_line.split(":", 1)
256
+ if len(parts) != 2:
257
+ return False
258
+
259
+ type_scope = parts[0].strip()
260
+ description = parts[1].strip()
261
+
262
+ # Check type(scope) format
263
+ if "(" not in type_scope or ")" not in type_scope:
264
+ return False
265
+
266
+ # Extract type
267
+ commit_type = type_scope.split("(")[0].strip()
268
+
269
+ # Validate type is recognized
270
+ if commit_type not in self.COMMIT_TYPES:
271
+ return False
272
+
273
+ # Check description is not empty
274
+ if not description:
275
+ return False
276
+
277
+ return True
278
+
279
+ def _format_changes_placeholder(self) -> str:
280
+ """
281
+ Generate placeholder text for changes section.
282
+
283
+ Returns:
284
+ Formatted changes placeholder
285
+ """
286
+ return """_Detailed changes will be visible in the diff. Key modifications:_
287
+ - [List specific instruction changes]
288
+ - [List frontmatter updates if any]
289
+ - [List any related file changes]"""
290
+
291
+ def generate_commit_message(
292
+ self,
293
+ item_name: str,
294
+ brief_description: str,
295
+ detailed_changes: str,
296
+ pr_type: PRType,
297
+ commit_type: str = "feat",
298
+ ) -> str:
299
+ """
300
+ Generate conventional commit message.
301
+
302
+ Args:
303
+ item_name: Agent or skill name
304
+ brief_description: Brief description
305
+ detailed_changes: Detailed list of changes
306
+ pr_type: Type (agent or skill)
307
+ commit_type: Conventional commit type
308
+
309
+ Returns:
310
+ Formatted commit message
311
+
312
+ Example:
313
+ >>> service = PRTemplateService()
314
+ >>> msg = service.generate_commit_message(
315
+ ... "research",
316
+ ... "improve memory efficiency",
317
+ ... "- Add hard limit of 5 files\\n- Document MCP summarizer",
318
+ ... PRType.AGENT
319
+ ... )
320
+ """
321
+ scope = pr_type.value
322
+ title = f"{commit_type}({scope}): improve {item_name} - {brief_description}"
323
+
324
+ return f"""{title}
325
+
326
+ {detailed_changes}
327
+
328
+ 🤖 Generated with Claude MPM
329
+ """