claude-mpm 5.1.9__py3-none-any.whl → 5.4.48__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 (248) 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/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +1 -1
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +843 -900
  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 +2 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +138 -1
  12. claude_mpm/cli/__main__.py +4 -0
  13. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  14. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  15. claude_mpm/cli/commands/agents.py +9 -40
  16. claude_mpm/cli/commands/auto_configure.py +210 -25
  17. claude_mpm/cli/commands/config.py +88 -2
  18. claude_mpm/cli/commands/configure.py +1098 -159
  19. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  20. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  21. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  22. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  23. claude_mpm/cli/commands/postmortem.py +1 -1
  24. claude_mpm/cli/commands/profile.py +277 -0
  25. claude_mpm/cli/commands/skills.py +218 -197
  26. claude_mpm/cli/commands/summarize.py +413 -0
  27. claude_mpm/cli/executor.py +21 -3
  28. claude_mpm/cli/interactive/agent_wizard.py +2 -2
  29. claude_mpm/cli/parsers/agents_parser.py +0 -9
  30. claude_mpm/cli/parsers/auto_configure_parser.py +0 -138
  31. claude_mpm/cli/parsers/base_parser.py +12 -0
  32. claude_mpm/cli/parsers/config_parser.py +153 -83
  33. claude_mpm/cli/parsers/profile_parser.py +148 -0
  34. claude_mpm/cli/parsers/skills_parser.py +0 -5
  35. claude_mpm/cli/startup.py +876 -149
  36. claude_mpm/commands/mpm-config.md +28 -0
  37. claude_mpm/commands/mpm-doctor.md +9 -22
  38. claude_mpm/commands/mpm-help.md +5 -287
  39. claude_mpm/commands/mpm-init.md +81 -507
  40. claude_mpm/commands/mpm-monitor.md +15 -402
  41. claude_mpm/commands/mpm-organize.md +120 -0
  42. claude_mpm/commands/mpm-postmortem.md +6 -108
  43. claude_mpm/commands/mpm-session-resume.md +12 -363
  44. claude_mpm/commands/mpm-status.md +5 -69
  45. claude_mpm/commands/mpm-ticket-view.md +52 -495
  46. claude_mpm/commands/mpm-version.md +5 -107
  47. claude_mpm/config/agent_sources.py +27 -0
  48. claude_mpm/core/config.py +2 -4
  49. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  50. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  51. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  52. claude_mpm/core/framework_loader.py +4 -2
  53. claude_mpm/core/logger.py +13 -0
  54. claude_mpm/core/optimized_startup.py +59 -0
  55. claude_mpm/core/shared/config_loader.py +1 -1
  56. claude_mpm/core/socketio_pool.py +3 -3
  57. claude_mpm/core/unified_agent_registry.py +5 -15
  58. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  59. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  60. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  74. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  75. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  76. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  77. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  78. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  85. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  86. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  87. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  88. claude_mpm/hooks/claude_hooks/memory_integration.py +26 -9
  89. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  92. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  97. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  98. claude_mpm/hooks/memory_integration_hook.py +46 -1
  99. claude_mpm/init.py +63 -19
  100. claude_mpm/models/git_repository.py +3 -3
  101. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  102. claude_mpm/scripts/launch_monitor.py +93 -13
  103. claude_mpm/services/agents/agent_builder.py +3 -3
  104. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  105. claude_mpm/services/agents/agent_review_service.py +280 -0
  106. claude_mpm/services/agents/cache_git_manager.py +6 -6
  107. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  108. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  109. claude_mpm/services/agents/deployment/agent_format_converter.py +23 -13
  110. claude_mpm/services/agents/deployment/agent_template_builder.py +32 -20
  111. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  112. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  113. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  114. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +247 -35
  115. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +392 -87
  116. claude_mpm/services/agents/git_source_manager.py +53 -4
  117. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  118. claude_mpm/services/agents/recommender.py +5 -3
  119. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  120. claude_mpm/services/agents/sources/git_source_sync_service.py +120 -7
  121. claude_mpm/services/agents/startup_sync.py +22 -2
  122. claude_mpm/services/agents/toolchain_detector.py +10 -6
  123. claude_mpm/services/analysis/__init__.py +11 -1
  124. claude_mpm/services/analysis/clone_detector.py +1030 -0
  125. claude_mpm/services/command_deployment_service.py +81 -10
  126. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  127. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  128. claude_mpm/services/event_bus/config.py +3 -1
  129. claude_mpm/services/git/git_operations_service.py +101 -16
  130. claude_mpm/services/monitor/daemon.py +9 -2
  131. claude_mpm/services/monitor/daemon_manager.py +39 -3
  132. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  133. claude_mpm/services/monitor/server.py +698 -22
  134. claude_mpm/services/pm_skills_deployer.py +711 -0
  135. claude_mpm/services/profile_manager.py +331 -0
  136. claude_mpm/services/self_upgrade_service.py +120 -12
  137. claude_mpm/services/skills/__init__.py +3 -0
  138. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  139. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  140. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  141. claude_mpm/services/skills_deployer.py +127 -9
  142. claude_mpm/services/socketio/dashboard_server.py +1 -0
  143. claude_mpm/services/socketio/event_normalizer.py +51 -6
  144. claude_mpm/services/socketio/server/core.py +386 -108
  145. claude_mpm/services/version_control/git_operations.py +103 -0
  146. claude_mpm/skills/skill_manager.py +92 -3
  147. claude_mpm/utils/agent_dependency_loader.py +14 -2
  148. claude_mpm/utils/agent_filters.py +17 -44
  149. claude_mpm/utils/migration.py +4 -4
  150. claude_mpm/utils/robust_installer.py +47 -3
  151. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/METADATA +53 -87
  152. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/RECORD +157 -197
  153. claude_mpm-5.4.48.dist-info/entry_points.txt +5 -0
  154. claude_mpm-5.4.48.dist-info/licenses/LICENSE +94 -0
  155. claude_mpm-5.4.48.dist-info/licenses/LICENSE-FAQ.md +153 -0
  156. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  157. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  158. claude_mpm/agents/BASE_OPS.md +0 -219
  159. claude_mpm/agents/BASE_PM.md +0 -480
  160. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  161. claude_mpm/agents/BASE_QA.md +0 -167
  162. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  163. claude_mpm/agents/base_agent_loader.py +0 -601
  164. claude_mpm/cli/commands/agents_detect.py +0 -380
  165. claude_mpm/cli/commands/agents_recommend.py +0 -309
  166. claude_mpm/cli/ticket_cli.py +0 -35
  167. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  168. claude_mpm/commands/mpm-agents-detect.md +0 -177
  169. claude_mpm/commands/mpm-agents-list.md +0 -131
  170. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  171. claude_mpm/commands/mpm-config-view.md +0 -150
  172. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  173. claude_mpm/dashboard/analysis_runner.py +0 -455
  174. claude_mpm/dashboard/index.html +0 -13
  175. claude_mpm/dashboard/open_dashboard.py +0 -66
  176. claude_mpm/dashboard/static/css/activity.css +0 -1958
  177. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  178. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  179. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  180. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  181. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  182. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  183. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  184. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  185. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  186. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  187. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  188. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  189. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  190. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  191. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  192. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  193. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  194. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  195. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  196. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  197. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  198. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  199. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  200. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  201. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  202. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  203. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  204. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  205. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  206. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  207. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  208. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  209. claude_mpm/dashboard/templates/code_simple.html +0 -153
  210. claude_mpm/dashboard/templates/index.html +0 -606
  211. claude_mpm/dashboard/test_dashboard.html +0 -372
  212. claude_mpm/scripts/mcp_server.py +0 -75
  213. claude_mpm/scripts/mcp_wrapper.py +0 -39
  214. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  215. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  216. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  217. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  218. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  219. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  220. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  221. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  222. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  223. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  224. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  225. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  226. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  227. claude_mpm/services/mcp_gateway/main.py +0 -589
  228. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  229. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  230. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  231. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  232. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  233. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  235. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  236. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  237. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  238. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  239. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  240. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  241. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  242. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  243. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  244. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  245. claude_mpm-5.1.9.dist-info/entry_points.txt +0 -10
  246. claude_mpm-5.1.9.dist-info/licenses/LICENSE +0 -21
  247. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/WHEEL +0 -0
  248. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.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.