claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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 (1062) hide show
  1. claude_mpm/BUILD_NUMBER +1 -0
  2. claude_mpm/VERSION +1 -0
  3. claude_mpm/__init__.py +50 -12
  4. claude_mpm/__main__.py +7 -2
  5. claude_mpm/agents/BASE_AGENT.md +164 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  8. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
  9. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
  10. claude_mpm/agents/MEMORY.md +72 -0
  11. claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
  12. claude_mpm/agents/WORKFLOW.md +111 -0
  13. claude_mpm/agents/__init__.py +92 -80
  14. claude_mpm/agents/agent-template.yaml +83 -0
  15. claude_mpm/agents/agent_loader.py +560 -745
  16. claude_mpm/agents/agent_loader_integration.py +53 -55
  17. claude_mpm/agents/agents_metadata.py +186 -27
  18. claude_mpm/agents/async_agent_loader.py +436 -0
  19. claude_mpm/agents/base_agent.json +8 -4
  20. claude_mpm/agents/frontmatter_validator.py +754 -0
  21. claude_mpm/agents/system_agent_config.py +222 -155
  22. claude_mpm/agents/templates/README.md +465 -0
  23. claude_mpm/agents/templates/__init__.py +17 -13
  24. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  25. claude_mpm/agents/templates/context-management-examples.md +544 -0
  26. claude_mpm/agents/templates/git-file-tracking.md +584 -0
  27. claude_mpm/agents/templates/pm-examples.md +474 -0
  28. claude_mpm/agents/templates/pm-red-flags.md +310 -0
  29. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  30. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  31. claude_mpm/agents/templates/response-format.md +583 -0
  32. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  33. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  34. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  35. claude_mpm/agents/templates/validation-templates.md +312 -0
  36. claude_mpm/cli/__init__.py +94 -128
  37. claude_mpm/cli/__main__.py +33 -0
  38. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  39. claude_mpm/cli/commands/__init__.py +36 -12
  40. claude_mpm/cli/commands/agent_manager.py +1403 -0
  41. claude_mpm/cli/commands/agent_source.py +774 -0
  42. claude_mpm/cli/commands/agent_state_manager.py +335 -0
  43. claude_mpm/cli/commands/agents.py +2501 -168
  44. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  45. claude_mpm/cli/commands/agents_discover.py +338 -0
  46. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  47. claude_mpm/cli/commands/aggregate.py +540 -0
  48. claude_mpm/cli/commands/analyze.py +553 -0
  49. claude_mpm/cli/commands/analyze_code.py +528 -0
  50. claude_mpm/cli/commands/auto_configure.py +1053 -0
  51. claude_mpm/cli/commands/cleanup.py +588 -0
  52. claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
  53. claude_mpm/cli/commands/config.py +586 -0
  54. claude_mpm/cli/commands/configure.py +3253 -0
  55. claude_mpm/cli/commands/configure_agent_display.py +282 -0
  56. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  57. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  58. claude_mpm/cli/commands/configure_models.py +18 -0
  59. claude_mpm/cli/commands/configure_navigation.py +184 -0
  60. claude_mpm/cli/commands/configure_paths.py +104 -0
  61. claude_mpm/cli/commands/configure_persistence.py +254 -0
  62. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  63. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  64. claude_mpm/cli/commands/configure_validators.py +73 -0
  65. claude_mpm/cli/commands/dashboard.py +286 -0
  66. claude_mpm/cli/commands/debug.py +1386 -0
  67. claude_mpm/cli/commands/doctor.py +243 -0
  68. claude_mpm/cli/commands/hook_errors.py +277 -0
  69. claude_mpm/cli/commands/info.py +195 -74
  70. claude_mpm/cli/commands/local_deploy.py +534 -0
  71. claude_mpm/cli/commands/mcp.py +205 -0
  72. claude_mpm/cli/commands/mcp_command_router.py +161 -0
  73. claude_mpm/cli/commands/mcp_config.py +154 -0
  74. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  75. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  76. claude_mpm/cli/commands/mcp_install_commands.py +346 -0
  77. claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
  78. claude_mpm/cli/commands/mcp_server_commands.py +155 -0
  79. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  80. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  81. claude_mpm/cli/commands/memory.py +585 -846
  82. claude_mpm/cli/commands/monitor.py +228 -310
  83. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  84. claude_mpm/cli/commands/mpm_init/core.py +759 -0
  85. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  86. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  87. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  88. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  89. claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
  90. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  91. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  92. claude_mpm/cli/commands/postmortem.py +401 -0
  93. claude_mpm/cli/commands/profile.py +276 -0
  94. claude_mpm/cli/commands/run.py +910 -488
  95. claude_mpm/cli/commands/search.py +458 -0
  96. claude_mpm/cli/commands/skill_source.py +694 -0
  97. claude_mpm/cli/commands/skills.py +1398 -0
  98. claude_mpm/cli/commands/summarize.py +413 -0
  99. claude_mpm/cli/commands/tickets.py +536 -53
  100. claude_mpm/cli/commands/uninstall.py +176 -0
  101. claude_mpm/cli/commands/upgrade.py +152 -0
  102. claude_mpm/cli/commands/verify.py +119 -0
  103. claude_mpm/cli/executor.py +298 -0
  104. claude_mpm/cli/helpers.py +105 -0
  105. claude_mpm/cli/interactive/__init__.py +31 -0
  106. claude_mpm/cli/interactive/agent_wizard.py +1927 -0
  107. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  108. claude_mpm/cli/interactive/skill_selector.py +481 -0
  109. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  110. claude_mpm/cli/parser.py +87 -563
  111. claude_mpm/cli/parsers/__init__.py +35 -0
  112. claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
  113. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  114. claude_mpm/cli/parsers/agents_parser.py +575 -0
  115. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  116. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  117. claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
  118. claude_mpm/cli/parsers/base_parser.py +649 -0
  119. claude_mpm/cli/parsers/config_parser.py +208 -0
  120. claude_mpm/cli/parsers/configure_parser.py +138 -0
  121. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  122. claude_mpm/cli/parsers/debug_parser.py +319 -0
  123. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  124. claude_mpm/cli/parsers/mcp_parser.py +195 -0
  125. claude_mpm/cli/parsers/memory_parser.py +138 -0
  126. claude_mpm/cli/parsers/monitor_parser.py +142 -0
  127. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  128. claude_mpm/cli/parsers/profile_parser.py +147 -0
  129. claude_mpm/cli/parsers/run_parser.py +157 -0
  130. claude_mpm/cli/parsers/search_parser.py +245 -0
  131. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  132. claude_mpm/cli/parsers/skills_parser.py +277 -0
  133. claude_mpm/cli/parsers/source_parser.py +138 -0
  134. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  135. claude_mpm/cli/shared/__init__.py +40 -0
  136. claude_mpm/cli/shared/argument_patterns.py +205 -0
  137. claude_mpm/cli/shared/base_command.py +242 -0
  138. claude_mpm/cli/shared/error_handling.py +242 -0
  139. claude_mpm/cli/shared/output_formatters.py +241 -0
  140. claude_mpm/cli/startup.py +1578 -0
  141. claude_mpm/cli/startup_display.py +480 -0
  142. claude_mpm/cli/startup_logging.py +839 -0
  143. claude_mpm/cli/utils.py +136 -47
  144. claude_mpm/cli_module/__init__.py +6 -6
  145. claude_mpm/cli_module/args.py +188 -140
  146. claude_mpm/cli_module/commands.py +79 -70
  147. claude_mpm/cli_module/migration_example.py +42 -64
  148. claude_mpm/commands/__init__.py +14 -0
  149. claude_mpm/commands/mpm-config.md +28 -0
  150. claude_mpm/commands/mpm-doctor.md +20 -0
  151. claude_mpm/commands/mpm-help.md +20 -0
  152. claude_mpm/commands/mpm-init.md +120 -0
  153. claude_mpm/commands/mpm-monitor.md +31 -0
  154. claude_mpm/commands/mpm-organize.md +120 -0
  155. claude_mpm/commands/mpm-postmortem.md +21 -0
  156. claude_mpm/commands/mpm-session-resume.md +30 -0
  157. claude_mpm/commands/mpm-status.md +20 -0
  158. claude_mpm/commands/mpm-ticket-view.md +109 -0
  159. claude_mpm/commands/mpm-version.md +20 -0
  160. claude_mpm/commands/mpm.md +31 -0
  161. claude_mpm/config/__init__.py +42 -2
  162. claude_mpm/config/agent_config.py +402 -0
  163. claude_mpm/config/agent_presets.py +488 -0
  164. claude_mpm/config/agent_sources.py +352 -0
  165. claude_mpm/config/experimental_features.py +217 -0
  166. claude_mpm/config/model_config.py +428 -0
  167. claude_mpm/config/paths.py +258 -0
  168. claude_mpm/config/skill_presets.py +392 -0
  169. claude_mpm/config/skill_sources.py +590 -0
  170. claude_mpm/config/socketio_config.py +125 -83
  171. claude_mpm/constants.py +133 -22
  172. claude_mpm/core/__init__.py +62 -36
  173. claude_mpm/core/agent_name_normalizer.py +71 -73
  174. claude_mpm/core/agent_registry.py +385 -492
  175. claude_mpm/core/agent_session_manager.py +81 -70
  176. claude_mpm/core/api_validator.py +330 -0
  177. claude_mpm/core/base_service.py +159 -122
  178. claude_mpm/core/cache.py +560 -0
  179. claude_mpm/core/claude_runner.py +696 -916
  180. claude_mpm/core/config.py +613 -122
  181. claude_mpm/core/config_aliases.py +74 -73
  182. claude_mpm/core/config_constants.py +314 -0
  183. claude_mpm/core/constants.py +361 -0
  184. claude_mpm/core/container.py +646 -104
  185. claude_mpm/core/enums.py +452 -0
  186. claude_mpm/core/error_handler.py +623 -0
  187. claude_mpm/core/exceptions.py +536 -0
  188. claude_mpm/core/factories.py +105 -109
  189. claude_mpm/core/file_utils.py +764 -0
  190. claude_mpm/core/framework/__init__.py +25 -0
  191. claude_mpm/core/framework/formatters/__init__.py +11 -0
  192. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  193. claude_mpm/core/framework/formatters/content_formatter.py +278 -0
  194. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  195. claude_mpm/core/framework/loaders/__init__.py +13 -0
  196. claude_mpm/core/framework/loaders/agent_loader.py +213 -0
  197. claude_mpm/core/framework/loaders/file_loader.py +176 -0
  198. claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
  199. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  200. claude_mpm/core/framework/processors/__init__.py +11 -0
  201. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  202. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  203. claude_mpm/core/framework/processors/template_processor.py +244 -0
  204. claude_mpm/core/framework_loader.py +485 -414
  205. claude_mpm/core/hook_error_memory.py +381 -0
  206. claude_mpm/core/hook_manager.py +246 -86
  207. claude_mpm/core/hook_performance_config.py +147 -0
  208. claude_mpm/core/injectable_service.py +72 -63
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +670 -0
  211. claude_mpm/core/interfaces.py +570 -164
  212. claude_mpm/core/lazy.py +467 -0
  213. claude_mpm/core/log_manager.py +707 -0
  214. claude_mpm/core/logger.py +295 -134
  215. claude_mpm/core/logging_config.py +474 -0
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/minimal_framework_loader.py +24 -22
  218. claude_mpm/core/mixins.py +30 -29
  219. claude_mpm/core/oneshot_session.py +594 -0
  220. claude_mpm/core/optimized_agent_loader.py +479 -0
  221. claude_mpm/core/optimized_startup.py +554 -0
  222. claude_mpm/core/output_style_manager.py +491 -0
  223. claude_mpm/core/pm_hook_interceptor.py +197 -82
  224. claude_mpm/core/protocols/__init__.py +23 -0
  225. claude_mpm/core/protocols/runner_protocol.py +103 -0
  226. claude_mpm/core/protocols/session_protocol.py +131 -0
  227. claude_mpm/core/service_registry.py +153 -116
  228. claude_mpm/core/session_manager.py +179 -64
  229. claude_mpm/core/shared/__init__.py +17 -0
  230. claude_mpm/core/shared/config_loader.py +326 -0
  231. claude_mpm/core/shared/path_resolver.py +281 -0
  232. claude_mpm/core/shared/singleton_manager.py +221 -0
  233. claude_mpm/core/socketio_pool.py +400 -137
  234. claude_mpm/core/system_context.py +38 -0
  235. claude_mpm/core/tool_access_control.py +64 -57
  236. claude_mpm/core/types.py +307 -0
  237. claude_mpm/core/typing_utils.py +553 -0
  238. claude_mpm/core/unified_agent_registry.py +969 -0
  239. claude_mpm/core/unified_config.py +612 -0
  240. claude_mpm/core/unified_paths.py +958 -0
  241. claude_mpm/dashboard/__init__.py +12 -0
  242. claude_mpm/dashboard/api/simple_directory.py +261 -0
  243. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  244. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
  245. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
  246. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
  247. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
  248. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
  249. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
  250. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
  251. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
  252. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
  253. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
  254. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  255. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  256. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
  257. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
  258. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
  259. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
  260. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
  261. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
  262. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
  263. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
  264. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
  265. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
  266. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
  267. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
  268. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  269. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
  270. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
  271. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  272. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
  273. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
  274. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
  275. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
  276. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
  277. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
  278. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
  279. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
  280. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
  281. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  282. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
  283. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
  284. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
  285. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
  286. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
  287. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
  288. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
  289. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
  290. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
  291. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
  292. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  293. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
  303. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
  304. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
  305. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
  306. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
  307. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
  308. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  309. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  310. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  311. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  312. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  313. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  314. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  315. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  316. claude_mpm/experimental/__init__.py +10 -0
  317. claude_mpm/experimental/cli_enhancements.py +104 -89
  318. claude_mpm/generators/__init__.py +1 -1
  319. claude_mpm/generators/agent_profile_generator.py +76 -66
  320. claude_mpm/hooks/__init__.py +37 -1
  321. claude_mpm/hooks/base_hook.py +37 -32
  322. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  323. claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
  324. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  325. claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
  326. claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
  327. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
  328. claude_mpm/hooks/claude_hooks/installer.py +806 -0
  329. claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
  330. claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
  331. claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
  332. claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
  333. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
  334. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  335. claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
  336. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  337. claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
  338. claude_mpm/hooks/failure_learning/__init__.py +54 -0
  339. claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
  340. claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
  341. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
  342. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  343. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  344. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  345. claude_mpm/hooks/kuzu_response_hook.py +179 -0
  346. claude_mpm/hooks/memory_integration_hook.py +201 -107
  347. claude_mpm/hooks/session_resume_hook.py +121 -0
  348. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  349. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  350. claude_mpm/hooks/tool_call_interceptor.py +92 -76
  351. claude_mpm/hooks/validation_hooks.py +62 -54
  352. claude_mpm/init.py +518 -83
  353. claude_mpm/models/__init__.py +9 -9
  354. claude_mpm/models/agent_definition.py +40 -23
  355. claude_mpm/models/agent_session.py +538 -0
  356. claude_mpm/models/git_repository.py +198 -0
  357. claude_mpm/models/resume_log.py +340 -0
  358. claude_mpm/schemas/__init__.py +12 -0
  359. claude_mpm/scripts/__init__.py +15 -0
  360. claude_mpm/scripts/claude-hook-handler.sh +227 -0
  361. claude_mpm/scripts/launch_monitor.py +165 -0
  362. claude_mpm/scripts/mpm_doctor.py +322 -0
  363. claude_mpm/scripts/socketio_daemon.py +189 -200
  364. claude_mpm/scripts/start_activity_logging.py +91 -0
  365. claude_mpm/services/__init__.py +208 -39
  366. claude_mpm/services/agent_capabilities_service.py +266 -0
  367. claude_mpm/services/agents/__init__.py +89 -0
  368. claude_mpm/services/agents/agent_builder.py +514 -0
  369. claude_mpm/services/agents/agent_preset_service.py +238 -0
  370. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  371. claude_mpm/services/agents/agent_review_service.py +280 -0
  372. claude_mpm/services/agents/agent_selection_service.py +484 -0
  373. claude_mpm/services/agents/auto_config_manager.py +796 -0
  374. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  375. claude_mpm/services/agents/cache_git_manager.py +621 -0
  376. claude_mpm/services/agents/deployment/__init__.py +21 -0
  377. claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
  378. claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
  379. claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
  380. claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
  381. claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
  382. claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
  383. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
  384. claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
  385. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
  386. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
  387. claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
  388. claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
  389. claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
  390. claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
  391. claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
  392. claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
  393. claude_mpm/services/agents/deployment/agent_validator.py +376 -0
  394. claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
  395. claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
  396. claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
  397. claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
  398. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  399. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  400. claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
  401. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  402. claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
  403. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  404. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  405. claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
  406. claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
  407. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  408. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  409. claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
  410. claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
  411. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  412. claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
  413. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  414. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  415. claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
  416. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
  417. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  418. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  419. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
  420. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  421. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  422. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
  423. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
  424. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
  425. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
  426. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
  427. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  428. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
  429. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  430. claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
  431. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
  432. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
  433. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  434. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  435. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  436. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  437. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  438. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  439. claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
  440. claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
  441. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  442. claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
  443. claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
  444. claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
  445. claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
  446. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  447. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  448. claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
  449. claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
  450. claude_mpm/services/agents/git_source_manager.py +682 -0
  451. claude_mpm/services/agents/loading/__init__.py +11 -0
  452. claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
  453. claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
  454. claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
  455. claude_mpm/services/agents/local_template_manager.py +784 -0
  456. claude_mpm/services/agents/management/__init__.py +9 -0
  457. claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
  458. claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
  459. claude_mpm/services/agents/memory/__init__.py +22 -0
  460. claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
  461. claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
  462. claude_mpm/services/agents/memory/content_manager.py +470 -0
  463. claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
  464. claude_mpm/services/agents/memory/memory_file_service.py +129 -0
  465. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  466. claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
  467. claude_mpm/services/agents/memory/template_generator.py +83 -0
  468. claude_mpm/services/agents/observers.py +547 -0
  469. claude_mpm/services/agents/recommender.py +617 -0
  470. claude_mpm/services/agents/registry/__init__.py +30 -0
  471. claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
  472. claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
  473. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  474. claude_mpm/services/agents/sources/__init__.py +13 -0
  475. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  476. claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
  477. claude_mpm/services/agents/startup_sync.py +262 -0
  478. claude_mpm/services/agents/toolchain_detector.py +478 -0
  479. claude_mpm/services/analysis/__init__.py +35 -0
  480. claude_mpm/services/analysis/clone_detector.py +1030 -0
  481. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  482. claude_mpm/services/analysis/postmortem_service.py +765 -0
  483. claude_mpm/services/async_session_logger.py +665 -0
  484. claude_mpm/services/claude_session_logger.py +321 -0
  485. claude_mpm/services/cli/__init__.py +18 -0
  486. claude_mpm/services/cli/agent_cleanup_service.py +408 -0
  487. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  488. claude_mpm/services/cli/agent_listing_service.py +463 -0
  489. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  490. claude_mpm/services/cli/agent_validation_service.py +590 -0
  491. claude_mpm/services/cli/memory_crud_service.py +622 -0
  492. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  493. claude_mpm/services/cli/resume_service.py +617 -0
  494. claude_mpm/services/cli/session_manager.py +604 -0
  495. claude_mpm/services/cli/session_pause_manager.py +504 -0
  496. claude_mpm/services/cli/session_resume_helper.py +372 -0
  497. claude_mpm/services/cli/startup_checker.py +362 -0
  498. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  499. claude_mpm/services/command_deployment_service.py +446 -0
  500. claude_mpm/services/command_handler_service.py +221 -0
  501. claude_mpm/services/communication/__init__.py +22 -0
  502. claude_mpm/services/core/__init__.py +108 -0
  503. claude_mpm/services/core/base.py +269 -0
  504. claude_mpm/services/core/cache_manager.py +309 -0
  505. claude_mpm/services/core/interfaces/__init__.py +273 -0
  506. claude_mpm/services/core/interfaces/agent.py +514 -0
  507. claude_mpm/services/core/interfaces/communication.py +316 -0
  508. claude_mpm/services/core/interfaces/health.py +169 -0
  509. claude_mpm/services/core/interfaces/infrastructure.py +357 -0
  510. claude_mpm/services/core/interfaces/model.py +281 -0
  511. claude_mpm/services/core/interfaces/process.py +372 -0
  512. claude_mpm/services/core/interfaces/project.py +121 -0
  513. claude_mpm/services/core/interfaces/restart.py +307 -0
  514. claude_mpm/services/core/interfaces/service.py +405 -0
  515. claude_mpm/services/core/interfaces/stability.py +260 -0
  516. claude_mpm/services/core/interfaces.py +81 -0
  517. claude_mpm/services/core/memory_manager.py +682 -0
  518. claude_mpm/services/core/models/__init__.py +70 -0
  519. claude_mpm/services/core/models/agent_config.py +384 -0
  520. claude_mpm/services/core/models/health.py +162 -0
  521. claude_mpm/services/core/models/process.py +239 -0
  522. claude_mpm/services/core/models/restart.py +302 -0
  523. claude_mpm/services/core/models/stability.py +264 -0
  524. claude_mpm/services/core/models/toolchain.py +306 -0
  525. claude_mpm/services/core/path_resolver.py +517 -0
  526. claude_mpm/services/core/service_container.py +520 -0
  527. claude_mpm/services/core/service_interfaces.py +436 -0
  528. claude_mpm/services/diagnostics/__init__.py +18 -0
  529. claude_mpm/services/diagnostics/checks/__init__.py +38 -0
  530. claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
  531. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  532. claude_mpm/services/diagnostics/checks/base_check.py +60 -0
  533. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  534. claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
  535. claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
  536. claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
  537. claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
  538. claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
  539. claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
  540. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
  541. claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
  542. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  543. claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
  544. claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
  545. claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
  546. claude_mpm/services/diagnostics/models.py +138 -0
  547. claude_mpm/services/event_aggregator.py +582 -0
  548. claude_mpm/services/event_bus/__init__.py +18 -0
  549. claude_mpm/services/event_bus/config.py +186 -0
  550. claude_mpm/services/event_bus/direct_relay.py +312 -0
  551. claude_mpm/services/event_bus/event_bus.py +396 -0
  552. claude_mpm/services/event_bus/relay.py +326 -0
  553. claude_mpm/services/events/__init__.py +44 -0
  554. claude_mpm/services/events/consumers/__init__.py +18 -0
  555. claude_mpm/services/events/consumers/dead_letter.py +306 -0
  556. claude_mpm/services/events/consumers/logging.py +184 -0
  557. claude_mpm/services/events/consumers/metrics.py +241 -0
  558. claude_mpm/services/events/consumers/socketio.py +377 -0
  559. claude_mpm/services/events/core.py +480 -0
  560. claude_mpm/services/events/interfaces.py +214 -0
  561. claude_mpm/services/events/producers/__init__.py +14 -0
  562. claude_mpm/services/events/producers/hook.py +269 -0
  563. claude_mpm/services/events/producers/system.py +329 -0
  564. claude_mpm/services/exceptions.py +433 -353
  565. claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
  566. claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
  567. claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
  568. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
  569. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
  570. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
  571. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
  572. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
  573. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  574. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  575. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  576. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  577. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
  578. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  579. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  580. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
  581. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
  582. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  583. claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
  584. claude_mpm/services/git/__init__.py +21 -0
  585. claude_mpm/services/git/git_operations_service.py +579 -0
  586. claude_mpm/services/github/__init__.py +21 -0
  587. claude_mpm/services/github/github_cli_service.py +397 -0
  588. claude_mpm/services/hook_installer_service.py +506 -0
  589. claude_mpm/services/hook_service.py +159 -111
  590. claude_mpm/services/infrastructure/__init__.py +52 -0
  591. claude_mpm/services/infrastructure/context_preservation.py +569 -0
  592. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  593. claude_mpm/services/infrastructure/logging.py +209 -0
  594. claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
  595. claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
  596. claude_mpm/services/infrastructure/monitoring/base.py +122 -0
  597. claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
  598. claude_mpm/services/infrastructure/monitoring/network.py +219 -0
  599. claude_mpm/services/infrastructure/monitoring/process.py +343 -0
  600. claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
  601. claude_mpm/services/infrastructure/monitoring/service.py +368 -0
  602. claude_mpm/services/infrastructure/monitoring.py +71 -0
  603. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  604. claude_mpm/services/instructions/__init__.py +9 -0
  605. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  606. claude_mpm/services/local_ops/__init__.py +155 -0
  607. claude_mpm/services/local_ops/crash_detector.py +257 -0
  608. claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
  609. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  610. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  611. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  612. claude_mpm/services/local_ops/health_manager.py +427 -0
  613. claude_mpm/services/local_ops/log_monitor.py +396 -0
  614. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  615. claude_mpm/services/local_ops/process_manager.py +595 -0
  616. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  617. claude_mpm/services/local_ops/restart_manager.py +401 -0
  618. claude_mpm/services/local_ops/restart_policy.py +387 -0
  619. claude_mpm/services/local_ops/state_manager.py +372 -0
  620. claude_mpm/services/local_ops/unified_manager.py +600 -0
  621. claude_mpm/services/mcp_config_manager.py +1542 -0
  622. claude_mpm/services/mcp_service_verifier.py +732 -0
  623. claude_mpm/services/memory/__init__.py +19 -0
  624. claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
  625. claude_mpm/services/memory/cache/__init__.py +14 -0
  626. claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
  627. claude_mpm/services/memory/cache/simple_cache.py +331 -0
  628. claude_mpm/services/memory/failure_tracker.py +578 -0
  629. claude_mpm/services/memory/indexed_memory.py +648 -0
  630. claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
  631. claude_mpm/services/memory/router.py +951 -0
  632. claude_mpm/services/memory_hook_service.py +470 -0
  633. claude_mpm/services/model/__init__.py +147 -0
  634. claude_mpm/services/model/base_provider.py +365 -0
  635. claude_mpm/services/model/claude_provider.py +412 -0
  636. claude_mpm/services/model/model_router.py +452 -0
  637. claude_mpm/services/model/ollama_provider.py +415 -0
  638. claude_mpm/services/monitor/__init__.py +20 -0
  639. claude_mpm/services/monitor/daemon.py +698 -0
  640. claude_mpm/services/monitor/daemon_manager.py +1076 -0
  641. claude_mpm/services/monitor/event_emitter.py +350 -0
  642. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  643. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  644. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  645. claude_mpm/services/monitor/handlers/file.py +264 -0
  646. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  647. claude_mpm/services/monitor/management/__init__.py +18 -0
  648. claude_mpm/services/monitor/management/health.py +124 -0
  649. claude_mpm/services/monitor/management/lifecycle.py +730 -0
  650. claude_mpm/services/monitor/server.py +1493 -0
  651. claude_mpm/services/monitor_build_service.py +349 -0
  652. claude_mpm/services/native_agent_converter.py +356 -0
  653. claude_mpm/services/orphan_detection.py +786 -0
  654. claude_mpm/services/pm_skills_deployer.py +711 -0
  655. claude_mpm/services/port_manager.py +597 -0
  656. claude_mpm/services/pr/__init__.py +14 -0
  657. claude_mpm/services/pr/pr_template_service.py +329 -0
  658. claude_mpm/services/profile_manager.py +337 -0
  659. claude_mpm/services/project/__init__.py +44 -0
  660. claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
  661. claude_mpm/services/project/analyzer_v2.py +566 -0
  662. claude_mpm/services/project/architecture_analyzer.py +461 -0
  663. claude_mpm/services/project/archive_manager.py +1045 -0
  664. claude_mpm/services/project/dependency_analyzer.py +462 -0
  665. claude_mpm/services/project/detection_strategies.py +719 -0
  666. claude_mpm/services/project/documentation_manager.py +554 -0
  667. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  668. claude_mpm/services/project/language_analyzer.py +265 -0
  669. claude_mpm/services/project/metrics_collector.py +407 -0
  670. claude_mpm/services/project/project_organizer.py +1009 -0
  671. claude_mpm/services/project/registry.py +636 -0
  672. claude_mpm/services/project/toolchain_analyzer.py +583 -0
  673. claude_mpm/services/project_port_allocator.py +596 -0
  674. claude_mpm/services/recovery_manager.py +293 -240
  675. claude_mpm/services/response_tracker.py +267 -0
  676. claude_mpm/services/runner_configuration_service.py +605 -0
  677. claude_mpm/services/self_upgrade_service.py +608 -0
  678. claude_mpm/services/session_management_service.py +314 -0
  679. claude_mpm/services/session_manager.py +380 -0
  680. claude_mpm/services/shared/__init__.py +21 -0
  681. claude_mpm/services/shared/async_service_base.py +216 -0
  682. claude_mpm/services/shared/config_service_base.py +301 -0
  683. claude_mpm/services/shared/lifecycle_service_base.py +308 -0
  684. claude_mpm/services/shared/manager_base.py +315 -0
  685. claude_mpm/services/shared/service_factory.py +309 -0
  686. claude_mpm/services/skills/__init__.py +21 -0
  687. claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
  688. claude_mpm/services/skills/selective_skill_deployer.py +743 -0
  689. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  690. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  691. claude_mpm/services/skills_config.py +547 -0
  692. claude_mpm/services/skills_deployer.py +1168 -0
  693. claude_mpm/services/socketio/__init__.py +25 -0
  694. claude_mpm/services/socketio/client_proxy.py +229 -0
  695. claude_mpm/services/socketio/dashboard_server.py +362 -0
  696. claude_mpm/services/socketio/event_normalizer.py +798 -0
  697. claude_mpm/services/socketio/handlers/__init__.py +30 -0
  698. claude_mpm/services/socketio/handlers/base.py +136 -0
  699. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  700. claude_mpm/services/socketio/handlers/connection.py +643 -0
  701. claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
  702. claude_mpm/services/socketio/handlers/file.py +263 -0
  703. claude_mpm/services/socketio/handlers/git.py +962 -0
  704. claude_mpm/services/socketio/handlers/hook.py +211 -0
  705. claude_mpm/services/socketio/handlers/memory.py +26 -0
  706. claude_mpm/services/socketio/handlers/project.py +24 -0
  707. claude_mpm/services/socketio/handlers/registry.py +214 -0
  708. claude_mpm/services/socketio/migration_utils.py +343 -0
  709. claude_mpm/services/socketio/monitor_client.py +364 -0
  710. claude_mpm/services/socketio/server/__init__.py +18 -0
  711. claude_mpm/services/socketio/server/broadcaster.py +569 -0
  712. claude_mpm/services/socketio/server/connection_manager.py +579 -0
  713. claude_mpm/services/socketio/server/core.py +1079 -0
  714. claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
  715. claude_mpm/services/socketio/server/main.py +501 -0
  716. claude_mpm/services/socketio_client_manager.py +173 -143
  717. claude_mpm/services/socketio_server.py +38 -1657
  718. claude_mpm/services/subprocess_launcher_service.py +322 -0
  719. claude_mpm/services/system_instructions_service.py +270 -0
  720. claude_mpm/services/ticket_manager.py +25 -209
  721. claude_mpm/services/ticket_services/__init__.py +26 -0
  722. claude_mpm/services/ticket_services/crud_service.py +328 -0
  723. claude_mpm/services/ticket_services/formatter_service.py +290 -0
  724. claude_mpm/services/ticket_services/search_service.py +324 -0
  725. claude_mpm/services/ticket_services/validation_service.py +303 -0
  726. claude_mpm/services/ticket_services/workflow_service.py +244 -0
  727. claude_mpm/services/unified/__init__.py +65 -0
  728. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  729. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  730. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  731. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
  732. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
  733. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  734. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  735. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  736. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  737. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  738. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  739. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  740. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  741. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  742. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  743. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  744. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  745. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  746. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  747. claude_mpm/services/unified/interfaces.py +475 -0
  748. claude_mpm/services/unified/migration.py +509 -0
  749. claude_mpm/services/unified/strategies.py +534 -0
  750. claude_mpm/services/unified/unified_analyzer.py +542 -0
  751. claude_mpm/services/unified/unified_config.py +691 -0
  752. claude_mpm/services/unified/unified_deployment.py +466 -0
  753. claude_mpm/services/utility_service.py +280 -0
  754. claude_mpm/services/version_control/__init__.py +34 -37
  755. claude_mpm/services/version_control/branch_strategy.py +26 -17
  756. claude_mpm/services/version_control/conflict_resolution.py +52 -36
  757. claude_mpm/services/version_control/git_operations.py +183 -49
  758. claude_mpm/services/version_control/semantic_versioning.py +172 -61
  759. claude_mpm/services/version_control/version_parser.py +546 -0
  760. claude_mpm/services/version_service.py +379 -0
  761. claude_mpm/services/visualization/__init__.py +15 -0
  762. claude_mpm/services/visualization/mermaid_generator.py +937 -0
  763. claude_mpm/skills/__init__.py +42 -0
  764. claude_mpm/skills/agent_skills_injector.py +324 -0
  765. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  766. claude_mpm/skills/bundled/__init__.py +6 -0
  767. claude_mpm/skills/bundled/api-documentation.md +393 -0
  768. claude_mpm/skills/bundled/async-testing.md +571 -0
  769. claude_mpm/skills/bundled/code-review.md +143 -0
  770. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  771. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  772. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  773. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  774. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  775. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  776. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  777. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  778. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  779. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  780. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  781. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  782. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  783. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  784. claude_mpm/skills/bundled/database-migration.md +199 -0
  785. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  786. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  787. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  788. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  789. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  790. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  791. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  792. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  793. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  794. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  795. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  796. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  797. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  798. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  799. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  800. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  801. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  802. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  803. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  804. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  805. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  806. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  807. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  808. claude_mpm/skills/bundled/git-workflow.md +414 -0
  809. claude_mpm/skills/bundled/imagemagick.md +204 -0
  810. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  811. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  812. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  813. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  814. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  815. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  816. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  817. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  818. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  819. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  820. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  821. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  822. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  823. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  824. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  825. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  826. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  827. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  828. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  829. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  830. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  831. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  832. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  833. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  834. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  835. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  836. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  837. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  838. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  839. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  840. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  841. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  842. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  843. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  844. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  845. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  846. claude_mpm/skills/bundled/pdf.md +141 -0
  847. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  848. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  849. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  850. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  851. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  852. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  853. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  854. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  855. claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
  856. claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
  857. claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
  858. claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
  859. claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
  860. claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
  861. claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
  862. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  863. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  864. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  865. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  866. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  867. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  868. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  869. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  870. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  871. claude_mpm/skills/bundled/security-scanning.md +439 -0
  872. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  873. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  874. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  875. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  876. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  877. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  878. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  879. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  880. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  881. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  882. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  883. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  884. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  885. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  886. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  887. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  888. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  889. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  890. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  891. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  892. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  893. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  894. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  895. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  896. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  897. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  898. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  899. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  900. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  901. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  902. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  903. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  904. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  905. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  906. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  907. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  908. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  909. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  910. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  911. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  912. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  913. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  914. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  915. claude_mpm/skills/bundled/xlsx.md +157 -0
  916. claude_mpm/skills/registry.py +286 -0
  917. claude_mpm/skills/skill_manager.py +405 -0
  918. claude_mpm/skills/skills_registry.py +347 -0
  919. claude_mpm/skills/skills_service.py +739 -0
  920. claude_mpm/storage/__init__.py +9 -0
  921. claude_mpm/storage/state_storage.py +546 -0
  922. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  923. claude_mpm/templates/questions/__init__.py +38 -0
  924. claude_mpm/templates/questions/base.py +193 -0
  925. claude_mpm/templates/questions/pr_strategy.py +311 -0
  926. claude_mpm/templates/questions/project_init.py +385 -0
  927. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  928. claude_mpm/ticket_wrapper.py +2 -2
  929. claude_mpm/tools/__init__.py +10 -0
  930. claude_mpm/tools/__main__.py +208 -0
  931. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  932. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  933. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  934. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  935. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  936. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  937. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  938. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  939. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  940. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  941. claude_mpm/tools/code_tree_builder.py +631 -0
  942. claude_mpm/tools/code_tree_events.py +420 -0
  943. claude_mpm/tools/socketio_debug.py +671 -0
  944. claude_mpm/utils/__init__.py +8 -8
  945. claude_mpm/utils/agent_dependency_loader.py +1189 -0
  946. claude_mpm/utils/agent_filters.py +261 -0
  947. claude_mpm/utils/common.py +544 -0
  948. claude_mpm/utils/config_manager.py +168 -126
  949. claude_mpm/utils/console.py +11 -0
  950. claude_mpm/utils/database_connector.py +298 -0
  951. claude_mpm/utils/dependency_cache.py +373 -0
  952. claude_mpm/utils/dependency_manager.py +60 -59
  953. claude_mpm/utils/dependency_strategies.py +381 -0
  954. claude_mpm/utils/display_helper.py +260 -0
  955. claude_mpm/utils/environment_context.py +313 -0
  956. claude_mpm/utils/error_handler.py +78 -66
  957. claude_mpm/utils/file_utils.py +305 -0
  958. claude_mpm/utils/framework_detection.py +12 -11
  959. claude_mpm/utils/git_analyzer.py +407 -0
  960. claude_mpm/utils/gitignore.py +244 -0
  961. claude_mpm/utils/import_migration_example.py +12 -60
  962. claude_mpm/utils/imports.py +48 -45
  963. claude_mpm/utils/log_cleanup.py +627 -0
  964. claude_mpm/utils/migration.py +372 -0
  965. claude_mpm/utils/path_operations.py +110 -104
  966. claude_mpm/utils/progress.py +387 -0
  967. claude_mpm/utils/robust_installer.py +844 -0
  968. claude_mpm/utils/session_logging.py +121 -0
  969. claude_mpm/utils/structured_questions.py +619 -0
  970. claude_mpm/utils/subprocess_utils.py +343 -0
  971. claude_mpm/validation/__init__.py +1 -1
  972. claude_mpm/validation/agent_validator.py +214 -108
  973. claude_mpm/validation/frontmatter_validator.py +252 -0
  974. claude_mpm-5.4.85.dist-info/METADATA +1023 -0
  975. claude_mpm-5.4.85.dist-info/RECORD +980 -0
  976. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
  977. claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
  978. claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
  979. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
  980. claude_mpm/agents/INSTRUCTIONS.md +0 -352
  981. claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
  982. claude_mpm/agents/base_agent_loader.py +0 -529
  983. claude_mpm/agents/schema/agent_schema.json +0 -314
  984. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
  985. claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
  986. claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
  987. claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
  988. claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
  989. claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
  990. claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
  991. claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
  992. claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
  993. claude_mpm/agents/templates/data_engineer.json +0 -110
  994. claude_mpm/agents/templates/documentation.json +0 -109
  995. claude_mpm/agents/templates/engineer.json +0 -113
  996. claude_mpm/agents/templates/ops.json +0 -109
  997. claude_mpm/agents/templates/pm.json +0 -25
  998. claude_mpm/agents/templates/qa.json +0 -111
  999. claude_mpm/agents/templates/research.json +0 -65
  1000. claude_mpm/agents/templates/security.json +0 -113
  1001. claude_mpm/agents/templates/test_integration.json +0 -112
  1002. claude_mpm/agents/templates/version_control.json +0 -107
  1003. claude_mpm/cli/commands/ui.py +0 -57
  1004. claude_mpm/core/simple_runner.py +0 -1046
  1005. claude_mpm/dashboard/open_dashboard.py +0 -34
  1006. claude_mpm/deployment_paths.py +0 -261
  1007. claude_mpm/hooks/builtin/__init__.py +0 -1
  1008. claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
  1009. claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
  1010. claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
  1011. claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
  1012. claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
  1013. claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
  1014. claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
  1015. claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
  1016. claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
  1017. claude_mpm/orchestration/__init__.py +0 -6
  1018. claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
  1019. claude_mpm/orchestration/archive/factory.py +0 -215
  1020. claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
  1021. claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
  1022. claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
  1023. claude_mpm/orchestration/archive/orchestrator.py +0 -501
  1024. claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
  1025. claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
  1026. claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
  1027. claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
  1028. claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
  1029. claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
  1030. claude_mpm/schemas/workflow_validator.py +0 -411
  1031. claude_mpm/services/agent_deployment.py +0 -1534
  1032. claude_mpm/services/agent_lifecycle_manager.py +0 -1169
  1033. claude_mpm/services/agent_memory_manager.py +0 -1415
  1034. claude_mpm/services/agent_registry.py +0 -676
  1035. claude_mpm/services/deployed_agent_discovery.py +0 -226
  1036. claude_mpm/services/framework_agent_loader.py +0 -337
  1037. claude_mpm/services/framework_claude_md_generator.py +0 -621
  1038. claude_mpm/services/health_monitor.py +0 -892
  1039. claude_mpm/services/memory_router.py +0 -538
  1040. claude_mpm/services/parent_directory_manager/__init__.py +0 -577
  1041. claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
  1042. claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
  1043. claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
  1044. claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
  1045. claude_mpm/services/parent_directory_manager/operations.py +0 -186
  1046. claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
  1047. claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
  1048. claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
  1049. claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
  1050. claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
  1051. claude_mpm/services/standalone_socketio_server.py +0 -1300
  1052. claude_mpm/services/ticket_manager_di.py +0 -318
  1053. claude_mpm/services/ticketing_service_original.py +0 -508
  1054. claude_mpm/ui/__init__.py +0 -1
  1055. claude_mpm/ui/rich_terminal_ui.py +0 -295
  1056. claude_mpm/ui/terminal_ui.py +0 -328
  1057. claude_mpm/utils/paths.py +0 -289
  1058. claude_mpm-3.4.10.dist-info/METADATA +0 -183
  1059. claude_mpm-3.4.10.dist-info/RECORD +0 -201
  1060. claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
  1061. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
  1062. {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1377 @@
1
+ """Agent Template Builder Service
2
+
3
+ This service handles the building and generation of agent templates,
4
+ including YAML and Markdown generation, template merging, and metadata extraction.
5
+
6
+ Extracted from AgentDeploymentService as part of the refactoring to improve
7
+ maintainability and testability.
8
+ """
9
+
10
+ import json
11
+ import re
12
+ from pathlib import Path
13
+ from typing import Any, Dict, List
14
+
15
+ import yaml
16
+
17
+ from claude_mpm.core.logging_config import get_logger
18
+
19
+
20
+ class AgentTemplateBuilder:
21
+ """Service for building agent templates from JSON and base agent data.
22
+
23
+ This service handles:
24
+ - Building agent markdown files with YAML frontmatter
25
+ - Building agent YAML files
26
+ - Merging narrative and configuration fields
27
+ - Extracting agent metadata
28
+ - Formatting YAML lists
29
+ """
30
+
31
+ def __init__(self):
32
+ """Initialize the template builder."""
33
+ self.logger = get_logger(__name__)
34
+
35
+ def normalize_tools_input(self, tools):
36
+ """Normalize various tool input formats to a consistent list.
37
+
38
+ Handles multiple input formats:
39
+ - None/empty: Returns default tools
40
+ - String: Splits by comma and strips whitespace
41
+ - List: Ensures all items are strings and strips whitespace
42
+ - Dict: Takes enabled tools (where value is True)
43
+
44
+ Args:
45
+ tools: Tools input in various formats (str, list, dict, or None)
46
+
47
+ Returns:
48
+ List of tool names, normalized and cleaned
49
+ """
50
+ default_tools = ["Read", "Write", "Edit", "Grep", "Glob", "Bash"]
51
+
52
+ # Handle None or empty
53
+ if not tools:
54
+ self.logger.debug("No tools provided, using defaults")
55
+ return default_tools
56
+
57
+ # Convert to list format
58
+ if isinstance(tools, str):
59
+ # Split by comma, strip whitespace
60
+ tool_list = [t.strip() for t in tools.split(",") if t.strip()]
61
+ self.logger.debug(f"Converted string tools '{tools}' to list: {tool_list}")
62
+ elif isinstance(tools, list):
63
+ # Ensure all items are strings and strip whitespace
64
+ tool_list = [str(t).strip() for t in tools if t and str(t).strip()]
65
+ self.logger.debug(f"Normalized list tools: {tool_list}")
66
+ elif isinstance(tools, dict):
67
+ # Handle dict format - take enabled tools
68
+ tool_list = [k for k, v in tools.items() if v]
69
+ self.logger.info(f"Converting dict tools format: {tools} -> {tool_list}")
70
+ else:
71
+ self.logger.warning(f"Unknown tools format: {type(tools)}, using defaults")
72
+ return default_tools
73
+
74
+ # Return processed list or defaults if empty
75
+ if not tool_list:
76
+ self.logger.debug("Tools list empty after processing, using defaults")
77
+ return default_tools
78
+
79
+ return tool_list
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 (check AFTER finding BASE-AGENT.md)
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 (check AFTER finding BASE-AGENT.md)
138
+ # Stop at cache root or .claude-mpm directory
139
+ if current_dir.name in [".claude-mpm", "cache"]:
140
+ self.logger.debug(
141
+ f"Reached repository root indicator at: {current_dir}"
142
+ )
143
+ break
144
+
145
+ # Move to parent directory
146
+ parent = current_dir.parent
147
+ if parent == current_dir: # Reached filesystem root
148
+ break
149
+
150
+ current_dir = parent
151
+ depth += 1
152
+
153
+ if base_templates:
154
+ self.logger.info(
155
+ f"Discovered {len(base_templates)} BASE-AGENT.md file(s) for {agent_file.name}"
156
+ )
157
+
158
+ return base_templates
159
+
160
+ def _parse_markdown_template(self, template_path: Path) -> dict:
161
+ """Parse Markdown template with YAML frontmatter.
162
+
163
+ Extracts metadata from YAML frontmatter and content from Markdown body.
164
+ Supports the new agent template format with YAML frontmatter between --- delimiters.
165
+
166
+ Args:
167
+ template_path: Path to the Markdown template file
168
+
169
+ Returns:
170
+ Dictionary containing metadata and instructions
171
+
172
+ Raises:
173
+ ValueError: If frontmatter is missing or malformed
174
+ yaml.YAMLError: If YAML parsing fails
175
+ """
176
+ content = template_path.read_text(encoding="utf-8")
177
+
178
+ # Split frontmatter and body
179
+ # Format: ---\n<yaml>\n---\n<markdown>
180
+ if not content.startswith("---"):
181
+ raise ValueError(
182
+ f"Markdown template missing YAML frontmatter: {template_path}"
183
+ )
184
+
185
+ # Split by --- delimiters
186
+ parts = content.split("---", 2)
187
+ if len(parts) < 3:
188
+ raise ValueError(f"Malformed YAML frontmatter in template: {template_path}")
189
+
190
+ # parts[0] is empty (before first ---)
191
+ # parts[1] is YAML frontmatter
192
+ # parts[2] is Markdown content
193
+ yaml_content = parts[1].strip()
194
+ markdown_content = parts[2].strip()
195
+
196
+ # Parse YAML frontmatter
197
+ try:
198
+ metadata = yaml.safe_load(yaml_content)
199
+ if not isinstance(metadata, dict):
200
+ raise ValueError(
201
+ f"YAML frontmatter must be a dictionary: {template_path}"
202
+ )
203
+ except yaml.YAMLError as e:
204
+ self.logger.error(
205
+ f"Failed to parse YAML frontmatter in {template_path}: {e}"
206
+ )
207
+ raise
208
+
209
+ # Validate required fields
210
+ required_fields = ["name", "description", "version"]
211
+ missing_fields = [field for field in required_fields if field not in metadata]
212
+ if missing_fields:
213
+ raise ValueError(
214
+ f"Missing required fields in template {template_path}: {missing_fields}"
215
+ )
216
+
217
+ # Add the markdown content as instructions field
218
+ metadata["instructions"] = markdown_content
219
+
220
+ # Normalize metadata structure to match JSON template format
221
+ # JSON templates have these fields at top level, Markdown may have them nested
222
+ self._normalize_metadata_structure(metadata)
223
+
224
+ return metadata
225
+
226
+ def _normalize_metadata_structure(self, metadata: dict) -> None:
227
+ """Normalize metadata structure to match expected JSON template format.
228
+
229
+ This ensures both Markdown and JSON templates produce the same metadata structure
230
+ for downstream processing.
231
+
232
+ Args:
233
+ metadata: Metadata dictionary to normalize (modified in-place)
234
+ """
235
+ # Map Markdown frontmatter fields to JSON template structure
236
+ # Handle tags: YAML list vs JSON comma-separated string
237
+ if "tags" in metadata and isinstance(metadata["tags"], list):
238
+ # Keep as list for now, normalize_tools_input will handle both formats
239
+ pass
240
+
241
+ # Map agent_id to name if name is missing
242
+ if "agent_id" in metadata and "name" not in metadata:
243
+ metadata["name"] = metadata["agent_id"]
244
+
245
+ # Ensure capabilities dict exists
246
+ if "capabilities" not in metadata:
247
+ metadata["capabilities"] = {}
248
+
249
+ # Merge top-level capability fields into capabilities dict
250
+ capability_fields = ["memory_limit", "cpu_limit", "network_access"]
251
+ for field in capability_fields:
252
+ if field in metadata:
253
+ metadata["capabilities"][field] = metadata.pop(field)
254
+
255
+ # Add model to capabilities if present at top level
256
+ if "model" in metadata and "model" not in metadata["capabilities"]:
257
+ metadata["capabilities"]["model"] = metadata["model"]
258
+
259
+ def _load_base_agent_instructions(self, agent_type: str) -> str:
260
+ """Load BASE instructions for a specific agent type.
261
+
262
+ DEPRECATED: This method loads BASE_{TYPE}.md files (old pattern).
263
+ New pattern uses hierarchical BASE-AGENT.md files discovered via
264
+ _discover_base_agent_templates() and composed in build_agent_markdown().
265
+
266
+ Args:
267
+ agent_type: The type of agent (engineer, qa, ops, research, documentation)
268
+
269
+ Returns:
270
+ The BASE instructions content or empty string if not found
271
+ """
272
+ if not agent_type:
273
+ return ""
274
+
275
+ try:
276
+ # Construct BASE file name
277
+ base_file = f"BASE_{agent_type.upper()}.md"
278
+
279
+ # Try to find BASE file in agents directory
280
+ # First try current working directory structure
281
+ agents_dir = Path(__file__).parent.parent.parent.parent / "agents"
282
+ base_path = agents_dir / base_file
283
+
284
+ if not base_path.exists():
285
+ # Try packaged resources if available
286
+ try:
287
+ from importlib.resources import files
288
+
289
+ agents_package = files("claude_mpm.agents")
290
+ base_resource = agents_package / base_file
291
+ if base_resource.is_file():
292
+ content = base_resource.read_text(encoding="utf-8")
293
+ self.logger.debug(
294
+ f"Loaded BASE instructions from package: {base_file}"
295
+ )
296
+ return content
297
+ except (ImportError, Exception) as e:
298
+ self.logger.debug(
299
+ f"Could not load BASE instructions from package: {e}"
300
+ )
301
+
302
+ # Final fallback - try multiple possible locations
303
+ possible_paths = [
304
+ Path.cwd() / "src" / "claude_mpm" / "agents" / base_file,
305
+ Path(__file__).parent.parent.parent.parent / "agents" / base_file,
306
+ Path.home() / ".claude-mpm" / "agents" / base_file,
307
+ ]
308
+
309
+ for path in possible_paths:
310
+ if path.exists():
311
+ base_path = path
312
+ break
313
+ else:
314
+ self.logger.debug(
315
+ f"No BASE instructions found for type: {agent_type}"
316
+ )
317
+ return ""
318
+
319
+ if base_path.exists():
320
+ self.logger.debug(f"Loading BASE instructions from {base_path}")
321
+ return base_path.read_text(encoding="utf-8")
322
+ self.logger.debug(f"No BASE instructions found for type: {agent_type}")
323
+ return ""
324
+
325
+ except Exception as e:
326
+ self.logger.warning(
327
+ f"Error loading BASE instructions for {agent_type}: {e}"
328
+ )
329
+ return ""
330
+
331
+ def build_agent_markdown(
332
+ self,
333
+ agent_name: str,
334
+ template_path: Path,
335
+ base_agent_data: dict,
336
+ source_info: str = "unknown",
337
+ ) -> str:
338
+ """
339
+ Build a complete agent markdown file with YAML frontmatter.
340
+
341
+ Args:
342
+ agent_name: Name of the agent
343
+ template_path: Path to the agent template (JSON or Markdown file)
344
+ base_agent_data: Base agent configuration data
345
+ source_info: Source of the agent (system/project/user)
346
+
347
+ Returns:
348
+ Complete markdown content with YAML frontmatter
349
+
350
+ Raises:
351
+ FileNotFoundError: If template file doesn't exist
352
+ json.JSONDecodeError: If template JSON is invalid
353
+ yaml.YAMLError: If template YAML is invalid
354
+ ValueError: If template format is unsupported or malformed
355
+ """
356
+ if not template_path.exists():
357
+ raise FileNotFoundError(f"Template file not found: {template_path}")
358
+
359
+ # Format detection: route to appropriate parser
360
+ try:
361
+ if template_path.suffix == ".md":
362
+ # Parse Markdown template with YAML frontmatter
363
+ self.logger.debug(f"Parsing Markdown template: {template_path}")
364
+ template_data = self._parse_markdown_template(template_path)
365
+ elif template_path.suffix == ".json":
366
+ # Parse JSON template (legacy format)
367
+ self.logger.debug(f"Parsing JSON template: {template_path}")
368
+ template_content = template_path.read_text()
369
+ template_data = json.loads(template_content)
370
+ else:
371
+ raise ValueError(
372
+ f"Unsupported template format: {template_path.suffix}. "
373
+ f"Expected .md or .json"
374
+ )
375
+ except json.JSONDecodeError as e:
376
+ self.logger.error(f"Invalid JSON in template {template_path}: {e}")
377
+ raise
378
+ except (yaml.YAMLError, ValueError) as e:
379
+ self.logger.error(f"Invalid template {template_path}: {e}")
380
+ raise
381
+
382
+ # Extract tools from template with fallback
383
+ # Handle both dict and list formats for capabilities (backward compatibility)
384
+ capabilities = template_data.get("capabilities", {})
385
+ capabilities_tools = (
386
+ capabilities.get("tools") if isinstance(capabilities, dict) else None
387
+ )
388
+
389
+ # Get raw tools from various possible locations
390
+ raw_tools = (
391
+ template_data.get("tools")
392
+ or capabilities_tools
393
+ or template_data.get("configuration_fields", {}).get("tools")
394
+ )
395
+
396
+ # Normalize tools to a consistent list format
397
+ tools = self.normalize_tools_input(raw_tools)
398
+
399
+ # Log if we see non-standard tool names (info level, not warning)
400
+ standard_tools = {
401
+ "Read",
402
+ "Write",
403
+ "Edit",
404
+ "MultiEdit", # File operations
405
+ "Grep",
406
+ "Glob",
407
+ "LS", # Search and navigation
408
+ "Bash",
409
+ "BashOutput",
410
+ "KillShell", # Command execution
411
+ "TodoWrite",
412
+ "ExitPlanMode", # Task management
413
+ "WebSearch",
414
+ "WebFetch", # Web operations
415
+ "NotebookRead",
416
+ "NotebookEdit", # Jupyter notebook support
417
+ }
418
+ non_standard = [t for t in tools if t not in standard_tools]
419
+ if non_standard:
420
+ self.logger.info(f"Using non-standard tools: {non_standard}")
421
+
422
+ # Extract model from template (no fallback - preserve None if not specified)
423
+ capabilities_model = (
424
+ capabilities.get("model") if isinstance(capabilities, dict) else None
425
+ )
426
+
427
+ model = (
428
+ template_data.get("model")
429
+ or capabilities_model
430
+ or template_data.get("configuration_fields", {}).get("model")
431
+ # No default fallback - preserve None if not set
432
+ )
433
+
434
+ # Convert tools list to comma-separated string (without spaces for compatibility)
435
+ ",".join(tools)
436
+
437
+ # Map model names to Claude Code format (as required)
438
+ model_map = {
439
+ "claude-3-5-sonnet-20241022": "sonnet",
440
+ "claude-3-5-haiku-20241022": "haiku",
441
+ "claude-3-opus-20240229": "opus",
442
+ "claude-3-5-sonnet": "sonnet",
443
+ "claude-3-sonnet": "sonnet",
444
+ "claude-3-haiku": "haiku",
445
+ "claude-3-opus": "opus",
446
+ "sonnet": "sonnet",
447
+ "haiku": "haiku",
448
+ "opus": "opus",
449
+ }
450
+
451
+ # Only map model if it's not None
452
+ if model is not None:
453
+ if model in model_map:
454
+ model = model_map[model]
455
+ # If model is specified but not in map, keep as-is (no default)
456
+
457
+ # Get response format from template or use base agent default
458
+ template_data.get("response", {}).get("format", "structured")
459
+
460
+ # Create Claude Code compatible name (lowercase, hyphens only)
461
+ claude_code_name = agent_name.lower().replace("_", "-")
462
+
463
+ # CRITICAL: NO underscores allowed - they cause silent failures!
464
+
465
+ # Validate the name before proceeding
466
+ if not re.match(r"^[a-z0-9]+(-[a-z0-9]+)*$", claude_code_name):
467
+ self.logger.error(
468
+ f"Invalid agent name '{claude_code_name}' - must match ^[a-z0-9]+(-[a-z0-9]+)*$"
469
+ )
470
+ raise ValueError(
471
+ f"Agent name '{claude_code_name}' does not meet Claude Code requirements"
472
+ )
473
+
474
+ # Extract description from template with fallback
475
+ raw_description = (
476
+ template_data.get("description")
477
+ or template_data.get("metadata", {}).get("description")
478
+ or f"{agent_name.title()} agent for specialized tasks"
479
+ )
480
+
481
+ # Convert to multiline format with examples for Claude Code compatibility
482
+ description = self._create_multiline_description(
483
+ raw_description, agent_name, template_data
484
+ )
485
+
486
+ # Extract custom metadata fields
487
+ metadata = template_data.get("metadata", {})
488
+ agent_version = (
489
+ template_data.get("agent_version")
490
+ or template_data.get("version")
491
+ or metadata.get("version", "1.0.0")
492
+ )
493
+ agent_type = template_data.get("agent_type", "general")
494
+ # Use the capabilities_model we already extracted earlier
495
+ model_type = capabilities_model or "sonnet"
496
+
497
+ # Map our model types to Claude Code format
498
+ if model_type in ["opus", "sonnet", "haiku"]:
499
+ # Use inherit for now - Claude Code seems to prefer this
500
+ pass
501
+ else:
502
+ pass
503
+
504
+ # Determine color - prefer template's color, fallback to type-based defaults
505
+ template_metadata = template_data.get("metadata", {})
506
+ template_color = template_metadata.get("color")
507
+
508
+ if template_color:
509
+ # Use the color specified in the template
510
+ pass
511
+ else:
512
+ # Fallback to default color map based on agent type
513
+ color_map = {
514
+ "engineer": "blue",
515
+ "qa": "green",
516
+ "security": "red",
517
+ "research": "purple",
518
+ "documentation": "cyan", # Changed default to match template preference
519
+ "ops": "gray",
520
+ }
521
+ color_map.get(agent_type, "blue")
522
+
523
+ # Check if we should include tools field (only if significantly restricting)
524
+ # Claude Code approach: omit tools field unless specifically restricting
525
+
526
+ # Convert tools to set for comparison
527
+ agent_tools = set(tools) if isinstance(tools, list) else set(tools.split(","))
528
+
529
+ # Only include tools field if agent is missing several important tools
530
+ # This matches Claude Code's approach of omitting tools for general-purpose agents
531
+ core_tools = {"Read", "Write", "Edit", "Bash", "Grep", "Glob"}
532
+ has_core_tools = len(agent_tools.intersection(core_tools)) >= 5
533
+
534
+ # Include tools field only if agent is clearly restricted (missing core tools or very few tools)
535
+ not has_core_tools or len(agent_tools) < 6
536
+
537
+ # Build YAML frontmatter with all relevant metadata from JSON template
538
+ # Include all fields that are useful for agent management and functionality
539
+ #
540
+ # COMPREHENSIVE AGENT FRONTMATTER FORMAT:
541
+ # - name: kebab-case agent name (required)
542
+ # - description: when/why to use this agent with examples (required, multiline)
543
+ # - model: mapped model name (required)
544
+ # - type: agent type for categorization and functionality (optional but important)
545
+ # - category: organizational category (optional)
546
+ # - color: visual identifier (optional)
547
+ # - version: agent version for update tracking (optional)
548
+ # - author: creator information (optional)
549
+ # - created_at: creation timestamp (optional)
550
+ # - updated_at: last update timestamp (optional)
551
+ # - tags: list of tags for search and categorization (optional)
552
+ frontmatter_lines = [
553
+ "---",
554
+ f"name: {claude_code_name}",
555
+ ]
556
+
557
+ # Add description as single-line YAML string with \n escapes
558
+ frontmatter_lines.append(
559
+ f"description: {self._format_description_for_yaml(description)}"
560
+ )
561
+
562
+ # Add model field only if explicitly set (not required for Claude Code)
563
+ if model is not None:
564
+ frontmatter_lines.append(f"model: {model}")
565
+
566
+ # Add type field (important for agent categorization)
567
+ if agent_type and agent_type != "general":
568
+ frontmatter_lines.append(f"type: {agent_type}")
569
+
570
+ # Add optional metadata fields
571
+ if metadata.get("color"):
572
+ frontmatter_lines.append(f"color: {metadata['color']}")
573
+ if metadata.get("category"):
574
+ frontmatter_lines.append(f"category: {metadata['category']}")
575
+ # Always include version field to prevent deployment comparison issues
576
+ if agent_version:
577
+ frontmatter_lines.append(f'version: "{agent_version}"')
578
+ if metadata.get("author"):
579
+ frontmatter_lines.append(f'author: "{metadata["author"]}"')
580
+ if metadata.get("created_at"):
581
+ frontmatter_lines.append(f"created_at: {metadata['created_at']}")
582
+ if metadata.get("updated_at"):
583
+ frontmatter_lines.append(f"updated_at: {metadata['updated_at']}")
584
+ # Add tags as comma-separated string if they exist (consistent with tools format)
585
+ if metadata.get("tags") and isinstance(metadata["tags"], list):
586
+ tags_str = ",".join(metadata["tags"])
587
+ frontmatter_lines.append(f"tags: {tags_str}")
588
+
589
+ # CRITICAL: Preserve skills field from template for selective skill deployment
590
+ # Skills are used by startup.py to determine which skills to deploy
591
+ skills = template_data.get("skills", [])
592
+ if skills and isinstance(skills, list):
593
+ frontmatter_lines.append("skills:")
594
+ for skill in skills:
595
+ frontmatter_lines.append(f"- {skill}")
596
+
597
+ frontmatter_lines.extend(
598
+ [
599
+ "---",
600
+ "",
601
+ ]
602
+ )
603
+
604
+ frontmatter = "\n".join(frontmatter_lines)
605
+
606
+ # Get agent instructions from template data (primary) or base agent data (fallback)
607
+ raw_instructions = template_data.get("instructions")
608
+
609
+ # Handle dictionary instructions format
610
+ if isinstance(raw_instructions, dict):
611
+ agent_specific_instructions = self._convert_instructions_dict_to_markdown(
612
+ raw_instructions
613
+ )
614
+ else:
615
+ agent_specific_instructions = (
616
+ raw_instructions
617
+ or base_agent_data.get("content")
618
+ or base_agent_data.get("instructions")
619
+ or "# Agent Instructions\n\nThis agent provides specialized assistance."
620
+ )
621
+
622
+ # Compose hierarchical BASE-AGENT.md templates
623
+ # Order: agent-specific + local BASE + parent BASE + ... + root BASE
624
+ content_parts = [agent_specific_instructions]
625
+
626
+ # Discover BASE-AGENT.md files in directory hierarchy
627
+ base_templates = self._discover_base_agent_templates(template_path)
628
+
629
+ # Append each BASE template (order: closest to farthest)
630
+ for base_template_path in base_templates:
631
+ try:
632
+ base_content = base_template_path.read_text(encoding="utf-8")
633
+ if base_content.strip():
634
+ content_parts.append(base_content)
635
+ self.logger.debug(
636
+ 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}"
637
+ )
638
+ except Exception as e:
639
+ self.logger.warning(
640
+ f"Failed to read BASE template {base_template_path}: {e}"
641
+ )
642
+
643
+ # Fallback: Load legacy BASE_{TYPE}.md if no hierarchical templates found
644
+ if len(content_parts) == 1: # Only agent-specific instructions
645
+ legacy_base_instructions = self._load_base_agent_instructions(agent_type)
646
+ if legacy_base_instructions:
647
+ content_parts.append(legacy_base_instructions)
648
+ self.logger.debug(
649
+ f"Using legacy BASE_{agent_type.upper()}.md (no hierarchical BASE-AGENT.md found)"
650
+ )
651
+
652
+ # Join all parts with separator
653
+ content = "\n\n---\n\n".join(content_parts)
654
+
655
+ # Add memory update instructions if not already present
656
+ if "memory-update" not in content and "Remember" not in content:
657
+ memory_instructions = """
658
+
659
+ ## Memory Updates
660
+
661
+ When you learn something important about this project that would be useful for future tasks, include it in your response JSON block:
662
+
663
+ ```json
664
+ {
665
+ "memory-update": {
666
+ "Project Architecture": ["Key architectural patterns or structures"],
667
+ "Implementation Guidelines": ["Important coding standards or practices"],
668
+ "Current Technical Context": ["Project-specific technical details"]
669
+ }
670
+ }
671
+ ```
672
+
673
+ Or use the simpler "remember" field for general learnings:
674
+
675
+ ```json
676
+ {
677
+ "remember": ["Learning 1", "Learning 2"]
678
+ }
679
+ ```
680
+
681
+ Only include memories that are:
682
+ - Project-specific (not generic programming knowledge)
683
+ - Likely to be useful in future tasks
684
+ - Not already documented elsewhere
685
+ """
686
+ content = content + memory_instructions
687
+
688
+ # Combine frontmatter and content
689
+ return frontmatter + content
690
+
691
+ def build_agent_yaml(
692
+ self, agent_name: str, template_path: Path, base_agent_data: dict
693
+ ) -> str:
694
+ """
695
+ Build a complete agent YAML file by combining base agent and template.
696
+ Only includes essential fields for Claude Code best practices.
697
+
698
+ Args:
699
+ agent_name: Name of the agent
700
+ template_path: Path to the agent template JSON file
701
+ base_agent_data: Base agent configuration data
702
+
703
+ Returns:
704
+ Complete YAML content
705
+
706
+ Raises:
707
+ FileNotFoundError: If template file doesn't exist
708
+ json.JSONDecodeError: If template JSON is invalid
709
+ """
710
+ if not template_path.exists():
711
+ raise FileNotFoundError(f"Template file not found: {template_path}")
712
+
713
+ try:
714
+ template_content = template_path.read_text()
715
+ template_data = json.loads(template_content)
716
+ except json.JSONDecodeError as e:
717
+ self.logger.error(f"Invalid JSON in template {template_path}: {e}")
718
+ raise
719
+
720
+ # Merge narrative and configuration fields
721
+ self.merge_narrative_fields(base_agent_data, template_data)
722
+ merged_config = self.merge_configuration_fields(base_agent_data, template_data)
723
+
724
+ # Extract essential fields for Claude Code
725
+ name = template_data.get("name", agent_name)
726
+ description = template_data.get(
727
+ "description", f"{name} agent for specialized tasks"
728
+ )
729
+
730
+ # Get tools and model (no fallback for model)
731
+ raw_tools = merged_config.get("tools")
732
+ tools = self.normalize_tools_input(raw_tools)
733
+ model = merged_config.get("model") # No default - preserve None
734
+
735
+ # Format tools as YAML list
736
+ tools_yaml = self.format_yaml_list(tools, 2)
737
+
738
+ # Build YAML content with only essential fields
739
+ yaml_lines = [
740
+ f"name: {name}",
741
+ f"description: {description}",
742
+ ]
743
+
744
+ # Only include model if explicitly set
745
+ if model is not None:
746
+ yaml_lines.append(f"model: {model}")
747
+
748
+ yaml_lines.extend(
749
+ [
750
+ "tools:",
751
+ tools_yaml,
752
+ ]
753
+ )
754
+
755
+ return "\n".join(yaml_lines) + "\n"
756
+
757
+ def merge_narrative_fields(self, base_data: dict, template_data: dict) -> dict:
758
+ """
759
+ Merge narrative fields from base and template, combining arrays.
760
+
761
+ Args:
762
+ base_data: Base agent data
763
+ template_data: Template agent data
764
+
765
+ Returns:
766
+ Merged narrative fields
767
+ """
768
+ merged = {}
769
+
770
+ # Fields that should be combined (arrays)
771
+ combinable_fields = [
772
+ "when_to_use",
773
+ "specialized_knowledge",
774
+ "unique_capabilities",
775
+ ]
776
+
777
+ for field in combinable_fields:
778
+ base_value = base_data.get(field, [])
779
+ template_value = template_data.get(field, [])
780
+
781
+ # Ensure both are lists
782
+ if not isinstance(base_value, list):
783
+ base_value = [base_value] if base_value else []
784
+ if not isinstance(template_value, list):
785
+ template_value = [template_value] if template_value else []
786
+
787
+ # Combine and deduplicate
788
+ combined = list(set(base_value + template_value))
789
+ merged[field] = combined
790
+
791
+ return merged
792
+
793
+ def merge_configuration_fields(self, base_data: dict, template_data: dict) -> dict:
794
+ """
795
+ Merge configuration fields, with template overriding base.
796
+
797
+ Args:
798
+ base_data: Base agent data
799
+ template_data: Template agent data
800
+
801
+ Returns:
802
+ Merged configuration fields
803
+ """
804
+ merged = {}
805
+
806
+ # Start with base configuration
807
+ if "configuration_fields" in base_data:
808
+ merged.update(base_data["configuration_fields"])
809
+
810
+ # Override with template configuration
811
+ if "configuration_fields" in template_data:
812
+ merged.update(template_data["configuration_fields"])
813
+
814
+ # Also check for direct fields in template
815
+ direct_fields = ["tools", "model", "timeout", "max_tokens"]
816
+ for field in direct_fields:
817
+ if field in template_data:
818
+ merged[field] = template_data[field]
819
+
820
+ return merged
821
+
822
+ def extract_agent_metadata(self, template_content: str) -> Dict[str, Any]:
823
+ """
824
+ Extract metadata from simplified agent template content.
825
+
826
+ Args:
827
+ template_content: Agent template markdown content
828
+
829
+ Returns:
830
+ Dictionary containing extracted metadata
831
+ """
832
+ metadata = {}
833
+ current_section = None
834
+ section_content = []
835
+
836
+ lines = template_content.split("\n")
837
+
838
+ for line in lines:
839
+ line = line.strip()
840
+
841
+ # Check for section headers
842
+ if line.startswith("## "):
843
+ # Save previous section
844
+ if current_section and section_content:
845
+ metadata[current_section] = section_content.copy()
846
+
847
+ # Start new section
848
+ current_section = line[3:].lower().replace(" ", "_")
849
+ section_content = []
850
+
851
+ elif line.startswith("- ") and current_section:
852
+ # Add list item to current section
853
+ section_content.append(line[2:])
854
+
855
+ elif line and current_section and not line.startswith("#"):
856
+ # Add non-empty, non-header line to current section
857
+ section_content.append(line)
858
+
859
+ # Save final section
860
+ if current_section and section_content:
861
+ metadata[current_section] = section_content.copy()
862
+
863
+ # Ensure all required fields have defaults
864
+ metadata.setdefault("when_to_use", [])
865
+ metadata.setdefault("specialized_knowledge", [])
866
+ metadata.setdefault("unique_capabilities", [])
867
+
868
+ return metadata
869
+
870
+ def format_yaml_list(self, items: List[str], indent: int) -> str:
871
+ """
872
+ Format a list for YAML with proper indentation.
873
+
874
+ Args:
875
+ items: List of items to format
876
+ indent: Number of spaces for indentation
877
+
878
+ Returns:
879
+ Formatted YAML list string
880
+ """
881
+ if not items:
882
+ return ""
883
+
884
+ indent_str = " " * indent
885
+ formatted_items = []
886
+
887
+ for item in items:
888
+ formatted_items.append(f"{indent_str}- {item}")
889
+
890
+ return "\n".join(formatted_items)
891
+
892
+ def _create_multiline_description(
893
+ self, raw_description: str, agent_name: str, template_data: dict
894
+ ) -> str:
895
+ """
896
+ Create a comprehensive multiline description with examples for Claude Code compatibility.
897
+ Based on Claude's software-engineer.md format: detailed when/why description with examples.
898
+
899
+ Args:
900
+ raw_description: Original single-line description
901
+ agent_name: Name of the agent
902
+ template_data: Template data for extracting examples
903
+
904
+ Returns:
905
+ Formatted multiline description with examples in Claude Code format
906
+ """
907
+ raw_description = self._format_to_single_line(raw_description)
908
+
909
+ # Get agent type for creating targeted descriptions
910
+ agent_type = template_data.get("agent_type", "general")
911
+
912
+ # Create enhanced description based on agent type
913
+ enhanced_description = self._create_enhanced_description(
914
+ raw_description, agent_name, agent_type, template_data
915
+ )
916
+
917
+ # Add examples
918
+ examples = self._extract_examples_from_template(template_data, agent_name)
919
+ if not examples:
920
+ examples = self._generate_default_examples(agent_name, template_data)
921
+
922
+ # Combine enhanced description with examples
923
+ if examples:
924
+ description_parts = [enhanced_description, "", *examples]
925
+ else:
926
+ description_parts = [enhanced_description]
927
+
928
+ return "\n".join(description_parts)
929
+
930
+ def _format_to_single_line(self, description: str) -> str:
931
+ """
932
+ Format description to single line by removing line breaks and normalizing whitespace.
933
+
934
+ Args:
935
+ description: Raw description text
936
+
937
+ Returns:
938
+ Single-line formatted description
939
+ """
940
+ if not description:
941
+ return description
942
+
943
+ # Remove all line breaks and normalize whitespace
944
+ single_line = " ".join(description.strip().split())
945
+
946
+ # Remove redundant spaces around punctuation
947
+ single_line = re.sub(r"\s+([,.!?;:])", r"\1", single_line)
948
+ return re.sub(r"([,.!?;:])\s+", r"\1 ", single_line)
949
+
950
+ def _create_enhanced_description(
951
+ self,
952
+ raw_description: str,
953
+ agent_name: str,
954
+ agent_type: str,
955
+ template_data: dict,
956
+ ) -> str:
957
+ """
958
+ Create an enhanced description based on agent type that follows Claude's format.
959
+
960
+ Args:
961
+ raw_description: Original description
962
+ agent_name: Name of the agent
963
+ agent_type: Type of agent (engineer, qa, research, etc.)
964
+ template_data: Template data for additional context
965
+
966
+ Returns:
967
+ Enhanced description string
968
+ """
969
+ # Type-specific enhanced descriptions following Claude's software-engineer.md pattern
970
+ enhanced_descriptions = {
971
+ "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.",
972
+ "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.",
973
+ "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.",
974
+ "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.",
975
+ "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.",
976
+ "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.",
977
+ }
978
+
979
+ # Get the enhanced description or fallback to the original with improvements
980
+ if agent_type in enhanced_descriptions:
981
+ return enhanced_descriptions[agent_type]
982
+ # Enhance the raw description if it's a custom type
983
+ if raw_description and len(raw_description) > 10:
984
+ 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."
985
+ 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."
986
+
987
+ def _extract_examples_from_template(
988
+ self, template_data: dict, agent_name: str
989
+ ) -> List[str]:
990
+ """
991
+ Extract examples from template data and format with commentary.
992
+ Creates ONE example with commentary from template data.
993
+
994
+ Args:
995
+ template_data: Template data
996
+ agent_name: Name of the agent
997
+
998
+ Returns:
999
+ List of example strings (single example with commentary)
1000
+ """
1001
+ examples = []
1002
+
1003
+ # Check for examples in knowledge section
1004
+ knowledge = template_data.get("knowledge", {})
1005
+ template_examples = knowledge.get("examples", [])
1006
+
1007
+ if template_examples:
1008
+ # Take only the first example and add commentary
1009
+ example = template_examples[0]
1010
+ scenario = example.get("scenario", "")
1011
+ approach = example.get("approach", "")
1012
+ commentary = example.get("commentary", "")
1013
+
1014
+ if scenario and approach:
1015
+ examples.extend(
1016
+ [
1017
+ "<example>",
1018
+ f"Context: {scenario}",
1019
+ f'user: "I need help with {scenario.lower()}"',
1020
+ f'assistant: "I\'ll use the {agent_name} agent to {approach.lower()}."',
1021
+ "<commentary>",
1022
+ (
1023
+ commentary
1024
+ if commentary
1025
+ else f"This agent is well-suited for {scenario.lower()} because it specializes in {approach.lower()} with targeted expertise."
1026
+ ),
1027
+ "</commentary>",
1028
+ "</example>",
1029
+ ]
1030
+ )
1031
+
1032
+ # Check for triggers that can be converted to examples
1033
+ interactions = template_data.get("interactions", {})
1034
+ triggers = interactions.get("triggers", [])
1035
+
1036
+ if triggers and not examples:
1037
+ # Convert first trigger to example with commentary
1038
+ trigger = triggers[0]
1039
+
1040
+ # Handle both string and dict trigger formats
1041
+ if isinstance(trigger, dict):
1042
+ # New format with pattern and confidence
1043
+ trigger_text = trigger.get("pattern", "")
1044
+ else:
1045
+ # Old format with simple string
1046
+ trigger_text = str(trigger)
1047
+
1048
+ # Skip if we don't have valid trigger text
1049
+ if not trigger_text:
1050
+ return examples
1051
+
1052
+ agent_type = template_data.get("agent_type", "general")
1053
+
1054
+ examples.extend(
1055
+ [
1056
+ "<example>",
1057
+ f"Context: When user needs {trigger_text}",
1058
+ f'user: "{trigger_text}"',
1059
+ f'assistant: "I\'ll use the {agent_name} agent for {trigger_text}."',
1060
+ "<commentary>",
1061
+ f"This {agent_type} agent is appropriate because it has specialized capabilities for {trigger_text.lower()} tasks.",
1062
+ "</commentary>",
1063
+ "</example>",
1064
+ ]
1065
+ )
1066
+
1067
+ return examples
1068
+
1069
+ def _generate_default_examples(
1070
+ self, agent_name: str, template_data: dict
1071
+ ) -> List[str]:
1072
+ """
1073
+ Generate default examples when none are available in template.
1074
+ Creates ONE example with commentary for each agent type.
1075
+
1076
+ Args:
1077
+ agent_name: Name of the agent
1078
+ template_data: Template data for context
1079
+
1080
+ Returns:
1081
+ List of example strings (single example with commentary)
1082
+ """
1083
+ agent_type = template_data.get("agent_type", "general")
1084
+
1085
+ # Create type-specific examples with commentary inside
1086
+ type_examples = {
1087
+ "engineer": [
1088
+ "<example>",
1089
+ "Context: When you need to implement new features or write code.",
1090
+ 'user: "I need to add authentication to my API"',
1091
+ f'assistant: "I\'ll use the {agent_name} agent to implement a secure authentication system for your API."',
1092
+ "<commentary>",
1093
+ "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.",
1094
+ "</commentary>",
1095
+ "</example>",
1096
+ ],
1097
+ "ops": [
1098
+ "<example>",
1099
+ "Context: When you need to deploy or manage infrastructure.",
1100
+ 'user: "I need to deploy my application to the cloud"',
1101
+ f'assistant: "I\'ll use the {agent_name} agent to set up and deploy your application infrastructure."',
1102
+ "<commentary>",
1103
+ "The ops agent excels at infrastructure management and deployment automation, ensuring reliable and scalable production systems.",
1104
+ "</commentary>",
1105
+ "</example>",
1106
+ ],
1107
+ "qa": [
1108
+ "<example>",
1109
+ "Context: When you need to test or validate functionality.",
1110
+ 'user: "I need to write tests for my new feature"',
1111
+ f'assistant: "I\'ll use the {agent_name} agent to create comprehensive tests for your feature."',
1112
+ "<commentary>",
1113
+ "The QA agent specializes in comprehensive testing strategies, quality assurance validation, and creating robust test suites that ensure code reliability.",
1114
+ "</commentary>",
1115
+ "</example>",
1116
+ ],
1117
+ "research": [
1118
+ "<example>",
1119
+ "Context: When you need to investigate or analyze existing codebases.",
1120
+ 'user: "I need to understand how the authentication system works in this project"',
1121
+ f'assistant: "I\'ll use the {agent_name} agent to analyze the codebase and explain the authentication implementation."',
1122
+ "<commentary>",
1123
+ "The research agent is perfect for code exploration and analysis tasks, providing thorough investigation of existing systems while maintaining memory efficiency.",
1124
+ "</commentary>",
1125
+ "</example>",
1126
+ ],
1127
+ "security": [
1128
+ "<example>",
1129
+ "Context: When you need to review code for security vulnerabilities.",
1130
+ 'user: "I need a security review of my authentication implementation"',
1131
+ f'assistant: "I\'ll use the {agent_name} agent to conduct a thorough security analysis of your authentication code."',
1132
+ "<commentary>",
1133
+ "The security agent specializes in identifying security risks, vulnerability assessment, and ensuring applications meet security standards and best practices.",
1134
+ "</commentary>",
1135
+ "</example>",
1136
+ ],
1137
+ "documentation": [
1138
+ "<example>",
1139
+ "Context: When you need to create or update technical documentation.",
1140
+ 'user: "I need to document this new API endpoint"',
1141
+ f'assistant: "I\'ll use the {agent_name} agent to create comprehensive API documentation."',
1142
+ "<commentary>",
1143
+ "The documentation agent excels at creating clear, comprehensive technical documentation including API docs, user guides, and technical specifications.",
1144
+ "</commentary>",
1145
+ "</example>",
1146
+ ],
1147
+ }
1148
+
1149
+ return type_examples.get(
1150
+ agent_type,
1151
+ [
1152
+ "<example>",
1153
+ f"Context: When you need specialized assistance from the {agent_name} agent.",
1154
+ f'user: "I need help with {agent_name.replace("-", " ")} tasks"',
1155
+ f'assistant: "I\'ll use the {agent_name} agent to provide specialized assistance."',
1156
+ "<commentary>",
1157
+ f"This agent provides targeted expertise for {agent_name.replace('-', ' ')} related tasks and follows established best practices.",
1158
+ "</commentary>",
1159
+ "</example>",
1160
+ ],
1161
+ )
1162
+
1163
+ def _indent_multiline_text(self, text: str, spaces: int) -> str:
1164
+ """
1165
+ Indent multiline text with specified number of spaces.
1166
+
1167
+ Args:
1168
+ text: Text to indent
1169
+ spaces: Number of spaces for indentation
1170
+
1171
+ Returns:
1172
+ Indented text
1173
+ """
1174
+ if not text:
1175
+ return ""
1176
+
1177
+ indent = " " * spaces
1178
+ lines = text.split("\n")
1179
+ indented_lines = []
1180
+
1181
+ for line in lines:
1182
+ if line.strip(): # Non-empty lines get indented
1183
+ indented_lines.append(indent + line)
1184
+ else: # Empty lines stay empty
1185
+ indented_lines.append("")
1186
+
1187
+ return "\n".join(indented_lines)
1188
+
1189
+ def _format_description_for_yaml(self, description: str) -> str:
1190
+ """Format description as a single-line YAML string with escaped newlines.
1191
+
1192
+ Args:
1193
+ description: Multi-line description text
1194
+
1195
+ Returns:
1196
+ Single-line YAML-formatted string with \n escapes
1197
+ """
1198
+ if not description:
1199
+ return '""'
1200
+
1201
+ # The description already contains actual newlines, we need to escape them
1202
+ # Replace actual newlines with \n escape sequence
1203
+ escaped = description.replace("\n", "\\n")
1204
+
1205
+ # Escape any quotes in the description
1206
+ escaped = escaped.replace('"', '\\"')
1207
+
1208
+ # Return as quoted string
1209
+ return f'"{escaped}"'
1210
+
1211
+ def _convert_instructions_dict_to_markdown(self, instructions_dict: dict) -> str:
1212
+ """Convert complex instructions dictionary to markdown format.
1213
+
1214
+ Args:
1215
+ instructions_dict: Dictionary containing structured instructions
1216
+
1217
+ Returns:
1218
+ Formatted markdown string representing the instructions
1219
+ """
1220
+ if not instructions_dict:
1221
+ return "# Agent Instructions\n\nThis agent provides specialized assistance."
1222
+
1223
+ markdown_parts = []
1224
+
1225
+ # Add primary role
1226
+ if "primary_role" in instructions_dict:
1227
+ markdown_parts.extend(["# Role", "", instructions_dict["primary_role"], ""])
1228
+
1229
+ # Add core identity
1230
+ if "core_identity" in instructions_dict:
1231
+ markdown_parts.extend(
1232
+ ["## Core Identity", "", instructions_dict["core_identity"], ""]
1233
+ )
1234
+
1235
+ # Add responsibilities
1236
+ if "responsibilities" in instructions_dict:
1237
+ markdown_parts.extend(["## Responsibilities", ""])
1238
+
1239
+ responsibilities = instructions_dict["responsibilities"]
1240
+ if isinstance(responsibilities, list):
1241
+ for resp in responsibilities:
1242
+ if isinstance(resp, dict):
1243
+ area = resp.get("area", "Unknown Area")
1244
+ tasks = resp.get("tasks", [])
1245
+
1246
+ markdown_parts.extend([f"### {area}", ""])
1247
+
1248
+ if isinstance(tasks, list):
1249
+ for task in tasks:
1250
+ markdown_parts.append(f"- {task}")
1251
+
1252
+ markdown_parts.append("")
1253
+ else:
1254
+ markdown_parts.append(f"- {resp}")
1255
+
1256
+ markdown_parts.append("")
1257
+
1258
+ # Add analytical framework
1259
+ if "analytical_framework" in instructions_dict:
1260
+ framework = instructions_dict["analytical_framework"]
1261
+ if isinstance(framework, dict):
1262
+ markdown_parts.extend(["## Analytical Framework", ""])
1263
+
1264
+ for framework_area, framework_data in framework.items():
1265
+ markdown_parts.extend(
1266
+ [f"### {framework_area.replace('_', ' ').title()}", ""]
1267
+ )
1268
+
1269
+ if isinstance(framework_data, dict):
1270
+ for category, items in framework_data.items():
1271
+ markdown_parts.extend(
1272
+ [f"#### {category.replace('_', ' ').title()}", ""]
1273
+ )
1274
+
1275
+ if isinstance(items, list):
1276
+ for item in items:
1277
+ markdown_parts.append(f"- {item}")
1278
+ elif isinstance(items, str):
1279
+ markdown_parts.append(items)
1280
+
1281
+ markdown_parts.append("")
1282
+ elif isinstance(framework_data, list):
1283
+ for item in framework_data:
1284
+ markdown_parts.append(f"- {item}")
1285
+ markdown_parts.append("")
1286
+
1287
+ # Add methodologies
1288
+ if "methodologies" in instructions_dict:
1289
+ methodologies = instructions_dict["methodologies"]
1290
+ if isinstance(methodologies, dict):
1291
+ markdown_parts.extend(["## Methodologies", ""])
1292
+
1293
+ for method_name, method_data in methodologies.items():
1294
+ markdown_parts.extend(
1295
+ [f"### {method_name.replace('_', ' ').title()}", ""]
1296
+ )
1297
+
1298
+ if isinstance(method_data, dict):
1299
+ for key, value in method_data.items():
1300
+ if isinstance(value, list):
1301
+ markdown_parts.extend(
1302
+ [f"#### {key.replace('_', ' ').title()}", ""]
1303
+ )
1304
+ for item in value:
1305
+ markdown_parts.append(f"- {item}")
1306
+ markdown_parts.append("")
1307
+ elif isinstance(value, str):
1308
+ markdown_parts.extend(
1309
+ [
1310
+ f"**{key.replace('_', ' ').title()}**: {value}",
1311
+ "",
1312
+ ]
1313
+ )
1314
+
1315
+ # Add quality standards
1316
+ if "quality_standards" in instructions_dict:
1317
+ standards = instructions_dict["quality_standards"]
1318
+ if isinstance(standards, dict):
1319
+ markdown_parts.extend(["## Quality Standards", ""])
1320
+
1321
+ for standard_area, standard_items in standards.items():
1322
+ markdown_parts.extend(
1323
+ [f"### {standard_area.replace('_', ' ').title()}", ""]
1324
+ )
1325
+
1326
+ if isinstance(standard_items, list):
1327
+ for item in standard_items:
1328
+ markdown_parts.append(f"- {item}")
1329
+ elif isinstance(standard_items, str):
1330
+ markdown_parts.append(standard_items)
1331
+
1332
+ markdown_parts.append("")
1333
+
1334
+ # Add communication style
1335
+ if "communication_style" in instructions_dict:
1336
+ comm_style = instructions_dict["communication_style"]
1337
+ if isinstance(comm_style, dict):
1338
+ markdown_parts.extend(["## Communication Style", ""])
1339
+
1340
+ for style_area, style_items in comm_style.items():
1341
+ markdown_parts.extend(
1342
+ [f"### {style_area.replace('_', ' ').title()}", ""]
1343
+ )
1344
+
1345
+ if isinstance(style_items, list):
1346
+ for item in style_items:
1347
+ markdown_parts.append(f"- {item}")
1348
+ elif isinstance(style_items, str):
1349
+ markdown_parts.append(style_items)
1350
+
1351
+ markdown_parts.append("")
1352
+
1353
+ # If no specific sections were found, convert as generic dict
1354
+ if not markdown_parts:
1355
+ markdown_parts = ["# Agent Instructions", ""]
1356
+ for key, value in instructions_dict.items():
1357
+ key_title = key.replace("_", " ").title()
1358
+ if isinstance(value, str):
1359
+ markdown_parts.extend([f"## {key_title}", "", value, ""])
1360
+ elif isinstance(value, list):
1361
+ markdown_parts.extend([f"## {key_title}", ""])
1362
+ for item in value:
1363
+ markdown_parts.append(f"- {item}")
1364
+ markdown_parts.append("")
1365
+ elif isinstance(value, dict):
1366
+ markdown_parts.extend([f"## {key_title}", ""])
1367
+ # Simple dict formatting
1368
+ for subkey, subvalue in value.items():
1369
+ if isinstance(subvalue, str):
1370
+ markdown_parts.extend(
1371
+ [
1372
+ f"**{subkey.replace('_', ' ').title()}**: {subvalue}",
1373
+ "",
1374
+ ]
1375
+ )
1376
+
1377
+ return "\n".join(markdown_parts).strip()