claude-mpm 4.3.19__py3-none-any.whl → 4.3.22__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/agent_loader.py +2 -2
- claude_mpm/agents/agent_loader_integration.py +2 -2
- claude_mpm/agents/async_agent_loader.py +2 -2
- claude_mpm/agents/base_agent_loader.py +2 -2
- claude_mpm/agents/frontmatter_validator.py +2 -2
- claude_mpm/agents/system_agent_config.py +2 -2
- claude_mpm/agents/templates/clerk-ops.json +6 -4
- claude_mpm/agents/templates/data_engineer.json +1 -2
- claude_mpm/cli/commands/doctor.py +2 -2
- claude_mpm/cli/commands/mpm_init.py +560 -47
- claude_mpm/cli/commands/mpm_init_handler.py +6 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +39 -1
- claude_mpm/cli/startup_logging.py +11 -9
- claude_mpm/commands/mpm-init.md +76 -12
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/paths.py +2 -2
- claude_mpm/core/agent_name_normalizer.py +2 -2
- claude_mpm/core/config.py +2 -1
- claude_mpm/core/config_aliases.py +2 -2
- claude_mpm/core/file_utils.py +1 -0
- claude_mpm/core/log_manager.py +2 -2
- claude_mpm/core/tool_access_control.py +2 -2
- claude_mpm/core/unified_agent_registry.py +2 -2
- claude_mpm/core/unified_paths.py +2 -2
- claude_mpm/experimental/cli_enhancements.py +3 -2
- claude_mpm/hooks/base_hook.py +2 -2
- claude_mpm/hooks/instruction_reinforcement.py +2 -2
- claude_mpm/hooks/validation_hooks.py +2 -2
- claude_mpm/scripts/mpm_doctor.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +2 -2
- claude_mpm/services/agents/loading/base_agent_manager.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +2 -2
- claude_mpm/services/agents/management/agent_management_service.py +2 -2
- claude_mpm/services/agents/memory/memory_categorization_service.py +5 -2
- claude_mpm/services/agents/memory/memory_file_service.py +27 -6
- claude_mpm/services/agents/memory/memory_format_service.py +5 -2
- claude_mpm/services/agents/memory/memory_limits_service.py +3 -2
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +2 -2
- claude_mpm/services/agents/registry/modification_tracker.py +4 -4
- claude_mpm/services/async_session_logger.py +2 -1
- claude_mpm/services/claude_session_logger.py +2 -2
- claude_mpm/services/core/path_resolver.py +3 -2
- claude_mpm/services/diagnostics/diagnostic_runner.py +4 -3
- claude_mpm/services/event_bus/direct_relay.py +2 -1
- claude_mpm/services/event_bus/event_bus.py +2 -1
- claude_mpm/services/event_bus/relay.py +2 -2
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +2 -2
- claude_mpm/services/infrastructure/daemon_manager.py +2 -2
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/project/archive_manager.py +981 -0
- claude_mpm/services/project/documentation_manager.py +536 -0
- claude_mpm/services/project/enhanced_analyzer.py +491 -0
- claude_mpm/services/project/project_organizer.py +904 -0
- claude_mpm/services/response_tracker.py +2 -2
- claude_mpm/services/socketio/handlers/connection.py +14 -33
- claude_mpm/services/socketio/server/eventbus_integration.py +2 -2
- claude_mpm/services/version_control/version_parser.py +5 -4
- claude_mpm/storage/state_storage.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +49 -0
- claude_mpm/utils/common.py +542 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/error_handler.py +2 -1
- claude_mpm/utils/log_cleanup.py +2 -2
- claude_mpm/utils/path_operations.py +2 -2
- claude_mpm/utils/robust_installer.py +56 -0
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +2 -2
- claude_mpm/validation/agent_validator.py +2 -2
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/METADATA +1 -1
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/RECORD +76 -70
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/WHEEL +0 -0
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/top_level.txt +0 -0
@@ -18,14 +18,14 @@ DESIGN DECISIONS:
|
|
18
18
|
- Handles agent name normalization for consistent tracking
|
19
19
|
"""
|
20
20
|
|
21
|
-
import logging
|
22
21
|
from datetime import datetime, timezone
|
23
22
|
from typing import Any, Dict, Optional
|
24
23
|
|
25
24
|
from claude_mpm.core.config import Config
|
26
25
|
from claude_mpm.core.shared.config_loader import ConfigLoader
|
27
26
|
|
28
|
-
|
27
|
+
from claude_mpm.core.logging_utils import get_logger
|
28
|
+
logger = get_logger(__name__)
|
29
29
|
|
30
30
|
|
31
31
|
class ResponseTracker:
|
@@ -11,8 +11,12 @@ import time
|
|
11
11
|
from datetime import datetime, timezone
|
12
12
|
from typing import Any, Callable, Dict, List, Optional
|
13
13
|
|
14
|
+
from claude_mpm.core.logging_utils import get_logger
|
15
|
+
|
14
16
|
from .base import BaseEventHandler
|
15
17
|
|
18
|
+
logger = get_logger(__name__)
|
19
|
+
|
16
20
|
|
17
21
|
def timeout_handler(timeout_seconds: float = 5.0):
|
18
22
|
"""Decorator to add timeout protection to async handlers.
|
@@ -39,49 +43,26 @@ def timeout_handler(timeout_seconds: float = 5.0):
|
|
39
43
|
|
40
44
|
elapsed = time.time() - start_time
|
41
45
|
if elapsed > timeout_seconds * 0.8: # Warn if close to timeout
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
logger = logging.getLogger(__name__)
|
47
|
-
logger.warning(
|
48
|
-
f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
|
49
|
-
f"(close to {timeout_seconds}s timeout)"
|
50
|
-
)
|
51
|
-
except Exception:
|
52
|
-
print(
|
53
|
-
f"⚠️ Handler {handler_name} took {elapsed:.2f}s (close to {timeout_seconds}s timeout)"
|
54
|
-
)
|
46
|
+
logger.warning(
|
47
|
+
f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
|
48
|
+
f"(close to {timeout_seconds}s timeout)"
|
49
|
+
)
|
55
50
|
|
56
51
|
return result
|
57
52
|
|
58
53
|
except asyncio.TimeoutError:
|
59
54
|
elapsed = time.time() - start_time
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
logger = logging.getLogger(__name__)
|
65
|
-
logger.error(
|
66
|
-
f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
|
67
|
-
)
|
68
|
-
except Exception:
|
69
|
-
print(f"❌ Handler {handler_name} timed out after {elapsed:.2f}s")
|
55
|
+
logger.error(
|
56
|
+
f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
|
57
|
+
)
|
70
58
|
|
71
59
|
return None
|
72
60
|
|
73
61
|
except Exception as e:
|
74
62
|
elapsed = time.time() - start_time
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
logger = logging.getLogger(__name__)
|
80
|
-
logger.error(
|
81
|
-
f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
|
82
|
-
)
|
83
|
-
except Exception:
|
84
|
-
print(f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}")
|
63
|
+
logger.error(
|
64
|
+
f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
|
65
|
+
)
|
85
66
|
raise
|
86
67
|
|
87
68
|
return wrapper
|
@@ -7,7 +7,6 @@ WHY this integration module:
|
|
7
7
|
- Provides clean separation of concerns
|
8
8
|
"""
|
9
9
|
|
10
|
-
import logging
|
11
10
|
from datetime import datetime, timezone
|
12
11
|
from typing import Optional
|
13
12
|
|
@@ -15,7 +14,8 @@ from claude_mpm.services.event_bus import EventBus
|
|
15
14
|
from claude_mpm.services.event_bus.config import get_config
|
16
15
|
from claude_mpm.services.event_bus.direct_relay import DirectSocketIORelay
|
17
16
|
|
18
|
-
|
17
|
+
from claude_mpm.core.logging_utils import get_logger
|
18
|
+
logger = get_logger(__name__)
|
19
19
|
|
20
20
|
|
21
21
|
class EventBusIntegration:
|
@@ -1,5 +1,3 @@
|
|
1
|
-
from pathlib import Path
|
2
|
-
|
3
1
|
"""
|
4
2
|
Enhanced version parsing system with multiple source support and fallback mechanisms.
|
5
3
|
|
@@ -17,13 +15,17 @@ The system includes caching for performance and validation for data integrity.
|
|
17
15
|
|
18
16
|
import contextlib
|
19
17
|
import json
|
20
|
-
import logging
|
21
18
|
import re
|
22
19
|
import subprocess
|
23
20
|
from datetime import datetime, timedelta, timezone
|
24
21
|
from functools import lru_cache
|
22
|
+
from pathlib import Path
|
25
23
|
from typing import Dict, List, Optional, Tuple
|
26
24
|
|
25
|
+
from claude_mpm.core.logging_utils import get_logger
|
26
|
+
|
27
|
+
logger = get_logger(__name__)
|
28
|
+
|
27
29
|
|
28
30
|
class VersionSource:
|
29
31
|
"""Enumeration of version sources with priority ordering."""
|
@@ -104,7 +106,6 @@ class EnhancedVersionParser:
|
|
104
106
|
"""
|
105
107
|
self.project_root = project_root or Path.cwd()
|
106
108
|
self.cache_ttl = cache_ttl
|
107
|
-
self.logger = logging.getLogger(__name__)
|
108
109
|
self._cache: Dict[str, Tuple[datetime, any]] = {}
|
109
110
|
|
110
111
|
# Compile regex patterns once for efficiency
|
@@ -16,7 +16,6 @@ import fcntl
|
|
16
16
|
import gzip
|
17
17
|
import hashlib
|
18
18
|
import json
|
19
|
-
import logging
|
20
19
|
import os
|
21
20
|
import pickle
|
22
21
|
import platform
|
@@ -39,7 +38,8 @@ class StateStorage:
|
|
39
38
|
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
40
39
|
|
41
40
|
# Logging
|
42
|
-
|
41
|
+
from claude_mpm.core.logging_utils import get_logger
|
42
|
+
logger = get_logger(__name__)
|
43
43
|
|
44
44
|
# File locking support (Unix-like systems)
|
45
45
|
self.supports_locking = platform.system() != "Windows"
|
@@ -31,6 +31,22 @@ class AgentDependencyLoader:
|
|
31
31
|
and being used, rather than all possible agents.
|
32
32
|
"""
|
33
33
|
|
34
|
+
# Optional database packages - if one fails, try alternatives
|
35
|
+
OPTIONAL_DB_PACKAGES = {
|
36
|
+
"mysqlclient": ["pymysql"], # PyMySQL is a pure Python alternative
|
37
|
+
"psycopg2": ["psycopg2-binary"], # Binary version doesn't require compilation
|
38
|
+
"cx_Oracle": [], # No good alternative, mark as optional
|
39
|
+
}
|
40
|
+
|
41
|
+
# Packages that commonly fail compilation on certain platforms
|
42
|
+
COMPILATION_PRONE = [
|
43
|
+
"mysqlclient", # Requires MySQL development headers
|
44
|
+
"psycopg2", # Requires PostgreSQL development headers (use psycopg2-binary instead)
|
45
|
+
"cx_Oracle", # Requires Oracle client libraries
|
46
|
+
"pycairo", # Requires Cairo development headers
|
47
|
+
"lxml", # Can fail if libxml2 dev headers missing
|
48
|
+
]
|
49
|
+
|
34
50
|
def __init__(self, auto_install: bool = False):
|
35
51
|
"""
|
36
52
|
Initialize the agent dependency loader.
|
@@ -44,6 +60,7 @@ class AgentDependencyLoader:
|
|
44
60
|
self.agent_dependencies: Dict[str, Dict] = {}
|
45
61
|
self.missing_dependencies: Dict[str, List[str]] = {}
|
46
62
|
self.checked_packages: Set[str] = set()
|
63
|
+
self.optional_failed: Dict[str, str] = {} # Track optional packages that failed
|
47
64
|
self.deployment_state_file = (
|
48
65
|
Path.cwd() / ".claude" / "agents" / ".mpm_deployment_state"
|
49
66
|
)
|
@@ -130,6 +147,11 @@ class AgentDependencyLoader:
|
|
130
147
|
self.checked_packages.add(package_name)
|
131
148
|
return True, "built-in"
|
132
149
|
|
150
|
+
# Check if this is an optional package that already failed
|
151
|
+
if package_name in self.optional_failed:
|
152
|
+
logger.debug(f"Skipping optional package {package_name} (previously failed)")
|
153
|
+
return True, "optional-skipped"
|
154
|
+
|
133
155
|
# Try to import and check version
|
134
156
|
try:
|
135
157
|
import importlib.metadata
|
@@ -147,6 +169,20 @@ class AgentDependencyLoader:
|
|
147
169
|
return False, version
|
148
170
|
|
149
171
|
except importlib.metadata.PackageNotFoundError:
|
172
|
+
# Check if there's an alternative for this optional package
|
173
|
+
if package_name in self.OPTIONAL_DB_PACKAGES:
|
174
|
+
for alternative in self.OPTIONAL_DB_PACKAGES[package_name]:
|
175
|
+
try:
|
176
|
+
alt_version = importlib.metadata.version(alternative)
|
177
|
+
logger.info(f"Using {alternative} as alternative to {package_name}")
|
178
|
+
self.checked_packages.add(package_name)
|
179
|
+
return True, f"{alternative}:{alt_version}"
|
180
|
+
except importlib.metadata.PackageNotFoundError:
|
181
|
+
continue
|
182
|
+
# If no alternatives work, mark as optional failure
|
183
|
+
self.optional_failed[package_name] = "No alternatives available"
|
184
|
+
logger.warning(f"Optional package {package_name} not found, marking as optional")
|
185
|
+
return True, "optional-not-found"
|
150
186
|
return False, None
|
151
187
|
|
152
188
|
except ImportError:
|
@@ -162,6 +198,19 @@ class AgentDependencyLoader:
|
|
162
198
|
return False, version
|
163
199
|
|
164
200
|
except pkg_resources.DistributionNotFound:
|
201
|
+
# Check alternatives for optional packages
|
202
|
+
if package_name in self.OPTIONAL_DB_PACKAGES:
|
203
|
+
for alternative in self.OPTIONAL_DB_PACKAGES[package_name]:
|
204
|
+
try:
|
205
|
+
alt_version = pkg_resources.get_distribution(alternative).version
|
206
|
+
logger.info(f"Using {alternative} as alternative to {package_name}")
|
207
|
+
self.checked_packages.add(package_name)
|
208
|
+
return True, f"{alternative}:{alt_version}"
|
209
|
+
except pkg_resources.DistributionNotFound:
|
210
|
+
continue
|
211
|
+
self.optional_failed[package_name] = "No alternatives available"
|
212
|
+
logger.warning(f"Optional package {package_name} not found, marking as optional")
|
213
|
+
return True, "optional-not-found"
|
165
214
|
return False, None
|
166
215
|
|
167
216
|
except InvalidRequirement as e:
|