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
@@ -12,6 +12,8 @@ import re
12
12
  from pathlib import Path
13
13
  from typing import Any, Dict, List
14
14
 
15
+ import yaml
16
+
15
17
  from claude_mpm.core.logging_config import get_logger
16
18
 
17
19
 
@@ -76,9 +78,190 @@ class AgentTemplateBuilder:
76
78
 
77
79
  return tool_list
78
80
 
81
+ def _discover_base_agent_templates(self, agent_file: Path) -> List[Path]:
82
+ """Discover BASE-AGENT.md files in hierarchy from agent file to repository root.
83
+
84
+ This method implements hierarchical BASE template discovery by walking up the
85
+ directory tree from the agent file location and collecting all BASE-AGENT.md
86
+ files found along the way.
87
+
88
+ Composition Order (closest to farthest):
89
+ 1. Local BASE-AGENT.md (same directory as agent)
90
+ 2. Parent BASE-AGENT.md (parent directory)
91
+ 3. Grandparent BASE-AGENT.md (grandparent directory)
92
+ ... continuing to repository root
93
+
94
+ Args:
95
+ agent_file: Path to the agent template file
96
+
97
+ Returns:
98
+ List of BASE-AGENT.md paths ordered from closest to farthest
99
+ (same directory to root)
100
+
101
+ Example:
102
+ Given structure:
103
+ repo/
104
+ BASE-AGENT.md # Root (index 2)
105
+ engineering/
106
+ BASE-AGENT.md # Parent (index 1)
107
+ python/
108
+ BASE-AGENT.md # Local (index 0)
109
+ fastapi-engineer.md # Agent file
110
+
111
+ Returns: [
112
+ repo/engineering/python/BASE-AGENT.md,
113
+ repo/engineering/BASE-AGENT.md,
114
+ repo/BASE-AGENT.md
115
+ ]
116
+ """
117
+ base_templates = []
118
+ current_dir = agent_file.parent
119
+
120
+ # Walk up directory tree until we reach root or a reasonable limit
121
+ # Stop at repository root or after 10 levels (safety limit)
122
+ max_depth = 10
123
+ depth = 0
124
+
125
+ while current_dir and depth < max_depth:
126
+ # Check for BASE-AGENT.md in current directory
127
+ base_agent_file = current_dir / "BASE-AGENT.md"
128
+ if base_agent_file.exists() and base_agent_file.is_file():
129
+ base_templates.append(base_agent_file)
130
+ self.logger.debug(f"Found BASE-AGENT.md at: {base_agent_file}")
131
+
132
+ # Stop at git repository root if detected
133
+ if (current_dir / ".git").exists():
134
+ self.logger.debug(f"Reached git repository root at: {current_dir}")
135
+ break
136
+
137
+ # Stop at common repository root indicators
138
+ if current_dir.name in [".claude-mpm", "remote-agents", "cache"]:
139
+ self.logger.debug(
140
+ f"Reached repository root indicator at: {current_dir}"
141
+ )
142
+ break
143
+
144
+ # Move to parent directory
145
+ parent = current_dir.parent
146
+ if parent == current_dir: # Reached filesystem root
147
+ break
148
+
149
+ current_dir = parent
150
+ depth += 1
151
+
152
+ if base_templates:
153
+ self.logger.info(
154
+ f"Discovered {len(base_templates)} BASE-AGENT.md file(s) for {agent_file.name}"
155
+ )
156
+
157
+ return base_templates
158
+
159
+ def _parse_markdown_template(self, template_path: Path) -> dict:
160
+ """Parse Markdown template with YAML frontmatter.
161
+
162
+ Extracts metadata from YAML frontmatter and content from Markdown body.
163
+ Supports the new agent template format with YAML frontmatter between --- delimiters.
164
+
165
+ Args:
166
+ template_path: Path to the Markdown template file
167
+
168
+ Returns:
169
+ Dictionary containing metadata and instructions
170
+
171
+ Raises:
172
+ ValueError: If frontmatter is missing or malformed
173
+ yaml.YAMLError: If YAML parsing fails
174
+ """
175
+ content = template_path.read_text(encoding="utf-8")
176
+
177
+ # Split frontmatter and body
178
+ # Format: ---\n<yaml>\n---\n<markdown>
179
+ if not content.startswith("---"):
180
+ raise ValueError(
181
+ f"Markdown template missing YAML frontmatter: {template_path}"
182
+ )
183
+
184
+ # Split by --- delimiters
185
+ parts = content.split("---", 2)
186
+ if len(parts) < 3:
187
+ raise ValueError(f"Malformed YAML frontmatter in template: {template_path}")
188
+
189
+ # parts[0] is empty (before first ---)
190
+ # parts[1] is YAML frontmatter
191
+ # parts[2] is Markdown content
192
+ yaml_content = parts[1].strip()
193
+ markdown_content = parts[2].strip()
194
+
195
+ # Parse YAML frontmatter
196
+ try:
197
+ metadata = yaml.safe_load(yaml_content)
198
+ if not isinstance(metadata, dict):
199
+ raise ValueError(
200
+ f"YAML frontmatter must be a dictionary: {template_path}"
201
+ )
202
+ except yaml.YAMLError as e:
203
+ self.logger.error(
204
+ f"Failed to parse YAML frontmatter in {template_path}: {e}"
205
+ )
206
+ raise
207
+
208
+ # Validate required fields
209
+ required_fields = ["name", "description", "version"]
210
+ missing_fields = [field for field in required_fields if field not in metadata]
211
+ if missing_fields:
212
+ raise ValueError(
213
+ f"Missing required fields in template {template_path}: {missing_fields}"
214
+ )
215
+
216
+ # Add the markdown content as instructions field
217
+ metadata["instructions"] = markdown_content
218
+
219
+ # Normalize metadata structure to match JSON template format
220
+ # JSON templates have these fields at top level, Markdown may have them nested
221
+ self._normalize_metadata_structure(metadata)
222
+
223
+ return metadata
224
+
225
+ def _normalize_metadata_structure(self, metadata: dict) -> None:
226
+ """Normalize metadata structure to match expected JSON template format.
227
+
228
+ This ensures both Markdown and JSON templates produce the same metadata structure
229
+ for downstream processing.
230
+
231
+ Args:
232
+ metadata: Metadata dictionary to normalize (modified in-place)
233
+ """
234
+ # Map Markdown frontmatter fields to JSON template structure
235
+ # Handle tags: YAML list vs JSON comma-separated string
236
+ if "tags" in metadata and isinstance(metadata["tags"], list):
237
+ # Keep as list for now, normalize_tools_input will handle both formats
238
+ pass
239
+
240
+ # Map agent_id to name if name is missing
241
+ if "agent_id" in metadata and "name" not in metadata:
242
+ metadata["name"] = metadata["agent_id"]
243
+
244
+ # Ensure capabilities dict exists
245
+ if "capabilities" not in metadata:
246
+ metadata["capabilities"] = {}
247
+
248
+ # Merge top-level capability fields into capabilities dict
249
+ capability_fields = ["memory_limit", "cpu_limit", "network_access"]
250
+ for field in capability_fields:
251
+ if field in metadata:
252
+ metadata["capabilities"][field] = metadata.pop(field)
253
+
254
+ # Add model to capabilities if present at top level
255
+ if "model" in metadata and "model" not in metadata["capabilities"]:
256
+ metadata["capabilities"]["model"] = metadata["model"]
257
+
79
258
  def _load_base_agent_instructions(self, agent_type: str) -> str:
80
259
  """Load BASE instructions for a specific agent type.
81
260
 
261
+ DEPRECATED: This method loads BASE_{TYPE}.md files (old pattern).
262
+ New pattern uses hierarchical BASE-AGENT.md files discovered via
263
+ _discover_base_agent_templates() and composed in build_agent_markdown().
264
+
82
265
  Args:
83
266
  agent_type: The type of agent (engineer, qa, ops, research, documentation)
84
267
 
@@ -156,7 +339,7 @@ class AgentTemplateBuilder:
156
339
 
157
340
  Args:
158
341
  agent_name: Name of the agent
159
- template_path: Path to the agent template JSON file
342
+ template_path: Path to the agent template (JSON or Markdown file)
160
343
  base_agent_data: Base agent configuration data
161
344
  source_info: Source of the agent (system/project/user)
162
345
 
@@ -166,16 +349,34 @@ class AgentTemplateBuilder:
166
349
  Raises:
167
350
  FileNotFoundError: If template file doesn't exist
168
351
  json.JSONDecodeError: If template JSON is invalid
352
+ yaml.YAMLError: If template YAML is invalid
353
+ ValueError: If template format is unsupported or malformed
169
354
  """
170
355
  if not template_path.exists():
171
356
  raise FileNotFoundError(f"Template file not found: {template_path}")
172
357
 
358
+ # Format detection: route to appropriate parser
173
359
  try:
174
- template_content = template_path.read_text()
175
- template_data = json.loads(template_content)
360
+ if template_path.suffix == ".md":
361
+ # Parse Markdown template with YAML frontmatter
362
+ self.logger.debug(f"Parsing Markdown template: {template_path}")
363
+ template_data = self._parse_markdown_template(template_path)
364
+ elif template_path.suffix == ".json":
365
+ # Parse JSON template (legacy format)
366
+ self.logger.debug(f"Parsing JSON template: {template_path}")
367
+ template_content = template_path.read_text()
368
+ template_data = json.loads(template_content)
369
+ else:
370
+ raise ValueError(
371
+ f"Unsupported template format: {template_path.suffix}. "
372
+ f"Expected .md or .json"
373
+ )
176
374
  except json.JSONDecodeError as e:
177
375
  self.logger.error(f"Invalid JSON in template {template_path}: {e}")
178
376
  raise
377
+ except (yaml.YAMLError, ValueError) as e:
378
+ self.logger.error(f"Invalid template {template_path}: {e}")
379
+ raise
179
380
 
180
381
  # Extract tools from template with fallback
181
382
  # Handle both dict and list formats for capabilities (backward compatibility)
@@ -392,9 +593,6 @@ class AgentTemplateBuilder:
392
593
 
393
594
  frontmatter = "\n".join(frontmatter_lines)
394
595
 
395
- # Load BASE instructions for this agent type
396
- base_instructions = self._load_base_agent_instructions(agent_type)
397
-
398
596
  # Get agent instructions from template data (primary) or base agent data (fallback)
399
597
  raw_instructions = template_data.get("instructions")
400
598
 
@@ -411,15 +609,38 @@ class AgentTemplateBuilder:
411
609
  or "# Agent Instructions\n\nThis agent provides specialized assistance."
412
610
  )
413
611
 
414
- # Combine BASE instructions with agent-specific instructions
415
- if base_instructions:
416
- # Create a combined instruction set
417
- content = f"{base_instructions}\n\n---\n\n{agent_specific_instructions}"
418
- self.logger.debug(
419
- f"Combined BASE instructions with agent-specific instructions for {agent_type}"
420
- )
421
- else:
422
- content = agent_specific_instructions
612
+ # Compose hierarchical BASE-AGENT.md templates
613
+ # Order: agent-specific + local BASE + parent BASE + ... + root BASE
614
+ content_parts = [agent_specific_instructions]
615
+
616
+ # Discover BASE-AGENT.md files in directory hierarchy
617
+ base_templates = self._discover_base_agent_templates(template_path)
618
+
619
+ # Append each BASE template (order: closest to farthest)
620
+ for base_template_path in base_templates:
621
+ try:
622
+ base_content = base_template_path.read_text(encoding="utf-8")
623
+ if base_content.strip():
624
+ content_parts.append(base_content)
625
+ self.logger.debug(
626
+ f"Composed BASE template: {base_template_path.relative_to(template_path.parent.parent) if template_path.parent.parent in base_template_path.parents else base_template_path.name}"
627
+ )
628
+ except Exception as e:
629
+ self.logger.warning(
630
+ f"Failed to read BASE template {base_template_path}: {e}"
631
+ )
632
+
633
+ # Fallback: Load legacy BASE_{TYPE}.md if no hierarchical templates found
634
+ if len(content_parts) == 1: # Only agent-specific instructions
635
+ legacy_base_instructions = self._load_base_agent_instructions(agent_type)
636
+ if legacy_base_instructions:
637
+ content_parts.append(legacy_base_instructions)
638
+ self.logger.debug(
639
+ f"Using legacy BASE_{agent_type.upper()}.md (no hierarchical BASE-AGENT.md found)"
640
+ )
641
+
642
+ # Join all parts with separator
643
+ content = "\n\n---\n\n".join(content_parts)
423
644
 
424
645
  # Add memory update instructions if not already present
425
646
  if "memory-update" not in content and "Remember" not in content:
@@ -2,6 +2,47 @@
2
2
 
3
3
  This module handles determining the correct agents directory for deployment
4
4
  based on different deployment scenarios and target directories.
5
+
6
+ DEPLOYMENT ARCHITECTURE:
7
+ =======================
8
+
9
+ Agent Source Locations (Discovery):
10
+ -----------------------------------
11
+ 1. System Agents: ~/.claude-mpm/cache/remote-agents/bobmatnyc/claude-mpm-agents/
12
+ - Synced from GitHub repository
13
+ - Read-only (managed by git pull)
14
+ - 44+ agents organized by category
15
+
16
+ 2. User Agents: ~/.claude-mpm/agents/
17
+ - User-created custom agents
18
+ - Personal agent definitions
19
+
20
+ 3. Project Agents: .claude-mpm/agents/
21
+ - Project-specific agents
22
+ - Overrides for system/user agents
23
+
24
+ Agent Deployment Target (Runtime):
25
+ ----------------------------------
26
+ ALL AGENTS DEPLOY TO: <project_root>/.claude/agents/
27
+ - Single deployment location for ALL agents (system, user, project)
28
+ - Claude Code discovers agents from this directory
29
+ - Ensures consistent agent availability across sessions
30
+ - Simplifies agent management and version control
31
+
32
+ Why Project-Level Deployment?
33
+ ------------------------------
34
+ 1. **Consistency**: All team members work with same agents
35
+ 2. **Versioning**: Agent deployments tracked in git
36
+ 3. **Isolation**: Different projects can have different agent versions
37
+ 4. **Performance**: No global agent conflicts or version mismatches
38
+
39
+ Example Flow:
40
+ -------------
41
+ 1. User runs: claude-mpm agents deploy
42
+ 2. Agents synced from GitHub → ~/.claude-mpm/cache/remote-agents/
43
+ 3. Agents deployed FROM cache → .claude/agents/
44
+ 4. Claude Code discovers agents FROM .claude/agents/
45
+
5
46
  Extracted from AgentDeploymentService to reduce complexity.
6
47
  """
7
48
 
@@ -28,36 +69,81 @@ class AgentsDirectoryResolver:
28
69
  """
29
70
  Determine the correct agents directory based on input.
30
71
 
31
- MODIFIED: Always deploy to project .claude/agents directory
32
- regardless of agent source (system, user, or project).
72
+ DEPLOYMENT STRATEGY:
73
+ ====================
74
+ Always deploy to project .claude/agents directory regardless of agent
75
+ source (system, user, or project). This ensures:
76
+ - All agents available in single location
77
+ - Claude Code agent discovery works consistently
78
+ - Version control tracks deployed agents
79
+ - No global agent conflicts between projects
33
80
 
34
- This ensures all agents are deployed at the project level while
35
- maintaining discovery from both user (~/.claude-mpm) and project
36
- (.claude-mpm) directories.
81
+ LOGIC FLOW:
82
+ -----------
83
+ 1. If target_dir is None (default case):
84
+ → Deploy to: <working_directory>/.claude/agents
85
+ → This is 99% of use cases (standard deployment)
86
+
87
+ 2. If target_dir is provided explicitly:
88
+ → Normalize the path based on directory name:
89
+ - Already "agents" directory? → Use as-is
90
+ - Is ".claude-mpm" directory? → Add /agents
91
+ - Is ".claude" directory? → Add /agents
92
+ - Otherwise? → Treat as project root, add /.claude/agents
93
+
94
+ EXAMPLES:
95
+ ---------
96
+ Standard deployment (target_dir=None):
97
+ working_directory = /Users/masa/Projects/my-app
98
+ → Returns: /Users/masa/Projects/my-app/.claude/agents
99
+
100
+ Explicit target (target_dir="/some/path/.claude"):
101
+ → Returns: /some/path/.claude/agents
102
+
103
+ Explicit target (target_dir="/some/path/.claude/agents"):
104
+ → Returns: /some/path/.claude/agents (no modification)
37
105
 
38
106
  Args:
39
- target_dir: Optional target directory
107
+ target_dir: Optional target directory override
108
+ None = use default project .claude/agents (recommended)
109
+ Path = explicitly specify deployment location (advanced)
40
110
 
41
111
  Returns:
42
- Path to agents directory
112
+ Path: Resolved agents directory path
113
+
114
+ Note:
115
+ The default behavior (target_dir=None) is the recommended approach.
116
+ Only provide target_dir for advanced use cases or testing.
43
117
  """
44
118
  if not target_dir:
45
- # Always deploy to project directory
46
- # This is the key change - all agents go to project .claude/agents
119
+ # DEFAULT CASE: Deploy to project .claude/agents directory
120
+ # This is the standard behavior for all normal deployments
121
+ # Example: /Users/masa/Projects/my-app → /Users/masa/Projects/my-app/.claude/agents
47
122
  return self.working_directory / ".claude" / "agents"
48
123
 
49
- # If target_dir provided, use it directly (caller decides structure)
124
+ # EXPLICIT TARGET CASE: User/caller provided specific target directory
125
+ # Normalize target_dir to proper agents directory based on structure
50
126
  target_dir = Path(target_dir)
51
127
 
52
- # Check if this is already an agents directory
128
+ # Pattern 1: Already an agents directory
53
129
  if target_dir.name == "agents":
54
- # Already an agents directory, use as-is
130
+ # Already targeting agents dir explicitly, use as-is
131
+ # Example: /some/path/.claude/agents → /some/path/.claude/agents
55
132
  return target_dir
133
+
134
+ # Pattern 2: Targeting .claude-mpm directory
56
135
  if target_dir.name == ".claude-mpm":
57
- # .claude-mpm directory, add agents subdirectory
136
+ # Add agents subdirectory to .claude-mpm
137
+ # Example: /some/path/.claude-mpm → /some/path/.claude-mpm/agents
58
138
  return target_dir / "agents"
139
+
140
+ # Pattern 3: Targeting .claude directory
59
141
  if target_dir.name == ".claude":
60
- # .claude directory, add agents subdirectory
142
+ # Add agents subdirectory to .claude
143
+ # Example: /some/path/.claude → /some/path/.claude/agents
61
144
  return target_dir / "agents"
62
- # Assume it's a project directory, add .claude/agents
145
+
146
+ # Pattern 4: Targeting project root or other directory
147
+ # Assume it's a project directory, add full .claude/agents path
148
+ # Example: /some/project → /some/project/.claude/agents
63
149
  return target_dir / ".claude" / "agents"
@@ -200,9 +200,10 @@ class AsyncAgentDeploymentService:
200
200
  return str(directory), []
201
201
 
202
202
  # Use asyncio to run glob in executor (since Path.glob is blocking)
203
+ # Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
203
204
  loop = asyncio.get_event_loop()
204
205
  files = await loop.run_in_executor(
205
- self.executor, lambda: list(directory.glob("*.json"))
206
+ self.executor, lambda: list(directory.glob("*.md"))
206
207
  )
207
208
 
208
209
  self.logger.debug(f"Found {len(files)} agents in {directory}")
@@ -89,9 +89,9 @@ class DeploymentFacade:
89
89
 
90
90
  results["metadata"]["facade_version"] = "1.0.0"
91
91
  results["metadata"]["selected_executor"] = executor.get_executor_name()
92
- results["metadata"][
93
- "executor_characteristics"
94
- ] = executor.get_performance_characteristics()
92
+ results["metadata"]["executor_characteristics"] = (
93
+ executor.get_performance_characteristics()
94
+ )
95
95
 
96
96
  return results
97
97