claude-mpm 5.1.9__py3-none-any.whl → 5.4.3__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 (131) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/PM_INSTRUCTIONS.md +46 -0
  3. claude_mpm/agents/agent_loader.py +10 -17
  4. claude_mpm/agents/templates/circuit-breakers.md +138 -1
  5. claude_mpm/cli/commands/agent_state_manager.py +8 -17
  6. claude_mpm/cli/commands/configure.py +1046 -149
  7. claude_mpm/cli/commands/configure_agent_display.py +13 -6
  8. claude_mpm/cli/commands/mpm_init/core.py +158 -1
  9. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  10. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  11. claude_mpm/cli/commands/summarize.py +413 -0
  12. claude_mpm/cli/executor.py +8 -0
  13. claude_mpm/cli/parsers/base_parser.py +5 -0
  14. claude_mpm/cli/startup.py +60 -53
  15. claude_mpm/commands/{mpm-ticket-organize.md → mpm-organize.md} +4 -5
  16. claude_mpm/config/agent_sources.py +27 -0
  17. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  18. claude_mpm/core/socketio_pool.py +3 -3
  19. claude_mpm/core/unified_agent_registry.py +5 -15
  20. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  21. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-313.pyc +0 -0
  22. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  23. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  24. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  25. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  26. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  27. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  28. claude_mpm/hooks/claude_hooks/event_handlers.py +35 -2
  29. claude_mpm/hooks/claude_hooks/hook_handler.py +4 -0
  30. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  31. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  32. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  33. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  34. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  35. claude_mpm/hooks/claude_hooks/services/connection_manager.py +4 -0
  36. claude_mpm/scripts/launch_monitor.py +93 -13
  37. claude_mpm/services/agents/agent_recommendation_service.py +279 -0
  38. claude_mpm/services/agents/deployment/agent_template_builder.py +3 -2
  39. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +322 -53
  40. claude_mpm/services/agents/git_source_manager.py +20 -0
  41. claude_mpm/services/agents/sources/git_source_sync_service.py +8 -1
  42. claude_mpm/services/agents/toolchain_detector.py +6 -5
  43. claude_mpm/services/analysis/__init__.py +11 -1
  44. claude_mpm/services/analysis/clone_detector.py +1030 -0
  45. claude_mpm/services/command_deployment_service.py +0 -2
  46. claude_mpm/services/event_bus/config.py +3 -1
  47. claude_mpm/services/monitor/daemon.py +9 -2
  48. claude_mpm/services/monitor/daemon_manager.py +39 -3
  49. claude_mpm/services/monitor/server.py +225 -19
  50. claude_mpm/services/socketio/event_normalizer.py +15 -1
  51. claude_mpm/services/socketio/server/core.py +160 -21
  52. claude_mpm/services/version_control/git_operations.py +103 -0
  53. claude_mpm/utils/agent_filters.py +17 -44
  54. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/METADATA +1 -77
  55. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/RECORD +59 -114
  56. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/entry_points.txt +0 -2
  57. claude_mpm/dashboard/analysis_runner.py +0 -455
  58. claude_mpm/dashboard/index.html +0 -13
  59. claude_mpm/dashboard/open_dashboard.py +0 -66
  60. claude_mpm/dashboard/static/css/activity.css +0 -1958
  61. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  62. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  63. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  64. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  65. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  66. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  67. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  68. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  69. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  70. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  71. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  72. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  73. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  74. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  75. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  76. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  77. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  78. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  79. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  80. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  81. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  82. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  83. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  84. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  85. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  86. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  87. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  88. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  89. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  90. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  91. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  92. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  93. claude_mpm/dashboard/templates/code_simple.html +0 -153
  94. claude_mpm/dashboard/templates/index.html +0 -606
  95. claude_mpm/dashboard/test_dashboard.html +0 -372
  96. claude_mpm/scripts/mcp_server.py +0 -75
  97. claude_mpm/scripts/mcp_wrapper.py +0 -39
  98. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  99. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  100. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  101. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  102. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  103. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  104. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  105. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  106. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  107. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  108. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  109. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  110. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  111. claude_mpm/services/mcp_gateway/main.py +0 -589
  112. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  113. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  114. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  115. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  116. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  117. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  118. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  119. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  120. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  121. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  122. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  123. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  124. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  125. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  126. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  127. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  128. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  129. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/WHEEL +0 -0
  130. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/licenses/LICENSE +0 -0
  131. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.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)