claude-mpm 4.16.0__py3-none-any.whl → 4.25.10__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 (531) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +272 -23
  4. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/agent_loader.py +4 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/api_qa.json +5 -2
  11. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  12. claude_mpm/agents/templates/documentation.json +33 -6
  13. claude_mpm/agents/templates/engineer.json +5 -1
  14. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  15. claude_mpm/agents/templates/php-engineer.json +10 -4
  16. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  17. claude_mpm/agents/templates/project_organizer.json +7 -3
  18. claude_mpm/agents/templates/python_engineer.json +8 -3
  19. claude_mpm/agents/templates/qa.json +2 -1
  20. claude_mpm/agents/templates/react_engineer.json +1 -0
  21. claude_mpm/agents/templates/research.json +82 -12
  22. claude_mpm/agents/templates/rust_engineer.json +12 -7
  23. claude_mpm/agents/templates/security.json +4 -4
  24. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  25. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  26. claude_mpm/agents/templates/ticketing.json +10 -6
  27. claude_mpm/agents/templates/version_control.json +4 -2
  28. claude_mpm/agents/templates/web_qa.json +2 -1
  29. claude_mpm/cli/README.md +253 -0
  30. claude_mpm/cli/__init__.py +11 -1
  31. claude_mpm/cli/commands/__init__.py +2 -0
  32. claude_mpm/cli/commands/aggregate.py +1 -1
  33. claude_mpm/cli/commands/analyze.py +3 -3
  34. claude_mpm/cli/commands/cleanup.py +1 -1
  35. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  36. claude_mpm/cli/commands/debug.py +12 -12
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  40. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  41. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  42. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  43. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  44. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  45. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  46. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  47. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  48. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  49. claude_mpm/cli/commands/run.py +124 -128
  50. claude_mpm/cli/commands/skills.py +922 -0
  51. claude_mpm/cli/executor.py +58 -0
  52. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  53. claude_mpm/cli/parsers/base_parser.py +35 -0
  54. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  55. claude_mpm/cli/parsers/skills_parser.py +275 -0
  56. claude_mpm/cli/startup.py +168 -8
  57. claude_mpm/cli/startup_display.py +480 -0
  58. claude_mpm/cli/utils.py +1 -1
  59. claude_mpm/cli_module/commands.py +1 -1
  60. claude_mpm/cli_module/refactoring_guide.md +253 -0
  61. claude_mpm/commands/mpm-auto-configure.md +52 -0
  62. claude_mpm/commands/mpm-help.md +6 -0
  63. claude_mpm/commands/mpm-init.md +130 -8
  64. claude_mpm/commands/mpm-resume.md +372 -0
  65. claude_mpm/commands/mpm-tickets.md +56 -7
  66. claude_mpm/commands/mpm-version.md +113 -0
  67. claude_mpm/commands/mpm.md +2 -0
  68. claude_mpm/config/agent_capabilities.yaml +658 -0
  69. claude_mpm/config/agent_config.py +2 -2
  70. claude_mpm/config/async_logging_config.yaml +145 -0
  71. claude_mpm/constants.py +24 -0
  72. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  73. claude_mpm/core/api_validator.py +1 -1
  74. claude_mpm/core/claude_runner.py +14 -1
  75. claude_mpm/core/config.py +50 -0
  76. claude_mpm/core/constants.py +1 -1
  77. claude_mpm/core/factories.py +1 -1
  78. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  79. claude_mpm/core/hook_error_memory.py +381 -0
  80. claude_mpm/core/hook_manager.py +41 -2
  81. claude_mpm/core/interactive_session.py +48 -3
  82. claude_mpm/core/interfaces.py +56 -1
  83. claude_mpm/core/logger.py +3 -1
  84. claude_mpm/core/oneshot_session.py +39 -0
  85. claude_mpm/core/optimized_agent_loader.py +3 -3
  86. claude_mpm/d2/.gitignore +22 -0
  87. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  88. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  89. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  90. claude_mpm/d2/QUICKSTART.md +186 -0
  91. claude_mpm/d2/README.md +232 -0
  92. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  93. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  94. claude_mpm/d2/TESTING.md +288 -0
  95. claude_mpm/d2/index.html +118 -0
  96. claude_mpm/d2/package.json +19 -0
  97. claude_mpm/d2/src/App.svelte +110 -0
  98. claude_mpm/d2/src/components/Header.svelte +153 -0
  99. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  100. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  101. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  102. claude_mpm/d2/src/lib/socketio.js +144 -0
  103. claude_mpm/d2/src/main.js +7 -0
  104. claude_mpm/d2/src/stores/events.js +114 -0
  105. claude_mpm/d2/src/stores/socket.js +108 -0
  106. claude_mpm/d2/src/stores/theme.js +65 -0
  107. claude_mpm/d2/svelte.config.js +12 -0
  108. claude_mpm/d2/vite.config.js +15 -0
  109. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  110. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  111. claude_mpm/dashboard/README.md +121 -0
  112. claude_mpm/dashboard/VERSION +1 -0
  113. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  114. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  115. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  116. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  117. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  118. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  119. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  120. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  121. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  122. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  123. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  124. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  125. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  127. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  128. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  129. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  130. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  131. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  132. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  135. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  136. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  140. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  141. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  142. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  143. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  144. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  145. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  146. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  147. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  148. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  149. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  150. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  151. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  152. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  153. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  154. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  155. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  156. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  157. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  158. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  159. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  160. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  161. claude_mpm/dashboard/static/css/activity.css +69 -69
  162. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  163. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  164. claude_mpm/dashboard/static/index.html +22 -22
  165. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  166. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  167. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  168. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  169. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  170. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  171. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  172. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  173. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  174. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  175. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  176. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  177. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  178. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  179. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  180. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  181. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  182. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  183. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  184. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  185. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  186. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  187. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  188. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  189. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  190. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  191. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  192. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  193. claude_mpm/dashboard/static/production/main.html +21 -21
  194. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  195. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  196. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  197. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  198. claude_mpm/dashboard/templates/code_simple.html +23 -23
  199. claude_mpm/dashboard/templates/index.html +18 -18
  200. claude_mpm/hooks/README.md +143 -0
  201. claude_mpm/hooks/__init__.py +8 -0
  202. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  203. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  204. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  205. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  206. claude_mpm/hooks/session_resume_hook.py +121 -0
  207. claude_mpm/hooks/templates/README.md +180 -0
  208. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  209. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  210. claude_mpm/hooks/templates/settings.json.example +147 -0
  211. claude_mpm/models/resume_log.py +340 -0
  212. claude_mpm/schemas/agent_schema.json +596 -0
  213. claude_mpm/schemas/frontmatter_schema.json +165 -0
  214. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  215. claude_mpm/scripts/start_activity_logging.py +3 -1
  216. claude_mpm/services/agents/auto_config_manager.py +1 -1
  217. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  218. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  219. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  220. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  221. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  222. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  223. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  224. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  225. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  226. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  227. claude_mpm/services/agents/local_template_manager.py +4 -2
  228. claude_mpm/services/agents/recommender.py +47 -0
  229. claude_mpm/services/cli/resume_service.py +617 -0
  230. claude_mpm/services/cli/session_manager.py +87 -0
  231. claude_mpm/services/cli/session_pause_manager.py +504 -0
  232. claude_mpm/services/cli/session_resume_helper.py +372 -0
  233. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  234. claude_mpm/services/core/base.py +26 -11
  235. claude_mpm/services/core/interfaces.py +56 -1
  236. claude_mpm/services/core/models/agent_config.py +3 -0
  237. claude_mpm/services/core/models/process.py +4 -0
  238. claude_mpm/services/core/path_resolver.py +1 -1
  239. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  240. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  241. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  242. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  243. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  244. claude_mpm/services/diagnostics/models.py +21 -0
  245. claude_mpm/services/event_bus/README.md +244 -0
  246. claude_mpm/services/event_bus/direct_relay.py +3 -3
  247. claude_mpm/services/event_bus/event_bus.py +36 -3
  248. claude_mpm/services/event_bus/relay.py +23 -7
  249. claude_mpm/services/events/README.md +303 -0
  250. claude_mpm/services/events/consumers/logging.py +1 -2
  251. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  252. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  253. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  254. claude_mpm/services/local_ops/__init__.py +2 -0
  255. claude_mpm/services/local_ops/process_manager.py +1 -1
  256. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  257. claude_mpm/services/mcp_config_manager.py +7 -131
  258. claude_mpm/services/mcp_gateway/README.md +185 -0
  259. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  260. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  261. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  262. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  263. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  264. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  265. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  266. claude_mpm/services/memory/failure_tracker.py +19 -4
  267. claude_mpm/services/memory/optimizer.py +1 -1
  268. claude_mpm/services/model/model_router.py +8 -9
  269. claude_mpm/services/monitor/daemon.py +1 -1
  270. claude_mpm/services/monitor/server.py +2 -2
  271. claude_mpm/services/native_agent_converter.py +356 -0
  272. claude_mpm/services/port_manager.py +1 -1
  273. claude_mpm/services/project/documentation_manager.py +2 -1
  274. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  275. claude_mpm/services/runner_configuration_service.py +1 -0
  276. claude_mpm/services/self_upgrade_service.py +165 -7
  277. claude_mpm/services/session_manager.py +205 -1
  278. claude_mpm/services/skills_config.py +547 -0
  279. claude_mpm/services/skills_deployer.py +955 -0
  280. claude_mpm/services/socketio/handlers/connection.py +1 -1
  281. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  282. claude_mpm/services/socketio/handlers/git.py +2 -2
  283. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  284. claude_mpm/services/static/.gitkeep +2 -0
  285. claude_mpm/services/system_instructions_service.py +1 -3
  286. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  287. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  288. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  289. claude_mpm/services/unified/deployment_strategies/local.py +1 -1
  290. claude_mpm/services/version_control/VERSION +1 -0
  291. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  292. claude_mpm/services/version_service.py +104 -1
  293. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  294. claude_mpm/skills/__init__.py +21 -0
  295. claude_mpm/skills/agent_skills_injector.py +324 -0
  296. claude_mpm/skills/bundled/.gitkeep +2 -0
  297. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  298. claude_mpm/skills/bundled/api-documentation.md +393 -0
  299. claude_mpm/skills/bundled/async-testing.md +571 -0
  300. claude_mpm/skills/bundled/code-review.md +143 -0
  301. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  302. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  303. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  304. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  305. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  306. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  307. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  308. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  309. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  310. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  311. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  312. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  313. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  314. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  315. claude_mpm/skills/bundled/database-migration.md +199 -0
  316. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  317. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  318. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  319. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  320. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  321. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  322. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  323. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  324. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  325. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  326. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  327. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  328. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  329. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  330. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  331. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  332. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  333. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  334. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  335. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  336. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  337. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  338. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  339. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  340. claude_mpm/skills/bundled/git-workflow.md +414 -0
  341. claude_mpm/skills/bundled/imagemagick.md +204 -0
  342. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  343. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  344. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  345. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  346. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  347. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  348. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  349. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  350. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  351. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  352. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  353. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  354. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  355. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  357. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  359. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  360. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  361. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  362. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  363. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  364. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  365. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  366. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  367. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  368. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  369. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  370. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  371. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  372. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  373. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  374. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  375. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  376. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  377. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  378. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  379. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  380. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  381. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  382. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  383. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  384. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  385. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  386. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  387. claude_mpm/skills/bundled/pdf.md +141 -0
  388. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  389. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  390. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  391. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  392. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  393. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  394. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  395. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  396. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  397. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  398. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  399. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  400. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  401. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  402. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  403. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  404. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  405. claude_mpm/skills/bundled/security-scanning.md +327 -0
  406. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  407. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  408. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  409. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  410. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  411. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  412. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  413. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  414. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  415. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  416. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  417. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  418. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  419. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  420. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  421. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  422. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  423. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  424. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  425. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  426. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  427. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  428. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  429. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  430. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  431. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  432. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  433. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  434. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  435. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  436. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  437. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  438. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  439. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  440. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  441. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  442. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  443. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  444. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  445. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  446. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  447. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  448. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  449. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  450. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  451. claude_mpm/skills/bundled/xlsx.md +157 -0
  452. claude_mpm/skills/registry.py +97 -9
  453. claude_mpm/skills/skills_registry.py +347 -0
  454. claude_mpm/skills/skills_service.py +739 -0
  455. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  456. claude_mpm/templates/questions/__init__.py +43 -0
  457. claude_mpm/templates/questions/base.py +193 -0
  458. claude_mpm/templates/questions/pr_strategy.py +314 -0
  459. claude_mpm/templates/questions/project_init.py +388 -0
  460. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  461. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  462. claude_mpm/tools/__main__.py +8 -8
  463. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  464. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  465. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  466. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  467. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  468. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  469. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  470. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  471. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  472. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  473. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  474. claude_mpm/utils/agent_dependency_loader.py +5 -5
  475. claude_mpm/utils/dependency_cache.py +3 -1
  476. claude_mpm/utils/gitignore.py +241 -0
  477. claude_mpm/utils/log_cleanup.py +3 -3
  478. claude_mpm/utils/robust_installer.py +3 -5
  479. claude_mpm/utils/structured_questions.py +619 -0
  480. claude_mpm-4.25.10.dist-info/METADATA +789 -0
  481. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
  482. claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
  483. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  484. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  485. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  486. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  487. claude_mpm/cli/commands/mpm_init.py +0 -2008
  488. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  489. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  490. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  491. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  492. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  493. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  494. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  495. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  496. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  497. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  498. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  499. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  500. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  501. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  502. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  503. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  504. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  505. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  506. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  507. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  508. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  509. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  510. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  511. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  512. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  513. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  514. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  515. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  516. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  517. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  518. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  519. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  520. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  521. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  522. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  523. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  524. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  525. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  526. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  527. claude_mpm-4.16.0.dist-info/METADATA +0 -453
  528. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  529. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  530. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  531. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.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}")
@@ -85,8 +85,8 @@ class InteractiveSession:
85
85
  self.logger.warning(f"WebSocket initialization failed: {error}")
86
86
  # Continue without WebSocket - not a fatal error
87
87
 
88
- # Display welcome message
89
- self._display_welcome_message()
88
+ # Banner now displayed in CLI startup - see startup_display.py
89
+ # Removed duplicate _display_welcome_message() to consolidate with main banner
90
90
 
91
91
  # Log session start
92
92
  if self.runner.project_logger:
@@ -293,7 +293,12 @@ class InteractiveSession:
293
293
  return False, f"Unexpected error with Socket.IO: {e}"
294
294
 
295
295
  def _display_welcome_message(self) -> None:
296
- """Display the interactive session welcome message."""
296
+ """Display the interactive session welcome message.
297
+
298
+ DEPRECATED: This method is kept for backward compatibility with tests.
299
+ The main banner is now displayed in startup_display.py during CLI startup.
300
+ This consolidated approach prevents duplicate banners.
301
+ """
297
302
  version_str = self.runner._get_version()
298
303
 
299
304
  # Get output style status
@@ -383,6 +388,14 @@ class InteractiveSession:
383
388
  self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
384
389
  cmd.extend(self.runner.claude_args)
385
390
 
391
+ # Add --agents flag if native agents mode is enabled
392
+ if getattr(self.runner, "use_native_agents", False):
393
+ agents_flag = self._build_agents_flag()
394
+ if agents_flag:
395
+ # Add --agents JSON directly (already properly formatted)
396
+ cmd.extend(agents_flag)
397
+ self.logger.info("✓ Native agents mode: Using --agents CLI flag")
398
+
386
399
  # Add system instructions
387
400
  from claude_mpm.core.claude_runner import create_simple_context
388
401
 
@@ -402,6 +415,38 @@ class InteractiveSession:
402
415
 
403
416
  return cmd
404
417
 
418
+ def _build_agents_flag(self) -> Optional[list]:
419
+ """Build --agents flag with all MPM agents.
420
+
421
+ Returns:
422
+ List with ["--agents", "<json>"] or None if conversion fails
423
+ """
424
+ try:
425
+ from claude_mpm.services.native_agent_converter import NativeAgentConverter
426
+
427
+ converter = NativeAgentConverter()
428
+ agents = converter.load_agents_from_templates()
429
+
430
+ if not agents:
431
+ self.logger.warning("No agents loaded for native mode")
432
+ return None
433
+
434
+ # Generate JSON for --agents flag
435
+ agents_json = converter.generate_agents_json(agents)
436
+ summary = converter.get_conversion_summary(agents)
437
+
438
+ self.logger.info(
439
+ f"Native agents: {summary['total_agents']} agents, "
440
+ f"{summary['json_size_kb']} KB JSON"
441
+ )
442
+
443
+ # Return as list: ["--agents", "<json>"]
444
+ return ["--agents", agents_json]
445
+
446
+ except Exception as e:
447
+ self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
448
+ return None
449
+
405
450
  def _prepare_environment(self) -> dict:
406
451
  """Prepare clean environment variables for Claude."""
407
452
  clean_env = os.environ.copy()
@@ -33,7 +33,62 @@ from pathlib import Path
33
33
  from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar
34
34
 
35
35
  # Re-export everything from the new location for backward compatibility
36
- from claude_mpm.services.core.interfaces import *
36
+ from claude_mpm.services.core.interfaces import ( # noqa: F401
37
+ AgentCapabilitiesInterface,
38
+ AgentDeploymentInterface,
39
+ AgentMetadata,
40
+ CacheEntry,
41
+ CommandHandlerInterface,
42
+ HealthStatus,
43
+ HookServiceInterface,
44
+ IAgentRecommender,
45
+ IAgentRegistry,
46
+ IAutoConfigManager,
47
+ ICacheService,
48
+ IConfigurationManager,
49
+ IConfigurationService,
50
+ ICrashDetector,
51
+ IDeploymentStateManager,
52
+ IErrorHandler,
53
+ IEventBus,
54
+ IHealthCheck,
55
+ IHealthCheckManager,
56
+ IHealthMonitor,
57
+ ILocalProcessManager,
58
+ ILogMonitor,
59
+ IMemoryLeakDetector,
60
+ IModelProvider,
61
+ IModelRouter,
62
+ InterfaceRegistry,
63
+ IPerformanceMonitor,
64
+ IPromptCache,
65
+ IResourceMonitor,
66
+ IRestartManager,
67
+ IRestartPolicy,
68
+ IServiceContainer,
69
+ IServiceFactory,
70
+ IServiceLifecycle,
71
+ IStructuredLogger,
72
+ ITemplateManager,
73
+ IToolchainAnalyzer,
74
+ MemoryHookInterface,
75
+ MemoryServiceInterface,
76
+ ModelCapability,
77
+ ModelProvider,
78
+ ModelResponse,
79
+ ProjectAnalyzerInterface,
80
+ RunnerConfigurationInterface,
81
+ ServiceType,
82
+ SessionManagementInterface,
83
+ SocketIOServiceInterface,
84
+ SubprocessLauncherInterface,
85
+ SystemInstructionsInterface,
86
+ T,
87
+ TemplateRenderContext,
88
+ TicketManagerInterface,
89
+ UtilityServiceInterface,
90
+ VersionServiceInterface,
91
+ )
37
92
 
38
93
  # Type variables for generic interfaces
39
94
  T = TypeVar("T")
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
@@ -268,8 +268,47 @@ class OneshotSession:
268
268
  if self.runner.claude_args:
269
269
  cmd.extend(self.runner.claude_args)
270
270
 
271
+ # Add --agents flag if native agents mode is enabled
272
+ if getattr(self.runner, "use_native_agents", False):
273
+ agents_flag = self._build_agents_flag()
274
+ if agents_flag:
275
+ cmd.extend(agents_flag)
276
+ self.logger.info("✓ Native agents mode: Using --agents CLI flag")
277
+
271
278
  return cmd
272
279
 
280
+ def _build_agents_flag(self) -> Optional[list]:
281
+ """Build --agents flag with all MPM agents.
282
+
283
+ Returns:
284
+ List with ["--agents", "<json>"] or None if conversion fails
285
+ """
286
+ try:
287
+ from claude_mpm.services.native_agent_converter import NativeAgentConverter
288
+
289
+ converter = NativeAgentConverter()
290
+ agents = converter.load_agents_from_templates()
291
+
292
+ if not agents:
293
+ self.logger.warning("No agents loaded for native mode")
294
+ return None
295
+
296
+ # Generate JSON for --agents flag
297
+ agents_json = converter.generate_agents_json(agents)
298
+ summary = converter.get_conversion_summary(agents)
299
+
300
+ self.logger.info(
301
+ f"Native agents: {summary['total_agents']} agents, "
302
+ f"{summary['json_size_kb']} KB JSON"
303
+ )
304
+
305
+ # Return as list: ["--agents", "<json>"]
306
+ return ["--agents", agents_json]
307
+
308
+ except Exception as e:
309
+ self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
310
+ return None
311
+
273
312
  def _handle_successful_response(self, response: str, prompt: str) -> None:
274
313
  """Process a successful Claude response."""
275
314
  print(response)
@@ -236,7 +236,7 @@ class OptimizedAgentLoader:
236
236
 
237
237
  self.metrics.total_time = time.time() - start_time
238
238
 
239
- self.logger.info(
239
+ self.logger.debug(
240
240
  f"Loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
241
241
  f"in {self.metrics.total_time:.2f}s "
242
242
  f"(cache hits: {self.metrics.cache_hits}, misses: {self.metrics.cache_misses})"
@@ -286,7 +286,7 @@ class OptimizedAgentLoader:
286
286
 
287
287
  self.metrics.total_time = time.time() - start_time
288
288
 
289
- self.logger.info(
289
+ self.logger.debug(
290
290
  f"Async loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
291
291
  f"in {self.metrics.total_time:.2f}s"
292
292
  )
@@ -418,7 +418,7 @@ class OptimizedAgentLoader:
418
418
  Args:
419
419
  agent_dirs: List of directories containing agents
420
420
  """
421
- self.logger.info(f"Preloading agents from {len(agent_dirs)} directories")
421
+ self.logger.debug(f"Preloading agents from {len(agent_dirs)} directories")
422
422
 
423
423
  all_paths = []
424
424
  for dir_path in agent_dirs: