claude-mpm 4.20.3__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 (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -163,17 +163,21 @@ class MCPAutoConfigurator:
163
163
  Returns:
164
164
  True if user agrees, False if declines, None if timeout
165
165
  """
166
- print("\n" + "=" * 60)
167
- print("🔧 MCP Gateway Configuration")
168
- print("=" * 60)
169
- print("\nClaude MPM can automatically configure MCP Gateway for")
170
- print("Claude Code integration. This enables advanced features:")
171
- print(" • File analysis and summarization")
172
- print(" • System diagnostics")
173
- print(" Ticket management")
174
- print(" • And more...")
175
- print("\nWould you like to configure it now? (y/n)")
176
- print(f"(Auto-declining in {timeout} seconds)")
166
+ print("\n" + "=" * 60, file=sys.stderr)
167
+ print("🔧 MCP Gateway Configuration", file=sys.stderr)
168
+ print("=" * 60, file=sys.stderr)
169
+ print(
170
+ "\nClaude MPM can automatically configure MCP Gateway for", file=sys.stderr
171
+ )
172
+ print(
173
+ "Claude Code integration. This enables advanced features:", file=sys.stderr
174
+ )
175
+ print(" File analysis and summarization", file=sys.stderr)
176
+ print(" System diagnostics", file=sys.stderr)
177
+ print(" • Ticket management", file=sys.stderr)
178
+ print(" • And more...", file=sys.stderr)
179
+ print("\nWould you like to configure it now? (y/n)", file=sys.stderr)
180
+ print(f"(Auto-declining in {timeout} seconds)", file=sys.stderr)
177
181
 
178
182
  # Use threading for cross-platform timeout support
179
183
  # Python 3.7+ has queue built-in - no need to check, we require 3.10+
@@ -203,7 +207,7 @@ class MCPAutoConfigurator:
203
207
 
204
208
  if input_thread.is_alive():
205
209
  # Timed out
206
- print("\n(Timed out - declining)")
210
+ print("\n(Timed out - declining)", file=sys.stderr)
207
211
  return None
208
212
  # Got input
209
213
  return user_input in ["y", "yes"]
@@ -220,7 +224,7 @@ class MCPAutoConfigurator:
220
224
  if self.claude_config_path.exists():
221
225
  backup_path = self._create_backup()
222
226
  if backup_path:
223
- print(f"✅ Backup created: {backup_path}")
227
+ print(f"✅ Backup created: {backup_path}", file=sys.stderr)
224
228
 
225
229
  # Load or create configuration
226
230
  config = self._load_or_create_config()
@@ -232,7 +236,7 @@ class MCPAutoConfigurator:
232
236
  # Find claude-mpm executable
233
237
  executable = self._find_claude_mpm_executable()
234
238
  if not executable:
235
- print("❌ Could not find claude-mpm executable")
239
+ print("❌ Could not find claude-mpm executable", file=sys.stderr)
236
240
  return False
237
241
 
238
242
  # Configure MCP server
@@ -246,20 +250,22 @@ class MCPAutoConfigurator:
246
250
  with self.claude_config_path.open("w") as f:
247
251
  json.dump(config, f, indent=2)
248
252
 
249
- print(f"✅ Configuration saved to: {self.claude_config_path}")
250
- print("\n🎉 MCP Gateway configured successfully!")
251
- print("\nNext steps:")
252
- print("1. Restart Claude Code (if running)")
253
- print("2. Look for the MCP icon in the interface")
254
- print("3. Try @claude-mpm-gateway in a conversation")
253
+ print(
254
+ f" Configuration saved to: {self.claude_config_path}", file=sys.stderr
255
+ )
256
+ print("\n🎉 MCP Gateway configured successfully!", file=sys.stderr)
257
+ print("\nNext steps:", file=sys.stderr)
258
+ print("1. Restart Claude Code (if running)", file=sys.stderr)
259
+ print("2. Look for the MCP icon in the interface", file=sys.stderr)
260
+ print("3. Try @claude-mpm-gateway in a conversation", file=sys.stderr)
255
261
 
256
262
  return True
257
263
 
258
264
  except Exception as e:
259
265
  self.logger.error(f"Auto-configuration failed: {e}")
260
- print(f"❌ Configuration failed: {e}")
261
- print("\nYou can configure manually with:")
262
- print(" claude-mpm mcp install")
266
+ print(f"❌ Configuration failed: {e}", file=sys.stderr)
267
+ print("\nYou can configure manually with:", file=sys.stderr)
268
+ print(" claude-mpm mcp install", file=sys.stderr)
263
269
  return False
264
270
 
265
271
  def _create_backup(self) -> Optional[Path]:
@@ -344,8 +350,8 @@ class MCPAutoConfigurator:
344
350
  if user_choice:
345
351
  return self.auto_configure()
346
352
  if user_choice is False: # User explicitly said no
347
- print("\n📝 You can configure MCP later with:")
348
- print(" claude-mpm mcp install")
353
+ print("\n📝 You can configure MCP later with:", file=sys.stderr)
354
+ print(" claude-mpm mcp install", file=sys.stderr)
349
355
  # If timeout (None), don't show additional message
350
356
  return False
351
357
 
@@ -215,7 +215,7 @@ class MCPConfiguration(BaseMCPService, IMCPConfiguration):
215
215
  current[part] = {}
216
216
  elif not isinstance(current[part], dict):
217
217
  self.log_warning(
218
- f"Cannot override non-dict config at {'.'.join(config_path[:i+1])}"
218
+ f"Cannot override non-dict config at {'.'.join(config_path[: i + 1])}"
219
219
  )
220
220
  break
221
221
  current = current[part]
@@ -864,7 +864,7 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
864
864
  # Check if running in a non-interactive context
865
865
  try:
866
866
  if confirm_operation(message):
867
- print("🚀 Updating kuzu-memory...")
867
+ print("🚀 Updating kuzu-memory...", file=sys.stderr)
868
868
  try:
869
869
  result = subprocess.run(
870
870
  ["pipx", "upgrade", "kuzu-memory"],
@@ -874,28 +874,37 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
874
874
  check=False,
875
875
  )
876
876
  if result.returncode == 0:
877
- print("✅ Successfully updated kuzu-memory!")
877
+ print("✅ Successfully updated kuzu-memory!", file=sys.stderr)
878
878
  logger.info(f"Updated kuzu-memory from {current} to {latest}")
879
879
  else:
880
- print(f"⚠️ Update failed: {result.stderr}")
880
+ print(f"⚠️ Update failed: {result.stderr}", file=sys.stderr)
881
881
  logger.warning(f"kuzu-memory update failed: {result.stderr}")
882
882
  except subprocess.TimeoutExpired:
883
- print("⚠️ Update timed out. Please try again later.")
883
+ print("⚠️ Update timed out. Please try again later.", file=sys.stderr)
884
884
  logger.warning("kuzu-memory update timed out")
885
885
  except Exception as e:
886
- print(f"⚠️ Update failed: {e}")
886
+ print(f"⚠️ Update failed: {e}", file=sys.stderr)
887
887
  logger.warning(f"kuzu-memory update error: {e}")
888
888
  else:
889
889
  # User declined update
890
- print("\n To skip this version permanently, run:")
891
- print(f" claude-mpm config set-skip-version kuzu-memory {latest}")
892
- print(" To disable update checks for kuzu-memory:")
893
- print(" claude-mpm config disable-update-checks kuzu-memory")
890
+ print("\n To skip this version permanently, run:", file=sys.stderr)
891
+ print(
892
+ f" claude-mpm config set-skip-version kuzu-memory {latest}",
893
+ file=sys.stderr,
894
+ )
895
+ print(" To disable update checks for kuzu-memory:", file=sys.stderr)
896
+ print(
897
+ " claude-mpm config disable-update-checks kuzu-memory",
898
+ file=sys.stderr,
899
+ )
894
900
 
895
901
  # Ask if user wants to skip this version
896
902
  if confirm_operation("\n Skip this version in future checks?"):
897
903
  UpdatePreferences.set_skip_version("kuzu-memory", latest)
898
- print(f" Version {latest} will be skipped in future checks.")
904
+ print(
905
+ f" Version {latest} will be skipped in future checks.",
906
+ file=sys.stderr,
907
+ )
899
908
  except (KeyboardInterrupt, EOFError):
900
909
  # User interrupted or input not available
901
910
  pass
@@ -65,7 +65,6 @@ def apply_backward_compatibility_patches():
65
65
  and hasattr(request, "params")
66
66
  and request.params is not None
67
67
  ):
68
-
69
68
  # Convert params to dict to check for clientInfo
70
69
  params_dict = request.params
71
70
  if hasattr(params_dict, "model_dump"):
@@ -542,7 +541,6 @@ class SimpleMCPServer:
542
541
 
543
542
  result = f"Python: {sys.version}"
544
543
  elif info_type == "cwd":
545
-
546
544
  result = f"Working Directory: {Path.cwd()}"
547
545
  elif info_type == "all":
548
546
  import datetime
@@ -73,7 +73,7 @@ class LRUCache:
73
73
  if not self.cache:
74
74
  break
75
75
  # Remove least recently used item
76
- removed_key, removed_value = self.cache.popitem(last=False)
76
+ _removed_key, removed_value = self.cache.popitem(last=False)
77
77
  self.current_memory -= removed_value.get("size_bytes", 0)
78
78
 
79
79
  # Add new item
@@ -161,12 +161,17 @@ class ExternalMCPService(BaseToolAdapter):
161
161
 
162
162
  if interactive:
163
163
  # Show user-friendly installation prompt
164
- print(f"\n⚠️ {self.package_name} not found")
165
- print("This package enables enhanced functionality (optional).")
166
- print("\nInstallation options:")
167
- print("1. Install via pip (recommended for this project)")
168
- print("2. Install via pipx (isolated, system-wide)")
169
- print("3. Skip (continue without this package)")
164
+ print(f"\n⚠️ {self.package_name} not found", file=sys.stderr)
165
+ print(
166
+ "This package enables enhanced functionality (optional).",
167
+ file=sys.stderr,
168
+ )
169
+ print("\nInstallation options:", file=sys.stderr)
170
+ print(
171
+ "1. Install via pip (recommended for this project)", file=sys.stderr
172
+ )
173
+ print("2. Install via pipx (isolated, system-wide)", file=sys.stderr)
174
+ print("3. Skip (continue without this package)", file=sys.stderr)
170
175
 
171
176
  try:
172
177
  choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
@@ -180,7 +185,7 @@ class ExternalMCPService(BaseToolAdapter):
180
185
  )
181
186
  return False
182
187
  except (EOFError, KeyboardInterrupt):
183
- print("\nInstallation cancelled")
188
+ print("\nInstallation cancelled", file=sys.stderr)
184
189
  return False
185
190
  else:
186
191
  # Non-interactive: default to pip
@@ -201,7 +206,7 @@ class ExternalMCPService(BaseToolAdapter):
201
206
  async def _install_via_pip(self) -> bool:
202
207
  """Install package via pip."""
203
208
  try:
204
- print(f"\n📦 Installing {self.package_name} via pip...")
209
+ print(f"\n📦 Installing {self.package_name} via pip...", file=sys.stderr)
205
210
  result = subprocess.run(
206
211
  [sys.executable, "-m", "pip", "install", self.package_name],
207
212
  capture_output=True,
@@ -211,21 +216,21 @@ class ExternalMCPService(BaseToolAdapter):
211
216
  )
212
217
 
213
218
  if result.returncode == 0:
214
- print(f"✓ Successfully installed {self.package_name}")
219
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
215
220
  self.logger.info(f"Successfully installed {self.package_name} via pip")
216
221
  return True
217
222
 
218
223
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
219
- print(f"✗ Installation failed: {error_msg}")
224
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
220
225
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
221
226
  return False
222
227
 
223
228
  except subprocess.TimeoutExpired:
224
- print("✗ Installation timed out")
229
+ print("✗ Installation timed out", file=sys.stderr)
225
230
  self.logger.error(f"Installation of {self.package_name} timed out")
226
231
  return False
227
232
  except Exception as e:
228
- print(f"✗ Installation error: {e}")
233
+ print(f"✗ Installation error: {e}", file=sys.stderr)
229
234
  self.logger.error(f"Error installing {self.package_name}: {e}")
230
235
  return False
231
236
 
@@ -242,12 +247,12 @@ class ExternalMCPService(BaseToolAdapter):
242
247
  )
243
248
 
244
249
  if pipx_check.returncode != 0:
245
- print("✗ pipx is not installed")
246
- print("Install pipx first: python -m pip install pipx")
250
+ print("✗ pipx is not installed", file=sys.stderr)
251
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
247
252
  self.logger.error("pipx not available for installation")
248
253
  return False
249
254
 
250
- print(f"\n📦 Installing {self.package_name} via pipx...")
255
+ print(f"\n📦 Installing {self.package_name} via pipx...", file=sys.stderr)
251
256
  result = subprocess.run(
252
257
  ["pipx", "install", self.package_name],
253
258
  capture_output=True,
@@ -257,26 +262,26 @@ class ExternalMCPService(BaseToolAdapter):
257
262
  )
258
263
 
259
264
  if result.returncode == 0:
260
- print(f"✓ Successfully installed {self.package_name}")
265
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
261
266
  self.logger.info(f"Successfully installed {self.package_name} via pipx")
262
267
  return True
263
268
 
264
269
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
265
- print(f"✗ Installation failed: {error_msg}")
270
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
266
271
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
267
272
  return False
268
273
 
269
274
  except FileNotFoundError:
270
- print("✗ pipx command not found")
271
- print("Install pipx first: python -m pip install pipx")
275
+ print("✗ pipx command not found", file=sys.stderr)
276
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
272
277
  self.logger.error("pipx command not found")
273
278
  return False
274
279
  except subprocess.TimeoutExpired:
275
- print("✗ Installation timed out")
280
+ print("✗ Installation timed out", file=sys.stderr)
276
281
  self.logger.error(f"Installation of {self.package_name} timed out")
277
282
  return False
278
283
  except Exception as e:
279
- print(f"✗ Installation error: {e}")
284
+ print(f"✗ Installation error: {e}", file=sys.stderr)
280
285
  self.logger.error(f"Error installing {self.package_name}: {e}")
281
286
  return False
282
287
 
@@ -199,7 +199,9 @@ class KuzuMemoryService(BaseToolAdapter):
199
199
  try:
200
200
  if action == "store":
201
201
  result = await self.store_memory(
202
- params.get("content"), params.get("tags"), {} # metadata
202
+ params.get("content"),
203
+ params.get("tags"),
204
+ {}, # metadata
203
205
  )
204
206
  elif action == "recall":
205
207
  result = await self.recall_memories(
@@ -213,7 +215,9 @@ class KuzuMemoryService(BaseToolAdapter):
213
215
  )
214
216
  elif action == "context":
215
217
  result = await self.get_context(
216
- params.get("query", ""), 2, True # depth # include_related
218
+ params.get("query", ""),
219
+ 2,
220
+ True, # depth # include_related
217
221
  )
218
222
  else:
219
223
  return MCPToolResult(success=False, error=f"Unknown action: {action}")
@@ -29,6 +29,7 @@ Example flow:
29
29
 
30
30
  import logging
31
31
  import re
32
+ import threading
32
33
  from dataclasses import dataclass, field
33
34
  from datetime import datetime, timezone
34
35
  from typing import Dict, List, Optional, Tuple
@@ -536,6 +537,7 @@ class FailureTracker:
536
537
 
537
538
  # Singleton instance for session-level tracking
538
539
  _tracker_instance: Optional[FailureTracker] = None
540
+ _tracker_lock = threading.Lock()
539
541
 
540
542
 
541
543
  def get_failure_tracker() -> FailureTracker:
@@ -544,13 +546,23 @@ def get_failure_tracker() -> FailureTracker:
544
546
  WHY: Session-level tracking requires a singleton to maintain state
545
547
  across multiple hook invocations during the same session.
546
548
 
549
+ Thread-safe implementation using double-checked locking pattern to
550
+ prevent race conditions during concurrent initialization.
551
+
547
552
  Returns:
548
553
  The FailureTracker singleton instance
549
554
  """
550
555
  global _tracker_instance
551
- if _tracker_instance is None:
552
- _tracker_instance = FailureTracker()
553
- return _tracker_instance
556
+
557
+ # Fast path - check without lock
558
+ if _tracker_instance is not None:
559
+ return _tracker_instance
560
+
561
+ # Slow path - acquire lock and double-check
562
+ with _tracker_lock:
563
+ if _tracker_instance is None:
564
+ _tracker_instance = FailureTracker()
565
+ return _tracker_instance
554
566
 
555
567
 
556
568
  def reset_failure_tracker() -> None:
@@ -558,6 +570,9 @@ def reset_failure_tracker() -> None:
558
570
 
559
571
  WHY: Tests need to reset state between runs. Also useful for
560
572
  explicitly starting a new tracking session.
573
+
574
+ Thread-safe implementation ensures proper cleanup.
561
575
  """
562
576
  global _tracker_instance
563
- _tracker_instance = None
577
+ with _tracker_lock:
578
+ _tracker_instance = None
@@ -618,7 +618,7 @@ class MemoryOptimizer(LoggerMixin):
618
618
  )
619
619
 
620
620
  # Check for similar items
621
- consolidated, consolidated_count = self._consolidate_similar_items(
621
+ _consolidated, consolidated_count = self._consolidate_similar_items(
622
622
  unique_points
623
623
  )
624
624
  if consolidated_count > 0:
@@ -266,7 +266,7 @@ class ModelRouter(BaseService, IModelRouter):
266
266
 
267
267
  # Route based on strategy
268
268
  if self.strategy == RoutingStrategy.CLAUDE_ONLY:
269
- return await self._route_to_claude(content, task, model, **kwargs)
269
+ return await self._route_to_claude(content, task, model=model, **kwargs)
270
270
 
271
271
  if self.strategy in (
272
272
  RoutingStrategy.OLLAMA_ONLY,
@@ -275,13 +275,13 @@ class ModelRouter(BaseService, IModelRouter):
275
275
  return await self._route_to_ollama(
276
276
  content,
277
277
  task,
278
- model,
278
+ model=model,
279
279
  require_success=True,
280
280
  **kwargs,
281
281
  )
282
282
 
283
283
  # AUTO strategy
284
- return await self._route_auto(content, task, model, **kwargs)
284
+ return await self._route_auto(content, task, model=model, **kwargs)
285
285
 
286
286
  async def _route_auto(
287
287
  self,
@@ -308,7 +308,7 @@ class ModelRouter(BaseService, IModelRouter):
308
308
  response = await self._route_to_ollama(
309
309
  content,
310
310
  task,
311
- model,
311
+ model=model,
312
312
  require_success=False,
313
313
  **kwargs,
314
314
  )
@@ -325,7 +325,7 @@ class ModelRouter(BaseService, IModelRouter):
325
325
  # Ollama unavailable or failed - fallback to Claude
326
326
  if self.fallback_enabled:
327
327
  self.log_info("Falling back to Claude")
328
- return await self._route_to_claude(content, task, model, **kwargs)
328
+ return await self._route_to_claude(content, task, model=model, **kwargs)
329
329
  return self._create_error_response(
330
330
  task,
331
331
  model,
@@ -356,8 +356,7 @@ class ModelRouter(BaseService, IModelRouter):
356
356
  if require_success and not await self.ollama_provider.is_available():
357
357
  if self.strategy == RoutingStrategy.PRIVACY_FIRST:
358
358
  error_msg = (
359
- "Ollama not available. Privacy mode enabled - "
360
- "not sending to cloud."
359
+ "Ollama not available. Privacy mode enabled - not sending to cloud."
361
360
  )
362
361
  else:
363
362
  error_msg = "Ollama not available and required by configuration"
@@ -368,7 +367,7 @@ class ModelRouter(BaseService, IModelRouter):
368
367
  self._route_count["ollama"] += 1
369
368
 
370
369
  return await self.ollama_provider.analyze_content(
371
- content, task, model, **kwargs
370
+ content, task, model=model, **kwargs
372
371
  )
373
372
 
374
373
  async def _route_to_claude(
@@ -394,7 +393,7 @@ class ModelRouter(BaseService, IModelRouter):
394
393
  self._route_count["claude"] += 1
395
394
 
396
395
  return await self.claude_provider.analyze_content(
397
- content, task, model, **kwargs
396
+ content, task, model=model, **kwargs
398
397
  )
399
398
 
400
399
  def _create_error_response(
@@ -479,7 +479,7 @@ class UnifiedMonitorDaemon:
479
479
  except OSError:
480
480
  if i < 9:
481
481
  self.logger.debug(
482
- f"Port {self.port} still in use, waiting... ({i+1}/10)"
482
+ f"Port {self.port} still in use, waiting... ({i + 1}/10)"
483
483
  )
484
484
  time.sleep(1)
485
485
  else:
@@ -203,8 +203,8 @@ class UnifiedMonitorServer:
203
203
  # Create Socket.IO server with proper ping configuration
204
204
  self.sio = socketio.AsyncServer(
205
205
  cors_allowed_origins="*",
206
- logger=False,
207
- engineio_logger=False,
206
+ logger=True, # Enable to see Socket.IO events and connection lifecycle
207
+ engineio_logger=True, # Enable to see Engine.IO protocol handshake details
208
208
  ping_interval=30, # 30 seconds ping interval (matches client expectation)
209
209
  ping_timeout=60, # 60 seconds ping timeout (generous for stability)
210
210
  )