claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__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 (866) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +431 -214
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/MEMORY.md +3 -0
  13. claude_mpm/agents/OUTPUT_STYLE.md +335 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -187
  16. claude_mpm/agents/agent_loader.py +40 -10
  17. claude_mpm/agents/agent_loader_integration.py +3 -2
  18. claude_mpm/agents/agents_metadata.py +57 -0
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent_loader.py +11 -9
  21. claude_mpm/agents/frontmatter_validator.py +291 -251
  22. claude_mpm/agents/system_agent_config.py +3 -2
  23. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  24. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  25. claude_mpm/agents/templates/README.md +465 -0
  26. claude_mpm/agents/templates/agent-manager.json +267 -18
  27. claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
  28. claude_mpm/agents/templates/api_qa.json +16 -4
  29. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  30. claude_mpm/agents/templates/clerk-ops.json +235 -0
  31. claude_mpm/agents/templates/code_analyzer.json +25 -9
  32. claude_mpm/agents/templates/content-agent.json +358 -0
  33. claude_mpm/agents/templates/dart_engineer.json +307 -0
  34. claude_mpm/agents/templates/data_engineer.json +87 -14
  35. claude_mpm/agents/templates/documentation.json +76 -13
  36. claude_mpm/agents/templates/engineer.json +44 -10
  37. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  38. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  39. claude_mpm/agents/templates/golang_engineer.json +270 -0
  40. claude_mpm/agents/templates/imagemagick.json +5 -2
  41. claude_mpm/agents/templates/java_engineer.json +346 -0
  42. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  43. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  44. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  45. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  46. claude_mpm/agents/templates/memory_manager.json +6 -3
  47. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  48. claude_mpm/agents/templates/ops.json +27 -8
  49. claude_mpm/agents/templates/php-engineer.json +287 -0
  50. claude_mpm/agents/templates/pm_examples.md +474 -0
  51. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  52. claude_mpm/agents/templates/product_owner.json +338 -0
  53. claude_mpm/agents/templates/project_organizer.json +19 -5
  54. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  55. claude_mpm/agents/templates/python_engineer.json +387 -0
  56. claude_mpm/agents/templates/qa.json +26 -6
  57. claude_mpm/agents/templates/react_engineer.json +239 -0
  58. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  59. claude_mpm/agents/templates/research.json +47 -22
  60. claude_mpm/agents/templates/response_format.md +583 -0
  61. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  62. claude_mpm/agents/templates/rust_engineer.json +275 -0
  63. claude_mpm/agents/templates/security.json +59 -10
  64. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  65. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  66. claude_mpm/agents/templates/ticketing.json +16 -7
  67. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  68. claude_mpm/agents/templates/validation_templates.md +312 -0
  69. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  70. claude_mpm/agents/templates/version_control.json +16 -4
  71. claude_mpm/agents/templates/web_qa.json +243 -21
  72. claude_mpm/agents/templates/web_ui.json +18 -5
  73. claude_mpm/cli/__init__.py +38 -363
  74. claude_mpm/cli/commands/__init__.py +8 -0
  75. claude_mpm/cli/commands/agent_manager.py +675 -20
  76. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  77. claude_mpm/cli/commands/agents.py +722 -150
  78. claude_mpm/cli/commands/agents_detect.py +380 -0
  79. claude_mpm/cli/commands/agents_recommend.py +309 -0
  80. claude_mpm/cli/commands/aggregate.py +10 -6
  81. claude_mpm/cli/commands/analyze.py +553 -0
  82. claude_mpm/cli/commands/analyze_code.py +528 -0
  83. claude_mpm/cli/commands/auto_configure.py +570 -0
  84. claude_mpm/cli/commands/cleanup.py +12 -12
  85. claude_mpm/cli/commands/config.py +47 -13
  86. claude_mpm/cli/commands/configure.py +488 -884
  87. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  88. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  89. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  90. claude_mpm/cli/commands/configure_models.py +18 -0
  91. claude_mpm/cli/commands/configure_navigation.py +167 -0
  92. claude_mpm/cli/commands/configure_paths.py +104 -0
  93. claude_mpm/cli/commands/configure_persistence.py +254 -0
  94. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  95. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  96. claude_mpm/cli/commands/configure_validators.py +73 -0
  97. claude_mpm/cli/commands/dashboard.py +286 -0
  98. claude_mpm/cli/commands/debug.py +1386 -0
  99. claude_mpm/cli/commands/doctor.py +43 -7
  100. claude_mpm/cli/commands/info.py +3 -4
  101. claude_mpm/cli/commands/local_deploy.py +537 -0
  102. claude_mpm/cli/commands/mcp.py +17 -10
  103. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  104. claude_mpm/cli/commands/mcp_config.py +154 -0
  105. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  106. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  107. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  108. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  109. claude_mpm/cli/commands/memory.py +55 -21
  110. claude_mpm/cli/commands/monitor.py +168 -617
  111. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  112. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  113. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  114. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  115. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  116. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  117. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  118. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  119. claude_mpm/cli/commands/run.py +169 -42
  120. claude_mpm/cli/commands/search.py +458 -0
  121. claude_mpm/cli/commands/skills.py +488 -0
  122. claude_mpm/cli/commands/uninstall.py +176 -0
  123. claude_mpm/cli/commands/upgrade.py +152 -0
  124. claude_mpm/cli/commands/verify.py +119 -0
  125. claude_mpm/cli/executor.py +204 -0
  126. claude_mpm/cli/helpers.py +105 -0
  127. claude_mpm/cli/interactive/__init__.py +21 -0
  128. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  129. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  130. claude_mpm/cli/parser.py +79 -2
  131. claude_mpm/cli/parsers/__init__.py +7 -1
  132. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  133. claude_mpm/cli/parsers/agents_parser.py +116 -0
  134. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  135. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  136. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  137. claude_mpm/cli/parsers/base_parser.py +187 -3
  138. claude_mpm/cli/parsers/configure_parser.py +34 -15
  139. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  140. claude_mpm/cli/parsers/debug_parser.py +319 -0
  141. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  142. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  143. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  144. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  145. claude_mpm/cli/parsers/run_parser.py +5 -0
  146. claude_mpm/cli/parsers/search_parser.py +245 -0
  147. claude_mpm/cli/parsers/skills_parser.py +137 -0
  148. claude_mpm/cli/shared/argument_patterns.py +20 -13
  149. claude_mpm/cli/shared/base_command.py +2 -2
  150. claude_mpm/cli/shared/output_formatters.py +28 -19
  151. claude_mpm/cli/startup.py +562 -0
  152. claude_mpm/cli/startup_logging.py +179 -13
  153. claude_mpm/cli/utils.py +53 -2
  154. claude_mpm/commands/__init__.py +14 -0
  155. claude_mpm/commands/mpm-agents-detect.md +168 -0
  156. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  157. claude_mpm/commands/mpm-agents.md +122 -0
  158. claude_mpm/commands/mpm-auto-configure.md +269 -0
  159. claude_mpm/commands/mpm-config.md +141 -0
  160. claude_mpm/commands/mpm-doctor.md +24 -0
  161. claude_mpm/commands/mpm-help.md +290 -0
  162. claude_mpm/commands/mpm-init.md +521 -0
  163. claude_mpm/commands/mpm-monitor.md +409 -0
  164. claude_mpm/commands/mpm-organize.md +295 -0
  165. claude_mpm/commands/mpm-resume.md +372 -0
  166. claude_mpm/commands/mpm-status.md +75 -0
  167. claude_mpm/commands/mpm-tickets.md +151 -0
  168. claude_mpm/commands/mpm-version.md +113 -0
  169. claude_mpm/commands/mpm.md +21 -0
  170. claude_mpm/config/agent_config.py +4 -4
  171. claude_mpm/config/experimental_features.py +7 -7
  172. claude_mpm/config/model_config.py +428 -0
  173. claude_mpm/config/paths.py +3 -2
  174. claude_mpm/config/socketio_config.py +36 -7
  175. claude_mpm/constants.py +27 -1
  176. claude_mpm/core/__init__.py +53 -17
  177. claude_mpm/core/agent_name_normalizer.py +3 -2
  178. claude_mpm/core/agent_registry.py +2 -2
  179. claude_mpm/core/agent_session_manager.py +10 -10
  180. claude_mpm/core/api_validator.py +330 -0
  181. claude_mpm/core/base_service.py +33 -23
  182. claude_mpm/core/cache.py +9 -9
  183. claude_mpm/core/claude_runner.py +19 -8
  184. claude_mpm/core/config.py +103 -8
  185. claude_mpm/core/config_aliases.py +7 -6
  186. claude_mpm/core/constants.py +65 -0
  187. claude_mpm/core/container.py +11 -5
  188. claude_mpm/core/enums.py +452 -0
  189. claude_mpm/core/error_handler.py +623 -0
  190. claude_mpm/core/factories.py +1 -1
  191. claude_mpm/core/file_utils.py +764 -0
  192. claude_mpm/core/framework/__init__.py +38 -0
  193. claude_mpm/core/framework/formatters/__init__.py +11 -0
  194. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  195. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  196. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  197. claude_mpm/core/framework/loaders/__init__.py +13 -0
  198. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  199. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  200. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  201. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  202. claude_mpm/core/framework/processors/__init__.py +11 -0
  203. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  204. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  205. claude_mpm/core/framework/processors/template_processor.py +244 -0
  206. claude_mpm/core/framework_loader.py +323 -1491
  207. claude_mpm/core/hook_manager.py +8 -6
  208. claude_mpm/core/injectable_service.py +11 -8
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +55 -8
  211. claude_mpm/core/interfaces.py +56 -1
  212. claude_mpm/core/lazy.py +3 -3
  213. claude_mpm/core/log_manager.py +100 -28
  214. claude_mpm/core/logger.py +19 -14
  215. claude_mpm/core/logging_config.py +6 -2
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/oneshot_session.py +51 -7
  218. claude_mpm/core/optimized_agent_loader.py +9 -9
  219. claude_mpm/core/optimized_startup.py +1 -1
  220. claude_mpm/core/output_style_manager.py +12 -192
  221. claude_mpm/core/pm_hook_interceptor.py +118 -15
  222. claude_mpm/core/service_registry.py +7 -3
  223. claude_mpm/core/session_manager.py +14 -12
  224. claude_mpm/core/shared/config_loader.py +1 -1
  225. claude_mpm/core/socketio_pool.py +15 -15
  226. claude_mpm/core/tool_access_control.py +3 -2
  227. claude_mpm/core/types.py +4 -11
  228. claude_mpm/core/typing_utils.py +7 -6
  229. claude_mpm/core/unified_agent_registry.py +116 -12
  230. claude_mpm/core/unified_config.py +6 -6
  231. claude_mpm/core/unified_paths.py +23 -20
  232. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  233. claude_mpm/dashboard/__init__.py +12 -0
  234. claude_mpm/dashboard/analysis_runner.py +455 -0
  235. claude_mpm/dashboard/api/simple_directory.py +261 -0
  236. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  237. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  238. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  239. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  240. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  241. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  242. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  243. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  244. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  245. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  246. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  247. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  248. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  249. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  250. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  251. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  252. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  253. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  254. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  255. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  256. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  257. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  258. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  259. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  260. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  261. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  262. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  263. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  264. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  265. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  266. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  267. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  268. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  269. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  270. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  271. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  272. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  273. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  274. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  275. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  276. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  277. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  278. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  279. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  280. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  281. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  282. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  283. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  284. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  285. claude_mpm/dashboard/static/built/react/events.js +30 -0
  286. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  287. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  288. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  289. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  290. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  291. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  292. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  293. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  294. claude_mpm/dashboard/static/css/activity.css +1958 -0
  295. claude_mpm/dashboard/static/css/dashboard.css +1413 -72
  296. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  297. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  298. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  299. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  300. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  301. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  302. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  303. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  304. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  305. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  306. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  307. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  308. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  309. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  310. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  311. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  312. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  313. claude_mpm/dashboard/static/events.html +607 -0
  314. claude_mpm/dashboard/static/index.html +635 -0
  315. claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
  316. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  317. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  318. claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
  319. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  320. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  321. claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
  322. claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
  323. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  324. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  325. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  326. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  327. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  328. claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
  329. claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
  330. claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
  331. claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
  332. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
  333. claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
  334. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  335. claude_mpm/dashboard/static/js/dashboard.js +523 -622
  336. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  337. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  338. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  339. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  340. claude_mpm/dashboard/static/js/socket-client.js +549 -62
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  342. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  343. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  344. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  345. claude_mpm/dashboard/static/legacy/files.html +747 -0
  346. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  347. claude_mpm/dashboard/static/monitors.html +431 -0
  348. claude_mpm/dashboard/static/production/events.html +659 -0
  349. claude_mpm/dashboard/static/production/main.html +698 -0
  350. claude_mpm/dashboard/static/production/monitors.html +483 -0
  351. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  352. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  353. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  354. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  355. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  356. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  357. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  358. claude_mpm/dashboard/templates/code_simple.html +153 -0
  359. claude_mpm/dashboard/templates/index.html +267 -9
  360. claude_mpm/experimental/__init__.py +10 -0
  361. claude_mpm/experimental/cli_enhancements.py +4 -2
  362. claude_mpm/generators/agent_profile_generator.py +5 -3
  363. claude_mpm/hooks/__init__.py +37 -1
  364. claude_mpm/hooks/base_hook.py +5 -4
  365. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  366. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  367. claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
  368. claude_mpm/hooks/claude_hooks/installer.py +783 -0
  369. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  370. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  371. claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
  372. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  373. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  374. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  375. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  376. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  377. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  378. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  379. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  380. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  381. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  382. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  383. claude_mpm/hooks/memory_integration_hook.py +1 -1
  384. claude_mpm/hooks/session_resume_hook.py +121 -0
  385. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  386. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  387. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  388. claude_mpm/hooks/validation_hooks.py +3 -3
  389. claude_mpm/init.py +23 -4
  390. claude_mpm/models/agent_session.py +8 -6
  391. claude_mpm/models/resume_log.py +340 -0
  392. claude_mpm/schemas/__init__.py +12 -0
  393. claude_mpm/scripts/claude-hook-handler.sh +187 -0
  394. claude_mpm/scripts/launch_monitor.py +85 -0
  395. claude_mpm/scripts/mcp_server.py +3 -5
  396. claude_mpm/scripts/mpm_doctor.py +3 -2
  397. claude_mpm/scripts/socketio_daemon.py +156 -396
  398. claude_mpm/services/__init__.py +144 -160
  399. claude_mpm/services/agents/__init__.py +18 -5
  400. claude_mpm/services/agents/agent_builder.py +13 -11
  401. claude_mpm/services/agents/auto_config_manager.py +796 -0
  402. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  403. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  404. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  405. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  406. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  407. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  408. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  409. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  410. claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
  411. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  412. claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
  413. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  414. claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
  415. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  416. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  417. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  418. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  419. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  421. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  422. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  423. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  424. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  425. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  426. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  427. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  428. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  429. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  430. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  431. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  432. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  433. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  434. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  435. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  436. claude_mpm/services/agents/local_template_manager.py +744 -0
  437. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  438. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  439. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  440. claude_mpm/services/agents/memory/content_manager.py +17 -9
  441. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  442. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  443. claude_mpm/services/agents/memory/memory_format_service.py +7 -7
  444. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  445. claude_mpm/services/agents/memory/template_generator.py +3 -3
  446. claude_mpm/services/agents/observers.py +547 -0
  447. claude_mpm/services/agents/recommender.py +615 -0
  448. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  449. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  450. claude_mpm/services/async_session_logger.py +141 -98
  451. claude_mpm/services/claude_session_logger.py +82 -74
  452. claude_mpm/services/cli/agent_cleanup_service.py +6 -5
  453. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  454. claude_mpm/services/cli/agent_listing_service.py +5 -5
  455. claude_mpm/services/cli/agent_validation_service.py +6 -5
  456. claude_mpm/services/cli/memory_crud_service.py +12 -7
  457. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  458. claude_mpm/services/cli/resume_service.py +617 -0
  459. claude_mpm/services/cli/session_manager.py +104 -13
  460. claude_mpm/services/cli/session_pause_manager.py +504 -0
  461. claude_mpm/services/cli/session_resume_helper.py +372 -0
  462. claude_mpm/services/cli/startup_checker.py +13 -21
  463. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  464. claude_mpm/services/command_deployment_service.py +17 -9
  465. claude_mpm/services/command_handler_service.py +11 -5
  466. claude_mpm/services/core/__init__.py +33 -1
  467. claude_mpm/services/core/base.py +26 -11
  468. claude_mpm/services/core/cache_manager.py +1 -3
  469. claude_mpm/services/core/interfaces/__init__.py +90 -3
  470. claude_mpm/services/core/interfaces/agent.py +184 -0
  471. claude_mpm/services/core/interfaces/health.py +172 -0
  472. claude_mpm/services/core/interfaces/model.py +281 -0
  473. claude_mpm/services/core/interfaces/process.py +372 -0
  474. claude_mpm/services/core/interfaces/project.py +121 -0
  475. claude_mpm/services/core/interfaces/restart.py +307 -0
  476. claude_mpm/services/core/interfaces/stability.py +260 -0
  477. claude_mpm/services/core/interfaces.py +56 -1
  478. claude_mpm/services/core/memory_manager.py +92 -47
  479. claude_mpm/services/core/models/__init__.py +79 -0
  480. claude_mpm/services/core/models/agent_config.py +384 -0
  481. claude_mpm/services/core/models/health.py +162 -0
  482. claude_mpm/services/core/models/process.py +239 -0
  483. claude_mpm/services/core/models/restart.py +302 -0
  484. claude_mpm/services/core/models/stability.py +264 -0
  485. claude_mpm/services/core/models/toolchain.py +306 -0
  486. claude_mpm/services/core/path_resolver.py +37 -18
  487. claude_mpm/services/core/service_container.py +2 -2
  488. claude_mpm/services/diagnostics/__init__.py +2 -2
  489. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  490. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  491. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  492. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  493. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  494. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  495. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  496. claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
  497. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  498. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  499. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  500. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  501. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  502. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  503. claude_mpm/services/diagnostics/models.py +37 -21
  504. claude_mpm/services/event_aggregator.py +5 -3
  505. claude_mpm/services/event_bus/direct_relay.py +152 -13
  506. claude_mpm/services/event_bus/event_bus.py +51 -9
  507. claude_mpm/services/event_bus/relay.py +33 -14
  508. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  509. claude_mpm/services/events/core.py +5 -6
  510. claude_mpm/services/events/producers/hook.py +6 -6
  511. claude_mpm/services/events/producers/system.py +8 -8
  512. claude_mpm/services/exceptions.py +5 -5
  513. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  514. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  515. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  516. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  517. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  518. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  519. claude_mpm/services/hook_installer_service.py +506 -0
  520. claude_mpm/services/hook_service.py +5 -6
  521. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  522. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  523. claude_mpm/services/infrastructure/logging.py +2 -2
  524. claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
  525. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  526. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  527. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  528. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  529. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  530. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  531. claude_mpm/services/infrastructure/monitoring.py +12 -12
  532. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  533. claude_mpm/services/local_ops/__init__.py +165 -0
  534. claude_mpm/services/local_ops/crash_detector.py +257 -0
  535. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  536. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  537. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  538. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  539. claude_mpm/services/local_ops/health_manager.py +430 -0
  540. claude_mpm/services/local_ops/log_monitor.py +396 -0
  541. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  542. claude_mpm/services/local_ops/process_manager.py +595 -0
  543. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  544. claude_mpm/services/local_ops/restart_manager.py +401 -0
  545. claude_mpm/services/local_ops/restart_policy.py +387 -0
  546. claude_mpm/services/local_ops/state_manager.py +372 -0
  547. claude_mpm/services/local_ops/unified_manager.py +600 -0
  548. claude_mpm/services/mcp_config_manager.py +1612 -0
  549. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  550. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  551. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  552. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  553. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  554. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  555. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  556. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  557. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  558. claude_mpm/services/mcp_gateway/main.py +90 -15
  559. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  560. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  561. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  562. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  563. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  564. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  565. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  566. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  567. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  568. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  569. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  570. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  571. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  572. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  573. claude_mpm/services/mcp_service_verifier.py +729 -0
  574. claude_mpm/services/memory/builder.py +9 -8
  575. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  576. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  577. claude_mpm/services/memory/failure_tracker.py +578 -0
  578. claude_mpm/services/memory/indexed_memory.py +8 -8
  579. claude_mpm/services/memory/optimizer.py +8 -9
  580. claude_mpm/services/memory/router.py +3 -3
  581. claude_mpm/services/memory_hook_service.py +165 -4
  582. claude_mpm/services/model/__init__.py +147 -0
  583. claude_mpm/services/model/base_provider.py +365 -0
  584. claude_mpm/services/model/claude_provider.py +412 -0
  585. claude_mpm/services/model/model_router.py +453 -0
  586. claude_mpm/services/model/ollama_provider.py +415 -0
  587. claude_mpm/services/monitor/__init__.py +20 -0
  588. claude_mpm/services/monitor/daemon.py +671 -0
  589. claude_mpm/services/monitor/daemon_manager.py +963 -0
  590. claude_mpm/services/monitor/event_emitter.py +350 -0
  591. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  592. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  593. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  594. claude_mpm/services/monitor/handlers/file.py +264 -0
  595. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  596. claude_mpm/services/monitor/management/__init__.py +18 -0
  597. claude_mpm/services/monitor/management/health.py +124 -0
  598. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  599. claude_mpm/services/monitor/server.py +817 -0
  600. claude_mpm/services/monitor_build_service.py +2 -2
  601. claude_mpm/services/native_agent_converter.py +356 -0
  602. claude_mpm/services/orphan_detection.py +786 -0
  603. claude_mpm/services/port_manager.py +2 -2
  604. claude_mpm/services/project/__init__.py +23 -0
  605. claude_mpm/services/project/analyzer.py +3 -3
  606. claude_mpm/services/project/architecture_analyzer.py +6 -6
  607. claude_mpm/services/project/archive_manager.py +1045 -0
  608. claude_mpm/services/project/dependency_analyzer.py +8 -8
  609. claude_mpm/services/project/detection_strategies.py +719 -0
  610. claude_mpm/services/project/documentation_manager.py +553 -0
  611. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  612. claude_mpm/services/project/language_analyzer.py +3 -3
  613. claude_mpm/services/project/metrics_collector.py +7 -10
  614. claude_mpm/services/project/project_organizer.py +1005 -0
  615. claude_mpm/services/project/registry.py +13 -7
  616. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  617. claude_mpm/services/project_port_allocator.py +596 -0
  618. claude_mpm/services/response_tracker.py +21 -10
  619. claude_mpm/services/runner_configuration_service.py +1 -0
  620. claude_mpm/services/self_upgrade_service.py +500 -0
  621. claude_mpm/services/session_management_service.py +7 -5
  622. claude_mpm/services/session_manager.py +380 -0
  623. claude_mpm/services/shared/__init__.py +2 -1
  624. claude_mpm/services/shared/async_service_base.py +16 -27
  625. claude_mpm/services/shared/config_service_base.py +17 -14
  626. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  627. claude_mpm/services/shared/service_factory.py +8 -5
  628. claude_mpm/services/socketio/client_proxy.py +60 -5
  629. claude_mpm/services/socketio/dashboard_server.py +361 -0
  630. claude_mpm/services/socketio/event_normalizer.py +74 -6
  631. claude_mpm/services/socketio/handlers/__init__.py +5 -0
  632. claude_mpm/services/socketio/handlers/base.py +2 -2
  633. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  634. claude_mpm/services/socketio/handlers/connection.py +21 -40
  635. claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
  636. claude_mpm/services/socketio/handlers/file.py +46 -10
  637. claude_mpm/services/socketio/handlers/git.py +8 -8
  638. claude_mpm/services/socketio/handlers/hook.py +29 -17
  639. claude_mpm/services/socketio/handlers/registry.py +4 -0
  640. claude_mpm/services/socketio/monitor_client.py +364 -0
  641. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  642. claude_mpm/services/socketio/server/connection_manager.py +131 -68
  643. claude_mpm/services/socketio/server/core.py +275 -22
  644. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  645. claude_mpm/services/socketio/server/main.py +99 -29
  646. claude_mpm/services/socketio_client_manager.py +4 -4
  647. claude_mpm/services/subprocess_launcher_service.py +19 -15
  648. claude_mpm/services/system_instructions_service.py +2 -2
  649. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  650. claude_mpm/services/ticket_services/validation_service.py +5 -5
  651. claude_mpm/services/unified/__init__.py +65 -0
  652. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  653. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  654. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  655. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  656. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  657. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  658. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  659. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  660. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  661. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  662. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  663. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  664. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  665. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  666. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  667. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  668. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  669. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  670. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  671. claude_mpm/services/unified/interfaces.py +475 -0
  672. claude_mpm/services/unified/migration.py +509 -0
  673. claude_mpm/services/unified/strategies.py +534 -0
  674. claude_mpm/services/unified/unified_analyzer.py +542 -0
  675. claude_mpm/services/unified/unified_config.py +691 -0
  676. claude_mpm/services/unified/unified_deployment.py +470 -0
  677. claude_mpm/services/utility_service.py +6 -3
  678. claude_mpm/services/version_control/branch_strategy.py +2 -2
  679. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  680. claude_mpm/services/version_control/git_operations.py +26 -24
  681. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  682. claude_mpm/services/version_control/version_parser.py +14 -11
  683. claude_mpm/services/version_service.py +104 -1
  684. claude_mpm/services/visualization/__init__.py +19 -0
  685. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  686. claude_mpm/skills/__init__.py +42 -0
  687. claude_mpm/skills/agent_skills_injector.py +324 -0
  688. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  689. claude_mpm/skills/bundled/__init__.py +6 -0
  690. claude_mpm/skills/bundled/api-documentation.md +393 -0
  691. claude_mpm/skills/bundled/async-testing.md +571 -0
  692. claude_mpm/skills/bundled/code-review.md +143 -0
  693. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  694. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  695. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  696. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  697. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  698. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  699. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  700. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  701. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  702. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  703. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  704. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  705. claude_mpm/skills/bundled/database-migration.md +199 -0
  706. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  707. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  708. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  709. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  710. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  711. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  712. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  713. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  714. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  715. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  716. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  717. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  718. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  719. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  720. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  721. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  722. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  723. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  724. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  725. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  726. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  727. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  728. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  729. claude_mpm/skills/bundled/git-workflow.md +414 -0
  730. claude_mpm/skills/bundled/imagemagick.md +204 -0
  731. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  732. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  733. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  734. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  735. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  736. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  737. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  738. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  739. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  740. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  741. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  742. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  743. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  744. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  745. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  746. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  747. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  748. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  749. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  750. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  751. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  752. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  753. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  754. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  755. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  756. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  757. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  758. claude_mpm/skills/bundled/pdf.md +141 -0
  759. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  760. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  761. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  762. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  763. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  764. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  765. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  766. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  767. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  768. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  769. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  770. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  771. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  772. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  773. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  774. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  775. claude_mpm/skills/bundled/security-scanning.md +327 -0
  776. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  777. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  778. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  779. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  780. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  781. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  782. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  783. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  784. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  785. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  786. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  787. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  788. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  789. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  790. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  791. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  792. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  793. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  794. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  795. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  796. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +310 -0
  806. claude_mpm/skills/skills_registry.py +348 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/state_storage.py +31 -31
  809. claude_mpm/tools/__init__.py +10 -0
  810. claude_mpm/tools/__main__.py +208 -0
  811. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  812. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  813. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  814. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  815. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  816. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  817. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  818. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  819. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  820. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  821. claude_mpm/tools/code_tree_builder.py +631 -0
  822. claude_mpm/tools/code_tree_events.py +420 -0
  823. claude_mpm/tools/socketio_debug.py +671 -0
  824. claude_mpm/utils/agent_dependency_loader.py +108 -27
  825. claude_mpm/utils/common.py +544 -0
  826. claude_mpm/utils/config_manager.py +12 -6
  827. claude_mpm/utils/database_connector.py +298 -0
  828. claude_mpm/utils/dependency_cache.py +2 -2
  829. claude_mpm/utils/dependency_strategies.py +15 -10
  830. claude_mpm/utils/display_helper.py +260 -0
  831. claude_mpm/utils/environment_context.py +4 -3
  832. claude_mpm/utils/error_handler.py +5 -3
  833. claude_mpm/utils/file_utils.py +13 -14
  834. claude_mpm/utils/git_analyzer.py +407 -0
  835. claude_mpm/utils/log_cleanup.py +627 -0
  836. claude_mpm/utils/path_operations.py +7 -4
  837. claude_mpm/utils/robust_installer.py +133 -24
  838. claude_mpm/utils/session_logging.py +2 -2
  839. claude_mpm/utils/subprocess_utils.py +9 -8
  840. claude_mpm/validation/agent_validator.py +6 -6
  841. claude_mpm/validation/frontmatter_validator.py +6 -6
  842. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  843. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  844. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  845. claude_mpm/agents/INSTRUCTIONS.md +0 -237
  846. claude_mpm/agents/schema/agent_schema.json +0 -314
  847. claude_mpm/agents/templates/agent-manager.md +0 -304
  848. claude_mpm/cli/commands/configure_tui.py +0 -1921
  849. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  850. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  851. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  852. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  853. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  854. claude_mpm/scripts/socketio_server_manager.py +0 -349
  855. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  856. claude_mpm/services/cli/dashboard_launcher.py +0 -424
  857. claude_mpm/services/cli/socketio_manager.py +0 -498
  858. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  859. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  860. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  861. claude_mpm/services/project/analyzer_refactored.py +0 -450
  862. claude_mpm-4.1.6.dist-info/METADATA +0 -325
  863. claude_mpm-4.1.6.dist-info/RECORD +0 -550
  864. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  865. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  866. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -8,6 +8,7 @@ maintainability and testability.
8
8
  """
9
9
 
10
10
  import json
11
+ import re
11
12
  from pathlib import Path
12
13
  from typing import Any, Dict, List
13
14
 
@@ -29,6 +30,120 @@ class AgentTemplateBuilder:
29
30
  """Initialize the template builder."""
30
31
  self.logger = get_logger(__name__)
31
32
 
33
+ def normalize_tools_input(self, tools):
34
+ """Normalize various tool input formats to a consistent list.
35
+
36
+ Handles multiple input formats:
37
+ - None/empty: Returns default tools
38
+ - String: Splits by comma and strips whitespace
39
+ - List: Ensures all items are strings and strips whitespace
40
+ - Dict: Takes enabled tools (where value is True)
41
+
42
+ Args:
43
+ tools: Tools input in various formats (str, list, dict, or None)
44
+
45
+ Returns:
46
+ List of tool names, normalized and cleaned
47
+ """
48
+ default_tools = ["Read", "Write", "Edit", "Grep", "Glob", "Bash"]
49
+
50
+ # Handle None or empty
51
+ if not tools:
52
+ self.logger.debug("No tools provided, using defaults")
53
+ return default_tools
54
+
55
+ # Convert to list format
56
+ if isinstance(tools, str):
57
+ # Split by comma, strip whitespace
58
+ tool_list = [t.strip() for t in tools.split(",") if t.strip()]
59
+ self.logger.debug(f"Converted string tools '{tools}' to list: {tool_list}")
60
+ elif isinstance(tools, list):
61
+ # Ensure all items are strings and strip whitespace
62
+ tool_list = [str(t).strip() for t in tools if t and str(t).strip()]
63
+ self.logger.debug(f"Normalized list tools: {tool_list}")
64
+ elif isinstance(tools, dict):
65
+ # Handle dict format - take enabled tools
66
+ tool_list = [k for k, v in tools.items() if v]
67
+ self.logger.info(f"Converting dict tools format: {tools} -> {tool_list}")
68
+ else:
69
+ self.logger.warning(f"Unknown tools format: {type(tools)}, using defaults")
70
+ return default_tools
71
+
72
+ # Return processed list or defaults if empty
73
+ if not tool_list:
74
+ self.logger.debug("Tools list empty after processing, using defaults")
75
+ return default_tools
76
+
77
+ return tool_list
78
+
79
+ def _load_base_agent_instructions(self, agent_type: str) -> str:
80
+ """Load BASE instructions for a specific agent type.
81
+
82
+ Args:
83
+ agent_type: The type of agent (engineer, qa, ops, research, documentation)
84
+
85
+ Returns:
86
+ The BASE instructions content or empty string if not found
87
+ """
88
+ if not agent_type:
89
+ return ""
90
+
91
+ try:
92
+ # Construct BASE file name
93
+ base_file = f"BASE_{agent_type.upper()}.md"
94
+
95
+ # Try to find BASE file in agents directory
96
+ # First try current working directory structure
97
+ agents_dir = Path(__file__).parent.parent.parent.parent / "agents"
98
+ base_path = agents_dir / base_file
99
+
100
+ if not base_path.exists():
101
+ # Try packaged resources if available
102
+ try:
103
+ from importlib.resources import files
104
+
105
+ agents_package = files("claude_mpm.agents")
106
+ base_resource = agents_package / base_file
107
+ if base_resource.is_file():
108
+ content = base_resource.read_text(encoding="utf-8")
109
+ self.logger.debug(
110
+ f"Loaded BASE instructions from package: {base_file}"
111
+ )
112
+ return content
113
+ except (ImportError, Exception) as e:
114
+ self.logger.debug(
115
+ f"Could not load BASE instructions from package: {e}"
116
+ )
117
+
118
+ # Final fallback - try multiple possible locations
119
+ possible_paths = [
120
+ Path.cwd() / "src" / "claude_mpm" / "agents" / base_file,
121
+ Path(__file__).parent.parent.parent.parent / "agents" / base_file,
122
+ Path.home() / ".claude-mpm" / "agents" / base_file,
123
+ ]
124
+
125
+ for path in possible_paths:
126
+ if path.exists():
127
+ base_path = path
128
+ break
129
+ else:
130
+ self.logger.debug(
131
+ f"No BASE instructions found for type: {agent_type}"
132
+ )
133
+ return ""
134
+
135
+ if base_path.exists():
136
+ self.logger.debug(f"Loading BASE instructions from {base_path}")
137
+ return base_path.read_text(encoding="utf-8")
138
+ self.logger.debug(f"No BASE instructions found for type: {agent_type}")
139
+ return ""
140
+
141
+ except Exception as e:
142
+ self.logger.warning(
143
+ f"Error loading BASE instructions for {agent_type}: {e}"
144
+ )
145
+ return ""
146
+
32
147
  def build_agent_markdown(
33
148
  self,
34
149
  agent_name: str,
@@ -69,13 +184,39 @@ class AgentTemplateBuilder:
69
184
  capabilities.get("tools") if isinstance(capabilities, dict) else None
70
185
  )
71
186
 
72
- tools = (
187
+ # Get raw tools from various possible locations
188
+ raw_tools = (
73
189
  template_data.get("tools")
74
190
  or capabilities_tools
75
191
  or template_data.get("configuration_fields", {}).get("tools")
76
- or ["Read", "Write", "Edit", "Grep", "Glob", "LS"] # Default fallback
77
192
  )
78
193
 
194
+ # Normalize tools to a consistent list format
195
+ tools = self.normalize_tools_input(raw_tools)
196
+
197
+ # Log if we see non-standard tool names (info level, not warning)
198
+ standard_tools = {
199
+ "Read",
200
+ "Write",
201
+ "Edit",
202
+ "MultiEdit", # File operations
203
+ "Grep",
204
+ "Glob",
205
+ "LS", # Search and navigation
206
+ "Bash",
207
+ "BashOutput",
208
+ "KillShell", # Command execution
209
+ "TodoWrite",
210
+ "ExitPlanMode", # Task management
211
+ "WebSearch",
212
+ "WebFetch", # Web operations
213
+ "NotebookRead",
214
+ "NotebookEdit", # Jupyter notebook support
215
+ }
216
+ non_standard = [t for t in tools if t not in standard_tools]
217
+ if non_standard:
218
+ self.logger.info(f"Using non-standard tools: {non_standard}")
219
+
79
220
  # Extract model from template with fallback
80
221
  capabilities_model = (
81
222
  capabilities.get("model") if isinstance(capabilities, dict) else None
@@ -88,19 +229,14 @@ class AgentTemplateBuilder:
88
229
  or "sonnet" # Default fallback
89
230
  )
90
231
 
91
- # Convert tools list to comma-separated string (no spaces!)
92
- tools_str = ",".join(tools) if isinstance(tools, list) else str(tools)
232
+ # Convert tools list to comma-separated string (without spaces for compatibility)
233
+ ",".join(tools)
93
234
 
94
- # Validate tools format - CRITICAL: No spaces allowed!
95
- if ", " in tools_str:
96
- self.logger.error(f"Tools contain spaces: '{tools_str}'")
97
- raise ValueError(
98
- f"Tools must be comma-separated WITHOUT spaces: {tools_str}"
99
- )
100
-
101
- # Map model names to Claude Code format
235
+ # Map model names to Claude Code format (as required)
102
236
  model_map = {
103
237
  "claude-3-5-sonnet-20241022": "sonnet",
238
+ "claude-3-5-haiku-20241022": "haiku",
239
+ "claude-3-opus-20240229": "opus",
104
240
  "claude-3-5-sonnet": "sonnet",
105
241
  "claude-3-sonnet": "sonnet",
106
242
  "claude-3-haiku": "haiku",
@@ -112,6 +248,9 @@ class AgentTemplateBuilder:
112
248
 
113
249
  if model in model_map:
114
250
  model = model_map[model]
251
+ else:
252
+ # Default to sonnet if model not found in map
253
+ model = "sonnet"
115
254
 
116
255
  # Get response format from template or use base agent default
117
256
  template_data.get("response", {}).get("format", "structured")
@@ -122,8 +261,6 @@ class AgentTemplateBuilder:
122
261
  # CRITICAL: NO underscores allowed - they cause silent failures!
123
262
 
124
263
  # Validate the name before proceeding
125
- import re
126
-
127
264
  if not re.match(r"^[a-z0-9]+(-[a-z0-9]+)*$", claude_code_name):
128
265
  self.logger.error(
129
266
  f"Invalid agent name '{claude_code_name}' - must match ^[a-z0-9]+(-[a-z0-9]+)*$"
@@ -133,12 +270,17 @@ class AgentTemplateBuilder:
133
270
  )
134
271
 
135
272
  # Extract description from template with fallback
136
- description = (
273
+ raw_description = (
137
274
  template_data.get("description")
138
275
  or template_data.get("metadata", {}).get("description")
139
276
  or f"{agent_name.title()} agent for specialized tasks"
140
277
  )
141
278
 
279
+ # Convert to multiline format with examples for Claude Code compatibility
280
+ description = self._create_multiline_description(
281
+ raw_description, agent_name, template_data
282
+ )
283
+
142
284
  # Extract custom metadata fields
143
285
  metadata = template_data.get("metadata", {})
144
286
  agent_version = (
@@ -163,7 +305,7 @@ class AgentTemplateBuilder:
163
305
 
164
306
  if template_color:
165
307
  # Use the color specified in the template
166
- color = template_color
308
+ pass
167
309
  else:
168
310
  # Fallback to default color map based on agent type
169
311
  color_map = {
@@ -174,7 +316,7 @@ class AgentTemplateBuilder:
174
316
  "documentation": "cyan", # Changed default to match template preference
175
317
  "ops": "gray",
176
318
  }
177
- color = color_map.get(agent_type, "blue")
319
+ color_map.get(agent_type, "blue")
178
320
 
179
321
  # Check if we should include tools field (only if significantly restricting)
180
322
  # Claude Code approach: omit tools field unless specifically restricting
@@ -188,27 +330,61 @@ class AgentTemplateBuilder:
188
330
  has_core_tools = len(agent_tools.intersection(core_tools)) >= 5
189
331
 
190
332
  # Include tools field only if agent is clearly restricted (missing core tools or very few tools)
191
- include_tools_field = not has_core_tools or len(agent_tools) < 6
192
-
193
- # Build YAML frontmatter using Claude Code's working format + our custom fields
333
+ not has_core_tools or len(agent_tools) < 6
334
+
335
+ # Build YAML frontmatter with all relevant metadata from JSON template
336
+ # Include all fields that are useful for agent management and functionality
337
+ #
338
+ # COMPREHENSIVE AGENT FRONTMATTER FORMAT:
339
+ # - name: kebab-case agent name (required)
340
+ # - description: when/why to use this agent with examples (required, multiline)
341
+ # - model: mapped model name (required)
342
+ # - type: agent type for categorization and functionality (optional but important)
343
+ # - category: organizational category (optional)
344
+ # - color: visual identifier (optional)
345
+ # - version: agent version for update tracking (optional)
346
+ # - author: creator information (optional)
347
+ # - created_at: creation timestamp (optional)
348
+ # - updated_at: last update timestamp (optional)
349
+ # - tags: list of tags for search and categorization (optional)
194
350
  frontmatter_lines = [
195
351
  "---",
196
352
  f"name: {claude_code_name}",
197
- f"description: {description}",
198
353
  ]
199
354
 
200
- # Only include tools if restricting to subset
201
- if include_tools_field:
202
- frontmatter_lines.append(f"tools: {tools_str}")
355
+ # Add description as single-line YAML string with \n escapes
356
+ frontmatter_lines.append(
357
+ f"description: {self._format_description_for_yaml(description)}"
358
+ )
359
+
360
+ # Add model field (required for Claude Code)
361
+ frontmatter_lines.append(f"model: {model}")
362
+
363
+ # Add type field (important for agent categorization)
364
+ if agent_type and agent_type != "general":
365
+ frontmatter_lines.append(f"type: {agent_type}")
366
+
367
+ # Add optional metadata fields
368
+ if metadata.get("color"):
369
+ frontmatter_lines.append(f"color: {metadata['color']}")
370
+ if metadata.get("category"):
371
+ frontmatter_lines.append(f"category: {metadata['category']}")
372
+ # Always include version field to prevent deployment comparison issues
373
+ if agent_version:
374
+ frontmatter_lines.append(f'version: "{agent_version}"')
375
+ if metadata.get("author"):
376
+ frontmatter_lines.append(f'author: "{metadata["author"]}"')
377
+ if metadata.get("created_at"):
378
+ frontmatter_lines.append(f"created_at: {metadata['created_at']}")
379
+ if metadata.get("updated_at"):
380
+ frontmatter_lines.append(f"updated_at: {metadata['updated_at']}")
381
+ # Add tags as comma-separated string if they exist (consistent with tools format)
382
+ if metadata.get("tags") and isinstance(metadata["tags"], list):
383
+ tags_str = ",".join(metadata["tags"])
384
+ frontmatter_lines.append(f"tags: {tags_str}")
203
385
 
204
386
  frontmatter_lines.extend(
205
387
  [
206
- f"model: {model_type}", # Use explicit model type instead of inherit
207
- f"color: {color}",
208
- f"version: {agent_version}",
209
- f"type: {agent_type}",
210
- f"source: {source_info}", # Track which source provided this agent
211
- "author: claude-mpm", # Mark as system-managed agent
212
388
  "---",
213
389
  "",
214
390
  ]
@@ -216,13 +392,34 @@ class AgentTemplateBuilder:
216
392
 
217
393
  frontmatter = "\n".join(frontmatter_lines)
218
394
 
395
+ # Load BASE instructions for this agent type
396
+ base_instructions = self._load_base_agent_instructions(agent_type)
397
+
219
398
  # Get agent instructions from template data (primary) or base agent data (fallback)
220
- content = (
221
- template_data.get("instructions")
222
- or base_agent_data.get("content")
223
- or base_agent_data.get("instructions")
224
- or "# Agent Instructions\n\nThis agent provides specialized assistance."
225
- )
399
+ raw_instructions = template_data.get("instructions")
400
+
401
+ # Handle dictionary instructions format
402
+ if isinstance(raw_instructions, dict):
403
+ agent_specific_instructions = self._convert_instructions_dict_to_markdown(
404
+ raw_instructions
405
+ )
406
+ else:
407
+ agent_specific_instructions = (
408
+ raw_instructions
409
+ or base_agent_data.get("content")
410
+ or base_agent_data.get("instructions")
411
+ or "# Agent Instructions\n\nThis agent provides specialized assistance."
412
+ )
413
+
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
226
423
 
227
424
  # Add memory update instructions if not already present
228
425
  if "memory-update" not in content and "Remember" not in content:
@@ -299,7 +496,8 @@ Only include memories that are:
299
496
  )
300
497
 
301
498
  # Get tools and model with fallbacks
302
- tools = merged_config.get("tools", ["Read", "Write", "Edit"])
499
+ raw_tools = merged_config.get("tools")
500
+ tools = self.normalize_tools_input(raw_tools)
303
501
  model = merged_config.get("model", "sonnet")
304
502
 
305
503
  # Format tools as YAML list
@@ -447,3 +645,490 @@ tools:
447
645
  formatted_items.append(f"{indent_str}- {item}")
448
646
 
449
647
  return "\n".join(formatted_items)
648
+
649
+ def _create_multiline_description(
650
+ self, raw_description: str, agent_name: str, template_data: dict
651
+ ) -> str:
652
+ """
653
+ Create a comprehensive multiline description with examples for Claude Code compatibility.
654
+ Based on Claude's software-engineer.md format: detailed when/why description with examples.
655
+
656
+ Args:
657
+ raw_description: Original single-line description
658
+ agent_name: Name of the agent
659
+ template_data: Template data for extracting examples
660
+
661
+ Returns:
662
+ Formatted multiline description with examples in Claude Code format
663
+ """
664
+ raw_description = self._format_to_single_line(raw_description)
665
+
666
+ # Get agent type for creating targeted descriptions
667
+ agent_type = template_data.get("agent_type", "general")
668
+
669
+ # Create enhanced description based on agent type
670
+ enhanced_description = self._create_enhanced_description(
671
+ raw_description, agent_name, agent_type, template_data
672
+ )
673
+
674
+ # Add examples
675
+ examples = self._extract_examples_from_template(template_data, agent_name)
676
+ if not examples:
677
+ examples = self._generate_default_examples(agent_name, template_data)
678
+
679
+ # Combine enhanced description with examples
680
+ if examples:
681
+ description_parts = [enhanced_description, "", *examples]
682
+ else:
683
+ description_parts = [enhanced_description]
684
+
685
+ return "\n".join(description_parts)
686
+
687
+ def _format_to_single_line(self, description: str) -> str:
688
+ """
689
+ Format description to single line by removing line breaks and normalizing whitespace.
690
+
691
+ Args:
692
+ description: Raw description text
693
+
694
+ Returns:
695
+ Single-line formatted description
696
+ """
697
+ if not description:
698
+ return description
699
+
700
+ # Remove all line breaks and normalize whitespace
701
+ single_line = " ".join(description.strip().split())
702
+
703
+ # Remove redundant spaces around punctuation
704
+ single_line = re.sub(r"\s+([,.!?;:])", r"\1", single_line)
705
+ return re.sub(r"([,.!?;:])\s+", r"\1 ", single_line)
706
+
707
+ def _create_enhanced_description(
708
+ self,
709
+ raw_description: str,
710
+ agent_name: str,
711
+ agent_type: str,
712
+ template_data: dict,
713
+ ) -> str:
714
+ """
715
+ Create an enhanced description based on agent type that follows Claude's format.
716
+
717
+ Args:
718
+ raw_description: Original description
719
+ agent_name: Name of the agent
720
+ agent_type: Type of agent (engineer, qa, research, etc.)
721
+ template_data: Template data for additional context
722
+
723
+ Returns:
724
+ Enhanced description string
725
+ """
726
+ # Type-specific enhanced descriptions following Claude's software-engineer.md pattern
727
+ enhanced_descriptions = {
728
+ "engineer": "Use this agent when you need to implement new features, write production-quality code, refactor existing code, or solve complex programming challenges. This agent excels at translating requirements into well-architected, maintainable code solutions across various programming languages and frameworks.",
729
+ "qa": "Use this agent when you need comprehensive testing, quality assurance validation, or test automation. This agent specializes in creating robust test suites, identifying edge cases, and ensuring code quality through systematic testing approaches across different testing methodologies.",
730
+ "research": "Use this agent when you need to investigate codebases, analyze system architecture, or gather technical insights. This agent excels at code exploration, pattern identification, and providing comprehensive analysis of existing systems while maintaining strict memory efficiency.",
731
+ "ops": "Use this agent when you need infrastructure management, deployment automation, or operational excellence. This agent specializes in DevOps practices, cloud operations, monitoring setup, and maintaining reliable production systems.",
732
+ "security": "Use this agent when you need security analysis, vulnerability assessment, or secure coding practices. This agent excels at identifying security risks, implementing security best practices, and ensuring applications meet security standards.",
733
+ "documentation": "Use this agent when you need to create, update, or maintain technical documentation. This agent specializes in writing clear, comprehensive documentation including API docs, user guides, and technical specifications.",
734
+ }
735
+
736
+ # Get the enhanced description or fallback to the original with improvements
737
+ if agent_type in enhanced_descriptions:
738
+ return enhanced_descriptions[agent_type]
739
+ # Enhance the raw description if it's a custom type
740
+ if raw_description and len(raw_description) > 10:
741
+ return f"Use this agent when you need specialized assistance with {raw_description.lower()}. This agent provides targeted expertise and follows best practices for {agent_name.replace('-', ' ')} related tasks."
742
+ return f"Use this agent when you need specialized assistance from the {agent_name.replace('-', ' ')} agent. This agent provides targeted expertise and follows established best practices."
743
+
744
+ def _extract_examples_from_template(
745
+ self, template_data: dict, agent_name: str
746
+ ) -> List[str]:
747
+ """
748
+ Extract examples from template data and format with commentary.
749
+ Creates ONE example with commentary from template data.
750
+
751
+ Args:
752
+ template_data: Template data
753
+ agent_name: Name of the agent
754
+
755
+ Returns:
756
+ List of example strings (single example with commentary)
757
+ """
758
+ examples = []
759
+
760
+ # Check for examples in knowledge section
761
+ knowledge = template_data.get("knowledge", {})
762
+ template_examples = knowledge.get("examples", [])
763
+
764
+ if template_examples:
765
+ # Take only the first example and add commentary
766
+ example = template_examples[0]
767
+ scenario = example.get("scenario", "")
768
+ approach = example.get("approach", "")
769
+ commentary = example.get("commentary", "")
770
+
771
+ if scenario and approach:
772
+ examples.extend(
773
+ [
774
+ "<example>",
775
+ f"Context: {scenario}",
776
+ f'user: "I need help with {scenario.lower()}"',
777
+ f'assistant: "I\'ll use the {agent_name} agent to {approach.lower()}."',
778
+ "<commentary>",
779
+ (
780
+ commentary
781
+ if commentary
782
+ else f"This agent is well-suited for {scenario.lower()} because it specializes in {approach.lower()} with targeted expertise."
783
+ ),
784
+ "</commentary>",
785
+ "</example>",
786
+ ]
787
+ )
788
+
789
+ # Check for triggers that can be converted to examples
790
+ interactions = template_data.get("interactions", {})
791
+ triggers = interactions.get("triggers", [])
792
+
793
+ if triggers and not examples:
794
+ # Convert first trigger to example with commentary
795
+ trigger = triggers[0]
796
+
797
+ # Handle both string and dict trigger formats
798
+ if isinstance(trigger, dict):
799
+ # New format with pattern and confidence
800
+ trigger_text = trigger.get("pattern", "")
801
+ else:
802
+ # Old format with simple string
803
+ trigger_text = str(trigger)
804
+
805
+ # Skip if we don't have valid trigger text
806
+ if not trigger_text:
807
+ return examples
808
+
809
+ agent_type = template_data.get("agent_type", "general")
810
+
811
+ examples.extend(
812
+ [
813
+ "<example>",
814
+ f"Context: When user needs {trigger_text}",
815
+ f'user: "{trigger_text}"',
816
+ f'assistant: "I\'ll use the {agent_name} agent for {trigger_text}."',
817
+ "<commentary>",
818
+ f"This {agent_type} agent is appropriate because it has specialized capabilities for {trigger_text.lower()} tasks.",
819
+ "</commentary>",
820
+ "</example>",
821
+ ]
822
+ )
823
+
824
+ return examples
825
+
826
+ def _generate_default_examples(
827
+ self, agent_name: str, template_data: dict
828
+ ) -> List[str]:
829
+ """
830
+ Generate default examples when none are available in template.
831
+ Creates ONE example with commentary for each agent type.
832
+
833
+ Args:
834
+ agent_name: Name of the agent
835
+ template_data: Template data for context
836
+
837
+ Returns:
838
+ List of example strings (single example with commentary)
839
+ """
840
+ agent_type = template_data.get("agent_type", "general")
841
+
842
+ # Create type-specific examples with commentary inside
843
+ type_examples = {
844
+ "engineer": [
845
+ "<example>",
846
+ "Context: When you need to implement new features or write code.",
847
+ 'user: "I need to add authentication to my API"',
848
+ f'assistant: "I\'ll use the {agent_name} agent to implement a secure authentication system for your API."',
849
+ "<commentary>",
850
+ "The engineer agent is ideal for code implementation tasks because it specializes in writing production-quality code, following best practices, and creating well-architected solutions.",
851
+ "</commentary>",
852
+ "</example>",
853
+ ],
854
+ "ops": [
855
+ "<example>",
856
+ "Context: When you need to deploy or manage infrastructure.",
857
+ 'user: "I need to deploy my application to the cloud"',
858
+ f'assistant: "I\'ll use the {agent_name} agent to set up and deploy your application infrastructure."',
859
+ "<commentary>",
860
+ "The ops agent excels at infrastructure management and deployment automation, ensuring reliable and scalable production systems.",
861
+ "</commentary>",
862
+ "</example>",
863
+ ],
864
+ "qa": [
865
+ "<example>",
866
+ "Context: When you need to test or validate functionality.",
867
+ 'user: "I need to write tests for my new feature"',
868
+ f'assistant: "I\'ll use the {agent_name} agent to create comprehensive tests for your feature."',
869
+ "<commentary>",
870
+ "The QA agent specializes in comprehensive testing strategies, quality assurance validation, and creating robust test suites that ensure code reliability.",
871
+ "</commentary>",
872
+ "</example>",
873
+ ],
874
+ "research": [
875
+ "<example>",
876
+ "Context: When you need to investigate or analyze existing codebases.",
877
+ 'user: "I need to understand how the authentication system works in this project"',
878
+ f'assistant: "I\'ll use the {agent_name} agent to analyze the codebase and explain the authentication implementation."',
879
+ "<commentary>",
880
+ "The research agent is perfect for code exploration and analysis tasks, providing thorough investigation of existing systems while maintaining memory efficiency.",
881
+ "</commentary>",
882
+ "</example>",
883
+ ],
884
+ "security": [
885
+ "<example>",
886
+ "Context: When you need to review code for security vulnerabilities.",
887
+ 'user: "I need a security review of my authentication implementation"',
888
+ f'assistant: "I\'ll use the {agent_name} agent to conduct a thorough security analysis of your authentication code."',
889
+ "<commentary>",
890
+ "The security agent specializes in identifying security risks, vulnerability assessment, and ensuring applications meet security standards and best practices.",
891
+ "</commentary>",
892
+ "</example>",
893
+ ],
894
+ "documentation": [
895
+ "<example>",
896
+ "Context: When you need to create or update technical documentation.",
897
+ 'user: "I need to document this new API endpoint"',
898
+ f'assistant: "I\'ll use the {agent_name} agent to create comprehensive API documentation."',
899
+ "<commentary>",
900
+ "The documentation agent excels at creating clear, comprehensive technical documentation including API docs, user guides, and technical specifications.",
901
+ "</commentary>",
902
+ "</example>",
903
+ ],
904
+ }
905
+
906
+ return type_examples.get(
907
+ agent_type,
908
+ [
909
+ "<example>",
910
+ f"Context: When you need specialized assistance from the {agent_name} agent.",
911
+ f'user: "I need help with {agent_name.replace("-", " ")} tasks"',
912
+ f'assistant: "I\'ll use the {agent_name} agent to provide specialized assistance."',
913
+ "<commentary>",
914
+ f"This agent provides targeted expertise for {agent_name.replace('-', ' ')} related tasks and follows established best practices.",
915
+ "</commentary>",
916
+ "</example>",
917
+ ],
918
+ )
919
+
920
+ def _indent_multiline_text(self, text: str, spaces: int) -> str:
921
+ """
922
+ Indent multiline text with specified number of spaces.
923
+
924
+ Args:
925
+ text: Text to indent
926
+ spaces: Number of spaces for indentation
927
+
928
+ Returns:
929
+ Indented text
930
+ """
931
+ if not text:
932
+ return ""
933
+
934
+ indent = " " * spaces
935
+ lines = text.split("\n")
936
+ indented_lines = []
937
+
938
+ for line in lines:
939
+ if line.strip(): # Non-empty lines get indented
940
+ indented_lines.append(indent + line)
941
+ else: # Empty lines stay empty
942
+ indented_lines.append("")
943
+
944
+ return "\n".join(indented_lines)
945
+
946
+ def _format_description_for_yaml(self, description: str) -> str:
947
+ """Format description as a single-line YAML string with escaped newlines.
948
+
949
+ Args:
950
+ description: Multi-line description text
951
+
952
+ Returns:
953
+ Single-line YAML-formatted string with \n escapes
954
+ """
955
+ if not description:
956
+ return '""'
957
+
958
+ # The description already contains actual newlines, we need to escape them
959
+ # Replace actual newlines with \n escape sequence
960
+ escaped = description.replace("\n", "\\n")
961
+
962
+ # Escape any quotes in the description
963
+ escaped = escaped.replace('"', '\\"')
964
+
965
+ # Return as quoted string
966
+ return f'"{escaped}"'
967
+
968
+ def _convert_instructions_dict_to_markdown(self, instructions_dict: dict) -> str:
969
+ """Convert complex instructions dictionary to markdown format.
970
+
971
+ Args:
972
+ instructions_dict: Dictionary containing structured instructions
973
+
974
+ Returns:
975
+ Formatted markdown string representing the instructions
976
+ """
977
+ if not instructions_dict:
978
+ return "# Agent Instructions\n\nThis agent provides specialized assistance."
979
+
980
+ markdown_parts = []
981
+
982
+ # Add primary role
983
+ if "primary_role" in instructions_dict:
984
+ markdown_parts.extend(["# Role", "", instructions_dict["primary_role"], ""])
985
+
986
+ # Add core identity
987
+ if "core_identity" in instructions_dict:
988
+ markdown_parts.extend(
989
+ ["## Core Identity", "", instructions_dict["core_identity"], ""]
990
+ )
991
+
992
+ # Add responsibilities
993
+ if "responsibilities" in instructions_dict:
994
+ markdown_parts.extend(["## Responsibilities", ""])
995
+
996
+ responsibilities = instructions_dict["responsibilities"]
997
+ if isinstance(responsibilities, list):
998
+ for resp in responsibilities:
999
+ if isinstance(resp, dict):
1000
+ area = resp.get("area", "Unknown Area")
1001
+ tasks = resp.get("tasks", [])
1002
+
1003
+ markdown_parts.extend([f"### {area}", ""])
1004
+
1005
+ if isinstance(tasks, list):
1006
+ for task in tasks:
1007
+ markdown_parts.append(f"- {task}")
1008
+
1009
+ markdown_parts.append("")
1010
+ else:
1011
+ markdown_parts.append(f"- {resp}")
1012
+
1013
+ markdown_parts.append("")
1014
+
1015
+ # Add analytical framework
1016
+ if "analytical_framework" in instructions_dict:
1017
+ framework = instructions_dict["analytical_framework"]
1018
+ if isinstance(framework, dict):
1019
+ markdown_parts.extend(["## Analytical Framework", ""])
1020
+
1021
+ for framework_area, framework_data in framework.items():
1022
+ markdown_parts.extend(
1023
+ [f"### {framework_area.replace('_', ' ').title()}", ""]
1024
+ )
1025
+
1026
+ if isinstance(framework_data, dict):
1027
+ for category, items in framework_data.items():
1028
+ markdown_parts.extend(
1029
+ [f"#### {category.replace('_', ' ').title()}", ""]
1030
+ )
1031
+
1032
+ if isinstance(items, list):
1033
+ for item in items:
1034
+ markdown_parts.append(f"- {item}")
1035
+ elif isinstance(items, str):
1036
+ markdown_parts.append(items)
1037
+
1038
+ markdown_parts.append("")
1039
+ elif isinstance(framework_data, list):
1040
+ for item in framework_data:
1041
+ markdown_parts.append(f"- {item}")
1042
+ markdown_parts.append("")
1043
+
1044
+ # Add methodologies
1045
+ if "methodologies" in instructions_dict:
1046
+ methodologies = instructions_dict["methodologies"]
1047
+ if isinstance(methodologies, dict):
1048
+ markdown_parts.extend(["## Methodologies", ""])
1049
+
1050
+ for method_name, method_data in methodologies.items():
1051
+ markdown_parts.extend(
1052
+ [f"### {method_name.replace('_', ' ').title()}", ""]
1053
+ )
1054
+
1055
+ if isinstance(method_data, dict):
1056
+ for key, value in method_data.items():
1057
+ if isinstance(value, list):
1058
+ markdown_parts.extend(
1059
+ [f"#### {key.replace('_', ' ').title()}", ""]
1060
+ )
1061
+ for item in value:
1062
+ markdown_parts.append(f"- {item}")
1063
+ markdown_parts.append("")
1064
+ elif isinstance(value, str):
1065
+ markdown_parts.extend(
1066
+ [
1067
+ f"**{key.replace('_', ' ').title()}**: {value}",
1068
+ "",
1069
+ ]
1070
+ )
1071
+
1072
+ # Add quality standards
1073
+ if "quality_standards" in instructions_dict:
1074
+ standards = instructions_dict["quality_standards"]
1075
+ if isinstance(standards, dict):
1076
+ markdown_parts.extend(["## Quality Standards", ""])
1077
+
1078
+ for standard_area, standard_items in standards.items():
1079
+ markdown_parts.extend(
1080
+ [f"### {standard_area.replace('_', ' ').title()}", ""]
1081
+ )
1082
+
1083
+ if isinstance(standard_items, list):
1084
+ for item in standard_items:
1085
+ markdown_parts.append(f"- {item}")
1086
+ elif isinstance(standard_items, str):
1087
+ markdown_parts.append(standard_items)
1088
+
1089
+ markdown_parts.append("")
1090
+
1091
+ # Add communication style
1092
+ if "communication_style" in instructions_dict:
1093
+ comm_style = instructions_dict["communication_style"]
1094
+ if isinstance(comm_style, dict):
1095
+ markdown_parts.extend(["## Communication Style", ""])
1096
+
1097
+ for style_area, style_items in comm_style.items():
1098
+ markdown_parts.extend(
1099
+ [f"### {style_area.replace('_', ' ').title()}", ""]
1100
+ )
1101
+
1102
+ if isinstance(style_items, list):
1103
+ for item in style_items:
1104
+ markdown_parts.append(f"- {item}")
1105
+ elif isinstance(style_items, str):
1106
+ markdown_parts.append(style_items)
1107
+
1108
+ markdown_parts.append("")
1109
+
1110
+ # If no specific sections were found, convert as generic dict
1111
+ if not markdown_parts:
1112
+ markdown_parts = ["# Agent Instructions", ""]
1113
+ for key, value in instructions_dict.items():
1114
+ key_title = key.replace("_", " ").title()
1115
+ if isinstance(value, str):
1116
+ markdown_parts.extend([f"## {key_title}", "", value, ""])
1117
+ elif isinstance(value, list):
1118
+ markdown_parts.extend([f"## {key_title}", ""])
1119
+ for item in value:
1120
+ markdown_parts.append(f"- {item}")
1121
+ markdown_parts.append("")
1122
+ elif isinstance(value, dict):
1123
+ markdown_parts.extend([f"## {key_title}", ""])
1124
+ # Simple dict formatting
1125
+ for subkey, subvalue in value.items():
1126
+ if isinstance(subvalue, str):
1127
+ markdown_parts.extend(
1128
+ [
1129
+ f"**{subkey.replace('_', ' ').title()}**: {subvalue}",
1130
+ "",
1131
+ ]
1132
+ )
1133
+
1134
+ return "\n".join(markdown_parts).strip()