claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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 (434) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +2 -2
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +330 -86
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +363 -220
  50. claude_mpm/cli/parser.py +24 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +124 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
  113. claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
  114. claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
  115. claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
  116. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
  117. claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
  118. claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
  119. claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
  120. claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  121. claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
  122. claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
  123. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
  124. claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
  125. claude_mpm/dashboard/static/built/dashboard.js +2 -0
  126. claude_mpm/dashboard/static/built/socket-client.js +2 -0
  127. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  128. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  129. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  130. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  131. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  132. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  133. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  134. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  135. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  136. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  137. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  138. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  139. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  140. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  141. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  142. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  143. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  144. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  145. claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
  146. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  147. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
  148. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  149. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  150. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  151. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  152. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  153. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  154. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  155. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  156. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  157. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  158. claude_mpm/dashboard/static/js/socket-client.js +133 -53
  159. claude_mpm/dashboard/templates/index.html +40 -50
  160. claude_mpm/experimental/cli_enhancements.py +60 -58
  161. claude_mpm/generators/__init__.py +1 -1
  162. claude_mpm/generators/agent_profile_generator.py +75 -65
  163. claude_mpm/hooks/__init__.py +1 -1
  164. claude_mpm/hooks/base_hook.py +33 -28
  165. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  166. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  167. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  168. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  169. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  170. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  171. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  172. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  173. claude_mpm/hooks/memory_integration_hook.py +140 -100
  174. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  175. claude_mpm/hooks/validation_hooks.py +57 -49
  176. claude_mpm/init.py +145 -121
  177. claude_mpm/models/__init__.py +9 -9
  178. claude_mpm/models/agent_definition.py +33 -23
  179. claude_mpm/models/agent_session.py +228 -200
  180. claude_mpm/scripts/__init__.py +1 -1
  181. claude_mpm/scripts/socketio_daemon.py +192 -75
  182. claude_mpm/scripts/socketio_server_manager.py +328 -0
  183. claude_mpm/scripts/start_activity_logging.py +25 -22
  184. claude_mpm/services/__init__.py +68 -43
  185. claude_mpm/services/agent_capabilities_service.py +271 -0
  186. claude_mpm/services/agents/__init__.py +23 -32
  187. claude_mpm/services/agents/deployment/__init__.py +3 -3
  188. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  189. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  190. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  191. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  192. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  193. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  194. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  195. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  196. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  197. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  198. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  199. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  200. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  201. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  202. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  203. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  204. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  205. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  206. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  207. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  208. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  209. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  210. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  211. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  212. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  213. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  214. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  215. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  216. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  217. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  218. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  219. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  220. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  221. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  222. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  223. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  224. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  225. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  226. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  227. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  228. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  229. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  230. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  231. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  232. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  233. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  234. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  235. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  236. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  237. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  238. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  239. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  240. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  241. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  242. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  243. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  244. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  245. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  246. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  247. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  248. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  249. claude_mpm/services/agents/loading/__init__.py +2 -2
  250. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  251. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  252. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  253. claude_mpm/services/agents/management/__init__.py +2 -2
  254. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  255. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  256. claude_mpm/services/agents/memory/__init__.py +9 -6
  257. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  258. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  259. claude_mpm/services/agents/memory/analyzer.py +430 -0
  260. claude_mpm/services/agents/memory/content_manager.py +376 -0
  261. claude_mpm/services/agents/memory/template_generator.py +468 -0
  262. claude_mpm/services/agents/registry/__init__.py +7 -10
  263. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  264. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  265. claude_mpm/services/async_session_logger.py +187 -153
  266. claude_mpm/services/claude_session_logger.py +87 -72
  267. claude_mpm/services/command_handler_service.py +217 -0
  268. claude_mpm/services/communication/__init__.py +3 -2
  269. claude_mpm/services/core/__init__.py +50 -97
  270. claude_mpm/services/core/base.py +60 -53
  271. claude_mpm/services/core/interfaces/__init__.py +188 -0
  272. claude_mpm/services/core/interfaces/agent.py +351 -0
  273. claude_mpm/services/core/interfaces/communication.py +343 -0
  274. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  275. claude_mpm/services/core/interfaces/service.py +434 -0
  276. claude_mpm/services/core/interfaces.py +19 -944
  277. claude_mpm/services/event_aggregator.py +208 -170
  278. claude_mpm/services/exceptions.py +387 -308
  279. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  280. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  281. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  282. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  283. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  284. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  285. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  286. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  287. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  288. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  289. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  290. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  291. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  292. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  293. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  294. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  295. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  296. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  297. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  298. claude_mpm/services/hook_service.py +106 -114
  299. claude_mpm/services/infrastructure/__init__.py +7 -5
  300. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  301. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  302. claude_mpm/services/infrastructure/logging.py +83 -76
  303. claude_mpm/services/infrastructure/monitoring.py +547 -404
  304. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  305. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  306. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  307. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  308. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  309. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  310. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  311. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  312. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  313. claude_mpm/services/mcp_gateway/main.py +287 -137
  314. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  315. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  316. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  317. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  318. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  319. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  320. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  321. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  322. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  323. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  324. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  325. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  326. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  327. claude_mpm/services/memory/__init__.py +2 -2
  328. claude_mpm/services/memory/builder.py +451 -362
  329. claude_mpm/services/memory/cache/__init__.py +2 -2
  330. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  331. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  332. claude_mpm/services/memory/indexed_memory.py +195 -193
  333. claude_mpm/services/memory/optimizer.py +267 -234
  334. claude_mpm/services/memory/router.py +571 -263
  335. claude_mpm/services/memory_hook_service.py +237 -0
  336. claude_mpm/services/port_manager.py +575 -0
  337. claude_mpm/services/project/__init__.py +3 -3
  338. claude_mpm/services/project/analyzer.py +451 -305
  339. claude_mpm/services/project/registry.py +262 -240
  340. claude_mpm/services/recovery_manager.py +287 -231
  341. claude_mpm/services/response_tracker.py +87 -67
  342. claude_mpm/services/runner_configuration_service.py +587 -0
  343. claude_mpm/services/session_management_service.py +304 -0
  344. claude_mpm/services/socketio/__init__.py +4 -4
  345. claude_mpm/services/socketio/client_proxy.py +174 -0
  346. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  347. claude_mpm/services/socketio/handlers/base.py +44 -30
  348. claude_mpm/services/socketio/handlers/connection.py +166 -64
  349. claude_mpm/services/socketio/handlers/file.py +123 -108
  350. claude_mpm/services/socketio/handlers/git.py +607 -373
  351. claude_mpm/services/socketio/handlers/hook.py +185 -0
  352. claude_mpm/services/socketio/handlers/memory.py +4 -4
  353. claude_mpm/services/socketio/handlers/project.py +4 -4
  354. claude_mpm/services/socketio/handlers/registry.py +53 -38
  355. claude_mpm/services/socketio/server/__init__.py +18 -0
  356. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  357. claude_mpm/services/socketio/server/core.py +399 -0
  358. claude_mpm/services/socketio/server/main.py +323 -0
  359. claude_mpm/services/socketio_client_manager.py +160 -133
  360. claude_mpm/services/socketio_server.py +36 -1885
  361. claude_mpm/services/subprocess_launcher_service.py +316 -0
  362. claude_mpm/services/system_instructions_service.py +258 -0
  363. claude_mpm/services/ticket_manager.py +19 -533
  364. claude_mpm/services/utility_service.py +285 -0
  365. claude_mpm/services/version_control/__init__.py +18 -21
  366. claude_mpm/services/version_control/branch_strategy.py +20 -10
  367. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  368. claude_mpm/services/version_control/git_operations.py +52 -21
  369. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  370. claude_mpm/services/version_control/version_parser.py +145 -125
  371. claude_mpm/services/version_service.py +270 -0
  372. claude_mpm/storage/__init__.py +2 -2
  373. claude_mpm/storage/state_storage.py +177 -181
  374. claude_mpm/ticket_wrapper.py +2 -2
  375. claude_mpm/utils/__init__.py +2 -2
  376. claude_mpm/utils/agent_dependency_loader.py +453 -243
  377. claude_mpm/utils/config_manager.py +157 -118
  378. claude_mpm/utils/console.py +1 -1
  379. claude_mpm/utils/dependency_cache.py +102 -107
  380. claude_mpm/utils/dependency_manager.py +52 -47
  381. claude_mpm/utils/dependency_strategies.py +131 -96
  382. claude_mpm/utils/environment_context.py +110 -102
  383. claude_mpm/utils/error_handler.py +75 -55
  384. claude_mpm/utils/file_utils.py +80 -67
  385. claude_mpm/utils/framework_detection.py +12 -11
  386. claude_mpm/utils/import_migration_example.py +12 -60
  387. claude_mpm/utils/imports.py +48 -45
  388. claude_mpm/utils/path_operations.py +100 -93
  389. claude_mpm/utils/robust_installer.py +172 -164
  390. claude_mpm/utils/session_logging.py +30 -23
  391. claude_mpm/utils/subprocess_utils.py +99 -61
  392. claude_mpm/validation/__init__.py +1 -1
  393. claude_mpm/validation/agent_validator.py +151 -111
  394. claude_mpm/validation/frontmatter_validator.py +92 -71
  395. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
  396. claude_mpm-4.0.4.dist-info/RECORD +417 -0
  397. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
  398. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
  399. claude_mpm/cli/commands/run_guarded.py +0 -511
  400. claude_mpm/config/memory_guardian_config.py +0 -325
  401. claude_mpm/config/memory_guardian_yaml.py +0 -335
  402. claude_mpm/core/config_paths.py +0 -150
  403. claude_mpm/core/memory_aware_runner.py +0 -353
  404. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  405. claude_mpm/deployment_paths.py +0 -261
  406. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  407. claude_mpm/models/state_models.py +0 -433
  408. claude_mpm/services/agent/__init__.py +0 -24
  409. claude_mpm/services/agent/deployment.py +0 -2548
  410. claude_mpm/services/agent/management.py +0 -598
  411. claude_mpm/services/agent/registry.py +0 -813
  412. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  413. claude_mpm/services/communication/socketio.py +0 -1935
  414. claude_mpm/services/communication/websocket.py +0 -479
  415. claude_mpm/services/framework_claude_md_generator.py +0 -624
  416. claude_mpm/services/health_monitor.py +0 -893
  417. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  418. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  419. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  420. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  421. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  422. claude_mpm/services/infrastructure/state_manager.py +0 -774
  423. claude_mpm/services/mcp_gateway/manager.py +0 -334
  424. claude_mpm/services/optimized_hook_service.py +0 -542
  425. claude_mpm/services/project_analyzer.py +0 -864
  426. claude_mpm/services/project_registry.py +0 -608
  427. claude_mpm/services/standalone_socketio_server.py +0 -1300
  428. claude_mpm/services/ticket_manager_di.py +0 -318
  429. claude_mpm/services/ticketing_service_original.py +0 -510
  430. claude_mpm/utils/paths.py +0 -395
  431. claude_mpm/utils/platform_memory.py +0 -524
  432. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  433. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
  434. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
@@ -1,598 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Agent Management Service
4
- ========================
5
-
6
- Comprehensive service for managing agent definitions with CRUD operations,
7
- section extraction/updates, and version management.
8
-
9
- Uses python-frontmatter and mistune for markdown parsing as recommended.
10
- """
11
-
12
- import os
13
- import re
14
- import json
15
- import yaml
16
- import logging
17
- from pathlib import Path
18
- from typing import Dict, List, Optional, Tuple, Any
19
- from datetime import datetime
20
-
21
- import frontmatter
22
- import mistune
23
-
24
- from claude_mpm.models.agent_definition import (
25
- AgentDefinition, AgentMetadata, AgentType,
26
- AgentSection, AgentWorkflow, AgentPermissions
27
- )
28
- from ..deployment.agent_versioning import AgentVersionManager
29
- from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
30
- from claude_mpm.utils.paths import PathResolver
31
- from claude_mpm.core.config_paths import ConfigPaths
32
-
33
- logger = logging.getLogger(__name__)
34
-
35
-
36
- class AgentManager:
37
- """Manages agent definitions with CRUD operations and versioning."""
38
-
39
- def __init__(self, framework_dir: Optional[Path] = None, project_dir: Optional[Path] = None):
40
- """
41
- Initialize AgentManager.
42
-
43
- Args:
44
- framework_dir: Path to agents templates directory
45
- project_dir: Path to project-specific agents directory
46
- """
47
- # Use PathResolver for consistent path discovery
48
- if framework_dir is None:
49
- try:
50
- # Use agents templates directory
51
- self.framework_dir = Path(__file__).parent.parent / "agents" / "templates"
52
- except Exception:
53
- # Fallback to agents directory
54
- self.framework_dir = PathResolver.get_agents_dir()
55
- else:
56
- self.framework_dir = framework_dir
57
-
58
- if project_dir is None:
59
- project_root = PathResolver.get_project_root()
60
- # Use direct agents directory without subdirectory to match deployment expectations
61
- self.project_dir = project_root / ConfigPaths.CONFIG_DIR / "agents"
62
- else:
63
- self.project_dir = project_dir
64
- self.version_manager = AgentVersionManager()
65
- self.cache = SharedPromptCache.get_instance()
66
- self._markdown = mistune.create_markdown()
67
-
68
- def create_agent(self, name: str, definition: AgentDefinition, location: str = "project") -> Path:
69
- """
70
- Create a new agent definition file.
71
-
72
- Args:
73
- name: Agent name (e.g., "performance-agent")
74
- definition: Agent definition object
75
- location: "project" or "framework"
76
-
77
- Returns:
78
- Path to created file
79
- """
80
- # Determine target directory
81
- target_dir = self.project_dir if location == "project" else self.framework_dir
82
- target_dir.mkdir(parents=True, exist_ok=True)
83
-
84
- # Generate markdown content
85
- content = self._definition_to_markdown(definition)
86
-
87
- # Write file
88
- file_path = target_dir / f"{name}.md"
89
- file_path.write_text(content, encoding='utf-8')
90
-
91
- # Clear cache
92
- self._clear_agent_cache(name)
93
-
94
- logger.info(f"Created agent '{name}' at {file_path}")
95
- return file_path
96
-
97
- def read_agent(self, name: str) -> Optional[AgentDefinition]:
98
- """
99
- Read an agent definition.
100
-
101
- Args:
102
- name: Agent name (without .md extension)
103
-
104
- Returns:
105
- AgentDefinition or None if not found
106
- """
107
- # Try to find the agent file
108
- agent_path = self._find_agent_file(name)
109
- if not agent_path:
110
- logger.warning(f"Agent '{name}' not found")
111
- return None
112
-
113
- try:
114
- # Read and parse the file
115
- content = agent_path.read_text(encoding='utf-8')
116
- return self._parse_agent_markdown(content, name, str(agent_path))
117
- except Exception as e:
118
- logger.error(f"Error reading agent '{name}': {e}")
119
- return None
120
-
121
- def update_agent(self, name: str, updates: Dict[str, Any],
122
- increment_version: bool = True) -> Optional[AgentDefinition]:
123
- """
124
- Update an agent definition.
125
-
126
- Args:
127
- name: Agent name
128
- updates: Dictionary of updates to apply
129
- increment_version: Whether to increment serial version
130
-
131
- Returns:
132
- Updated AgentDefinition or None if failed
133
- """
134
- # Read current definition
135
- agent_def = self.read_agent(name)
136
- if not agent_def:
137
- return None
138
-
139
- # Apply updates
140
- for key, value in updates.items():
141
- if hasattr(agent_def, key):
142
- setattr(agent_def, key, value)
143
- elif key in ["type", "model_preference", "tags", "specializations"]:
144
- setattr(agent_def.metadata, key, value)
145
-
146
- # Increment version if requested
147
- if increment_version:
148
- agent_def.metadata.increment_serial_version()
149
- agent_def.metadata.last_updated = datetime.now()
150
-
151
- # Write back
152
- agent_path = self._find_agent_file(name)
153
- if agent_path:
154
- content = self._definition_to_markdown(agent_def)
155
- agent_path.write_text(content, encoding='utf-8')
156
-
157
- # Clear cache
158
- self._clear_agent_cache(name)
159
-
160
- logger.info(f"Updated agent '{name}' to version {agent_def.metadata.version}")
161
- return agent_def
162
-
163
- return None
164
-
165
- def update_section(self, name: str, section: AgentSection, content: str,
166
- increment_version: bool = True) -> Optional[AgentDefinition]:
167
- """
168
- Update a specific section of an agent.
169
-
170
- Args:
171
- name: Agent name
172
- section: Section to update
173
- content: New section content
174
- increment_version: Whether to increment version
175
-
176
- Returns:
177
- Updated AgentDefinition or None
178
- """
179
- agent_def = self.read_agent(name)
180
- if not agent_def:
181
- return None
182
-
183
- # Map section to attribute
184
- section_map = {
185
- AgentSection.PRIMARY_ROLE: "primary_role",
186
- AgentSection.CAPABILITIES: "capabilities",
187
- AgentSection.TOOLS: "tools_commands",
188
- AgentSection.ESCALATION: "escalation_triggers",
189
- AgentSection.KPI: "kpis",
190
- AgentSection.DEPENDENCIES: "dependencies"
191
- }
192
-
193
- if section in section_map:
194
- attr_name = section_map[section]
195
- if section in [AgentSection.CAPABILITIES, AgentSection.ESCALATION,
196
- AgentSection.KPI, AgentSection.DEPENDENCIES]:
197
- # Parse list content
198
- setattr(agent_def, attr_name, self._parse_list_content(content))
199
- else:
200
- setattr(agent_def, attr_name, content.strip())
201
-
202
- # Special handling for complex sections
203
- elif section == AgentSection.WHEN_TO_USE:
204
- agent_def.when_to_use = self._parse_when_to_use(content)
205
- elif section == AgentSection.AUTHORITY:
206
- agent_def.authority = self._parse_authority(content)
207
- elif section == AgentSection.WORKFLOWS:
208
- agent_def.workflows = self._parse_workflows(content)
209
-
210
- # Update raw section
211
- agent_def.raw_sections[section.value] = content
212
-
213
- # Increment version
214
- if increment_version:
215
- agent_def.metadata.increment_serial_version()
216
- agent_def.metadata.last_updated = datetime.now()
217
-
218
- # Write back
219
- return self.update_agent(name, {}, increment_version=False)
220
-
221
- def delete_agent(self, name: str) -> bool:
222
- """
223
- Delete an agent definition.
224
-
225
- Args:
226
- name: Agent name
227
-
228
- Returns:
229
- True if deleted, False otherwise
230
- """
231
- agent_path = self._find_agent_file(name)
232
- if not agent_path:
233
- return False
234
-
235
- try:
236
- agent_path.unlink()
237
- self._clear_agent_cache(name)
238
- logger.info(f"Deleted agent '{name}'")
239
- return True
240
- except Exception as e:
241
- logger.error(f"Error deleting agent '{name}': {e}")
242
- return False
243
-
244
- def list_agents(self, location: Optional[str] = None) -> Dict[str, Dict[str, Any]]:
245
- """
246
- List all available agents.
247
-
248
- Args:
249
- location: Filter by location ("project", "framework", or None for all)
250
-
251
- Returns:
252
- Dictionary of agent info
253
- """
254
- agents = {}
255
-
256
- # Check framework agents
257
- if location in [None, "framework"]:
258
- for agent_file in self.framework_dir.glob("*.md"):
259
- if agent_file.name != "base_agent.md":
260
- agent_name = agent_file.stem
261
- agent_def = self.read_agent(agent_name)
262
- if agent_def:
263
- agents[agent_name] = {
264
- "location": "framework",
265
- "path": str(agent_file),
266
- "version": agent_def.metadata.version,
267
- "type": agent_def.metadata.type.value,
268
- "specializations": agent_def.metadata.specializations
269
- }
270
-
271
- # Check project agents
272
- if location in [None, "project"] and self.project_dir.exists():
273
- for agent_file in self.project_dir.glob("*.md"):
274
- agent_name = agent_file.stem
275
- agent_def = self.read_agent(agent_name)
276
- if agent_def:
277
- agents[agent_name] = {
278
- "location": "project",
279
- "path": str(agent_file),
280
- "version": agent_def.metadata.version,
281
- "type": agent_def.metadata.type.value,
282
- "specializations": agent_def.metadata.specializations
283
- }
284
-
285
- return agents
286
-
287
- def get_agent_api(self, name: str) -> Optional[Dict[str, Any]]:
288
- """
289
- Get agent data in API-friendly format.
290
-
291
- Args:
292
- name: Agent name
293
-
294
- Returns:
295
- Agent data dictionary or None
296
- """
297
- agent_def = self.read_agent(name)
298
- if not agent_def:
299
- return None
300
-
301
- return agent_def.to_dict()
302
-
303
- # Private helper methods
304
-
305
- def _find_agent_file(self, name: str) -> Optional[Path]:
306
- """Find agent file in project or framework directories."""
307
- # Check project first (higher precedence)
308
- if self.project_dir.exists():
309
- project_path = self.project_dir / f"{name}.md"
310
- if project_path.exists():
311
- return project_path
312
-
313
- # Check framework
314
- framework_path = self.framework_dir / f"{name}.md"
315
- if framework_path.exists():
316
- return framework_path
317
-
318
- return None
319
-
320
- def _parse_agent_markdown(self, content: str, name: str, file_path: str) -> AgentDefinition:
321
- """Parse markdown content into AgentDefinition."""
322
- # Parse frontmatter
323
- post = frontmatter.loads(content)
324
-
325
- # Extract metadata
326
- metadata = AgentMetadata(
327
- type=AgentType(post.metadata.get("type", "core")),
328
- model_preference=post.metadata.get("model_preference", "claude-3-sonnet"),
329
- version=post.metadata.get("version", "1.0.0"),
330
- last_updated=post.metadata.get("last_updated"),
331
- author=post.metadata.get("author"),
332
- tags=post.metadata.get("tags", []),
333
- specializations=post.metadata.get("specializations", [])
334
- )
335
-
336
- # Extract version from content if not in frontmatter
337
- if not post.metadata.get("version"):
338
- version = self.version_manager.extract_version_from_markdown(content)
339
- if version:
340
- metadata.version = version
341
-
342
- # Parse sections
343
- sections = self._extract_sections(post.content)
344
-
345
- # Extract title
346
- title_match = re.search(r'^#\s+(.+)$', post.content, re.MULTILINE)
347
- title = title_match.group(1) if title_match else name.replace('-', ' ').title()
348
-
349
- # Build definition
350
- definition = AgentDefinition(
351
- name=name,
352
- title=title,
353
- file_path=file_path,
354
- metadata=metadata,
355
- primary_role=sections.get("Primary Role", ""),
356
- when_to_use=self._parse_when_to_use(sections.get("When to Use This Agent", "")),
357
- capabilities=self._parse_list_content(sections.get("Core Capabilities", "")),
358
- authority=self._parse_authority(sections.get("Authority & Permissions", "")),
359
- workflows=self._parse_workflows(sections.get("Agent-Specific Workflows", "")),
360
- escalation_triggers=self._parse_list_content(sections.get("Unique Escalation Triggers", "")),
361
- kpis=self._parse_list_content(sections.get("Key Performance Indicators", "")),
362
- dependencies=self._parse_list_content(sections.get("Critical Dependencies", "")),
363
- tools_commands=sections.get("Specialized Tools/Commands", ""),
364
- raw_content=content,
365
- raw_sections=sections
366
- )
367
-
368
- return definition
369
-
370
- def _extract_sections(self, content: str) -> Dict[str, str]:
371
- """Extract sections from markdown content."""
372
- sections = {}
373
- current_section = None
374
- current_content = []
375
-
376
- # Split into lines
377
- lines = content.split('\n')
378
-
379
- for line in lines:
380
- # Check if this is a section header
381
- header_match = re.match(r'^##\s+(?:🎯|🔧|🔑|📋|🚨|📊|🔄|🛠️)?\s*(.+)$', line)
382
- if header_match:
383
- # Save previous section
384
- if current_section:
385
- sections[current_section] = '\n'.join(current_content).strip()
386
-
387
- # Start new section
388
- current_section = header_match.group(1).strip()
389
- current_content = []
390
- else:
391
- # Add to current section
392
- if current_section:
393
- current_content.append(line)
394
-
395
- # Save last section
396
- if current_section:
397
- sections[current_section] = '\n'.join(current_content).strip()
398
-
399
- return sections
400
-
401
- def _parse_list_content(self, content: str) -> List[str]:
402
- """Parse bullet point or numbered list content."""
403
- items = []
404
- for line in content.split('\n'):
405
- # Match bullet points or numbered items
406
- match = re.match(r'^[-*•]\s+(.+)$|^\d+\.\s+(.+)$', line.strip())
407
- if match:
408
- item = match.group(1) or match.group(2)
409
- items.append(item.strip())
410
- return items
411
-
412
- def _parse_when_to_use(self, content: str) -> Dict[str, List[str]]:
413
- """Parse When to Use section."""
414
- result = {"select": [], "do_not_select": []}
415
- current_mode = None
416
-
417
- for line in content.split('\n'):
418
- if "Select this agent when:" in line or "**Select this agent when:**" in line:
419
- current_mode = "select"
420
- elif "Do NOT select for:" in line or "**Do NOT select for:**" in line:
421
- current_mode = "do_not_select"
422
- elif current_mode and line.strip().startswith('-'):
423
- item = line.strip()[1:].strip()
424
- result[current_mode].append(item)
425
-
426
- return result
427
-
428
- def _parse_authority(self, content: str) -> AgentPermissions:
429
- """Parse Authority & Permissions section."""
430
- permissions = AgentPermissions()
431
- current_section = None
432
-
433
- for line in content.split('\n'):
434
- if "Exclusive Write Access" in line:
435
- current_section = "write"
436
- elif "Forbidden Operations" in line:
437
- current_section = "forbidden"
438
- elif "Read Access" in line:
439
- current_section = "read"
440
- elif current_section and line.strip().startswith('-'):
441
- item = line.strip()[1:].strip()
442
- # Remove inline comments
443
- item = re.sub(r'\s*#.*$', '', item).strip()
444
-
445
- if current_section == "write":
446
- permissions.exclusive_write_access.append(item)
447
- elif current_section == "forbidden":
448
- permissions.forbidden_operations.append(item)
449
- elif current_section == "read":
450
- permissions.read_access.append(item)
451
-
452
- return permissions
453
-
454
- def _parse_workflows(self, content: str) -> List[AgentWorkflow]:
455
- """Parse workflows from YAML blocks."""
456
- workflows = []
457
-
458
- # Find all YAML blocks
459
- yaml_blocks = re.findall(r'```yaml\n(.*?)\n```', content, re.DOTALL)
460
-
461
- for block in yaml_blocks:
462
- try:
463
- data = yaml.safe_load(block)
464
- if isinstance(data, dict) and all(k in data for k in ["trigger", "process", "output"]):
465
- # Extract workflow name from preceding heading if available
466
- name_match = re.search(r'###\s+(.+)\n```yaml\n' + re.escape(block), content)
467
- name = name_match.group(1) if name_match else "Unnamed Workflow"
468
-
469
- workflow = AgentWorkflow(
470
- name=name,
471
- trigger=data["trigger"],
472
- process=data["process"] if isinstance(data["process"], list) else [data["process"]],
473
- output=data["output"],
474
- raw_yaml=block
475
- )
476
- workflows.append(workflow)
477
- except yaml.YAMLError:
478
- logger.warning("Failed to parse YAML workflow block")
479
-
480
- return workflows
481
-
482
- def _definition_to_markdown(self, definition: AgentDefinition) -> str:
483
- """Convert AgentDefinition back to markdown."""
484
- # Start with frontmatter
485
- frontmatter_data = {
486
- "type": definition.metadata.type.value,
487
- "model_preference": definition.metadata.model_preference,
488
- "version": definition.metadata.version,
489
- "last_updated": definition.metadata.last_updated,
490
- "author": definition.metadata.author,
491
- "tags": definition.metadata.tags,
492
- "specializations": definition.metadata.specializations
493
- }
494
-
495
- # Remove None values
496
- frontmatter_data = {k: v for k, v in frontmatter_data.items() if v is not None}
497
-
498
- # Build content
499
- content = []
500
- content.append(f"# {definition.title}\n")
501
-
502
- # Primary Role
503
- content.append("## 🎯 Primary Role")
504
- content.append(definition.primary_role)
505
- content.append("")
506
-
507
- # When to Use
508
- content.append("## 🎯 When to Use This Agent")
509
- content.append("")
510
- content.append("**Select this agent when:**")
511
- for item in definition.when_to_use.get("select", []):
512
- content.append(f"- {item}")
513
- content.append("")
514
- content.append("**Do NOT select for:**")
515
- for item in definition.when_to_use.get("do_not_select", []):
516
- content.append(f"- {item}")
517
- content.append("")
518
-
519
- # Capabilities
520
- content.append("## 🔧 Core Capabilities")
521
- for capability in definition.capabilities:
522
- content.append(f"- {capability}")
523
- content.append("")
524
-
525
- # Authority
526
- content.append("## 🔑 Authority & Permissions")
527
- content.append("")
528
- content.append("### ✅ Exclusive Write Access")
529
- for item in definition.authority.exclusive_write_access:
530
- content.append(f"- {item}")
531
- content.append("")
532
- content.append("### ❌ Forbidden Operations")
533
- for item in definition.authority.forbidden_operations:
534
- content.append(f"- {item}")
535
- content.append("")
536
-
537
- # Workflows
538
- if definition.workflows:
539
- content.append("## 📋 Agent-Specific Workflows")
540
- content.append("")
541
- for workflow in definition.workflows:
542
- content.append(f"### {workflow.name}")
543
- content.append("```yaml")
544
- yaml_content = {
545
- "trigger": workflow.trigger,
546
- "process": workflow.process,
547
- "output": workflow.output
548
- }
549
- content.append(yaml.dump(yaml_content, default_flow_style=False).strip())
550
- content.append("```")
551
- content.append("")
552
-
553
- # Escalation
554
- if definition.escalation_triggers:
555
- content.append("## 🚨 Unique Escalation Triggers")
556
- for trigger in definition.escalation_triggers:
557
- content.append(f"- {trigger}")
558
- content.append("")
559
-
560
- # KPIs
561
- if definition.kpis:
562
- content.append("## 📊 Key Performance Indicators")
563
- for i, kpi in enumerate(definition.kpis, 1):
564
- content.append(f"{i}. {kpi}")
565
- content.append("")
566
-
567
- # Dependencies
568
- if definition.dependencies:
569
- content.append("## 🔄 Critical Dependencies")
570
- for dep in definition.dependencies:
571
- content.append(f"- {dep}")
572
- content.append("")
573
-
574
- # Tools
575
- if definition.tools_commands:
576
- content.append("## 🛠️ Specialized Tools/Commands")
577
- content.append(definition.tools_commands)
578
- content.append("")
579
-
580
- # Footer
581
- content.append("---")
582
- content.append(f"**Agent Type**: {definition.metadata.type.value}")
583
- content.append(f"**Model Preference**: {definition.metadata.model_preference}")
584
- content.append(f"**Version**: {definition.metadata.version}")
585
- if definition.metadata.last_updated:
586
- content.append(f"**Last Updated**: {definition.metadata.last_updated.strftime('%Y-%m-%d %H:%M:%S')}")
587
-
588
- # Combine with frontmatter
589
- post = frontmatter.Post('\n'.join(content), **frontmatter_data)
590
- return frontmatter.dumps(post)
591
-
592
- def _clear_agent_cache(self, name: str):
593
- """Clear cache for a specific agent."""
594
- try:
595
- cache_key = f"agent_prompt:{name}:md"
596
- self.cache.invalidate(cache_key)
597
- except Exception as e:
598
- logger.warning(f"Failed to clear cache for agent '{name}': {e}")