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

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

Potentially problematic release.


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

Files changed (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -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