claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -23,6 +23,7 @@ from datetime import datetime, timezone
23
23
  from typing import Any, Dict, Optional
24
24
 
25
25
  from ..core.logger import get_logger
26
+ from .hook_error_memory import get_hook_error_memory
26
27
  from .hook_performance_config import get_hook_performance_config
27
28
  from .unified_paths import get_package_root
28
29
 
@@ -42,6 +43,9 @@ class HookManager:
42
43
  self.session_id = self._get_or_create_session_id()
43
44
  self.hook_handler_path = self._find_hook_handler()
44
45
 
46
+ # Initialize error memory for tracking and preventing repeated errors
47
+ self.error_memory = get_hook_error_memory()
48
+
45
49
  # Initialize background hook processing for async execution
46
50
  self.performance_config = get_hook_performance_config()
47
51
  queue_config = self.performance_config.get_queue_config()
@@ -97,11 +101,31 @@ class HookManager:
97
101
  self.logger.debug("Started background hook processor thread")
98
102
 
99
103
  def _execute_hook_sync(self, hook_data: Dict[str, Any]):
100
- """Execute a single hook synchronously in the background thread."""
104
+ """Execute a single hook synchronously in the background thread with error detection.
105
+
106
+ WHY error detection:
107
+ - Prevents repeated execution of failing hooks
108
+ - Provides actionable error messages to users
109
+ - Learns from failures to improve system reliability
110
+ - Reduces log noise from repeated errors
111
+ """
101
112
  try:
102
113
  hook_type = hook_data["hook_type"]
103
114
  event_data = hook_data["event_data"]
104
115
 
116
+ # Check if this hook is known to fail repeatedly
117
+ if self.error_memory.should_skip_hook(hook_type):
118
+ known_error = self.error_memory.is_known_failing_hook(hook_type)
119
+ if known_error:
120
+ # Log warning but don't spam - only on first skip
121
+ if known_error["count"] == 2: # First time we're skipping
122
+ self.logger.warning(
123
+ f"⚠️ Skipping {hook_type} hook - failed {known_error['count']} times previously\n"
124
+ f"Error: {known_error['match']}\n"
125
+ f"To retry: rm {self.error_memory.memory_file}"
126
+ )
127
+ return
128
+
105
129
  # Create the hook event
106
130
  hook_event = {
107
131
  "hook_event_name": hook_type,
@@ -127,7 +151,22 @@ class HookManager:
127
151
  check=False,
128
152
  )
129
153
 
130
- if result.returncode != 0:
154
+ # Detect errors in the output
155
+ error_info = self.error_memory.detect_error(
156
+ result.stdout or "", result.stderr or "", result.returncode
157
+ )
158
+
159
+ if error_info:
160
+ # Record the error
161
+ self.error_memory.record_error(error_info, hook_type)
162
+
163
+ # Get fix suggestion
164
+ suggestion = self.error_memory.suggest_fix(error_info)
165
+
166
+ # Log error with suggestion
167
+ self.logger.warning(f"Hook {hook_type} error detected:\n{suggestion}")
168
+ elif result.returncode != 0:
169
+ # Non-zero return without detected pattern
131
170
  self.logger.debug(f"Hook {hook_type} returned code {result.returncode}")
132
171
  if result.stderr:
133
172
  self.logger.debug(f"Hook stderr: {result.stderr}")
@@ -2,6 +2,12 @@
2
2
 
3
3
  This module provides the InteractiveSession class that manages Claude's interactive mode
4
4
  with proper separation of concerns and reduced complexity.
5
+
6
+ DEPENDENCY INJECTION:
7
+ This module uses protocol-based dependency injection to break circular imports.
8
+ Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
9
+ defines the interface it needs. This allows ClaudeRunner to create instances
10
+ of InteractiveSession without circular dependency issues.
5
11
  """
6
12
 
7
13
  import contextlib
@@ -9,11 +15,18 @@ import os
9
15
  import subprocess
10
16
  import uuid
11
17
  from pathlib import Path
12
- from typing import Any, Dict, Optional, Tuple
18
+ from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
13
19
 
14
20
  from claude_mpm.core.enums import ServiceState
15
21
  from claude_mpm.core.logger import get_logger
16
22
 
23
+ # Protocol imports for type checking without circular dependencies
24
+ if TYPE_CHECKING:
25
+ from claude_mpm.core.protocols import ClaudeRunnerProtocol
26
+ else:
27
+ # At runtime, accept any object with matching interface
28
+ ClaudeRunnerProtocol = Any
29
+
17
30
 
18
31
  class InteractiveSession:
19
32
  """
@@ -28,13 +41,14 @@ class InteractiveSession:
28
41
  and makes testing easier while preserving all original functionality.
29
42
  """
30
43
 
31
- def __init__(self, runner):
44
+ def __init__(self, runner: "ClaudeRunnerProtocol"):
32
45
  """Initialize interactive session handler.
33
46
 
34
47
  Args:
35
- runner: ClaudeRunner instance with all necessary services
48
+ runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
49
+ with all necessary services
36
50
  """
37
- self.runner = runner
51
+ self.runner: ClaudeRunnerProtocol = runner
38
52
  self.logger = get_logger("interactive_session")
39
53
  self.session_id = None
40
54
  self.original_cwd = Path.cwd()
@@ -85,8 +99,8 @@ class InteractiveSession:
85
99
  self.logger.warning(f"WebSocket initialization failed: {error}")
86
100
  # Continue without WebSocket - not a fatal error
87
101
 
88
- # Display welcome message
89
- self._display_welcome_message()
102
+ # Banner now displayed in CLI startup - see startup_display.py
103
+ # Removed duplicate _display_welcome_message() to consolidate with main banner
90
104
 
91
105
  # Log session start
92
106
  if self.runner.project_logger:
@@ -293,7 +307,12 @@ class InteractiveSession:
293
307
  return False, f"Unexpected error with Socket.IO: {e}"
294
308
 
295
309
  def _display_welcome_message(self) -> None:
296
- """Display the interactive session welcome message."""
310
+ """Display the interactive session welcome message.
311
+
312
+ DEPRECATED: This method is kept for backward compatibility with tests.
313
+ The main banner is now displayed in startup_display.py during CLI startup.
314
+ This consolidated approach prevents duplicate banners.
315
+ """
297
316
  version_str = self.runner._get_version()
298
317
 
299
318
  # Get output style status
@@ -391,12 +410,74 @@ class InteractiveSession:
391
410
  cmd.extend(agents_flag)
392
411
  self.logger.info("✓ Native agents mode: Using --agents CLI flag")
393
412
 
394
- # Add system instructions
395
- from claude_mpm.core.claude_runner import create_simple_context
413
+ # Add system instructions with file-based caching
414
+ from claude_mpm.core.system_context import create_simple_context
415
+ from claude_mpm.services.instructions.instruction_cache_service import (
416
+ InstructionCacheService,
417
+ )
396
418
 
397
419
  system_prompt = self.runner._create_system_prompt()
398
420
  if system_prompt and system_prompt != create_simple_context():
399
- cmd.extend(["--append-system-prompt", system_prompt])
421
+ # Try to use cached instruction file for better performance
422
+ try:
423
+ # Initialize cache service with project root
424
+ if "CLAUDE_MPM_USER_PWD" in os.environ:
425
+ project_root = Path(os.environ["CLAUDE_MPM_USER_PWD"])
426
+ else:
427
+ project_root = Path.cwd()
428
+
429
+ # Instruction Caching (1M-446)
430
+ # Cache assembled instructions to file to avoid ARG_MAX limits on Linux/Windows.
431
+ # - Linux: 128 KB limit, instructions are ~152 KB (exceeds by 19.1%)
432
+ # - Windows: 32 KB limit (exceeds by 476%)
433
+ # Cache updates only when content hash changes (hash-based invalidation).
434
+ # Fallback to inline instruction if cache fails (graceful degradation).
435
+ cache_service = InstructionCacheService(project_root=project_root)
436
+
437
+ # Update cache with assembled instruction content
438
+ cache_result = cache_service.update_cache(
439
+ instruction_content=system_prompt
440
+ )
441
+
442
+ # Use cache file if available
443
+ if (
444
+ cache_result.get("updated")
445
+ or cache_service.get_cache_path().exists()
446
+ ):
447
+ cache_file = cache_service.get_cache_path()
448
+
449
+ # Log cache operation
450
+ if cache_result.get("updated"):
451
+ self.logger.info(
452
+ f"Instruction cache updated: {cache_result.get('reason', 'unknown')}"
453
+ )
454
+ self.logger.debug(
455
+ f"Cache hash: {cache_result.get('content_hash', 'N/A')[:8]}..."
456
+ )
457
+ self.logger.debug(
458
+ f"Cache size: {cache_result.get('content_size_kb', 'N/A')} KB"
459
+ )
460
+ else:
461
+ self.logger.debug(
462
+ f"Using cached instructions: {cache_result.get('reason', 'unknown')}"
463
+ )
464
+
465
+ # Use file-based loading for better performance
466
+ cmd.extend(["--system-prompt-file", str(cache_file)])
467
+ self.logger.info(
468
+ f"✓ Using file-based instruction loading: {cache_file}"
469
+ )
470
+ else:
471
+ # Fallback to inline if cache file doesn't exist
472
+ self.logger.warning(
473
+ "Cache file not available, falling back to inline instruction"
474
+ )
475
+ cmd.extend(["--append-system-prompt", system_prompt])
476
+
477
+ except Exception as e:
478
+ # Graceful fallback - cache failures don't break deployment
479
+ self.logger.warning(f"Failed to cache instructions, using inline: {e}")
480
+ cmd.extend(["--append-system-prompt", system_prompt])
400
481
 
401
482
  # Final command verification
402
483
  # self.logger.info(f"Final Claude command built: {' '.join(cmd)}")
claude_mpm/core/logger.py CHANGED
@@ -225,7 +225,9 @@ def setup_logging(
225
225
 
226
226
  # Use rotating file handler
227
227
  file_handler = logging.handlers.RotatingFileHandler(
228
- log_file, maxBytes=10 * 1024 * 1024, backupCount=5 # 10 MB
228
+ log_file,
229
+ maxBytes=10 * 1024 * 1024,
230
+ backupCount=5, # 10 MB
229
231
  )
230
232
  else:
231
233
  # Use default log directory
@@ -2,19 +2,32 @@
2
2
 
3
3
  This module encapsulates the logic for running one-time Claude commands,
4
4
  breaking down the monolithic run_oneshot method into focused, testable components.
5
+
6
+ DEPENDENCY INJECTION:
7
+ This module uses protocol-based dependency injection to break circular imports.
8
+ Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
9
+ defines the interface it needs.
5
10
  """
6
11
 
7
12
  import contextlib
8
13
  import os
9
14
  import subprocess
15
+ import tempfile
10
16
  import time
11
17
  import uuid
12
18
  from pathlib import Path
13
- from typing import Any, Dict, Optional, Tuple
19
+ from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
14
20
 
15
21
  from claude_mpm.core.enums import OperationResult, ServiceState
16
22
  from claude_mpm.core.logger import get_logger
17
23
 
24
+ # Protocol imports for type checking without circular dependencies
25
+ if TYPE_CHECKING:
26
+ from claude_mpm.core.protocols import ClaudeRunnerProtocol
27
+ else:
28
+ # At runtime, accept any object with matching interface
29
+ ClaudeRunnerProtocol = Any
30
+
18
31
 
19
32
  class OneshotSession:
20
33
  """Manages a single oneshot Claude execution session.
@@ -26,17 +39,18 @@ class OneshotSession:
26
39
  complexity < 10 and lines < 80, making the code easier to test and modify.
27
40
  """
28
41
 
29
- def __init__(self, runner):
42
+ def __init__(self, runner: "ClaudeRunnerProtocol"):
30
43
  """Initialize the oneshot session with a reference to the runner.
31
44
 
32
45
  Args:
33
- runner: The ClaudeRunner instance that owns this session
46
+ runner: The ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
34
47
  """
35
- self.runner = runner
48
+ self.runner: ClaudeRunnerProtocol = runner
36
49
  self.logger = get_logger("oneshot_session")
37
50
  self.start_time = None
38
51
  self.session_id = None
39
52
  self.original_cwd = None
53
+ self.temp_system_prompt_file = None
40
54
 
41
55
  def initialize_session(self, prompt: str) -> Tuple[bool, Optional[str]]:
42
56
  """Initialize the oneshot session.
@@ -134,7 +148,13 @@ class OneshotSession:
134
148
  def _build_final_command(
135
149
  self, prompt: str, context: Optional[str], infrastructure: Dict[str, Any]
136
150
  ) -> list:
137
- """Build the final command with prompt and system instructions."""
151
+ """Build the final command with prompt and system instructions.
152
+
153
+ Uses file-based caching to avoid Linux ARG_MAX limits:
154
+ - Linux MAX_ARG_STRLEN: 128 KB per argument
155
+ - System prompt size: ~138.7 KB (exceeds limit by 7.7 KB)
156
+ - Solution: Write to temp file, pass file path (~60 bytes)
157
+ """
138
158
  full_prompt = f"{context}\n\n{prompt}" if context else prompt
139
159
  cmd = infrastructure["cmd"] + ["--print", full_prompt]
140
160
 
@@ -148,9 +168,38 @@ class OneshotSession:
148
168
  self.logger.warning("System prompt contains Python code references!")
149
169
 
150
170
  if system_prompt and system_prompt != self._get_simple_context():
151
- # The problem might be with insert positioning
152
- # Let's add system prompt differently
153
- cmd.extend(["--append-system-prompt", system_prompt])
171
+ # Use file-based loading to avoid ARG_MAX limits (1M-485)
172
+ # Create temp file for system prompt
173
+ try:
174
+ # Create temp file in system temp directory
175
+ temp_fd, temp_path = tempfile.mkstemp(
176
+ suffix=".md", prefix="claude_mpm_system_prompt_"
177
+ )
178
+
179
+ # Write system prompt to temp file
180
+ with os.fdopen(temp_fd, "w", encoding="utf-8") as f:
181
+ f.write(system_prompt)
182
+
183
+ # Store temp file path for cleanup
184
+ self.temp_system_prompt_file = temp_path
185
+
186
+ # Use --system-prompt-file flag (matches interactive mode pattern)
187
+ cmd.extend(["--system-prompt-file", temp_path])
188
+
189
+ # User-visible notification
190
+ print(f"📄 Reading system prompt from: {temp_path}")
191
+
192
+ self.logger.info(
193
+ f"Using file-based system prompt loading: {temp_path} "
194
+ f"({len(system_prompt) / 1024:.1f} KB)"
195
+ )
196
+
197
+ except Exception as e:
198
+ # Fallback to inline if file creation fails
199
+ self.logger.warning(
200
+ f"Failed to create temp file for system prompt, using inline: {e}"
201
+ )
202
+ cmd.extend(["--append-system-prompt", system_prompt])
154
203
 
155
204
  return cmd
156
205
 
@@ -203,6 +252,20 @@ class OneshotSession:
203
252
 
204
253
  def cleanup_session(self) -> None:
205
254
  """Clean up the session and restore state."""
255
+ # Clean up temp system prompt file
256
+ if self.temp_system_prompt_file:
257
+ try:
258
+ temp_file_path = Path(self.temp_system_prompt_file)
259
+ if temp_file_path.exists():
260
+ temp_file_path.unlink()
261
+ self.logger.debug(
262
+ f"Cleaned up temp system prompt file: {self.temp_system_prompt_file}"
263
+ )
264
+ except Exception as e:
265
+ self.logger.warning(f"Failed to clean up temp system prompt file: {e}")
266
+ finally:
267
+ self.temp_system_prompt_file = None
268
+
206
269
  # Restore original working directory
207
270
  if self.original_cwd:
208
271
  with contextlib.suppress(Exception):
@@ -0,0 +1,23 @@
1
+ """Protocol interfaces for dependency injection.
2
+
3
+ This module defines Protocol interfaces to break circular dependencies
4
+ using Python's typing.Protocol feature for structural subtyping.
5
+ """
6
+
7
+ from claude_mpm.core.protocols.runner_protocol import (
8
+ ClaudeRunnerProtocol,
9
+ SystemPromptProvider,
10
+ )
11
+ from claude_mpm.core.protocols.session_protocol import (
12
+ InteractiveSessionProtocol,
13
+ OneshotSessionProtocol,
14
+ SessionManagementProtocol,
15
+ )
16
+
17
+ __all__ = [
18
+ "ClaudeRunnerProtocol",
19
+ "InteractiveSessionProtocol",
20
+ "OneshotSessionProtocol",
21
+ "SessionManagementProtocol",
22
+ "SystemPromptProvider",
23
+ ]
@@ -0,0 +1,103 @@
1
+ """Protocol definitions for ClaudeRunner dependencies.
2
+
3
+ These protocols use Python's typing.Protocol for structural subtyping,
4
+ allowing dependency injection without circular imports.
5
+ """
6
+
7
+ from pathlib import Path
8
+ from typing import Any, Optional, Protocol
9
+
10
+
11
+ class SystemPromptProvider(Protocol):
12
+ """Protocol for providing system prompts without circular dependency.
13
+
14
+ This protocol allows InteractiveSession to get system prompts without
15
+ directly importing ClaudeRunner, breaking the circular dependency.
16
+ """
17
+
18
+ def _create_system_prompt(self) -> str:
19
+ """Create the complete system prompt including instructions.
20
+
21
+ Returns:
22
+ Complete system prompt as string
23
+ """
24
+ ...
25
+
26
+
27
+ class ClaudeRunnerProtocol(Protocol):
28
+ """Protocol defining the interface InteractiveSession needs from ClaudeRunner.
29
+
30
+ This protocol breaks the circular dependency between InteractiveSession
31
+ and ClaudeRunner by defining only the methods that InteractiveSession
32
+ actually uses, without requiring the full ClaudeRunner import.
33
+
34
+ Design Decision: Uses Protocol instead of ABC to allow structural subtyping.
35
+ This means ClaudeRunner doesn't need to explicitly inherit from this protocol,
36
+ it just needs to implement these methods with matching signatures.
37
+ """
38
+
39
+ # Configuration attributes
40
+ enable_websocket: bool
41
+ enable_tickets: bool
42
+ log_level: str
43
+ claude_args: Optional[list]
44
+ launch_method: str
45
+ websocket_port: int
46
+ use_native_agents: bool
47
+ config: Any
48
+ session_log_file: Optional[Path]
49
+
50
+ # Service references
51
+ project_logger: Any
52
+ websocket_server: Any
53
+ command_handler_service: Any
54
+ subprocess_launcher_service: Any
55
+
56
+ def setup_agents(self) -> bool:
57
+ """Deploy native agents to .claude/agents/.
58
+
59
+ Returns:
60
+ True if successful, False otherwise
61
+ """
62
+ ...
63
+
64
+ def deploy_project_agents_to_claude(self) -> bool:
65
+ """Deploy project agents from .claude-mpm/agents/ to .claude/agents/.
66
+
67
+ Returns:
68
+ True if successful, False otherwise
69
+ """
70
+ ...
71
+
72
+ def _create_system_prompt(self) -> str:
73
+ """Create the complete system prompt including instructions.
74
+
75
+ Returns:
76
+ Complete system prompt as string
77
+ """
78
+ ...
79
+
80
+ def _get_version(self) -> str:
81
+ """Get version string.
82
+
83
+ Returns:
84
+ Version string
85
+ """
86
+ ...
87
+
88
+ def _log_session_event(self, event_data: dict) -> None:
89
+ """Log an event to the session log file.
90
+
91
+ Args:
92
+ event_data: Event data to log
93
+ """
94
+ ...
95
+
96
+ def _launch_subprocess_interactive(self, cmd: list, env: dict) -> None:
97
+ """Launch Claude as a subprocess with PTY for interactive mode.
98
+
99
+ Args:
100
+ cmd: Command to execute
101
+ env: Environment variables
102
+ """
103
+ ...
@@ -0,0 +1,131 @@
1
+ """Protocol definitions for session management dependencies.
2
+
3
+ These protocols use Python's typing.Protocol for structural subtyping,
4
+ allowing dependency injection without circular imports.
5
+ """
6
+
7
+ from typing import Any, Dict, Optional, Protocol, Tuple
8
+
9
+
10
+ class InteractiveSessionProtocol(Protocol):
11
+ """Protocol for interactive session orchestration.
12
+
13
+ This protocol defines the interface that SessionManagementService
14
+ needs from InteractiveSession without requiring a full import.
15
+ """
16
+
17
+ def initialize_interactive_session(self) -> Tuple[bool, Optional[str]]:
18
+ """Initialize the interactive session environment.
19
+
20
+ Returns:
21
+ Tuple of (success, error_message)
22
+ """
23
+ ...
24
+
25
+ def setup_interactive_environment(self) -> Tuple[bool, Dict[str, Any]]:
26
+ """Set up the interactive environment including agents and commands.
27
+
28
+ Returns:
29
+ Tuple of (success, environment_dict)
30
+ """
31
+ ...
32
+
33
+ def handle_interactive_input(self, environment: Dict[str, Any]) -> bool:
34
+ """Handle the interactive input/output loop.
35
+
36
+ Args:
37
+ environment: Dictionary with command, env vars, and session info
38
+
39
+ Returns:
40
+ True if successful, False otherwise
41
+ """
42
+ ...
43
+
44
+ def cleanup_interactive_session(self) -> None:
45
+ """Clean up resources after interactive session ends."""
46
+ ...
47
+
48
+
49
+ class OneshotSessionProtocol(Protocol):
50
+ """Protocol for oneshot session orchestration.
51
+
52
+ This protocol defines the interface that SessionManagementService
53
+ needs from OneshotSession without requiring a full import.
54
+ """
55
+
56
+ def initialize_session(self, prompt: str) -> Tuple[bool, Optional[str]]:
57
+ """Initialize the oneshot session.
58
+
59
+ Args:
60
+ prompt: The command or prompt to execute
61
+
62
+ Returns:
63
+ Tuple of (success, error_message)
64
+ """
65
+ ...
66
+
67
+ def deploy_agents(self) -> bool:
68
+ """Deploy agents for the session.
69
+
70
+ Returns:
71
+ True if successful, False otherwise
72
+ """
73
+ ...
74
+
75
+ def setup_infrastructure(self) -> Dict[str, Any]:
76
+ """Set up session infrastructure.
77
+
78
+ Returns:
79
+ Dictionary with infrastructure configuration
80
+ """
81
+ ...
82
+
83
+ def execute_command(
84
+ self, prompt: str, context: Optional[str], infrastructure: Dict[str, Any]
85
+ ) -> Tuple[bool, Optional[str]]:
86
+ """Execute the command with given context and infrastructure.
87
+
88
+ Args:
89
+ prompt: Command to execute
90
+ context: Optional context
91
+ infrastructure: Infrastructure configuration
92
+
93
+ Returns:
94
+ Tuple of (success, response)
95
+ """
96
+ ...
97
+
98
+ def cleanup_session(self) -> None:
99
+ """Clean up session resources."""
100
+ ...
101
+
102
+
103
+ class SessionManagementProtocol(Protocol):
104
+ """Protocol for session management service.
105
+
106
+ This protocol defines the interface that ClaudeRunner needs from
107
+ SessionManagementService without requiring a full import.
108
+ """
109
+
110
+ def run_interactive_session(self, initial_context: Optional[str] = None) -> bool:
111
+ """Run Claude in interactive mode.
112
+
113
+ Args:
114
+ initial_context: Optional initial context to pass to Claude
115
+
116
+ Returns:
117
+ True if successful, False otherwise
118
+ """
119
+ ...
120
+
121
+ def run_oneshot_session(self, prompt: str, context: Optional[str] = None) -> bool:
122
+ """Run Claude with a single prompt.
123
+
124
+ Args:
125
+ prompt: The command or prompt to execute
126
+ context: Optional context to prepend to the prompt
127
+
128
+ Returns:
129
+ True if successful, False otherwise
130
+ """
131
+ ...
@@ -16,11 +16,14 @@ class SingletonManager:
16
16
 
17
17
  Reduces duplication by providing thread-safe singleton patterns
18
18
  that can be used across different classes.
19
+
20
+ Uses RLock (reentrant locks) to support recursive calls from
21
+ SingletonMixin.__new__ and @singleton decorator patterns.
19
22
  """
20
23
 
21
24
  _instances: Dict[Type, Any] = {}
22
- _locks: Dict[Type, threading.Lock] = {}
23
- _global_lock = threading.Lock()
25
+ _locks: Dict[Type, threading.RLock] = {}
26
+ _global_lock = threading.RLock()
24
27
 
25
28
  @classmethod
26
29
  def get_instance(
@@ -42,7 +45,7 @@ class SingletonManager:
42
45
  if singleton_class not in cls._locks:
43
46
  with cls._global_lock:
44
47
  if singleton_class not in cls._locks:
45
- cls._locks[singleton_class] = threading.Lock()
48
+ cls._locks[singleton_class] = threading.RLock()
46
49
 
47
50
  # Get instance with class-specific lock
48
51
  with cls._locks[singleton_class]:
@@ -50,9 +53,13 @@ class SingletonManager:
50
53
  logger = get_logger("singleton_manager")
51
54
  logger.debug(f"Creating singleton instance: {singleton_class.__name__}")
52
55
 
53
- instance = singleton_class(*args, **kwargs)
56
+ # Use object.__new__ to bypass SingletonMixin.__new__ and avoid recursion
57
+ instance = object.__new__(singleton_class)
54
58
  cls._instances[singleton_class] = instance
55
59
 
60
+ # Now call __init__ explicitly with the stored instance
61
+ instance.__init__(*args, **kwargs)
62
+
56
63
  return instance
57
64
 
58
65
  return cls._instances[singleton_class]