claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__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 (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  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 +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  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 +37 -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 +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,381 @@
1
+ """Hook Error Memory System.
2
+
3
+ This module provides error detection and memory for hook execution to prevent
4
+ repeated errors and provide helpful diagnostics.
5
+
6
+ WHY this is needed:
7
+ - Hook processor can encounter transient or persistent errors
8
+ - Repeated failing commands waste resources and clutter logs
9
+ - Users need actionable suggestions to fix configuration issues
10
+ - System should learn from errors and prevent repetition
11
+
12
+ DESIGN DECISION: Store errors in JSON file rather than database because:
13
+ - Simple, human-readable format
14
+ - Easy to inspect and manually clear
15
+ - No additional dependencies
16
+ - Fast read/write for small datasets
17
+ - Users can easily delete to retry failed commands
18
+ """
19
+
20
+ import json
21
+ import re
22
+ from datetime import datetime, timezone
23
+ from pathlib import Path
24
+ from typing import Any, Dict, Optional
25
+
26
+ from ..core.logger import get_logger
27
+
28
+
29
+ class HookErrorMemory:
30
+ """Tracks and prevents repeated hook execution errors.
31
+
32
+ WHY this design:
33
+ - Detects common error patterns automatically
34
+ - Stores error history to prevent repetition
35
+ - Provides actionable fix suggestions
36
+ - Allows manual retry by clearing memory
37
+ - Minimal performance overhead (<1ms per check)
38
+ """
39
+
40
+ # Error pattern definitions with detection regexes
41
+ ERROR_PATTERNS = [
42
+ (r"no such file or directory[:\s]+(.+?)(?:\n|$)", "file_not_found"),
43
+ (r"command not found[:\s]+(.+?)(?:\n|$)", "command_not_found"),
44
+ (r"permission denied[:\s]+(.+?)(?:\n|$)", "permission_denied"),
45
+ (r"syntax error", "syntax_error"),
46
+ (r"Error:\s*\(eval\):(\d+):\s*(.+?)(?:\n|$)", "eval_error"),
47
+ (r"Error:\s*(.+?)(?:\n|$)", "general_error"),
48
+ ]
49
+
50
+ def __init__(self, memory_file: Optional[Path] = None):
51
+ """Initialize hook error memory.
52
+
53
+ Args:
54
+ memory_file: Path to memory file (default: .claude-mpm/hook_errors.json)
55
+ """
56
+ self.logger = get_logger("hook_error_memory")
57
+
58
+ # Use default location if not specified
59
+ if memory_file is None:
60
+ memory_file = Path.cwd() / ".claude-mpm" / "hook_errors.json"
61
+
62
+ self.memory_file = memory_file
63
+ self.errors: Dict[str, Any] = self._load_errors()
64
+
65
+ def _load_errors(self) -> Dict[str, Any]:
66
+ """Load previously encountered errors from disk.
67
+
68
+ Returns:
69
+ Dictionary of error records
70
+ """
71
+ if not self.memory_file.exists():
72
+ return {}
73
+
74
+ try:
75
+ content = self.memory_file.read_text()
76
+ if not content.strip():
77
+ return {}
78
+ return json.loads(content)
79
+ except json.JSONDecodeError as e:
80
+ self.logger.warning(f"Failed to parse error memory file: {e}")
81
+ return {}
82
+ except Exception as e:
83
+ self.logger.error(f"Error loading error memory: {e}")
84
+ return {}
85
+
86
+ def _save_errors(self):
87
+ """Persist errors to disk."""
88
+ try:
89
+ # Ensure directory exists
90
+ self.memory_file.parent.mkdir(parents=True, exist_ok=True)
91
+
92
+ # Write with pretty formatting for human readability
93
+ self.memory_file.write_text(json.dumps(self.errors, indent=2))
94
+ except Exception as e:
95
+ self.logger.error(f"Failed to save error memory: {e}")
96
+
97
+ def detect_error(
98
+ self, output: str, stderr: str, returncode: int
99
+ ) -> Optional[Dict[str, str]]:
100
+ """Detect if output contains an error.
101
+
102
+ WHY check both stdout and stderr:
103
+ - Some commands write errors to stdout
104
+ - Some write to stderr
105
+ - Return code alone isn't enough (some hooks return non-zero on purpose)
106
+
107
+ Args:
108
+ output: Standard output from command
109
+ stderr: Standard error from command
110
+ returncode: Exit code from command
111
+
112
+ Returns:
113
+ Dict with error info if detected, None otherwise
114
+ """
115
+ # Combine output sources for comprehensive error detection
116
+ combined_output = f"{output}\n{stderr}"
117
+
118
+ # Try each pattern in order of specificity
119
+ for pattern, error_type in self.ERROR_PATTERNS:
120
+ match = re.search(pattern, combined_output, re.IGNORECASE | re.MULTILINE)
121
+ if match:
122
+ # Extract details from the match
123
+ details = match.group(1) if match.groups() else match.group(0)
124
+
125
+ return {
126
+ "type": error_type,
127
+ "pattern": pattern,
128
+ "match": match.group(0).strip(),
129
+ "details": details.strip() if details else "",
130
+ "returncode": returncode,
131
+ }
132
+
133
+ # If no pattern matched but returncode is non-zero, record as generic error
134
+ if returncode != 0 and combined_output.strip():
135
+ return {
136
+ "type": "unknown_error",
137
+ "pattern": "non-zero exit code",
138
+ "match": f"Exit code: {returncode}",
139
+ "details": combined_output[:200].strip(), # First 200 chars
140
+ "returncode": returncode,
141
+ }
142
+
143
+ return None
144
+
145
+ def record_error(self, error_info: Dict[str, str], hook_type: str):
146
+ """Record an error to prevent future repetition.
147
+
148
+ WHY use composite key:
149
+ - Same error type can occur with different details
150
+ - Want to track specific error instances
151
+ - Hook type context helps with diagnosis
152
+
153
+ Args:
154
+ error_info: Error information from detect_error()
155
+ hook_type: Type of hook that failed (e.g., "PreToolUse")
156
+ """
157
+ # Create unique key for this error
158
+ key = f"{error_info['type']}:{hook_type}:{error_info['details']}"
159
+
160
+ now = datetime.now(timezone.utc).isoformat()
161
+
162
+ if key in self.errors:
163
+ # Update existing error
164
+ self.errors[key]["count"] += 1
165
+ self.errors[key]["last_seen"] = now
166
+ else:
167
+ # Record new error
168
+ self.errors[key] = {
169
+ "type": error_info["type"],
170
+ "hook_type": hook_type,
171
+ "details": error_info["details"],
172
+ "match": error_info["match"],
173
+ "returncode": error_info.get("returncode", 1),
174
+ "count": 1,
175
+ "first_seen": now,
176
+ "last_seen": now,
177
+ }
178
+
179
+ self._save_errors()
180
+ self.logger.debug(
181
+ f"Recorded error: {error_info['type']} (count: {self.errors[key]['count']})"
182
+ )
183
+
184
+ def is_known_failing_hook(self, hook_type: str) -> Optional[Dict[str, Any]]:
185
+ """Check if a hook type is known to fail repeatedly.
186
+
187
+ WHY check for 2+ failures:
188
+ - Single failure could be transient
189
+ - 2+ failures indicate persistent issue
190
+ - Balance between retry attempts and error prevention
191
+
192
+ Args:
193
+ hook_type: Type of hook to check
194
+
195
+ Returns:
196
+ Error data if hook is known to fail, None otherwise
197
+ """
198
+ # Find any errors for this hook type with 2+ occurrences
199
+ for key, error_data in self.errors.items():
200
+ if error_data["hook_type"] == hook_type and error_data["count"] >= 2:
201
+ return error_data
202
+
203
+ return None
204
+
205
+ def should_skip_hook(self, hook_type: str, threshold: int = 2) -> bool:
206
+ """Determine if a hook should be skipped due to repeated failures.
207
+
208
+ Args:
209
+ hook_type: Type of hook to check
210
+ threshold: Minimum failure count to skip (default: 2)
211
+
212
+ Returns:
213
+ True if hook should be skipped
214
+ """
215
+ error_data = self.is_known_failing_hook(hook_type)
216
+ return error_data is not None and error_data["count"] >= threshold
217
+
218
+ def suggest_fix(self, error_info: Dict[str, str]) -> str:
219
+ """Suggest a fix for the detected error.
220
+
221
+ WHY provide suggestions:
222
+ - Users need actionable guidance
223
+ - Common errors have known solutions
224
+ - Reduces support burden
225
+ - Improves user experience
226
+
227
+ Args:
228
+ error_info: Error information from detect_error()
229
+
230
+ Returns:
231
+ Human-readable fix suggestion
232
+ """
233
+ error_type = error_info["type"]
234
+ details = error_info.get("details", "")
235
+
236
+ suggestions = {
237
+ "file_not_found": f"""File not found: {details}
238
+
239
+ Possible fixes:
240
+ 1. Check if the file exists: ls -la {details}
241
+ 2. Verify the path is correct in your hook configuration
242
+ 3. If it's a script, ensure it's executable: chmod +x {details}
243
+ 4. Clear error memory to retry: rm {self.memory_file}
244
+ """,
245
+ "command_not_found": f"""Command not found: {details}
246
+
247
+ Possible fixes:
248
+ 1. Install the missing command
249
+ 2. Check if it's in your PATH: which {details}
250
+ 3. Update hook configuration to use absolute path
251
+ 4. Remove the hook if no longer needed
252
+ """,
253
+ "permission_denied": f"""Permission denied: {details}
254
+
255
+ Possible fixes:
256
+ 1. Check file permissions: ls -la {details}
257
+ 2. Make file executable: chmod +x {details}
258
+ 3. Run with appropriate privileges
259
+ 4. Check file ownership
260
+ """,
261
+ "syntax_error": """Syntax error in hook configuration or script
262
+
263
+ Possible fixes:
264
+ 1. Review hook configuration in .claude-mpm/config
265
+ 2. Check script syntax if using shell hooks
266
+ 3. Validate JSON configuration format
267
+ 4. Check for typos in hook definitions
268
+ """,
269
+ "eval_error": f"""Error in hook execution: {details}
270
+
271
+ Possible fixes:
272
+ 1. Review hook handler logs for details
273
+ 2. Check hook configuration syntax
274
+ 3. Verify all required dependencies are available
275
+ 4. Test hook handler manually: python {details}
276
+ """,
277
+ "general_error": f"""Error during hook execution: {error_info.get("match", "Unknown error")}
278
+
279
+ Possible fixes:
280
+ 1. Check logs for detailed error information
281
+ 2. Verify hook configuration is correct
282
+ 3. Ensure all dependencies are installed
283
+ 4. Clear error memory to retry: rm {self.memory_file}
284
+ """,
285
+ }
286
+
287
+ return suggestions.get(
288
+ error_type, f"Unknown error type: {error_type}\n\nDetails: {details}"
289
+ )
290
+
291
+ def clear_errors(self, hook_type: Optional[str] = None):
292
+ """Clear error memory to allow retry of failed hooks.
293
+
294
+ Args:
295
+ hook_type: If specified, only clear errors for this hook type
296
+ """
297
+ if hook_type is None:
298
+ # Clear all errors
299
+ count = len(self.errors)
300
+ self.errors.clear()
301
+ self._save_errors()
302
+ self.logger.info(f"Cleared all {count} error records")
303
+ else:
304
+ # Clear errors for specific hook type
305
+ keys_to_remove = [
306
+ key
307
+ for key, data in self.errors.items()
308
+ if data["hook_type"] == hook_type
309
+ ]
310
+ for key in keys_to_remove:
311
+ del self.errors[key]
312
+ self._save_errors()
313
+ self.logger.info(
314
+ f"Cleared {len(keys_to_remove)} error records for {hook_type}"
315
+ )
316
+
317
+ def get_error_summary(self) -> Dict[str, Any]:
318
+ """Get summary of all recorded errors.
319
+
320
+ Returns:
321
+ Dictionary with error statistics and details
322
+ """
323
+ if not self.errors:
324
+ return {
325
+ "total_errors": 0,
326
+ "unique_errors": 0,
327
+ "errors_by_type": {},
328
+ "errors_by_hook": {},
329
+ }
330
+
331
+ errors_by_type = {}
332
+ errors_by_hook = {}
333
+
334
+ total_count = 0
335
+
336
+ for error_data in self.errors.values():
337
+ error_type = error_data["type"]
338
+ hook_type = error_data["hook_type"]
339
+ count = error_data["count"]
340
+
341
+ total_count += count
342
+
343
+ errors_by_type[error_type] = errors_by_type.get(error_type, 0) + count
344
+ errors_by_hook[hook_type] = errors_by_hook.get(hook_type, 0) + count
345
+
346
+ return {
347
+ "total_errors": total_count,
348
+ "unique_errors": len(self.errors),
349
+ "errors_by_type": errors_by_type,
350
+ "errors_by_hook": errors_by_hook,
351
+ "memory_file": str(self.memory_file),
352
+ }
353
+
354
+
355
+ # Global instance
356
+ _hook_error_memory: Optional[HookErrorMemory] = None
357
+
358
+
359
+ def get_hook_error_memory(memory_file: Optional[Path] = None) -> HookErrorMemory:
360
+ """Get the global hook error memory instance.
361
+
362
+ Args:
363
+ memory_file: Optional custom memory file path
364
+
365
+ Returns:
366
+ HookErrorMemory instance
367
+ """
368
+ global _hook_error_memory
369
+ if _hook_error_memory is None:
370
+ _hook_error_memory = HookErrorMemory(memory_file)
371
+ return _hook_error_memory
372
+
373
+
374
+ def clear_hook_errors(hook_type: Optional[str] = None):
375
+ """Convenience function to clear hook error memory.
376
+
377
+ Args:
378
+ hook_type: If specified, only clear errors for this hook type
379
+ """
380
+ memory = get_hook_error_memory()
381
+ memory.clear_errors(hook_type)
@@ -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
@@ -383,12 +402,82 @@ class InteractiveSession:
383
402
  self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
384
403
  cmd.extend(self.runner.claude_args)
385
404
 
386
- # Add system instructions
387
- from claude_mpm.core.claude_runner import create_simple_context
405
+ # Add --agents flag if native agents mode is enabled
406
+ if getattr(self.runner, "use_native_agents", False):
407
+ agents_flag = self._build_agents_flag()
408
+ if agents_flag:
409
+ # Add --agents JSON directly (already properly formatted)
410
+ cmd.extend(agents_flag)
411
+ self.logger.info("✓ Native agents mode: Using --agents CLI flag")
412
+
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
+ )
388
418
 
389
419
  system_prompt = self.runner._create_system_prompt()
390
420
  if system_prompt and system_prompt != create_simple_context():
391
- 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])
392
481
 
393
482
  # Final command verification
394
483
  # self.logger.info(f"Final Claude command built: {' '.join(cmd)}")
@@ -402,6 +491,38 @@ class InteractiveSession:
402
491
 
403
492
  return cmd
404
493
 
494
+ def _build_agents_flag(self) -> Optional[list]:
495
+ """Build --agents flag with all MPM agents.
496
+
497
+ Returns:
498
+ List with ["--agents", "<json>"] or None if conversion fails
499
+ """
500
+ try:
501
+ from claude_mpm.services.native_agent_converter import NativeAgentConverter
502
+
503
+ converter = NativeAgentConverter()
504
+ agents = converter.load_agents_from_templates()
505
+
506
+ if not agents:
507
+ self.logger.warning("No agents loaded for native mode")
508
+ return None
509
+
510
+ # Generate JSON for --agents flag
511
+ agents_json = converter.generate_agents_json(agents)
512
+ summary = converter.get_conversion_summary(agents)
513
+
514
+ self.logger.info(
515
+ f"Native agents: {summary['total_agents']} agents, "
516
+ f"{summary['json_size_kb']} KB JSON"
517
+ )
518
+
519
+ # Return as list: ["--agents", "<json>"]
520
+ return ["--agents", agents_json]
521
+
522
+ except Exception as e:
523
+ self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
524
+ return None
525
+
405
526
  def _prepare_environment(self) -> dict:
406
527
  """Prepare clean environment variables for Claude."""
407
528
  clean_env = os.environ.copy()