claude-mpm 5.6.1__py3-none-any.whl → 5.6.2__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 CHANGED
@@ -1 +1 @@
1
- 5.6.1
1
+ 5.6.2
@@ -103,23 +103,45 @@ class LoggerFactory:
103
103
 
104
104
  # Set up root logger
105
105
  root_logger = logging.getLogger()
106
- root_logger.setLevel(LoggingConfig.LEVELS.get(cls._log_level, logging.INFO))
106
+
107
+ # CRITICAL FIX: Respect existing root logger suppression
108
+ # If root logger is already set to CRITICAL+1 (suppressed by startup.py),
109
+ # don't override it. This prevents logging from appearing during startup
110
+ # before the CLI's setup_logging() runs.
111
+ current_level = root_logger.level
112
+ desired_level = LoggingConfig.LEVELS.get(cls._log_level, logging.INFO)
113
+
114
+ # Only set level if current is unset (0) or lower than desired
115
+ # CRITICAL+1 is 51, so this check preserves suppression
116
+ should_configure_logging = current_level == 0 or (
117
+ current_level < desired_level and current_level <= logging.CRITICAL
118
+ )
119
+
120
+ if should_configure_logging:
121
+ root_logger.setLevel(desired_level)
122
+ # else: root logger is suppressed (CRITICAL+1), keep it suppressed
107
123
 
108
124
  # Remove existing handlers
109
125
  root_logger.handlers = []
110
126
 
111
- # Console handler - MUST use stderr to avoid corrupting hook JSON output
112
- # WHY stderr: Hook handlers output JSON to stdout. Logging to stdout
113
- # corrupts this JSON and causes "hook error" messages from Claude Code.
114
- console_handler = logging.StreamHandler(sys.stderr)
115
- console_handler.setLevel(LoggingConfig.LEVELS.get(cls._log_level, logging.INFO))
116
- console_formatter = logging.Formatter(
117
- log_format or LoggingConfig.DEFAULT_FORMAT,
118
- date_format or LoggingConfig.DATE_FORMAT,
119
- )
120
- console_handler.setFormatter(console_formatter)
121
- root_logger.addHandler(console_handler)
122
- cls._handlers["console"] = console_handler
127
+ # CRITICAL FIX: Don't add handlers if logging is suppressed
128
+ # If root logger is at CRITICAL+1 (startup suppression), don't add any handlers
129
+ # This prevents early imports from logging before CLI setup_logging() runs
130
+ if should_configure_logging:
131
+ # Console handler - MUST use stderr to avoid corrupting hook JSON output
132
+ # WHY stderr: Hook handlers output JSON to stdout. Logging to stdout
133
+ # corrupts this JSON and causes "hook error" messages from Claude Code.
134
+ console_handler = logging.StreamHandler(sys.stderr)
135
+ console_handler.setLevel(
136
+ LoggingConfig.LEVELS.get(cls._log_level, logging.INFO)
137
+ )
138
+ console_formatter = logging.Formatter(
139
+ log_format or LoggingConfig.DEFAULT_FORMAT,
140
+ date_format or LoggingConfig.DATE_FORMAT,
141
+ )
142
+ console_handler.setFormatter(console_formatter)
143
+ root_logger.addHandler(console_handler)
144
+ cls._handlers["console"] = console_handler
123
145
 
124
146
  # File handler (optional)
125
147
  if log_to_file and cls._log_dir:
@@ -76,6 +76,7 @@ class DeploymentContext(Enum):
76
76
  EDITABLE_INSTALL = "editable_install"
77
77
  PIP_INSTALL = "pip_install"
78
78
  PIPX_INSTALL = "pipx_install"
79
+ UV_TOOLS = "uv_tools"
79
80
  SYSTEM_PACKAGE = "system_package"
80
81
 
81
82
 
@@ -190,113 +191,100 @@ class PathContext:
190
191
 
191
192
  Priority order:
192
193
  1. Environment variable override (CLAUDE_MPM_DEV_MODE)
193
- 2. Current working directory is a claude-mpm development project
194
- 3. Editable installation detection
195
- 4. Path-based detection (development, pipx, system, pip)
194
+ 2. Package installation path (uv tools, pipx, site-packages, editable)
195
+ 3. Current working directory (opt-in with CLAUDE_MPM_PREFER_LOCAL_SOURCE)
196
+
197
+ This ensures installed packages use their installation paths rather than
198
+ accidentally picking up development paths from CWD.
196
199
  """
197
- # Check for environment variable override
200
+ # 1. Explicit environment variable override
198
201
  if os.environ.get("CLAUDE_MPM_DEV_MODE", "").lower() in ("1", "true", "yes"):
199
202
  logger.debug(
200
203
  "Development mode forced via CLAUDE_MPM_DEV_MODE environment variable"
201
204
  )
202
205
  return DeploymentContext.DEVELOPMENT
203
206
 
204
- # Check if current working directory is a claude-mpm development project
205
- # This handles the case where pipx claude-mpm is run from within the dev directory
206
- cwd = _safe_cwd()
207
- current = cwd
208
- for _ in range(5): # Check up to 5 levels up from current directory
209
- if (current / "pyproject.toml").exists() and (
210
- current / "src" / "claude_mpm"
211
- ).exists():
212
- # Check if this is the claude-mpm project
213
- try:
214
- pyproject_content = (current / "pyproject.toml").read_text()
215
- if (
216
- 'name = "claude-mpm"' in pyproject_content
217
- or '"claude-mpm"' in pyproject_content
218
- ):
219
- logger.debug(
220
- f"Detected claude-mpm development directory at {current}"
221
- )
222
- logger.debug(
223
- "Using development mode for local source preference"
224
- )
225
- return DeploymentContext.DEVELOPMENT
226
- except Exception: # nosec B110
227
- pass
228
- if current == current.parent:
229
- break
230
- current = current.parent
231
-
207
+ # 2. Check where the actual package is installed
232
208
  try:
233
209
  import claude_mpm
234
210
 
235
211
  module_path = Path(claude_mpm.__file__).parent
212
+ package_str = str(module_path)
236
213
 
237
- # First check if this is an editable install, regardless of path
238
- # This is important for cases where pipx points to a development installation
239
- if PathContext._is_editable_install():
240
- logger.debug("Detected editable/development installation")
241
- # Check if we should use development paths
242
- # This could be because we're in a src/ directory or running from dev directory
243
- if module_path.parent.name == "src":
244
- return DeploymentContext.DEVELOPMENT
245
- if "pipx" in str(module_path):
246
- # Running via pipx but from within a development directory
247
- # Use development mode to prefer local source over pipx installation
248
- cwd = _safe_cwd()
249
- current = cwd
250
- for _ in range(5):
251
- if (current / "src" / "claude_mpm").exists() and (
252
- current / "pyproject.toml"
253
- ).exists():
254
- logger.debug(
255
- "Running pipx from development directory, using development mode"
256
- )
257
- return DeploymentContext.DEVELOPMENT
258
- if current == current.parent:
259
- break
260
- current = current.parent
261
- return DeploymentContext.EDITABLE_INSTALL
262
- return DeploymentContext.EDITABLE_INSTALL
214
+ # UV tools installation (~/.local/share/uv/tools/)
215
+ if "/.local/share/uv/tools/" in package_str:
216
+ logger.debug(f"Detected uv tools installation at {module_path}")
217
+ return DeploymentContext.UV_TOOLS
263
218
 
264
- # Check for development mode based on directory structure
265
- # module_path is typically /path/to/project/src/claude_mpm
266
- if (
267
- module_path.parent.name == "src"
268
- and (module_path.parent.parent / "src" / "claude_mpm").exists()
269
- ):
219
+ # pipx installation (~/.local/pipx/venvs/)
220
+ if "/.local/pipx/venvs/" in package_str or "/pipx/" in package_str:
221
+ logger.debug(f"Detected pipx installation at {module_path}")
222
+ return DeploymentContext.PIPX_INSTALL
223
+
224
+ # site-packages (pip install) - but not editable
225
+ if "/site-packages/" in package_str and "/src/" not in package_str:
226
+ logger.debug(f"Detected pip installation at {module_path}")
227
+ return DeploymentContext.PIP_INSTALL
228
+
229
+ # Editable install (pip install -e) - module in src/
230
+ if module_path.parent.name == "src":
231
+ # Check if this is truly an editable install
232
+ if PathContext._is_editable_install():
233
+ logger.debug(f"Detected editable installation at {module_path}")
234
+ return DeploymentContext.EDITABLE_INSTALL
235
+ # Module in src/ but not editable - development mode
270
236
  logger.debug(
271
237
  f"Detected development mode via directory structure at {module_path}"
272
238
  )
273
239
  return DeploymentContext.DEVELOPMENT
274
240
 
275
- # Check for pipx install
276
- if "pipx" in str(module_path):
277
- logger.debug(f"Detected pipx installation at {module_path}")
278
- return DeploymentContext.PIPX_INSTALL
279
-
280
- # Check for system package
281
- if "dist-packages" in str(module_path):
241
+ # dist-packages (system package manager)
242
+ if "dist-packages" in package_str:
282
243
  logger.debug(f"Detected system package installation at {module_path}")
283
244
  return DeploymentContext.SYSTEM_PACKAGE
284
245
 
285
- # Check for site-packages (could be pip or editable)
286
- if "site-packages" in str(module_path):
287
- # Already checked for editable above, so this is a regular pip install
288
- logger.debug(f"Detected pip installation at {module_path}")
289
- return DeploymentContext.PIP_INSTALL
290
-
291
- # Default to pip install
246
+ # Default to pip install for any other installation
292
247
  logger.debug(f"Defaulting to pip installation for {module_path}")
293
248
  return DeploymentContext.PIP_INSTALL
294
249
 
295
250
  except ImportError:
296
251
  logger.debug(
297
- "ImportError during context detection, defaulting to development"
252
+ "ImportError during module path detection, checking CWD as fallback"
298
253
  )
299
- return DeploymentContext.DEVELOPMENT
254
+
255
+ # 3. CWD-based detection (OPT-IN ONLY for explicit development work)
256
+ # Only use CWD if explicitly requested or no package installation found
257
+ if os.environ.get("CLAUDE_MPM_PREFER_LOCAL_SOURCE", "").lower() in (
258
+ "1",
259
+ "true",
260
+ "yes",
261
+ ):
262
+ cwd = _safe_cwd()
263
+ current = cwd
264
+ for _ in range(5): # Check up to 5 levels up from current directory
265
+ if (current / "pyproject.toml").exists() and (
266
+ current / "src" / "claude_mpm"
267
+ ).exists():
268
+ # Check if this is the claude-mpm project
269
+ try:
270
+ pyproject_content = (current / "pyproject.toml").read_text()
271
+ if (
272
+ 'name = "claude-mpm"' in pyproject_content
273
+ or '"claude-mpm"' in pyproject_content
274
+ ):
275
+ logger.debug(
276
+ f"CLAUDE_MPM_PREFER_LOCAL_SOURCE: Using development directory at {current}"
277
+ )
278
+ return DeploymentContext.DEVELOPMENT
279
+ except Exception: # nosec B110
280
+ pass
281
+ if current == current.parent:
282
+ break
283
+ current = current.parent
284
+
285
+ # Final fallback: assume development mode
286
+ logger.debug("No installation detected, defaulting to development mode")
287
+ return DeploymentContext.DEVELOPMENT
300
288
 
301
289
 
302
290
  class UnifiedPathManager:
@@ -14,8 +14,6 @@ import subprocess # nosec B404 - Safe: only uses hardcoded 'claude' CLI command
14
14
  from pathlib import Path
15
15
  from typing import Dict, List, Optional, Tuple
16
16
 
17
- from ...core.logger import get_logger
18
-
19
17
 
20
18
  class HookInstaller:
21
19
  """Manages installation and configuration of Claude MPM hooks."""
@@ -199,7 +197,12 @@ main "$@"
199
197
 
200
198
  def __init__(self):
201
199
  """Initialize the hook installer."""
202
- self.logger = get_logger(__name__)
200
+ # Use __name__ directly to avoid double prefix
201
+ # __name__ is already 'claude_mpm.hooks.claude_hooks.installer'
202
+ # get_logger() adds 'claude_mpm.' prefix, causing duplicate
203
+ import logging
204
+
205
+ self.logger = logging.getLogger(__name__)
203
206
  self.claude_dir = Path.home() / ".claude"
204
207
  self.hooks_dir = self.claude_dir / "hooks" # Kept for backward compatibility
205
208
  # Use settings.json for hooks (Claude Code reads from this file)
@@ -11,15 +11,23 @@ import sys
11
11
 
12
12
  # Install-type-aware logging configuration BEFORE kuzu-memory imports
13
13
  # This overrides kuzu-memory's WARNING-level basicConfig (fixes 1M-445)
14
- # but respects production install silence
14
+ # but respects production install silence AND startup suppression
15
15
  try:
16
16
  from claude_mpm.core.unified_paths import DeploymentContext, PathContext
17
17
 
18
18
  context = PathContext.detect_deployment_context()
19
19
 
20
+ # CRITICAL: Check if root logger is already suppressed (CRITICAL+1 from startup.py)
21
+ # If so, don't call basicConfig as it will reset the level to INFO
22
+ root_logger = logging.getLogger()
23
+ is_suppressed = root_logger.level > logging.CRITICAL # CRITICAL+1 = 51
24
+
20
25
  # Only configure verbose logging for development/editable installs
21
- # Production installs remain silent by default
22
- if context in (DeploymentContext.DEVELOPMENT, DeploymentContext.EDITABLE_INSTALL):
26
+ # AND if logging isn't already suppressed by startup.py
27
+ if not is_suppressed and context in (
28
+ DeploymentContext.DEVELOPMENT,
29
+ DeploymentContext.EDITABLE_INSTALL,
30
+ ):
23
31
  logging.basicConfig(
24
32
  level=logging.INFO,
25
33
  format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
@@ -27,14 +35,17 @@ try:
27
35
  stream=sys.stderr,
28
36
  )
29
37
  except ImportError:
30
- # Fallback: if unified_paths not available, configure logging
31
- # This maintains backward compatibility
32
- logging.basicConfig(
33
- level=logging.INFO,
34
- format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
35
- force=True,
36
- stream=sys.stderr,
37
- )
38
+ # Fallback: if unified_paths not available, check suppression before configuring
39
+ root_logger = logging.getLogger()
40
+ is_suppressed = root_logger.level > logging.CRITICAL
41
+
42
+ if not is_suppressed:
43
+ logging.basicConfig(
44
+ level=logging.INFO,
45
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
46
+ force=True,
47
+ stream=sys.stderr,
48
+ )
38
49
  from datetime import datetime, timezone
39
50
  from typing import Optional
40
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.6.1
3
+ Version: 5.6.2
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=LC8NTaW3idNE8vjuA2ICAWG2aHo5AOlM_M3rzaLo7Bg,6
2
+ claude_mpm/VERSION,sha256=h30O3O6JDu7O14VoCq1YqQo9Js3uwcNMmIJOFIdWD74,6
3
3
  claude_mpm/__init__.py,sha256=AGfh00BHKvLYD-UVFw7qbKtl7NMRIzRXOWw7vEuZ-h4,2214
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=pz3lTrZZR5HhV3eZzYtIbtBwWo7iM6pkBHP_ixxmI6Y,6827
@@ -277,7 +277,7 @@ claude_mpm/core/lazy.py,sha256=pyCfEqGHyLz18yXTu_uG52-II-9nCaBcpzwwQGBrQro,14808
277
277
  claude_mpm/core/log_manager.py,sha256=yf82AKC-DYLtl7h0ka5IEoVC8aC0_II-zCjHOwD3RxQ,24661
278
278
  claude_mpm/core/logger.py,sha256=9HDM9MOHzQXvI6rV35S9AQgZS5kTx5r-tNbKUZVZ7u0,21931
279
279
  claude_mpm/core/logging_config.py,sha256=h6beZ1QQTOSM8RM_dq-LC-pnfA3iRxIcTtuGv9zusyI,14724
280
- claude_mpm/core/logging_utils.py,sha256=A7fVgLVs4k4qpWGHSoSoJcvW-g_cUEVnniIi_41keHE,16219
280
+ claude_mpm/core/logging_utils.py,sha256=RrHi4mt4h8Aq9igMos3ZyeAB2_Xfmcx_XPLRSGKTtzQ,17333
281
281
  claude_mpm/core/minimal_framework_loader.py,sha256=vmDEjL3MjnV7W4WIR-ymaL8QgsGsgxJJ0KdiQqAtudM,3640
282
282
  claude_mpm/core/mixins.py,sha256=vmZ7Nu2ZOnKjbhN07Ixk4noIej9nsJiknrp-Sclfu0A,5344
283
283
  claude_mpm/core/oneshot_session.py,sha256=nA86Zk7W3Rh_yIhPuegFL7Xgc9S63vQ_MqfLk52doV0,21994
@@ -294,7 +294,7 @@ claude_mpm/core/types.py,sha256=Sv62QhMYvfxbt7oIGoAhhN_jxonFTeLRf-BuhxZ4vYw,7719
294
294
  claude_mpm/core/typing_utils.py,sha256=qny3rA9mAeXqdLgUj9DZg642shw4LmLbkPqADN-765s,13314
295
295
  claude_mpm/core/unified_agent_registry.py,sha256=YbL-oWeHU85zdf1mF7tyMHBYKtFBupsMeH9BCdzD6ZI,34161
296
296
  claude_mpm/core/unified_config.py,sha256=iKJc8fSACrVWr5bWXwg9D3TF9EhwLUvCI52u4kOFo-c,22178
297
- claude_mpm/core/unified_paths.py,sha256=F2NYAK6RNtn_xsZnVHVfP7MErzDh_O9hyaa3B4OyT9A,36690
297
+ claude_mpm/core/unified_paths.py,sha256=DJOI7JAoN-Mnw7lRwqGo9BCAZKALOfjpaNJ6GFxaREc,36042
298
298
  claude_mpm/core/framework/__init__.py,sha256=IJCp6-MQO8gW31uG8aMWHdNg54NgGvXb4GvOuwZF6Iw,736
299
299
  claude_mpm/core/framework/formatters/__init__.py,sha256=OKkLN2x21rcbg3d3feZLixIS-UjHPlxl768uGmQy7Qc,307
300
300
  claude_mpm/core/framework/formatters/capability_generator.py,sha256=mZpnuKiNhGtE7R39VftWiHaSCabnpUDnUbH3FKKTMUk,14649
@@ -414,8 +414,8 @@ claude_mpm/hooks/claude_hooks/correlation_manager.py,sha256=3n-RxzqE8egG4max_Ncp
414
414
  claude_mpm/hooks/claude_hooks/event_handlers.py,sha256=_GUOe9urO9RVIaOWSNXv2F_di4D7SaePjxONyd37das,47019
415
415
  claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=UOl5IVvz0Ro8Z0Owx4sKUWCxoIhvQpt7VTJ8lRC7Y8o,28266
416
416
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=XYkdYtcM0nfnwYvMdyIFCasr80ry3uI5-fLYsLtDGw4,2214
417
- claude_mpm/hooks/claude_hooks/installer.py,sha256=RTjDGwFJFQaqRuHIG7dPNuyq04rcvadn0RZwYgaTR7M,33088
418
- claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=73w7A5-3s5i1oYdkbEgw7qhgalQvSuJjfx6OFqfaw64,9963
417
+ claude_mpm/hooks/claude_hooks/installer.py,sha256=X6m0CQ9mjaESqUu9RF00uOopZx1u5VOeR0-ilyaP6Xg,33275
418
+ claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=ggPUpSLOp1fUu8cfHR7oyeGZINoeh_eKx85iKeNmnIQ,10436
419
419
  claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=bgX4iVQqmX0L3_GHyKs1q4CSIjnavdxYnJZT0GaT4gs,17148
420
420
  claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
421
421
  claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=OIYOKsUNw1BHYawOCp-KFK5kmQKuj92cCqCEPO0nwo0,585
@@ -1070,10 +1070,10 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
1070
1070
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
1071
1071
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
1072
1072
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
1073
- claude_mpm-5.6.1.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1074
- claude_mpm-5.6.1.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1075
- claude_mpm-5.6.1.dist-info/METADATA,sha256=FWy0gp_k5S6wXgzKyJz8SVzlULPwFZvdjvG10w3Lfqs,14983
1076
- claude_mpm-5.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1077
- claude_mpm-5.6.1.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1078
- claude_mpm-5.6.1.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1079
- claude_mpm-5.6.1.dist-info/RECORD,,
1073
+ claude_mpm-5.6.2.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1074
+ claude_mpm-5.6.2.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1075
+ claude_mpm-5.6.2.dist-info/METADATA,sha256=0UjXWxh6ZxAAd23Fz65DKfaJx-h0QSoP3bXNIw1TLxA,14983
1076
+ claude_mpm-5.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1077
+ claude_mpm-5.6.2.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1078
+ claude_mpm-5.6.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1079
+ claude_mpm-5.6.2.dist-info/RECORD,,