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