claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__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 (411) 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 +155 -0
  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 +1 -1
  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 +90 -49
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +21 -18
  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 +143 -762
  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 +203 -81
  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 +305 -197
  50. claude_mpm/cli/parser.py +24 -1150
  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 +104 -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 +217 -0
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +36 -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/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +571 -0
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +40 -23
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
  298. claude_mpm/services/mcp_gateway/main.py +307 -127
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
  303. claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +20 -534
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +9 -0
  358. claude_mpm/storage/state_storage.py +552 -0
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/config/memory_guardian_config.py +0 -325
  385. claude_mpm/core/config_paths.py +0 -150
  386. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  387. claude_mpm/deployment_paths.py +0 -261
  388. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  389. claude_mpm/models/state_models.py +0 -433
  390. claude_mpm/services/agent/__init__.py +0 -24
  391. claude_mpm/services/agent/deployment.py +0 -2548
  392. claude_mpm/services/agent/management.py +0 -598
  393. claude_mpm/services/agent/registry.py +0 -813
  394. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  395. claude_mpm/services/communication/socketio.py +0 -1935
  396. claude_mpm/services/communication/websocket.py +0 -479
  397. claude_mpm/services/framework_claude_md_generator.py +0 -624
  398. claude_mpm/services/health_monitor.py +0 -893
  399. claude_mpm/services/infrastructure/memory_guardian.py +0 -770
  400. claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
  401. claude_mpm/services/optimized_hook_service.py +0 -542
  402. claude_mpm/services/project_analyzer.py +0 -864
  403. claude_mpm/services/project_registry.py +0 -608
  404. claude_mpm/services/standalone_socketio_server.py +0 -1300
  405. claude_mpm/services/ticket_manager_di.py +0 -318
  406. claude_mpm/services/ticketing_service_original.py +0 -510
  407. claude_mpm/utils/paths.py +0 -395
  408. claude_mpm/utils/platform_memory.py +0 -524
  409. claude_mpm-3.9.9.dist-info/RECORD +0 -293
  410. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  411. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,587 @@
1
+ from pathlib import Path
2
+
3
+ """Runner configuration service for initializing and configuring ClaudeRunner.
4
+
5
+ This service handles:
6
+ 1. Service registration and dependency injection setup
7
+ 2. Configuration loading and validation
8
+ 3. Logger initialization (project and response loggers)
9
+ 4. Session management setup
10
+ 5. Hook service registration
11
+
12
+ Extracted from ClaudeRunner to follow Single Responsibility Principle.
13
+ """
14
+
15
+ import os
16
+ from typing import Any, Dict, List, Optional, Tuple
17
+
18
+ from claude_mpm.core.base_service import BaseService
19
+ from claude_mpm.core.config import Config
20
+ from claude_mpm.core.container import ServiceLifetime, get_container
21
+ from claude_mpm.core.logger import get_project_logger
22
+ from claude_mpm.core.logging_config import get_logger
23
+ from claude_mpm.services.core.interfaces import RunnerConfigurationInterface
24
+
25
+
26
+ class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
27
+ """Service for configuring and initializing ClaudeRunner components."""
28
+
29
+ def __init__(self):
30
+ """Initialize the runner configuration service."""
31
+ super().__init__(name="runner_configuration_service")
32
+
33
+ async def _initialize(self) -> None:
34
+ """Initialize the service. No special initialization needed."""
35
+ pass
36
+
37
+ async def _cleanup(self) -> None:
38
+ """Cleanup service resources. No cleanup needed."""
39
+ pass
40
+
41
+ # Implementation of abstract methods from RunnerConfigurationInterface
42
+
43
+ def initialize_runner(self, config: Dict[str, Any]) -> Dict[str, Any]:
44
+ """Initialize runner with configuration.
45
+
46
+ Args:
47
+ config: Configuration dictionary
48
+
49
+ Returns:
50
+ Dictionary with initialization results
51
+ """
52
+ # This method can delegate to the existing initialize_configuration method
53
+ return self.initialize_configuration(**config)
54
+
55
+ def register_services(self, service_container) -> None:
56
+ """Register services with the dependency injection container.
57
+
58
+ Args:
59
+ service_container: Service container for registration
60
+ """
61
+ # This method can delegate to existing service registration methods
62
+ # For now, this is a no-op as service registration is handled elsewhere
63
+ pass
64
+
65
+ def load_configuration(self, config_path: Optional[Path] = None) -> Dict[str, Any]:
66
+ """Load configuration from file or defaults.
67
+
68
+ Args:
69
+ config_path: Optional path to configuration file
70
+
71
+ Returns:
72
+ Loaded configuration dictionary
73
+ """
74
+ try:
75
+ if config_path:
76
+ # Load from specific path if provided
77
+ config = Config(config_path)
78
+ else:
79
+ # Load from default location
80
+ config = Config()
81
+
82
+ return {
83
+ "config": config,
84
+ "enable_tickets": True,
85
+ "log_level": "OFF",
86
+ "claude_args": [],
87
+ "launch_method": "exec",
88
+ "enable_websocket": False,
89
+ "websocket_port": 8765,
90
+ }
91
+ except Exception as e:
92
+ self.logger.error("Failed to load configuration", exc_info=True)
93
+ raise RuntimeError(f"Configuration loading failed: {e}") from e
94
+
95
+ def validate_configuration(self, config: Dict[str, Any]) -> Tuple[bool, List[str]]:
96
+ """Validate configuration structure and values.
97
+
98
+ Args:
99
+ config: Configuration to validate
100
+
101
+ Returns:
102
+ Tuple of (is_valid, list_of_errors)
103
+ """
104
+ errors = []
105
+
106
+ # Validate required keys
107
+ required_keys = ["enable_tickets", "log_level", "claude_args", "launch_method"]
108
+ for key in required_keys:
109
+ if key not in config:
110
+ errors.append(f"Missing required configuration key: {key}")
111
+
112
+ # Validate specific values
113
+ if "launch_method" in config and config["launch_method"] not in [
114
+ "exec",
115
+ "subprocess",
116
+ ]:
117
+ errors.append("launch_method must be 'exec' or 'subprocess'")
118
+
119
+ if "websocket_port" in config:
120
+ try:
121
+ port = int(config["websocket_port"])
122
+ if port < 1 or port > 65535:
123
+ errors.append("websocket_port must be between 1 and 65535")
124
+ except (ValueError, TypeError):
125
+ errors.append("websocket_port must be a valid integer")
126
+
127
+ return len(errors) == 0, errors
128
+
129
+ def setup_logging(self, config: Dict[str, Any]) -> None:
130
+ """Setup logging configuration.
131
+
132
+ Args:
133
+ config: Logging configuration
134
+ """
135
+ log_level = config.get("log_level", "OFF")
136
+ if log_level != "OFF":
137
+ try:
138
+ # Initialize project logger if needed
139
+ project_logger = self.initialize_project_logger(log_level)
140
+ if project_logger:
141
+ self.logger.info(
142
+ f"Project logging initialized with level: {log_level}"
143
+ )
144
+ except Exception as e:
145
+ self.logger.warning(f"Failed to setup logging: {e}")
146
+
147
+ def initialize_configuration(self, **kwargs) -> Dict[str, Any]:
148
+ """Initialize configuration and return configuration data.
149
+
150
+ Args:
151
+ **kwargs: Configuration parameters from ClaudeRunner constructor
152
+
153
+ Returns:
154
+ Dictionary containing initialized configuration data
155
+ """
156
+ config_data = {
157
+ "enable_tickets": kwargs.get("enable_tickets", True),
158
+ "log_level": kwargs.get("log_level", "OFF"),
159
+ "claude_args": kwargs.get("claude_args", []) or [],
160
+ "launch_method": kwargs.get("launch_method", "exec"),
161
+ "enable_websocket": kwargs.get("enable_websocket", False),
162
+ "websocket_port": kwargs.get("websocket_port", 8765),
163
+ }
164
+
165
+ # Initialize main configuration
166
+ try:
167
+ config = Config()
168
+ except FileNotFoundError as e:
169
+ self.logger.warning(
170
+ "Configuration file not found, using defaults", extra={"error": str(e)}
171
+ )
172
+ config = Config() # Will use defaults
173
+ except Exception as e:
174
+ self.logger.error("Failed to load configuration", exc_info=True)
175
+ raise RuntimeError(f"Configuration initialization failed: {e}") from e
176
+
177
+ config_data["config"] = config
178
+
179
+ return config_data
180
+
181
+ def initialize_project_logger(self, log_level: str):
182
+ """Initialize project logger for session logging.
183
+
184
+ Args:
185
+ log_level: Logging level
186
+
187
+ Returns:
188
+ Initialized project logger or None if disabled/failed
189
+ """
190
+ if log_level == "OFF":
191
+ return None
192
+
193
+ try:
194
+ project_logger = get_project_logger(log_level)
195
+ project_logger.log_system(
196
+ f"Initializing ClaudeRunner", level="INFO", component="runner"
197
+ )
198
+ return project_logger
199
+ except ImportError as e:
200
+ self.logger.warning(f"Project logger module not available: {e}")
201
+ return None
202
+ except Exception as e:
203
+ self.logger.warning(f"Failed to initialize project logger: {e}")
204
+ return None
205
+
206
+ def initialize_response_logger(self, config: Config, project_logger=None):
207
+ """Initialize response logger if enabled in configuration.
208
+
209
+ Args:
210
+ config: Configuration object
211
+ project_logger: Optional project logger for system events
212
+
213
+ Returns:
214
+ Initialized response logger or None if disabled/failed
215
+ """
216
+ response_config = config.get("response_logging", {})
217
+ if not response_config.get("enabled", False):
218
+ return None
219
+
220
+ try:
221
+ from claude_mpm.services.claude_session_logger import get_session_logger
222
+
223
+ response_logger = get_session_logger(config)
224
+ if project_logger:
225
+ project_logger.log_system(
226
+ "Response logging initialized", level="INFO", component="logging"
227
+ )
228
+ return response_logger
229
+ except Exception as e:
230
+ self.logger.warning("Failed to initialize response logger", exc_info=True)
231
+ return None
232
+
233
+ def get_user_working_directory(self) -> Optional[Path]:
234
+ """Get user working directory from environment.
235
+
236
+ Returns:
237
+ Path to user working directory or None if not set
238
+ """
239
+ if "CLAUDE_MPM_USER_PWD" in os.environ:
240
+ user_working_dir = Path(os.environ["CLAUDE_MPM_USER_PWD"])
241
+ self.logger.info(
242
+ f"Using user working directory from CLAUDE_MPM_USER_PWD",
243
+ extra={"directory": str(user_working_dir)},
244
+ )
245
+ return user_working_dir
246
+ return None
247
+
248
+ def register_core_services(
249
+ self, container, user_working_dir: Optional[Path] = None
250
+ ):
251
+ """Register core services in the DI container.
252
+
253
+ Args:
254
+ container: DI container instance
255
+ user_working_dir: Optional user working directory
256
+ """
257
+ # Register deployment service
258
+ from claude_mpm.core.interfaces import AgentDeploymentInterface
259
+
260
+ if not container.is_registered(AgentDeploymentInterface):
261
+ from claude_mpm.services.agents.deployment import AgentDeploymentService
262
+
263
+ container.register_factory(
264
+ AgentDeploymentInterface,
265
+ lambda c: AgentDeploymentService(working_directory=user_working_dir),
266
+ lifetime=ServiceLifetime.SINGLETON,
267
+ )
268
+
269
+ def register_ticket_manager(self, container, enable_tickets: bool):
270
+ """Register ticket manager service if enabled.
271
+
272
+ Args:
273
+ container: DI container instance
274
+ enable_tickets: Whether to enable ticket management
275
+
276
+ Returns:
277
+ Tuple of (ticket_manager, actual_enable_tickets_flag)
278
+ """
279
+ # Ticket manager is now disabled by default - use claude-mpm tickets CLI instead
280
+ self.logger.info(
281
+ "Ticket manager disabled - use 'claude-mpm tickets' CLI commands for ticket management"
282
+ )
283
+ return None, False
284
+
285
+ def register_hook_service(self, container, config: Config):
286
+ """Register hook service in the DI container.
287
+
288
+ Args:
289
+ container: DI container instance
290
+ config: Configuration object
291
+
292
+ Returns:
293
+ Initialized hook service or None if failed
294
+ """
295
+ from claude_mpm.core.interfaces import HookServiceInterface
296
+
297
+ if not container.is_registered(HookServiceInterface):
298
+ from claude_mpm.services.hook_service import HookService
299
+
300
+ container.register_factory(
301
+ HookServiceInterface,
302
+ lambda c: HookService(config),
303
+ lifetime=ServiceLifetime.SINGLETON,
304
+ )
305
+
306
+ try:
307
+ return container.get(HookServiceInterface)
308
+ except Exception as e:
309
+ self.logger.warning("Failed to initialize hook service", exc_info=True)
310
+ return None
311
+
312
+ def register_agent_capabilities_service(self, container):
313
+ """Register agent capabilities service in the DI container.
314
+
315
+ Args:
316
+ container: DI container instance
317
+
318
+ Returns:
319
+ Initialized agent capabilities service or None if failed
320
+ """
321
+ from claude_mpm.services.core.interfaces import AgentCapabilitiesInterface
322
+
323
+ if not container.is_registered(AgentCapabilitiesInterface):
324
+ from claude_mpm.services.agent_capabilities_service import (
325
+ AgentCapabilitiesService,
326
+ )
327
+
328
+ container.register_singleton(
329
+ AgentCapabilitiesInterface, AgentCapabilitiesService
330
+ )
331
+
332
+ try:
333
+ return container.get(AgentCapabilitiesInterface)
334
+ except Exception as e:
335
+ self.logger.warning(
336
+ "Failed to initialize agent capabilities service", exc_info=True
337
+ )
338
+ return None
339
+
340
+ def register_system_instructions_service(
341
+ self, container, agent_capabilities_service
342
+ ):
343
+ """Register system instructions service in the DI container.
344
+
345
+ Args:
346
+ container: DI container instance
347
+ agent_capabilities_service: Agent capabilities service dependency
348
+
349
+ Returns:
350
+ Initialized system instructions service or None if failed
351
+ """
352
+ from claude_mpm.services.core.interfaces import SystemInstructionsInterface
353
+
354
+ if not container.is_registered(SystemInstructionsInterface):
355
+ from claude_mpm.services.system_instructions_service import (
356
+ SystemInstructionsService,
357
+ )
358
+
359
+ container.register_factory(
360
+ SystemInstructionsInterface,
361
+ lambda c: SystemInstructionsService(
362
+ agent_capabilities_service=agent_capabilities_service
363
+ ),
364
+ lifetime=ServiceLifetime.SINGLETON,
365
+ )
366
+
367
+ try:
368
+ return container.get(SystemInstructionsInterface)
369
+ except Exception as e:
370
+ self.logger.warning(
371
+ "Failed to initialize system instructions service", exc_info=True
372
+ )
373
+ return None
374
+
375
+ def register_subprocess_launcher_service(
376
+ self, container, project_logger, websocket_server
377
+ ):
378
+ """Register subprocess launcher service in the DI container.
379
+
380
+ Args:
381
+ container: DI container instance
382
+ project_logger: Project logger dependency
383
+ websocket_server: WebSocket server dependency
384
+
385
+ Returns:
386
+ Initialized subprocess launcher service or None if failed
387
+ """
388
+ from claude_mpm.services.core.interfaces import SubprocessLauncherInterface
389
+
390
+ if not container.is_registered(SubprocessLauncherInterface):
391
+ from claude_mpm.services.subprocess_launcher_service import (
392
+ SubprocessLauncherService,
393
+ )
394
+
395
+ container.register_factory(
396
+ SubprocessLauncherInterface,
397
+ lambda c: SubprocessLauncherService(
398
+ project_logger=project_logger, websocket_server=websocket_server
399
+ ),
400
+ lifetime=ServiceLifetime.SINGLETON,
401
+ )
402
+
403
+ try:
404
+ return container.get(SubprocessLauncherInterface)
405
+ except Exception as e:
406
+ self.logger.warning(
407
+ "Failed to initialize subprocess launcher service", exc_info=True
408
+ )
409
+ return None
410
+
411
+ def register_version_service(self, container):
412
+ """Register version service in the DI container.
413
+
414
+ Args:
415
+ container: DI container instance
416
+
417
+ Returns:
418
+ Initialized version service or None if failed
419
+ """
420
+ from claude_mpm.services.core.interfaces import VersionServiceInterface
421
+
422
+ if not container.is_registered(VersionServiceInterface):
423
+ from claude_mpm.services.version_service import VersionService
424
+
425
+ container.register_singleton(VersionServiceInterface, VersionService)
426
+
427
+ try:
428
+ return container.get(VersionServiceInterface)
429
+ except Exception as e:
430
+ self.logger.warning("Failed to initialize version service", exc_info=True)
431
+ return None
432
+
433
+ def register_command_handler_service(self, container, project_logger):
434
+ """Register command handler service in the DI container.
435
+
436
+ Args:
437
+ container: DI container instance
438
+ project_logger: Project logger dependency
439
+
440
+ Returns:
441
+ Initialized command handler service or None if failed
442
+ """
443
+ from claude_mpm.services.core.interfaces import CommandHandlerInterface
444
+
445
+ if not container.is_registered(CommandHandlerInterface):
446
+ from claude_mpm.services.command_handler_service import (
447
+ CommandHandlerService,
448
+ )
449
+
450
+ container.register_factory(
451
+ CommandHandlerInterface,
452
+ lambda c: CommandHandlerService(project_logger=project_logger),
453
+ lifetime=ServiceLifetime.SINGLETON,
454
+ )
455
+
456
+ try:
457
+ return container.get(CommandHandlerInterface)
458
+ except Exception as e:
459
+ self.logger.warning(
460
+ "Failed to initialize command handler service", exc_info=True
461
+ )
462
+ return None
463
+
464
+ def register_memory_hook_service(self, container, hook_service):
465
+ """Register memory hook service in the DI container.
466
+
467
+ Args:
468
+ container: DI container instance
469
+ hook_service: Hook service dependency
470
+
471
+ Returns:
472
+ Initialized memory hook service or None if failed
473
+ """
474
+ from claude_mpm.services.core.interfaces import MemoryHookInterface
475
+
476
+ if not container.is_registered(MemoryHookInterface):
477
+ from claude_mpm.services.memory_hook_service import MemoryHookService
478
+
479
+ container.register_factory(
480
+ MemoryHookInterface,
481
+ lambda c: MemoryHookService(hook_service=hook_service),
482
+ lifetime=ServiceLifetime.SINGLETON,
483
+ )
484
+
485
+ try:
486
+ return container.get(MemoryHookInterface)
487
+ except Exception as e:
488
+ self.logger.warning(
489
+ "Failed to initialize memory hook service", exc_info=True
490
+ )
491
+ return None
492
+
493
+ def register_session_management_service(self, container, runner):
494
+ """Register session management service in the DI container.
495
+
496
+ Args:
497
+ container: DI container instance
498
+ runner: ClaudeRunner instance dependency
499
+
500
+ Returns:
501
+ Initialized session management service or None if failed
502
+ """
503
+ from claude_mpm.services.core.interfaces import SessionManagementInterface
504
+
505
+ if not container.is_registered(SessionManagementInterface):
506
+ from claude_mpm.services.session_management_service import (
507
+ SessionManagementService,
508
+ )
509
+
510
+ container.register_factory(
511
+ SessionManagementInterface,
512
+ lambda c: SessionManagementService(runner=runner),
513
+ lifetime=ServiceLifetime.SINGLETON,
514
+ )
515
+
516
+ try:
517
+ return container.get(SessionManagementInterface)
518
+ except Exception as e:
519
+ self.logger.warning(
520
+ "Failed to initialize session management service", exc_info=True
521
+ )
522
+ return None
523
+
524
+ def register_utility_service(self, container):
525
+ """Register utility service in the DI container.
526
+
527
+ Args:
528
+ container: DI container instance
529
+
530
+ Returns:
531
+ Initialized utility service or None if failed
532
+ """
533
+ from claude_mpm.services.core.interfaces import UtilityServiceInterface
534
+
535
+ if not container.is_registered(UtilityServiceInterface):
536
+ from claude_mpm.services.utility_service import UtilityService
537
+
538
+ container.register_singleton(UtilityServiceInterface, UtilityService)
539
+
540
+ try:
541
+ return container.get(UtilityServiceInterface)
542
+ except Exception as e:
543
+ self.logger.warning("Failed to initialize utility service", exc_info=True)
544
+ return None
545
+
546
+ def create_session_log_file(
547
+ self, project_logger, log_level: str, config_data: Dict[str, Any]
548
+ ) -> Optional[Path]:
549
+ """Create session log file and log session start event.
550
+
551
+ Args:
552
+ project_logger: Project logger instance
553
+ log_level: Logging level
554
+ config_data: Configuration data for logging
555
+
556
+ Returns:
557
+ Path to session log file or None if failed
558
+ """
559
+ if not project_logger or log_level == "OFF":
560
+ return None
561
+
562
+ try:
563
+ # Create a system.jsonl file in the session directory
564
+ session_log_file = project_logger.session_dir / "system.jsonl"
565
+
566
+ # Log session start event
567
+ session_event = {
568
+ "event": "session_start",
569
+ "runner": "ClaudeRunner",
570
+ "enable_tickets": config_data.get("enable_tickets"),
571
+ "log_level": log_level,
572
+ "launch_method": config_data.get("launch_method"),
573
+ }
574
+
575
+ # Write session event (this would be handled by a session logging method)
576
+ # For now, we'll return the file path
577
+ return session_log_file
578
+
579
+ except PermissionError as e:
580
+ self.logger.debug(f"Permission denied creating session log file: {e}")
581
+ return None
582
+ except OSError as e:
583
+ self.logger.debug(f"OS error creating session log file: {e}")
584
+ return None
585
+ except Exception as e:
586
+ self.logger.debug(f"Failed to create session log file: {e}")
587
+ return None