claude-mpm 5.4.64__py3-none-any.whl → 5.4.65__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 (22) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/startup.py +24 -15
  3. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-312.pyc +0 -0
  4. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
  5. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
  6. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
  7. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
  8. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-312.pyc +0 -0
  9. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-312.pyc +0 -0
  10. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc +0 -0
  11. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-312.pyc +0 -0
  12. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
  13. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
  14. claude_mpm/utils/agent_dependency_loader.py +99 -2
  15. claude_mpm/utils/robust_installer.py +35 -18
  16. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/METADATA +1 -1
  17. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/RECORD +22 -11
  18. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/WHEEL +0 -0
  19. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/entry_points.txt +0 -0
  20. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/licenses/LICENSE +0 -0
  21. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  22. {claude_mpm-5.4.64.dist-info → claude_mpm-5.4.65.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 5.4.64
1
+ 5.4.65
claude_mpm/cli/startup.py CHANGED
@@ -314,7 +314,7 @@ def deploy_output_style_on_startup():
314
314
 
315
315
  Deploys two styles:
316
316
  - claude-mpm-style.md (professional mode)
317
- - claude-mpm-teacher.md (teaching mode)
317
+ - claude-mpm-teach.md (teaching mode)
318
318
  """
319
319
  try:
320
320
  import shutil
@@ -330,7 +330,7 @@ def deploy_output_style_on_startup():
330
330
  user_home = Path.home()
331
331
  output_styles_dir = user_home / ".claude" / "settings" / "output-styles"
332
332
  professional_target = output_styles_dir / "claude-mpm-style.md"
333
- teacher_target = output_styles_dir / "claude-mpm-teacher.md"
333
+ teacher_target = output_styles_dir / "claude-mpm-teach.md"
334
334
 
335
335
  # Create directory if it doesn't exist
336
336
  output_styles_dir.mkdir(parents=True, exist_ok=True)
@@ -471,16 +471,13 @@ def sync_remote_agents_on_startup():
471
471
  block startup to ensure claude-mpm remains functional.
472
472
 
473
473
  Workflow:
474
- 1. Cleanup legacy agent cache directories (if any)
475
- 2. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
476
- 3. Deploy agents to ~/.claude/agents/ - Phase 2 progress bar
477
- 4. Cleanup orphaned agents (ours but no longer deployed) - Phase 3
474
+ 1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
475
+ 2. Deploy agents to ~/.claude/agents/ - Phase 2 progress bar
476
+ 3. Cleanup orphaned agents (ours but no longer deployed) - Phase 3
477
+ 4. Cleanup legacy agent cache directories (after sync/deployment) - Phase 4
478
478
  5. Log deployment results
479
479
  """
480
- # Cleanup legacy cache directories first (before syncing)
481
- cleanup_legacy_agent_cache()
482
-
483
- # DEPRECATED: Legacy warning - replaced by automatic cleanup above
480
+ # DEPRECATED: Legacy warning - no-op function, kept for compatibility
484
481
  check_legacy_cache()
485
482
 
486
483
  try:
@@ -700,7 +697,8 @@ def sync_remote_agents_on_startup():
700
697
  agent_files = [
701
698
  f
702
699
  for f in all_md_files
703
- if (
700
+ if
701
+ (
704
702
  # Must be in an agent directory
705
703
  # Supports: cache/agents/{category}/... (flat)
706
704
  # Supports: cache/agents/{owner}/{repo}/agents/{category}/... (GitHub sync)
@@ -843,6 +841,11 @@ def sync_remote_agents_on_startup():
843
841
  logger = get_logger("cli")
844
842
  logger.warning(f"Failed to deploy agents from cache: {e}")
845
843
 
844
+ # Phase 4: Cleanup legacy agent cache directories (after sync/deployment)
845
+ # CRITICAL: This must run AFTER sync completes because sync may recreate
846
+ # legacy directories. Running cleanup here ensures they're removed.
847
+ cleanup_legacy_agent_cache()
848
+
846
849
  except Exception as e:
847
850
  # Non-critical - log but don't fail startup
848
851
  from ..core.logger import get_logger
@@ -851,6 +854,12 @@ def sync_remote_agents_on_startup():
851
854
  logger.debug(f"Failed to sync remote agents: {e}")
852
855
  # Continue execution - agent sync failure shouldn't block startup
853
856
 
857
+ # Cleanup legacy cache even if sync failed
858
+ try:
859
+ cleanup_legacy_agent_cache()
860
+ except Exception:
861
+ pass # Ignore cleanup errors
862
+
854
863
 
855
864
  def sync_remote_skills_on_startup():
856
865
  """
@@ -1073,9 +1082,7 @@ def sync_remote_skills_on_startup():
1073
1082
  total_skill_count = len(all_skills)
1074
1083
 
1075
1084
  # Determine skill count based on resolution
1076
- skill_count = (
1077
- len(skills_to_deploy) if skills_to_deploy else total_skill_count
1078
- )
1085
+ skill_count = len(skills_to_deploy) if skills_to_deploy else total_skill_count
1079
1086
 
1080
1087
  if skill_count > 0:
1081
1088
  # Deploy skills with resolved filter
@@ -1090,7 +1097,9 @@ def sync_remote_skills_on_startup():
1090
1097
  # CRITICAL FIX: Empty list should mean "deploy no skills", not "deploy all"
1091
1098
  # When skills_to_deploy is [], we want skill_filter=set() NOT skill_filter=None
1092
1099
  # None means "no filtering" (deploy all), empty set means "filter to nothing"
1093
- skill_filter=set(skills_to_deploy) if skills_to_deploy is not None else None,
1100
+ skill_filter=set(skills_to_deploy)
1101
+ if skills_to_deploy is not None
1102
+ else None,
1094
1103
  )
1095
1104
 
1096
1105
  # REMOVED: User-level deployment (lines 1068-1074)
@@ -65,6 +65,7 @@ class AgentDependencyLoader:
65
65
  self.deployment_state_file = (
66
66
  Path.cwd() / ".claude" / "agents" / ".mpm_deployment_state"
67
67
  )
68
+ self.is_uv_tool = self._check_uv_tool_installation()
68
69
 
69
70
  def discover_deployed_agents(self) -> Dict[str, Path]:
70
71
  """
@@ -191,9 +192,42 @@ class AgentDependencyLoader:
191
192
  logger.debug(f"Loaded dependencies for {len(agent_dependencies)} agents")
192
193
  return agent_dependencies
193
194
 
195
+ def _check_uv_tool_installation(self) -> bool:
196
+ """
197
+ Check if running in UV tool environment (no pip available).
198
+
199
+ WHY: UV tool environments don't have pip installed. The executable
200
+ path typically contains ".local/share/uv/tools/" and the UV_TOOL_DIR
201
+ environment variable is set. In such environments, we need to use
202
+ 'uv pip' instead of 'python -m pip'.
203
+
204
+ Returns:
205
+ True if UV tool environment, False otherwise
206
+ """
207
+ import os
208
+
209
+ # Check UV_TOOL_DIR environment variable
210
+ uv_tool_dir = os.environ.get("UV_TOOL_DIR", "")
211
+ if uv_tool_dir and "claude-mpm" in uv_tool_dir:
212
+ logger.debug(f"UV tool environment detected via UV_TOOL_DIR: {uv_tool_dir}")
213
+ return True
214
+
215
+ # Check executable path for UV tool patterns
216
+ executable = sys.executable
217
+ if ".local/share/uv/tools/" in executable or "/uv/tools/" in executable:
218
+ logger.debug(
219
+ f"UV tool environment detected via executable path: {executable}"
220
+ )
221
+ return True
222
+
223
+ return False
224
+
194
225
  def check_python_dependency(self, package_spec: str) -> Tuple[bool, Optional[str]]:
195
226
  """
196
- Check if a Python package dependency is satisfied.
227
+ Check if a Python package dependency is satisfied in the TARGET environment.
228
+
229
+ WHY: UV tool environments use a separate Python installation. We must check
230
+ packages in the same environment where they would be installed/used.
197
231
 
198
232
  Args:
199
233
  package_spec: Package specification (e.g., "pandas>=2.0.0")
@@ -221,7 +255,70 @@ class AgentDependencyLoader:
221
255
  )
222
256
  return True, "optional-skipped"
223
257
 
224
- # Try to import and check version
258
+ # For UV tool environments, check via UV's Python
259
+ if self.is_uv_tool:
260
+ try:
261
+ verify_cmd = [
262
+ "uv",
263
+ "run",
264
+ "--no-project",
265
+ "python",
266
+ "-c",
267
+ f"import importlib.metadata; print(importlib.metadata.version('{package_name}'))",
268
+ ]
269
+ result = subprocess.run(
270
+ verify_cmd, capture_output=True, timeout=30, check=False
271
+ )
272
+ if result.returncode == 0:
273
+ version = result.stdout.decode().strip()
274
+ self.checked_packages.add(package_name)
275
+ if req.specifier.contains(version):
276
+ logger.debug(
277
+ f"Package {package_name} {version} satisfied in UV environment"
278
+ )
279
+ return True, version
280
+ logger.debug(
281
+ f"{package_name} {version} does not satisfy {req.specifier}"
282
+ )
283
+ return False, version
284
+ # Check alternatives for optional packages
285
+ if package_name in self.OPTIONAL_DB_PACKAGES:
286
+ for alternative in self.OPTIONAL_DB_PACKAGES[package_name]:
287
+ alt_cmd = [
288
+ "uv",
289
+ "run",
290
+ "--no-project",
291
+ "python",
292
+ "-c",
293
+ f"import importlib.metadata; print(importlib.metadata.version('{alternative}'))",
294
+ ]
295
+ alt_result = subprocess.run(
296
+ alt_cmd, capture_output=True, timeout=30, check=False
297
+ )
298
+ if alt_result.returncode == 0:
299
+ alt_version = alt_result.stdout.decode().strip()
300
+ logger.info(
301
+ f"Using {alternative} as alternative to {package_name}"
302
+ )
303
+ self.checked_packages.add(package_name)
304
+ return True, f"{alternative}:{alt_version}"
305
+ # If no alternatives work, mark as optional failure
306
+ self.optional_failed[package_name] = "No alternatives available"
307
+ logger.warning(
308
+ f"Optional package {package_name} not found, marking as optional"
309
+ )
310
+ return True, "optional-not-found"
311
+ return False, None
312
+ except subprocess.TimeoutExpired:
313
+ logger.warning(f"Timeout checking {package_name} in UV environment")
314
+ return False, None
315
+ except Exception as e:
316
+ logger.debug(
317
+ f"Error checking {package_name} in UV environment: {e}"
318
+ )
319
+ return False, None
320
+
321
+ # For normal Python, try to import and check version
225
322
  try:
226
323
  import importlib.metadata
227
324
 
@@ -478,42 +478,56 @@ class RobustPackageInstaller:
478
478
 
479
479
  def _verify_installation(self, package_spec: str) -> bool:
480
480
  """
481
- Verify that a package was successfully installed.
481
+ Verify that a package was successfully installed in the TARGET environment.
482
+
483
+ WHY: UV installs packages to its own Python environment, not the current process.
484
+ We must verify in the same environment where packages were installed.
482
485
 
483
486
  Args:
484
487
  package_spec: Package specification
485
488
 
486
489
  Returns:
487
- True if package is installed and importable
490
+ True if package is installed and importable in the target environment
488
491
  """
489
492
  package_name = self._extract_package_name(package_spec)
490
493
 
491
- # Convert package name to import name (e.g., tree-sitter-ruby -> tree_sitter_ruby)
492
- import_name = package_name.replace("-", "_")
493
-
494
494
  try:
495
- # Check if package is installed
495
+ if self.is_uv_tool:
496
+ # For UV tool, verify via UV's Python environment
497
+ verify_cmd = [
498
+ "uv",
499
+ "run",
500
+ "--no-project",
501
+ "python",
502
+ "-c",
503
+ f"import importlib.metadata; print(importlib.metadata.version('{package_name}'))",
504
+ ]
505
+ result = subprocess.run(
506
+ verify_cmd, capture_output=True, timeout=30, check=False
507
+ )
508
+ if result.returncode == 0:
509
+ logger.debug(
510
+ f"Package {package_name} verified in UV environment: {result.stdout.decode().strip()}"
511
+ )
512
+ return True
513
+ logger.debug(
514
+ f"Package {package_name} not found in UV environment: {result.stderr.decode().strip()}"
515
+ )
516
+ return False
517
+ # For normal Python, use importlib.metadata in current process
496
518
  import importlib.metadata
497
519
 
498
520
  try:
499
521
  version = importlib.metadata.version(package_name)
500
522
  logger.debug(f"Package {package_name} version {version} is installed")
501
-
502
- # For tree-sitter packages, don't try to import (they have C extensions)
503
- if package_name.startswith("tree-sitter-"):
504
- return True
505
-
506
- # Try to import the package
507
- try:
508
- __import__(import_name)
509
- return True
510
- except ImportError:
511
- # Some packages have different import names, that's OK
512
- return True
523
+ return True
513
524
 
514
525
  except importlib.metadata.PackageNotFoundError:
515
526
  return False
516
527
 
528
+ except subprocess.TimeoutExpired:
529
+ logger.warning(f"Verification timeout for {package_name}")
530
+ return False
517
531
  except ImportError:
518
532
  # Fallback for older Python versions
519
533
  try:
@@ -523,6 +537,9 @@ class RobustPackageInstaller:
523
537
  return True
524
538
  except pkg_resources.DistributionNotFound:
525
539
  return False
540
+ except Exception as e:
541
+ logger.debug(f"Verification error for {package_name}: {e}")
542
+ return False
526
543
 
527
544
  def _is_retryable_error(self, error: Optional[str]) -> bool:
528
545
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.4.64
3
+ Version: 5.4.65
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=M355auL1V2Am8PXigXNddMMq0BXRCpwnL6A66WMqinA,7
2
+ claude_mpm/VERSION,sha256=-UpN4Js98_xT1OT7M9yLLDPO7u1QCvPn-FdaspMG6Cg,7
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=CU7v8LZT-cFCNNLZU4dpaMD-4c3ib16v8fVE620wUjk,6761
@@ -41,7 +41,7 @@ claude_mpm/cli/chrome_devtools_installer.py,sha256=efA_ZX1iR3oaJi3222079BQw6DEG8
41
41
  claude_mpm/cli/executor.py,sha256=cetKiY2YS4XETUBXmfySdHYloI_M_lBJUFViRQ9TcS4,10544
42
42
  claude_mpm/cli/helpers.py,sha256=CypEhw0tbNH6_GzVTaQdi4w7ThCWO43Ep92YbJzPR4I,3638
43
43
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
44
- claude_mpm/cli/startup.py,sha256=6NleJe7X0f0PCLBU4d7eel7XV8QHov-OJxGH37twda0,73577
44
+ claude_mpm/cli/startup.py,sha256=yp4pEd9NUJmGenowc6ew0Fx-1k5TmsVfyLpuacclvJ4,73988
45
45
  claude_mpm/cli/startup_display.py,sha256=R_QIamjfdaY5o_VxpIeymyYj1Qde2B9hPXy1P-KmUKI,14972
46
46
  claude_mpm/cli/startup_logging.py,sha256=RTuyd6CbhiFQz7Z07LDDhK_ZAnZfuJ9B0NghVSntHFI,29390
47
47
  claude_mpm/cli/utils.py,sha256=FSMPftBZM8MeUyTtiB63Lz7oFOgkzwTetQs58RbRb_Q,8785
@@ -336,13 +336,19 @@ claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=73w7A5-3s5i1oYdkbEgw7
336
336
  claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=bz_8csYxxUZ3k_SI6q9uvtE7wfH-T15v_jpP2nq45nk,16896
337
337
  claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
338
338
  claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc,sha256=EGpgXqhPM0iRRZtCqHaLVQ6wDH42OH_M7Gt5GiFLyro,346
339
+ claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-312.pyc,sha256=RdPlaoNPDoSlTFV36Ku4vxs7xYqh7t2038D4pyULy-g,322
339
340
  claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc,sha256=SQX5iiP9bQZkLL-cj_2tlGH7lpAzarO0mYal7btj3tc,3521
340
341
  claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc,sha256=T9FMRyRjvHTRJm0LXosba7MezdUVw6I-nt_KP--LTwA,35923
342
+ claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc,sha256=-ayyVTxDW5_BVD2TD14e4zDteH0l_mXIcyEG8AQCERg,32006
341
343
  claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc,sha256=AsvVXkge1Pio3jgnS-zNbPt9brySB8ZeVPSn7VvuKjs,29654
344
+ claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc,sha256=heIj2o28Pw6QF5zgZBAebUInR8nxi6Ezdlfau9p-WJQ,27040
342
345
  claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc,sha256=9mpAKY4gNcbU5VvZ5tGbf2UM0uIEWdreKSUvVr_BKcM,33917
343
346
  claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc,sha256=YbwauQDKSGvXkT1972faalJLuxwyvq328DYQhkCnel0,10513
347
+ claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc,sha256=K-FbzUxbOffBSol-RUZkyFr9k1Ktg0HRdykSKbAn0NI,9489
344
348
  claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc,sha256=0xWsBZ63F-akLopSiRi36-hmhh1v9R5aKFBM0z93Jd0,16730
349
+ claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc,sha256=QZDMBrRbhD5lnm1sDcONSU5s5qsrcRme-vQOGUD5J3U,14632
345
350
  claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc,sha256=ZjcNfNY5Ht6FhalPeh7M7OzMffcey5iF4AVjDDg9kak,10694
351
+ claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-312.pyc,sha256=T98zonvVkllflFNw_pptXXAXbDrIgeBfY6aXvSY8el8,9071
346
352
  claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=OIYOKsUNw1BHYawOCp-KFK5kmQKuj92cCqCEPO0nwo0,585
347
353
  claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=l-aKzxwK-PWKL3TO1Iiu0sfSbj6Y9JMBOm3pgAiUYZc,9378
348
354
  claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=n14k1byOBbviu0nFab3q0gb7p6eMqGO8hS0b7Gt2JRg,10262
@@ -350,10 +356,15 @@ claude_mpm/hooks/claude_hooks/services/duplicate_detector.py,sha256=Fh9LmEMsVmQM
350
356
  claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=QB0JPJQThTVg0TGRO3Dc_3y3bac-hkulgMqqzo_71ng,11189
351
357
  claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=f7a_vgo_kuG9MalDTka2UPXwDyCkqNgCvG8i1hp0oRo,15263
352
358
  claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc,sha256=xBfLBSqnpcKfcQBWfh7xUm454g1lq1LvbO7SxGvcOPc,644
359
+ claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-312.pyc,sha256=75pkmoqE7CeBOc2ZHTYfgSR-mtVjKrcKaOA6PxFGW64,565
353
360
  claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc,sha256=bvZ_QcuI0j125Ebv8RzeWUh1BkuRTUfufGi0NV7HjuY,12359
361
+ claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc,sha256=HEBjsWvdkCpV8X4UyDsKhm0HXpstuHnObck_Yr-QQBA,11177
354
362
  claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc,sha256=Yy_REAUhJCiFjOhxeDb4v0qyEvEbUtCmXD9PAz40dhw,5321
363
+ claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-312.pyc,sha256=ef_Tx9Uv1CvS18tC_PXmGVvIoMDsRnEUhKRUZaUdGBw,4751
355
364
  claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc,sha256=TPkEc-Zi3oNS5dCXBpGbSZwg_8RQvzNzd4pVx9B3WeM,12364
365
+ claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc,sha256=uDZ1o2NYu0e2-sXxHovFOy28cklRaMOOX4vkLTRDjq0,11477
356
366
  claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc,sha256=YjWbj0qXMjew5bZCgvHWrb3dxp3BQZkpuOqsXgu4Wis,15045
367
+ claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc,sha256=c2Y-gHruenFjPNTimrkiSUvXamZayjpMinAKIppzMoM,13611
357
368
  claude_mpm/hooks/failure_learning/__init__.py,sha256=iJ80AKFHiT8DjIH2a72DQVJvL6nAFrizNA2yTKwZ4rw,1805
358
369
  claude_mpm/hooks/failure_learning/failure_detection_hook.py,sha256=KENoB5N-dBm5hb0SxeIZtCvNKbmG2BKHOJSrSO-3Z_I,7500
359
370
  claude_mpm/hooks/failure_learning/fix_detection_hook.py,sha256=XUk1bnBVLdfhQ9AMQSvGsTSeFQsKsVud2wbWX-Jjor8,7164
@@ -947,7 +958,7 @@ claude_mpm/tools/code_tree_analyzer/models.py,sha256=jZ63GOGivZFImbqKfg12fUAo1n5
947
958
  claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py,sha256=A7MC11_WFc-e5P6Klazh0QJN2kGzq-PmhrqOU6Q1fj0,8386
948
959
  claude_mpm/tools/code_tree_analyzer/python_analyzer.py,sha256=iJsda_pFgXIY36oaqglPuc_vUo8APIpqwW30TUJfgls,11314
949
960
  claude_mpm/utils/__init__.py,sha256=rkxNE0tDfKEN2lr2LLBuToNSvkF-yjF38607eUXL1vk,353
950
- claude_mpm/utils/agent_dependency_loader.py,sha256=nFiD6M_QEDdMAJrKic15qiN8Cq-LlGgMjKzvGofQzi0,39780
961
+ claude_mpm/utils/agent_dependency_loader.py,sha256=984o7ccgzto3WLXKIF3xBzaheF0K518sgzi4_wGVvWo,44464
951
962
  claude_mpm/utils/agent_filters.py,sha256=mSuMrroTnIhNisUF4xR7ghwQmrHq5B2-hq6rjWBVkC0,9475
952
963
  claude_mpm/utils/common.py,sha256=6hcs3Y6lx596Oj4H3CEQId-NIn8XEZJw1Ud3GAKwXKA,14341
953
964
  claude_mpm/utils/config_manager.py,sha256=iWsPM0uo31Ela-XhFe9DIw3RuVxJf94_yFQ1HkibAlY,15876
@@ -969,17 +980,17 @@ claude_mpm/utils/log_cleanup.py,sha256=go_axmP7FqdDX5tspd-D-B10a1PpY51K5X_xMQMRD
969
980
  claude_mpm/utils/migration.py,sha256=ugJAW_OOxLsV3sEv0Il2gb2QfnqnLwVD9SjhgppPQYo,12802
970
981
  claude_mpm/utils/path_operations.py,sha256=gvd6Ye5rMFxIKnFzWwIL6jYy8wGkjSH3onYAan6zXkA,10869
971
982
  claude_mpm/utils/progress.py,sha256=tSalO95Xv6YsGT4_uxNYvGT3qz6D3bsDDsflP-ZZnbI,14084
972
- claude_mpm/utils/robust_installer.py,sha256=fVoWe6aTtx-4en3E7nqOKQy1FXhn0mVPNRG2RuzdpnU,28913
983
+ claude_mpm/utils/robust_installer.py,sha256=KiSA_EhzyxYCiFHScQX3fNmloLfgXvytoCUFm-VExqQ,29805
973
984
  claude_mpm/utils/session_logging.py,sha256=_6eoyCvVKhu2OhgRzC5FvMfFnD9et75lzCqARbd_i-k,3059
974
985
  claude_mpm/utils/structured_questions.py,sha256=GoPr8UOe2vsAfJbNXS5y8E1wjp8zGHE1pDbg8H2Lv7M,20611
975
986
  claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalNmfX9KlM,10443
976
987
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
977
988
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
978
989
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
979
- claude_mpm-5.4.64.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
980
- claude_mpm-5.4.64.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
981
- claude_mpm-5.4.64.dist-info/METADATA,sha256=dRRo2_EqJDPrnCvHoFNoHuHhE5h5hTSJ9ngi2FaYRhw,37997
982
- claude_mpm-5.4.64.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
983
- claude_mpm-5.4.64.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
984
- claude_mpm-5.4.64.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
985
- claude_mpm-5.4.64.dist-info/RECORD,,
990
+ claude_mpm-5.4.65.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
991
+ claude_mpm-5.4.65.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
992
+ claude_mpm-5.4.65.dist-info/METADATA,sha256=WAr2nJ4qaCTCW3K484g0sCtLcZdPhNSjYcDd9kwaCb8,37997
993
+ claude_mpm-5.4.65.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
994
+ claude_mpm-5.4.65.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
995
+ claude_mpm-5.4.65.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
996
+ claude_mpm-5.4.65.dist-info/RECORD,,