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.
Files changed (76) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/agent_loader.py +2 -2
  3. claude_mpm/agents/agent_loader_integration.py +2 -2
  4. claude_mpm/agents/async_agent_loader.py +2 -2
  5. claude_mpm/agents/base_agent_loader.py +2 -2
  6. claude_mpm/agents/frontmatter_validator.py +2 -2
  7. claude_mpm/agents/system_agent_config.py +2 -2
  8. claude_mpm/agents/templates/clerk-ops.json +6 -4
  9. claude_mpm/agents/templates/data_engineer.json +1 -2
  10. claude_mpm/cli/commands/doctor.py +2 -2
  11. claude_mpm/cli/commands/mpm_init.py +560 -47
  12. claude_mpm/cli/commands/mpm_init_handler.py +6 -0
  13. claude_mpm/cli/parsers/mpm_init_parser.py +39 -1
  14. claude_mpm/cli/startup_logging.py +11 -9
  15. claude_mpm/commands/mpm-init.md +76 -12
  16. claude_mpm/config/agent_config.py +2 -2
  17. claude_mpm/config/paths.py +2 -2
  18. claude_mpm/core/agent_name_normalizer.py +2 -2
  19. claude_mpm/core/config.py +2 -1
  20. claude_mpm/core/config_aliases.py +2 -2
  21. claude_mpm/core/file_utils.py +1 -0
  22. claude_mpm/core/log_manager.py +2 -2
  23. claude_mpm/core/tool_access_control.py +2 -2
  24. claude_mpm/core/unified_agent_registry.py +2 -2
  25. claude_mpm/core/unified_paths.py +2 -2
  26. claude_mpm/experimental/cli_enhancements.py +3 -2
  27. claude_mpm/hooks/base_hook.py +2 -2
  28. claude_mpm/hooks/instruction_reinforcement.py +2 -2
  29. claude_mpm/hooks/validation_hooks.py +2 -2
  30. claude_mpm/scripts/mpm_doctor.py +2 -2
  31. claude_mpm/services/agents/loading/agent_profile_loader.py +2 -2
  32. claude_mpm/services/agents/loading/base_agent_manager.py +2 -2
  33. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  34. claude_mpm/services/agents/management/agent_capabilities_generator.py +2 -2
  35. claude_mpm/services/agents/management/agent_management_service.py +2 -2
  36. claude_mpm/services/agents/memory/memory_categorization_service.py +5 -2
  37. claude_mpm/services/agents/memory/memory_file_service.py +27 -6
  38. claude_mpm/services/agents/memory/memory_format_service.py +5 -2
  39. claude_mpm/services/agents/memory/memory_limits_service.py +3 -2
  40. claude_mpm/services/agents/registry/deployed_agent_discovery.py +2 -2
  41. claude_mpm/services/agents/registry/modification_tracker.py +4 -4
  42. claude_mpm/services/async_session_logger.py +2 -1
  43. claude_mpm/services/claude_session_logger.py +2 -2
  44. claude_mpm/services/core/path_resolver.py +3 -2
  45. claude_mpm/services/diagnostics/diagnostic_runner.py +4 -3
  46. claude_mpm/services/event_bus/direct_relay.py +2 -1
  47. claude_mpm/services/event_bus/event_bus.py +2 -1
  48. claude_mpm/services/event_bus/relay.py +2 -2
  49. claude_mpm/services/framework_claude_md_generator/content_assembler.py +2 -2
  50. claude_mpm/services/infrastructure/daemon_manager.py +2 -2
  51. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  52. claude_mpm/services/project/archive_manager.py +981 -0
  53. claude_mpm/services/project/documentation_manager.py +536 -0
  54. claude_mpm/services/project/enhanced_analyzer.py +491 -0
  55. claude_mpm/services/project/project_organizer.py +904 -0
  56. claude_mpm/services/response_tracker.py +2 -2
  57. claude_mpm/services/socketio/handlers/connection.py +14 -33
  58. claude_mpm/services/socketio/server/eventbus_integration.py +2 -2
  59. claude_mpm/services/version_control/version_parser.py +5 -4
  60. claude_mpm/storage/state_storage.py +2 -2
  61. claude_mpm/utils/agent_dependency_loader.py +49 -0
  62. claude_mpm/utils/common.py +542 -0
  63. claude_mpm/utils/database_connector.py +298 -0
  64. claude_mpm/utils/error_handler.py +2 -1
  65. claude_mpm/utils/log_cleanup.py +2 -2
  66. claude_mpm/utils/path_operations.py +2 -2
  67. claude_mpm/utils/robust_installer.py +56 -0
  68. claude_mpm/utils/session_logging.py +2 -2
  69. claude_mpm/utils/subprocess_utils.py +2 -2
  70. claude_mpm/validation/agent_validator.py +2 -2
  71. {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/METADATA +1 -1
  72. {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/RECORD +76 -70
  73. {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/WHEEL +0 -0
  74. {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/entry_points.txt +0 -0
  75. {claude_mpm-4.3.19.dist-info → claude_mpm-4.3.22.dist-info}/licenses/LICENSE +0 -0
  76. {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
- logger = logging.getLogger(__name__)
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
- # Try to get logger from closure scope or fallback to print
43
- try:
44
- import logging
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
- # Try to get logger from closure scope or fallback to print
61
- try:
62
- import logging
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
- # Try to get logger from closure scope or fallback to print
76
- try:
77
- import logging
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
- logger = logging.getLogger(__name__)
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
- self.logger = logging.getLogger(__name__)
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: