claude-mpm 5.0.9__py3-none-any.whl → 5.4.41__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 (263) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/{PM_INSTRUCTIONS_TEACH.md → CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md} +721 -41
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +468 -468
  7. claude_mpm/agents/WORKFLOW.md +5 -254
  8. claude_mpm/agents/agent_loader.py +13 -44
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/frontmatter_validator.py +70 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +431 -45
  12. claude_mpm/cli/__init__.py +0 -1
  13. claude_mpm/cli/__main__.py +4 -0
  14. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  15. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  16. claude_mpm/cli/commands/agents.py +175 -37
  17. claude_mpm/cli/commands/auto_configure.py +723 -236
  18. claude_mpm/cli/commands/config.py +88 -2
  19. claude_mpm/cli/commands/configure.py +1262 -157
  20. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  21. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  22. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  23. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  24. claude_mpm/cli/commands/postmortem.py +1 -1
  25. claude_mpm/cli/commands/profile.py +277 -0
  26. claude_mpm/cli/commands/skills.py +214 -189
  27. claude_mpm/cli/commands/summarize.py +413 -0
  28. claude_mpm/cli/executor.py +21 -3
  29. claude_mpm/cli/interactive/agent_wizard.py +85 -10
  30. claude_mpm/cli/parsers/agents_parser.py +54 -9
  31. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  32. claude_mpm/cli/parsers/base_parser.py +12 -0
  33. claude_mpm/cli/parsers/config_parser.py +153 -83
  34. claude_mpm/cli/parsers/profile_parser.py +148 -0
  35. claude_mpm/cli/parsers/skills_parser.py +3 -2
  36. claude_mpm/cli/startup.py +879 -149
  37. claude_mpm/commands/mpm-config.md +28 -0
  38. claude_mpm/commands/mpm-doctor.md +9 -22
  39. claude_mpm/commands/mpm-help.md +5 -287
  40. claude_mpm/commands/mpm-init.md +81 -507
  41. claude_mpm/commands/mpm-monitor.md +15 -402
  42. claude_mpm/commands/mpm-organize.md +120 -0
  43. claude_mpm/commands/mpm-postmortem.md +6 -108
  44. claude_mpm/commands/mpm-session-resume.md +12 -363
  45. claude_mpm/commands/mpm-status.md +5 -69
  46. claude_mpm/commands/mpm-ticket-view.md +52 -495
  47. claude_mpm/commands/mpm-version.md +5 -107
  48. claude_mpm/config/agent_sources.py +27 -0
  49. claude_mpm/core/config.py +2 -4
  50. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  51. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  52. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  53. claude_mpm/core/framework_loader.py +4 -2
  54. claude_mpm/core/logger.py +13 -0
  55. claude_mpm/core/optimized_startup.py +59 -0
  56. claude_mpm/core/output_style_manager.py +173 -43
  57. claude_mpm/core/shared/config_loader.py +1 -1
  58. claude_mpm/core/socketio_pool.py +3 -3
  59. claude_mpm/core/unified_agent_registry.py +134 -16
  60. claude_mpm/core/unified_config.py +22 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  74. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  75. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  76. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  77. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  78. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  87. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  88. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  89. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  90. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  91. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  92. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  97. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  98. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  99. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  100. claude_mpm/hooks/memory_integration_hook.py +46 -1
  101. claude_mpm/init.py +63 -19
  102. claude_mpm/models/agent_definition.py +7 -0
  103. claude_mpm/models/git_repository.py +3 -3
  104. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  105. claude_mpm/scripts/launch_monitor.py +93 -13
  106. claude_mpm/scripts/start_activity_logging.py +0 -0
  107. claude_mpm/services/agents/agent_builder.py +3 -3
  108. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  109. claude_mpm/services/agents/agent_review_service.py +280 -0
  110. claude_mpm/services/agents/cache_git_manager.py +6 -6
  111. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  112. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  113. claude_mpm/services/agents/deployment/agent_template_builder.py +5 -3
  114. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  115. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +320 -29
  116. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +546 -68
  117. claude_mpm/services/agents/git_source_manager.py +36 -2
  118. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  119. claude_mpm/services/agents/recommender.py +5 -3
  120. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  121. claude_mpm/services/agents/sources/git_source_sync_service.py +13 -6
  122. claude_mpm/services/agents/startup_sync.py +22 -2
  123. claude_mpm/services/agents/toolchain_detector.py +10 -6
  124. claude_mpm/services/analysis/__init__.py +11 -1
  125. claude_mpm/services/analysis/clone_detector.py +1030 -0
  126. claude_mpm/services/command_deployment_service.py +81 -10
  127. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  128. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  129. claude_mpm/services/event_bus/config.py +3 -1
  130. claude_mpm/services/git/git_operations_service.py +101 -16
  131. claude_mpm/services/monitor/daemon.py +9 -2
  132. claude_mpm/services/monitor/daemon_manager.py +39 -3
  133. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  134. claude_mpm/services/monitor/server.py +698 -22
  135. claude_mpm/services/pm_skills_deployer.py +676 -0
  136. claude_mpm/services/profile_manager.py +331 -0
  137. claude_mpm/services/project/project_organizer.py +4 -0
  138. claude_mpm/services/self_upgrade_service.py +120 -12
  139. claude_mpm/services/skills/__init__.py +3 -0
  140. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  141. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  142. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  143. claude_mpm/services/skills_deployer.py +126 -9
  144. claude_mpm/services/socketio/dashboard_server.py +1 -0
  145. claude_mpm/services/socketio/event_normalizer.py +51 -6
  146. claude_mpm/services/socketio/server/core.py +386 -108
  147. claude_mpm/services/version_control/git_operations.py +103 -0
  148. claude_mpm/skills/skill_manager.py +92 -3
  149. claude_mpm/utils/agent_dependency_loader.py +14 -2
  150. claude_mpm/utils/agent_filters.py +17 -44
  151. claude_mpm/utils/gitignore.py +3 -0
  152. claude_mpm/utils/migration.py +4 -4
  153. claude_mpm/utils/robust_installer.py +47 -3
  154. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +57 -87
  155. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +160 -211
  156. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  157. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  158. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  159. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  160. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  161. claude_mpm/agents/BASE_OPS.md +0 -219
  162. claude_mpm/agents/BASE_PM.md +0 -480
  163. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  164. claude_mpm/agents/BASE_QA.md +0 -167
  165. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  166. claude_mpm/agents/base_agent_loader.py +0 -601
  167. claude_mpm/cli/commands/agents_detect.py +0 -380
  168. claude_mpm/cli/commands/agents_recommend.py +0 -309
  169. claude_mpm/cli/ticket_cli.py +0 -35
  170. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  171. claude_mpm/commands/mpm-agents-detect.md +0 -177
  172. claude_mpm/commands/mpm-agents-list.md +0 -131
  173. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  174. claude_mpm/commands/mpm-config-view.md +0 -150
  175. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  176. claude_mpm/dashboard/analysis_runner.py +0 -455
  177. claude_mpm/dashboard/index.html +0 -13
  178. claude_mpm/dashboard/open_dashboard.py +0 -66
  179. claude_mpm/dashboard/static/css/activity.css +0 -1958
  180. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  181. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  182. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  183. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  184. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  185. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  186. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  187. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  188. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  189. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  190. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  191. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  192. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  193. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  194. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  195. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  196. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  197. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  198. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  199. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  200. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  201. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  202. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  203. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  204. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  205. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  206. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  207. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  208. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  209. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  210. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  211. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  212. claude_mpm/dashboard/templates/code_simple.html +0 -153
  213. claude_mpm/dashboard/templates/index.html +0 -606
  214. claude_mpm/dashboard/test_dashboard.html +0 -372
  215. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  216. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  217. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  218. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  219. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  220. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  221. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  222. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  223. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  224. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  225. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  226. claude_mpm/scripts/mcp_server.py +0 -75
  227. claude_mpm/scripts/mcp_wrapper.py +0 -39
  228. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  229. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  230. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  231. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  232. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  233. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  234. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  235. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  236. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  237. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  239. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  240. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  241. claude_mpm/services/mcp_gateway/main.py +0 -589
  242. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  243. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  244. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  245. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  246. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  247. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  248. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  249. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  250. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  251. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  252. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  253. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  254. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  255. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  256. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  257. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  258. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  259. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  260. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  261. /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
  262. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  263. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -1,160 +0,0 @@
1
- """
2
- Package Version Checker
3
- =======================
4
-
5
- Checks PyPI packages for updates with caching and timeout support.
6
- Provides non-blocking version checking for MCP tools like kuzu-memory.
7
- """
8
-
9
- import asyncio
10
- import json
11
- from datetime import datetime, timedelta, timezone
12
- from pathlib import Path
13
- from typing import Any, Dict, Optional
14
-
15
- import aiohttp
16
- from packaging import version
17
-
18
- from ....core.logger import get_logger
19
-
20
-
21
- class PackageVersionChecker:
22
- """
23
- Check PyPI packages for updates with caching and timeout.
24
-
25
- WHY: Automatically detect when newer versions of critical packages
26
- (like kuzu-memory) are available to help users stay up-to-date.
27
-
28
- DESIGN DECISIONS:
29
- - Cache results to avoid excessive PyPI API calls
30
- - Non-blocking with timeout to prevent startup delays
31
- - Graceful failure handling (never block system operation)
32
- """
33
-
34
- CACHE_DIR = Path.home() / ".cache" / "claude-mpm" / "version-checks"
35
- DEFAULT_CACHE_TTL = 86400 # 24 hours
36
- PYPI_TIMEOUT = 5 # seconds
37
-
38
- def __init__(self):
39
- """Initialize the version checker with cache directory."""
40
- self.logger = get_logger("PackageVersionChecker")
41
- self.cache_dir = self.CACHE_DIR
42
- self.cache_dir.mkdir(parents=True, exist_ok=True)
43
-
44
- async def check_for_update(
45
- self, package_name: str, current_version: str, cache_ttl: Optional[int] = None
46
- ) -> Optional[Dict[str, Any]]:
47
- """
48
- Check if a package has updates available.
49
-
50
- Args:
51
- package_name: Name of the package on PyPI
52
- current_version: Currently installed version
53
- cache_ttl: Cache time-to-live in seconds (optional)
54
-
55
- Returns:
56
- Dict with update information or None if check fails:
57
- {
58
- "current": "1.0.0",
59
- "latest": "1.1.0",
60
- "update_available": True,
61
- "checked_at": "2025-01-29T12:00:00"
62
- }
63
- """
64
- cache_ttl = cache_ttl or self.DEFAULT_CACHE_TTL
65
-
66
- # Check cache first
67
- cache_file = self.cache_dir / f"{package_name}.json"
68
- cached = self._read_cache(cache_file, cache_ttl)
69
- if cached:
70
- # Update current version in cached data
71
- cached["current"] = current_version
72
- cached["update_available"] = version.parse(
73
- cached["latest"]
74
- ) > version.parse(current_version)
75
- return cached
76
-
77
- # Fetch from PyPI with timeout
78
- try:
79
- latest = await self._fetch_pypi_version(package_name)
80
- if latest:
81
- result = {
82
- "current": current_version,
83
- "latest": latest,
84
- "update_available": version.parse(latest)
85
- > version.parse(current_version),
86
- "checked_at": datetime.now(timezone.utc).isoformat(),
87
- }
88
- self._write_cache(cache_file, result)
89
- return result
90
- except Exception as e:
91
- self.logger.debug(f"Version check failed for {package_name}: {e}")
92
-
93
- return None
94
-
95
- async def _fetch_pypi_version(self, package_name: str) -> Optional[str]:
96
- """
97
- Fetch the latest version from PyPI.
98
-
99
- Args:
100
- package_name: Package name to query
101
-
102
- Returns:
103
- Latest version string or None if fetch fails
104
- """
105
- url = f"https://pypi.org/pypi/{package_name}/json"
106
-
107
- try:
108
- timeout = aiohttp.ClientTimeout(total=self.PYPI_TIMEOUT)
109
- async with aiohttp.ClientSession(timeout=timeout) as session:
110
- async with session.get(url) as response:
111
- if response.status == 200:
112
- data = await response.json()
113
- return data["info"]["version"]
114
- except asyncio.TimeoutError:
115
- self.logger.debug(f"PyPI request timed out for {package_name}")
116
- except Exception as e:
117
- self.logger.debug(f"PyPI request failed: {e}")
118
-
119
- return None
120
-
121
- def _read_cache(self, cache_file: Path, ttl: int) -> Optional[Dict[str, Any]]:
122
- """
123
- Read from cache if valid.
124
-
125
- Args:
126
- cache_file: Path to cache file
127
- ttl: Time-to-live in seconds
128
-
129
- Returns:
130
- Cached data if valid, None otherwise
131
- """
132
- if not cache_file.exists():
133
- return None
134
-
135
- try:
136
- with cache_file.open() as f:
137
- data = json.load(f)
138
-
139
- # Check TTL
140
- checked_at = datetime.fromisoformat(data["checked_at"])
141
- if datetime.now(timezone.utc) - checked_at < timedelta(seconds=ttl):
142
- return data
143
- except Exception as e:
144
- self.logger.debug(f"Cache read error: {e}")
145
-
146
- return None
147
-
148
- def _write_cache(self, cache_file: Path, data: Dict[str, Any]) -> None:
149
- """
150
- Write data to cache file.
151
-
152
- Args:
153
- cache_file: Path to cache file
154
- data: Data to cache
155
- """
156
- try:
157
- with cache_file.open("w") as f:
158
- json.dump(data, f, indent=2)
159
- except Exception as e:
160
- self.logger.debug(f"Cache write failed: {e}")
@@ -1,170 +0,0 @@
1
- """
2
- Update Preferences Manager
3
- ===========================
4
-
5
- Manages user preferences for package update checking.
6
- Allows users to skip specific versions or disable update checks entirely.
7
- """
8
-
9
- import json
10
- from pathlib import Path
11
- from typing import Any, Dict
12
-
13
-
14
- class UpdatePreferences:
15
- """
16
- Manage update checking preferences.
17
-
18
- WHY: Respect user preferences about update notifications to avoid
19
- annoying users who want to stay on specific versions or disable checks.
20
-
21
- DESIGN DECISIONS:
22
- - Store preferences in user's home directory
23
- - Simple JSON format for easy manual editing
24
- - Per-package preferences for granular control
25
- """
26
-
27
- PREFS_FILE = Path.home() / ".claude-mpm" / "mcp_updates.json"
28
-
29
- @classmethod
30
- def load(cls) -> Dict[str, Any]:
31
- """
32
- Load preferences from disk.
33
-
34
- Returns:
35
- Dictionary of preferences, empty dict if file doesn't exist
36
- """
37
- if cls.PREFS_FILE.exists():
38
- try:
39
- with cls.PREFS_FILE.open() as f:
40
- return json.load(f)
41
- except (OSError, json.JSONDecodeError):
42
- # Return empty dict if file is corrupted or unreadable
43
- pass
44
- return {}
45
-
46
- @classmethod
47
- def save(cls, prefs: Dict[str, Any]) -> None:
48
- """
49
- Save preferences to disk.
50
-
51
- Args:
52
- prefs: Preferences dictionary to save
53
- """
54
- cls.PREFS_FILE.parent.mkdir(parents=True, exist_ok=True)
55
- try:
56
- with cls.PREFS_FILE.open("w") as f:
57
- json.dump(prefs, f, indent=2)
58
- except OSError:
59
- # Silently fail if we can't write preferences
60
- pass
61
-
62
- @classmethod
63
- def should_check_package(cls, package: str) -> bool:
64
- """
65
- Check if updates should be checked for a specific package.
66
-
67
- Args:
68
- package: Package name to check
69
-
70
- Returns:
71
- True if updates should be checked, False otherwise
72
- """
73
- prefs = cls.load()
74
-
75
- # Global preference takes precedence
76
- if not prefs.get("global_check_enabled", True):
77
- return False
78
-
79
- # Package-specific preference
80
- pkg_prefs = prefs.get("packages", {}).get(package, {})
81
- return pkg_prefs.get("check_enabled", True)
82
-
83
- @classmethod
84
- def should_skip_version(cls, package: str, version: str) -> bool:
85
- """
86
- Check if a specific version should be skipped for a package.
87
-
88
- Args:
89
- package: Package name
90
- version: Version to check
91
-
92
- Returns:
93
- True if this version should be skipped, False otherwise
94
- """
95
- prefs = cls.load()
96
- pkg_prefs = prefs.get("packages", {}).get(package, {})
97
- skip_version = pkg_prefs.get("skip_version")
98
- return skip_version == version
99
-
100
- @classmethod
101
- def set_skip_version(cls, package: str, version: str) -> None:
102
- """
103
- Remember to skip a specific version for a package.
104
-
105
- Args:
106
- package: Package name
107
- version: Version to skip
108
- """
109
- prefs = cls.load()
110
-
111
- # Ensure packages dict exists
112
- if "packages" not in prefs:
113
- prefs["packages"] = {}
114
- if package not in prefs["packages"]:
115
- prefs["packages"][package] = {}
116
-
117
- prefs["packages"][package]["skip_version"] = version
118
- cls.save(prefs)
119
-
120
- @classmethod
121
- def disable_package_checks(cls, package: str) -> None:
122
- """
123
- Disable update checks for a specific package.
124
-
125
- Args:
126
- package: Package name to disable checks for
127
- """
128
- prefs = cls.load()
129
-
130
- # Ensure packages dict exists
131
- if "packages" not in prefs:
132
- prefs["packages"] = {}
133
- if package not in prefs["packages"]:
134
- prefs["packages"][package] = {}
135
-
136
- prefs["packages"][package]["check_enabled"] = False
137
- cls.save(prefs)
138
-
139
- @classmethod
140
- def enable_package_checks(cls, package: str) -> None:
141
- """
142
- Enable update checks for a specific package.
143
-
144
- Args:
145
- package: Package name to enable checks for
146
- """
147
- prefs = cls.load()
148
-
149
- # Ensure packages dict exists
150
- if "packages" not in prefs:
151
- prefs["packages"] = {}
152
- if package not in prefs["packages"]:
153
- prefs["packages"][package] = {}
154
-
155
- prefs["packages"][package]["check_enabled"] = True
156
- cls.save(prefs)
157
-
158
- @classmethod
159
- def disable_all_checks(cls) -> None:
160
- """Disable all update checks globally."""
161
- prefs = cls.load()
162
- prefs["global_check_enabled"] = False
163
- cls.save(prefs)
164
-
165
- @classmethod
166
- def enable_all_checks(cls) -> None:
167
- """Enable all update checks globally."""
168
- prefs = cls.load()
169
- prefs["global_check_enabled"] = True
170
- cls.save(prefs)
@@ -1,10 +0,0 @@
1
- [console_scripts]
2
- claude-mpm = claude_mpm.cli:main
3
- claude-mpm-doctor = claude_mpm.scripts.mpm_doctor:main
4
- claude-mpm-mcp = claude_mpm.services.mcp_gateway.server.stdio_server:main_sync
5
- claude-mpm-mcp-wrapper = claude_mpm.scripts.mcp_wrapper:entry_point
6
- claude-mpm-monitor = claude_mpm.scripts.launch_monitor:main
7
- claude-mpm-socketio = claude_mpm.scripts.socketio_daemon:main
8
- claude-mpm-ticket = claude_mpm.cli.ticket_cli:main
9
- claude-mpm-version = claude_mpm.scripts.manage_version:main
10
- ticket = claude_mpm.cli.ticket_cli:main
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Claude MPM Team
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.