claude-mpm 4.21.3__py3-none-any.whl → 5.1.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 (517) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
  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 +69 -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 +1128 -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 +935 -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/core.py +50 -2
  41. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  42. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  43. claude_mpm/cli/commands/postmortem.py +401 -0
  44. claude_mpm/cli/commands/run.py +125 -167
  45. claude_mpm/cli/commands/skill_source.py +694 -0
  46. claude_mpm/cli/commands/skills.py +757 -20
  47. claude_mpm/cli/executor.py +78 -3
  48. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  49. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  50. claude_mpm/cli/parsers/agents_parser.py +310 -4
  51. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  52. claude_mpm/cli/parsers/base_parser.py +53 -0
  53. claude_mpm/cli/parsers/config_parser.py +96 -43
  54. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  55. claude_mpm/cli/parsers/skills_parser.py +145 -0
  56. claude_mpm/cli/parsers/source_parser.py +138 -0
  57. claude_mpm/cli/startup.py +564 -108
  58. claude_mpm/cli/startup_display.py +480 -0
  59. claude_mpm/cli/utils.py +1 -1
  60. claude_mpm/cli_module/commands.py +1 -1
  61. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  62. claude_mpm/commands/mpm-agents-detect.md +9 -0
  63. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  64. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  65. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  66. claude_mpm/commands/mpm-doctor.md +9 -0
  67. claude_mpm/commands/mpm-help.md +14 -2
  68. claude_mpm/commands/mpm-init.md +27 -2
  69. claude_mpm/commands/mpm-monitor.md +9 -0
  70. claude_mpm/commands/mpm-postmortem.md +123 -0
  71. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  72. claude_mpm/commands/mpm-status.md +9 -0
  73. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  74. claude_mpm/commands/mpm-ticket-view.md +552 -0
  75. claude_mpm/commands/mpm-version.md +9 -0
  76. claude_mpm/commands/mpm.md +10 -0
  77. claude_mpm/config/agent_presets.py +488 -0
  78. claude_mpm/config/agent_sources.py +325 -0
  79. claude_mpm/config/skill_presets.py +392 -0
  80. claude_mpm/config/skill_sources.py +590 -0
  81. claude_mpm/constants.py +13 -0
  82. claude_mpm/core/api_validator.py +1 -1
  83. claude_mpm/core/claude_runner.py +19 -35
  84. claude_mpm/core/config.py +24 -0
  85. claude_mpm/core/constants.py +1 -1
  86. claude_mpm/core/framework/__init__.py +3 -16
  87. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  88. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  89. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  90. claude_mpm/core/hook_error_memory.py +381 -0
  91. claude_mpm/core/hook_manager.py +41 -2
  92. claude_mpm/core/interactive_session.py +131 -10
  93. claude_mpm/core/logger.py +3 -1
  94. claude_mpm/core/oneshot_session.py +110 -8
  95. claude_mpm/core/output_style_manager.py +173 -43
  96. claude_mpm/core/protocols/__init__.py +23 -0
  97. claude_mpm/core/protocols/runner_protocol.py +103 -0
  98. claude_mpm/core/protocols/session_protocol.py +131 -0
  99. claude_mpm/core/shared/singleton_manager.py +11 -4
  100. claude_mpm/core/system_context.py +38 -0
  101. claude_mpm/core/unified_agent_registry.py +129 -1
  102. claude_mpm/core/unified_config.py +22 -0
  103. claude_mpm/dashboard/static/css/activity.css +69 -69
  104. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  105. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  106. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  107. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  108. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  109. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  110. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  111. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  112. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  113. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  114. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  115. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  116. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  117. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  118. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  119. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  120. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  121. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  122. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  123. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  124. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  125. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  126. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  127. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  128. claude_mpm/dashboard/templates/code_simple.html +23 -23
  129. claude_mpm/dashboard/templates/index.html +18 -18
  130. claude_mpm/experimental/cli_enhancements.py +1 -5
  131. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  132. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  133. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  134. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  135. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  136. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  137. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  139. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  140. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  141. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  142. claude_mpm/models/agent_definition.py +7 -0
  143. claude_mpm/models/git_repository.py +198 -0
  144. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  145. claude_mpm/scripts/start_activity_logging.py +3 -1
  146. claude_mpm/services/agents/agent_builder.py +45 -9
  147. claude_mpm/services/agents/agent_preset_service.py +238 -0
  148. claude_mpm/services/agents/agent_selection_service.py +484 -0
  149. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  150. claude_mpm/services/agents/cache_git_manager.py +621 -0
  151. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  152. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  153. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  154. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  155. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  156. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  157. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  158. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  159. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  161. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
  162. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  163. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  164. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
  165. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  166. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  167. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  168. claude_mpm/services/agents/git_source_manager.py +629 -0
  169. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  170. claude_mpm/services/agents/local_template_manager.py +50 -10
  171. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  172. claude_mpm/services/agents/sources/__init__.py +13 -0
  173. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  174. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  175. claude_mpm/services/agents/startup_sync.py +239 -0
  176. claude_mpm/services/agents/toolchain_detector.py +474 -0
  177. claude_mpm/services/analysis/__init__.py +25 -0
  178. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  179. claude_mpm/services/analysis/postmortem_service.py +765 -0
  180. claude_mpm/services/cli/session_pause_manager.py +1 -1
  181. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  182. claude_mpm/services/command_deployment_service.py +200 -6
  183. claude_mpm/services/core/base.py +7 -2
  184. claude_mpm/services/core/interfaces/__init__.py +1 -3
  185. claude_mpm/services/core/interfaces/health.py +1 -4
  186. claude_mpm/services/core/models/__init__.py +2 -11
  187. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  188. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  189. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  190. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  191. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  192. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  193. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  194. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  195. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  196. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  197. claude_mpm/services/event_bus/direct_relay.py +3 -3
  198. claude_mpm/services/event_bus/event_bus.py +36 -3
  199. claude_mpm/services/events/consumers/logging.py +1 -2
  200. claude_mpm/services/git/__init__.py +21 -0
  201. claude_mpm/services/git/git_operations_service.py +494 -0
  202. claude_mpm/services/github/__init__.py +21 -0
  203. claude_mpm/services/github/github_cli_service.py +397 -0
  204. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  205. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  206. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  207. claude_mpm/services/instructions/__init__.py +9 -0
  208. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  209. claude_mpm/services/local_ops/__init__.py +3 -13
  210. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  211. claude_mpm/services/local_ops/health_manager.py +1 -4
  212. claude_mpm/services/local_ops/process_manager.py +1 -1
  213. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  214. claude_mpm/services/mcp_config_manager.py +75 -145
  215. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  216. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  217. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  218. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  219. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  220. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  221. claude_mpm/services/mcp_service_verifier.py +6 -3
  222. claude_mpm/services/memory/optimizer.py +1 -1
  223. claude_mpm/services/model/model_router.py +8 -9
  224. claude_mpm/services/monitor/daemon.py +29 -9
  225. claude_mpm/services/monitor/daemon_manager.py +96 -19
  226. claude_mpm/services/monitor/server.py +2 -2
  227. claude_mpm/services/native_agent_converter.py +356 -0
  228. claude_mpm/services/port_manager.py +1 -1
  229. claude_mpm/services/pr/__init__.py +14 -0
  230. claude_mpm/services/pr/pr_template_service.py +329 -0
  231. claude_mpm/services/project/documentation_manager.py +2 -1
  232. claude_mpm/services/project/project_organizer.py +4 -0
  233. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  234. claude_mpm/services/runner_configuration_service.py +17 -3
  235. claude_mpm/services/self_upgrade_service.py +165 -7
  236. claude_mpm/services/session_management_service.py +16 -4
  237. claude_mpm/services/skills/__init__.py +18 -0
  238. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  239. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  240. claude_mpm/services/skills_config.py +547 -0
  241. claude_mpm/services/skills_deployer.py +955 -0
  242. claude_mpm/services/socketio/handlers/connection.py +1 -1
  243. claude_mpm/services/socketio/handlers/git.py +2 -2
  244. claude_mpm/services/socketio/server/core.py +1 -4
  245. claude_mpm/services/socketio/server/main.py +1 -3
  246. claude_mpm/services/system_instructions_service.py +1 -3
  247. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  248. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  249. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  250. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  251. claude_mpm/services/unified/unified_deployment.py +1 -5
  252. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  253. claude_mpm/services/visualization/__init__.py +1 -5
  254. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  255. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  256. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  257. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  258. claude_mpm/skills/skills_registry.py +0 -1
  259. claude_mpm/templates/questions/__init__.py +38 -0
  260. claude_mpm/templates/questions/base.py +193 -0
  261. claude_mpm/templates/questions/pr_strategy.py +311 -0
  262. claude_mpm/templates/questions/project_init.py +385 -0
  263. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  264. claude_mpm/tools/__main__.py +8 -8
  265. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  266. claude_mpm/utils/agent_dependency_loader.py +80 -13
  267. claude_mpm/utils/agent_filters.py +288 -0
  268. claude_mpm/utils/dependency_cache.py +3 -1
  269. claude_mpm/utils/gitignore.py +244 -0
  270. claude_mpm/utils/log_cleanup.py +3 -3
  271. claude_mpm/utils/migration.py +372 -0
  272. claude_mpm/utils/progress.py +387 -0
  273. claude_mpm/utils/robust_installer.py +3 -5
  274. claude_mpm/utils/structured_questions.py +619 -0
  275. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
  276. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
  277. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  278. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  279. claude_mpm/agents/templates/agent-manager.json +0 -273
  280. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  281. claude_mpm/agents/templates/api_qa.json +0 -180
  282. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  283. claude_mpm/agents/templates/clerk-ops.json +0 -235
  284. claude_mpm/agents/templates/code_analyzer.json +0 -101
  285. claude_mpm/agents/templates/content-agent.json +0 -358
  286. claude_mpm/agents/templates/dart_engineer.json +0 -307
  287. claude_mpm/agents/templates/data_engineer.json +0 -225
  288. claude_mpm/agents/templates/documentation.json +0 -211
  289. claude_mpm/agents/templates/engineer.json +0 -210
  290. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  291. claude_mpm/agents/templates/golang_engineer.json +0 -270
  292. claude_mpm/agents/templates/imagemagick.json +0 -264
  293. claude_mpm/agents/templates/java_engineer.json +0 -346
  294. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  295. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  296. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  297. claude_mpm/agents/templates/memory_manager.json +0 -158
  298. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  299. claude_mpm/agents/templates/ops.json +0 -185
  300. claude_mpm/agents/templates/php-engineer.json +0 -287
  301. claude_mpm/agents/templates/product_owner.json +0 -338
  302. claude_mpm/agents/templates/project_organizer.json +0 -140
  303. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  304. claude_mpm/agents/templates/python_engineer.json +0 -387
  305. claude_mpm/agents/templates/qa.json +0 -242
  306. claude_mpm/agents/templates/react_engineer.json +0 -238
  307. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  308. claude_mpm/agents/templates/research.json +0 -188
  309. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  310. claude_mpm/agents/templates/rust_engineer.json +0 -275
  311. claude_mpm/agents/templates/security.json +0 -202
  312. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  313. claude_mpm/agents/templates/ticketing.json +0 -177
  314. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  315. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  316. claude_mpm/agents/templates/version_control.json +0 -157
  317. claude_mpm/agents/templates/web_qa.json +0 -399
  318. claude_mpm/agents/templates/web_ui.json +0 -189
  319. claude_mpm/commands/mpm-tickets.md +0 -102
  320. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  321. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  322. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  323. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  324. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  325. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  326. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  327. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  328. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  329. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  330. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  331. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  332. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  333. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  334. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  335. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  336. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  337. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  338. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  339. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  340. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  341. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  342. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  343. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  344. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  345. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  346. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  347. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  348. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  349. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  350. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  351. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  352. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  353. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  354. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  355. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  357. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  358. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  359. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  366. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  367. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  368. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  369. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  370. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  371. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  372. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  373. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  374. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  375. claude_mpm/dashboard/static/built/react/events.js +0 -30
  376. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  377. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  378. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  379. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  380. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  381. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  382. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  383. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  384. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  385. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  390. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  391. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  392. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  393. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  394. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  395. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  396. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  397. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  398. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  399. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  400. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  401. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  402. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  403. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  404. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  405. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  406. claude_mpm/dashboard/static/events.html +0 -607
  407. claude_mpm/dashboard/static/index.html +0 -635
  408. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  409. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  410. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  411. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  412. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  413. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  414. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  415. claude_mpm/dashboard/static/legacy/files.html +0 -747
  416. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  417. claude_mpm/dashboard/static/monitors.html +0 -431
  418. claude_mpm/dashboard/static/production/events.html +0 -659
  419. claude_mpm/dashboard/static/production/main.html +0 -698
  420. claude_mpm/dashboard/static/production/monitors.html +0 -483
  421. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  422. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  423. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  424. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  425. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  426. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  427. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  428. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  429. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  430. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  431. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  432. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  433. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  434. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  435. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  436. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  437. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  438. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  439. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  440. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  441. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  442. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  443. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  444. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  445. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  446. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  447. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  448. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  449. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  450. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  451. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  452. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  453. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  454. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  455. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  456. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  457. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  458. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  459. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  460. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  461. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  462. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  463. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  464. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  465. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  466. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  467. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  468. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  469. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  470. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  471. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  472. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  473. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  474. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  475. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  476. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  477. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  478. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  479. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  480. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  481. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  482. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  483. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  484. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  485. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  486. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  487. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  488. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  489. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  490. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  491. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  492. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  493. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  494. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  495. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  496. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  497. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  498. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  499. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  500. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  501. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  502. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  503. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  504. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  505. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  506. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  507. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  508. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  509. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  510. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  511. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  512. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  513. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  514. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
  515. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
  516. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
  517. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.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()
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