claude-mpm 5.6.37__py3-none-any.whl → 5.6.39__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 (27) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/startup.py +51 -8
  3. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  4. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc +0 -0
  5. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-314.pyc +0 -0
  6. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc +0 -0
  7. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc +0 -0
  8. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  9. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc +0 -0
  10. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc +0 -0
  11. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc +0 -0
  12. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc +0 -0
  13. claude_mpm/hooks/claude_hooks/installer.py +84 -23
  14. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc +0 -0
  15. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc +0 -0
  16. claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-314.pyc +0 -0
  17. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc +0 -0
  18. claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-314.pyc +0 -0
  19. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc +0 -0
  20. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc +0 -0
  21. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/METADATA +1 -1
  22. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/RECORD +27 -10
  23. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/entry_points.txt +1 -0
  24. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/WHEEL +0 -0
  25. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/licenses/LICENSE +0 -0
  26. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  27. {claude_mpm-5.6.37.dist-info → claude_mpm-5.6.39.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 5.6.37
1
+ 5.6.39
claude_mpm/cli/startup.py CHANGED
@@ -13,7 +13,7 @@ import sys
13
13
  from pathlib import Path
14
14
 
15
15
 
16
- def cleanup_user_level_hooks() -> None:
16
+ def cleanup_user_level_hooks() -> bool:
17
17
  """Remove stale user-level hooks directory.
18
18
 
19
19
  WHY: claude-mpm previously deployed hooks to ~/.claude/hooks/claude-mpm/
@@ -23,13 +23,16 @@ def cleanup_user_level_hooks() -> None:
23
23
 
24
24
  DESIGN DECISION: Runs early in startup, before project hook sync.
25
25
  Non-blocking - failures are logged at debug level but don't prevent startup.
26
+
27
+ Returns:
28
+ bool: True if hooks were cleaned up, False if none found or cleanup failed
26
29
  """
27
30
  import shutil
28
31
 
29
32
  user_hooks_dir = Path.home() / ".claude" / "hooks" / "claude-mpm"
30
33
 
31
34
  if not user_hooks_dir.exists():
32
- return
35
+ return False
33
36
 
34
37
  try:
35
38
  from ..core.logger import get_logger
@@ -40,6 +43,7 @@ def cleanup_user_level_hooks() -> None:
40
43
  shutil.rmtree(user_hooks_dir)
41
44
 
42
45
  logger.debug("User-level hooks cleanup complete")
46
+ return True
43
47
  except Exception as e:
44
48
  # Non-critical - log but don't fail startup
45
49
  try:
@@ -49,6 +53,7 @@ def cleanup_user_level_hooks() -> None:
49
53
  logger.debug(f"Failed to cleanup user-level hooks (non-fatal): {e}")
50
54
  except Exception: # nosec B110
51
55
  pass # Avoid any errors in error handling
56
+ return False
52
57
 
53
58
 
54
59
  def sync_hooks_on_startup(quiet: bool = False) -> bool:
@@ -71,31 +76,45 @@ def sync_hooks_on_startup(quiet: bool = False) -> bool:
71
76
  Returns:
72
77
  bool: True if hooks were synced successfully, False otherwise
73
78
  """
79
+ is_tty = not quiet and sys.stdout.isatty()
80
+
74
81
  # Step 1: Cleanup stale user-level hooks first
75
- cleanup_user_level_hooks()
82
+ if is_tty:
83
+ print("Cleaning user-level hooks...", end=" ", flush=True)
76
84
 
85
+ cleaned = cleanup_user_level_hooks()
86
+
87
+ if is_tty:
88
+ if cleaned:
89
+ print("✓")
90
+ else:
91
+ print("(none found)")
92
+
93
+ # Step 2: Install project-level hooks
77
94
  try:
78
95
  from ..hooks.claude_hooks.installer import HookInstaller
79
96
 
80
97
  installer = HookInstaller()
81
98
 
82
99
  # Show brief status (hooks sync is fast)
83
- if not quiet and sys.stdout.isatty():
84
- print("Syncing Claude Code hooks...", end=" ", flush=True)
100
+ if is_tty:
101
+ print("Installing project hooks...", end=" ", flush=True)
85
102
 
86
103
  # Reinstall hooks (force=True ensures update)
87
104
  success = installer.install_hooks(force=True)
88
105
 
89
- if not quiet and sys.stdout.isatty():
106
+ if is_tty:
90
107
  if success:
91
- print("✓")
108
+ # Count hooks from settings file
109
+ hook_count = _count_installed_hooks(installer.settings_file)
110
+ print(f"{hook_count} hooks configured ✓")
92
111
  else:
93
112
  print("(skipped)")
94
113
 
95
114
  return success
96
115
 
97
116
  except Exception as e:
98
- if not quiet and sys.stdout.isatty():
117
+ if is_tty:
99
118
  print("(error)")
100
119
  # Log but don't fail startup
101
120
  from ..core.logger import get_logger
@@ -105,6 +124,30 @@ def sync_hooks_on_startup(quiet: bool = False) -> bool:
105
124
  return False
106
125
 
107
126
 
127
+ def _count_installed_hooks(settings_file: Path) -> int:
128
+ """Count the number of hook event types configured in settings.
129
+
130
+ Args:
131
+ settings_file: Path to the settings.local.json file
132
+
133
+ Returns:
134
+ int: Number of hook event types configured (e.g., 7 for all events)
135
+ """
136
+ import json
137
+
138
+ try:
139
+ if not settings_file.exists():
140
+ return 0
141
+
142
+ with settings_file.open() as f:
143
+ settings = json.load(f)
144
+
145
+ hooks = settings.get("hooks", {})
146
+ return len(hooks)
147
+ except Exception:
148
+ return 0
149
+
150
+
108
151
  def cleanup_legacy_agent_cache() -> None:
109
152
  """Remove legacy hierarchical agent cache directories.
110
153
 
@@ -387,8 +387,35 @@ main "$@"
387
387
  return False
388
388
  return self._version_meets_minimum(version, self.MIN_SKILLS_VERSION)
389
389
 
390
- def get_hook_script_path(self) -> Path:
391
- """Get the path to the hook handler script based on installation method.
390
+ def get_hook_command(self) -> str:
391
+ """Get the hook command based on installation method.
392
+
393
+ Priority order:
394
+ 1. claude-hook entry point (uv tool install, pipx install, pip install)
395
+ 2. Fallback to bash script (development installs)
396
+
397
+ Returns:
398
+ Command string for the hook handler (either 'claude-hook' or path to bash script)
399
+
400
+ Raises:
401
+ FileNotFoundError: If no hook handler can be found
402
+ """
403
+ # Check if claude-hook entry point is available in PATH
404
+ claude_hook_path = shutil.which("claude-hook")
405
+ if claude_hook_path:
406
+ self.logger.info(f"Using claude-hook entry point: {claude_hook_path}")
407
+ return "claude-hook"
408
+
409
+ # Fallback to bash script for development installs
410
+ script_path = self._get_hook_script_path()
411
+ self.logger.info(f"Using fallback bash script: {script_path}")
412
+ return str(script_path.absolute())
413
+
414
+ def _get_hook_script_path(self) -> Path:
415
+ """Get the path to the fallback bash hook handler script.
416
+
417
+ This is used when the claude-hook entry point is not available
418
+ (e.g., development installs without uv tool install).
392
419
 
393
420
  Returns:
394
421
  Path to the claude-hook-handler.sh script
@@ -441,6 +468,19 @@ main "$@"
441
468
 
442
469
  raise FileNotFoundError(f"Hook handler script not found at {script_path}")
443
470
 
471
+ def get_hook_script_path(self) -> Path:
472
+ """Get the path to the hook handler script based on installation method.
473
+
474
+ DEPRECATED: Use get_hook_command() instead for proper entry point support.
475
+
476
+ Returns:
477
+ Path to the claude-hook-handler.sh script
478
+
479
+ Raises:
480
+ FileNotFoundError: If the script cannot be found
481
+ """
482
+ return self._get_hook_script_path()
483
+
444
484
  def install_hooks(self, force: bool = False) -> bool:
445
485
  """
446
486
  Install Claude MPM hooks.
@@ -473,18 +513,16 @@ main "$@"
473
513
  # Create Claude directory (hooks_dir no longer needed)
474
514
  self.claude_dir.mkdir(exist_ok=True)
475
515
 
476
- # Get the deployment-root hook script path
516
+ # Get the hook command (either claude-hook entry point or fallback bash script)
477
517
  try:
478
- hook_script_path = self.get_hook_script_path()
479
- self.logger.info(
480
- f"Using deployment-root hook script: {hook_script_path}"
481
- )
518
+ hook_command = self.get_hook_command()
519
+ self.logger.info(f"Using hook command: {hook_command}")
482
520
  except FileNotFoundError as e:
483
- self.logger.error(f"Failed to locate hook script: {e}")
521
+ self.logger.error(f"Failed to locate hook handler: {e}")
484
522
  return False
485
523
 
486
- # Update Claude settings to use deployment-root script
487
- self._update_claude_settings(hook_script_path)
524
+ # Update Claude settings to use the hook command
525
+ self._update_claude_settings(hook_command)
488
526
 
489
527
  # Install commands if available
490
528
  self._install_commands()
@@ -579,8 +617,12 @@ main "$@"
579
617
  "StatusLine command already supports both schemas or not present"
580
618
  )
581
619
 
582
- def _update_claude_settings(self, hook_script_path: Path) -> None:
583
- """Update Claude settings to use the installed hook."""
620
+ def _update_claude_settings(self, hook_cmd: str) -> None:
621
+ """Update Claude settings to use the installed hook.
622
+
623
+ Args:
624
+ hook_cmd: The hook command to use (either 'claude-hook' or path to bash script)
625
+ """
584
626
  self.logger.info("Updating Claude settings...")
585
627
 
586
628
  # Load existing settings.json or create new
@@ -603,15 +645,18 @@ main "$@"
603
645
  settings["hooks"] = {}
604
646
 
605
647
  # Hook configuration for each event type
606
- hook_command = {"type": "command", "command": str(hook_script_path.absolute())}
648
+ hook_command = {"type": "command", "command": hook_cmd}
607
649
 
608
650
  def is_our_hook(cmd: dict) -> bool:
609
651
  """Check if a hook command belongs to claude-mpm."""
610
652
  if cmd.get("type") != "command":
611
653
  return False
612
654
  command = cmd.get("command", "")
613
- return "claude-hook-handler.sh" in command or command.endswith(
614
- "claude-mpm-hook.sh"
655
+ # Match claude-hook entry point or bash script fallback
656
+ return (
657
+ command == "claude-hook"
658
+ or "claude-hook-handler.sh" in command
659
+ or command.endswith("claude-mpm-hook.sh")
615
660
  )
616
661
 
617
662
  def merge_hooks_for_event(
@@ -867,7 +912,8 @@ main "$@"
867
912
  ):
868
913
  cmd = hook_cmd.get("command", "")
869
914
  if (
870
- "claude-hook-handler.sh" in cmd
915
+ cmd == "claude-hook"
916
+ or "claude-hook-handler.sh" in cmd
871
917
  or cmd.endswith("claude-mpm-hook.sh")
872
918
  ):
873
919
  is_claude_mpm = True
@@ -912,27 +958,42 @@ main "$@"
912
958
 
913
959
  is_valid, issues = self.verify_hooks()
914
960
 
915
- # Try to get deployment-root script path
961
+ # Try to get hook command (entry point or fallback script)
962
+ hook_command = None
963
+ using_entry_point = False
916
964
  try:
917
- hook_script_path = self.get_hook_script_path()
965
+ hook_command = self.get_hook_command()
966
+ using_entry_point = hook_command == "claude-hook"
967
+ except FileNotFoundError:
968
+ hook_command = None
969
+
970
+ # For backward compatibility, also try to get the script path
971
+ hook_script_str = None
972
+ script_exists = False
973
+ try:
974
+ hook_script_path = self._get_hook_script_path()
918
975
  hook_script_str = str(hook_script_path)
919
976
  script_exists = hook_script_path.exists()
920
977
  except FileNotFoundError:
921
- hook_script_str = None
922
- script_exists = False
978
+ pass
923
979
 
924
980
  status = {
925
- "installed": script_exists and self.settings_file.exists(),
981
+ "installed": (hook_command is not None or script_exists)
982
+ and self.settings_file.exists(),
926
983
  "valid": is_valid,
927
984
  "issues": issues,
928
- "hook_script": hook_script_str,
985
+ "hook_command": hook_command,
986
+ "hook_script": hook_script_str, # Kept for backward compatibility
987
+ "using_entry_point": using_entry_point,
929
988
  "settings_file": (
930
989
  str(self.settings_file) if self.settings_file.exists() else None
931
990
  ),
932
991
  "claude_version": claude_version,
933
992
  "version_compatible": is_compatible,
934
993
  "version_message": version_message,
935
- "deployment_type": "deployment-root", # New field to indicate new architecture
994
+ "deployment_type": "entry-point"
995
+ if using_entry_point
996
+ else "deployment-root",
936
997
  "pretool_modify_supported": pretool_modify_supported, # v2.0.30+ feature
937
998
  "pretool_modify_message": (
938
999
  f"PreToolUse input modification supported (v{claude_version})"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.6.37
3
+ Version: 5.6.39
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=6wU_GWy-ocN_lZJMsDrvXWts8AcQ_8tGO-otGNlaDwg,7
2
+ claude_mpm/VERSION,sha256=o33lw8E1XvRlHyJSIB4uJYtJR5yBSBweCbV6dacoztI,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=pz3lTrZZR5HhV3eZzYtIbtBwWo7iM6pkBHP_ixxmI6Y,6827
@@ -42,7 +42,7 @@ claude_mpm/cli/chrome_devtools_installer.py,sha256=efA_ZX1iR3oaJi3222079BQw6DEG8
42
42
  claude_mpm/cli/executor.py,sha256=eerqDVszBfTm8N2FgreLr-132Jb9BVZGNrrukvb_b-I,15106
43
43
  claude_mpm/cli/helpers.py,sha256=CypEhw0tbNH6_GzVTaQdi4w7ThCWO43Ep92YbJzPR4I,3638
44
44
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
45
- claude_mpm/cli/startup.py,sha256=yqq44doFdcrR8f1pCPOAeLG-3kzmdWHaMEmk_uAhc5E,70361
45
+ claude_mpm/cli/startup.py,sha256=iYf_i1fzFPVCljsQM048h6vkpDz9DyVP_UfIEGmjO28,71438
46
46
  claude_mpm/cli/startup_display.py,sha256=KI4GZ0uVoK7FXeK5jsS4JAyaKaKf5rCkY3h5tNeEY7M,17209
47
47
  claude_mpm/cli/startup_logging.py,sha256=wHokzcCA0AJPxAqFrpY5PMOBh1iOhdhgP1gY1OvD0gY,29392
48
48
  claude_mpm/cli/utils.py,sha256=5e3v-ow1gd-5nlad9OWCsL-3SRJcPjBJ9HS3zygwkiQ,8988
@@ -432,18 +432,28 @@ claude_mpm/hooks/claude_hooks/correlation_manager.py,sha256=3n-RxzqE8egG4max_Ncp
432
432
  claude_mpm/hooks/claude_hooks/event_handlers.py,sha256=VJ4kY_GMZkVv8WBAII4GTfY4qxFgoKdXpMdhEbzt980,50344
433
433
  claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=AH0z6D06bo02UGyEdYlzll2EcELl-gmt8D42MPqu_SU,30459
434
434
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=XYkdYtcM0nfnwYvMdyIFCasr80ry3uI5-fLYsLtDGw4,2214
435
- claude_mpm/hooks/claude_hooks/installer.py,sha256=SvIgxRMocQxnqNF3ZQfKH8zA-1b4lpiCA4vCI0vWOZI,38065
435
+ claude_mpm/hooks/claude_hooks/installer.py,sha256=s4AqVbln4oWmVr4cSCXhMN4TxDPQ48P-qk-qKvv0690,40353
436
436
  claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=YOMD4Ah003uMh7A454w8ngLmKw8RUAEIHpEj-FRk3TI,10759
437
437
  claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=1KOGC19rYRNYbc1Tfe7FAP6AtvgOMSM5uEPxMi2N6-c,16323
438
438
  claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
439
439
  claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc,sha256=EGpgXqhPM0iRRZtCqHaLVQ6wDH42OH_M7Gt5GiFLyro,346
440
+ claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc,sha256=tBzcQ_3WxkmgPTQAPd7uKgFGtz-Yb6r2hEgF9Y_Flwc,319
440
441
  claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc,sha256=lw3g7dHPcJ258xtcmbXOk-tCqVz0JAc5PZ10LUfG4Zo,20829
442
+ claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc,sha256=TW6wmI4uZSKYTZLvzRUo8a2BNrJRumyIPJEy5SwbPY0,21381
441
443
  claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc,sha256=SQX5iiP9bQZkLL-cj_2tlGH7lpAzarO0mYal7btj3tc,3521
444
+ claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-314.pyc,sha256=EsrmN8bVySuKI2cdojP30zm6kao4N-6Y57p0-AeJBYM,3966
442
445
  claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc,sha256=rUcbnsARIgWenNkPv8LlHJBXmxTOExqgcwtBaBfGzg4,49040
446
+ claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc,sha256=l29mAnJP0z-1ofdS9D7uvotF0HJaYoKCpuFjrCZnCko,48746
443
447
  claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc,sha256=NQtvV9vs1OMKQTZWRQrAie83y4Q61mJ-QFawC2GnsUQ,32799
448
+ claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc,sha256=Y42877bxn92Yjwep0Htoq9oHSCuyxBQ2EdJ0F0b6MRA,32590
449
+ claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc,sha256=MjEHwTWmXNGwIuQEhk9fwdMR3uCbd0c4msz5LV3weiQ,43292
450
+ claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc,sha256=o_VDKXRxxNBrosgfuPQRLmzDC_zZtF0yOWxnYTdw0Yk,41573
444
451
  claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc,sha256=1llucgjrun0H6q8V8_BXTHtkTiYAwNGyptluhoIi7ss,11185
452
+ claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc,sha256=I4vC0wDRgWcosl44rxzCqeiLaubCPdwzn2mnMBcCe7o,11081
445
453
  claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc,sha256=E_pRoKx-mAB5gEv2_5TneMC_K10zj7FYCPwQPnPd88g,16228
454
+ claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc,sha256=HGqXKBQrB8f01TCf7n07AeFgIF48bnBRrPxsuoZ6TdE,15820
446
455
  claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc,sha256=ZjcNfNY5Ht6FhalPeh7M7OzMffcey5iF4AVjDDg9kak,10694
456
+ claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc,sha256=ck8ifVIoVPaMVVRcMgvsM8RfIHnQbwGBUVs25A-yQBw,10771
447
457
  claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=Hb4SqNzSN-JKzp8pMM3SbDMTCsUydypfXiDx4_4QvBI,1112
448
458
  claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=46y84lKi3KuExWyJgFcEfgLxrzQY3IjGRob_6I4hXp4,10196
449
459
  claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=uJH0CGsszvhlg7zfEI2JB7uuxXtYBk9Yey-u2F6VoNo,7582
@@ -453,12 +463,19 @@ claude_mpm/hooks/claude_hooks/services/protocols.py,sha256=vbGAhbg1vJVwyY6zQn5cN
453
463
  claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=uuYJVsxIinmOhu7muqJsRZvFMN83YaoYoOWWIiORhr0,10898
454
464
  claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=Wq0CKzgBnAtJfxiWHTipjkmFbuvMGu1mqcmQoEMMyyQ,15039
455
465
  claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc,sha256=Ourc5IO3cUSZ9lg-1SKh5HaF01L5DmWXTRl38UN35NE,1145
466
+ claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc,sha256=2sEfKbiRDzZ31YPdbcmYCyMD2RrsBvV2dz6rIUM4hwo,957
456
467
  claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc,sha256=a7ERR-95KADLqU8bgoPzpCvEPo0yoYjhfXq_u2sCKuk,9613
468
+ claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc,sha256=IiHEGNWsa-DRr1m8ixEIHv_duHT5SorIcg1d2vZBR34,9627
457
469
  claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc,sha256=3SkPihhEUk3S39IvnM3bZ-ijoLE0qqHMvoeeM-hebdk,15390
470
+ claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-314.pyc,sha256=hx96Ck5d5IlRfCt5KYhWN9SSRYOMUexS-sNXr11YS_M,18427
458
471
  claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc,sha256=Yy_REAUhJCiFjOhxeDb4v0qyEvEbUtCmXD9PAz40dhw,5321
472
+ claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc,sha256=Xy9iNAtQMfXC_eW9rvumG9rFqK5t-QlLPmUahlqza_I,5341
459
473
  claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc,sha256=rmXujh8AxeOajj_40rSug1QdKCFNl5cFjn_pQE6DExY,15962
474
+ claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-314.pyc,sha256=0YrvSRdqX6CI5Fh3_Oy-ax16HD4b0H9tbL87pqpS1Pk,20861
460
475
  claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc,sha256=FkVlm20olvS286fK1SKPBDo9tOy0A9hRW0o5Gkyszuc,12352
476
+ claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc,sha256=dk8pUEtJS1CFnaQ62Wt4Z9E8-dePdqiP3ObrDgZLDVc,13101
461
477
  claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc,sha256=LILTBRAG9Wxpu_FmVod_5hnJO-wbaewqKrxEZ_GJTEI,14931
478
+ claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc,sha256=Y_3P-WuOGBdmRbGj7CmsOofU5KzQ_K9vXFxKDYKZPwA,15104
462
479
  claude_mpm/hooks/failure_learning/__init__.py,sha256=iJ80AKFHiT8DjIH2a72DQVJvL6nAFrizNA2yTKwZ4rw,1805
463
480
  claude_mpm/hooks/failure_learning/failure_detection_hook.py,sha256=KENoB5N-dBm5hb0SxeIZtCvNKbmG2BKHOJSrSO-3Z_I,7500
464
481
  claude_mpm/hooks/failure_learning/fix_detection_hook.py,sha256=XUk1bnBVLdfhQ9AMQSvGsTSeFQsKsVud2wbWX-Jjor8,7164
@@ -1106,10 +1123,10 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
1106
1123
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
1107
1124
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
1108
1125
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
1109
- claude_mpm-5.6.37.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1110
- claude_mpm-5.6.37.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1111
- claude_mpm-5.6.37.dist-info/METADATA,sha256=9S9VFtM7YgENEHeksusZFEuIArHYOdUV2KTV0ut4T9E,15245
1112
- claude_mpm-5.6.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1113
- claude_mpm-5.6.37.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1114
- claude_mpm-5.6.37.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1115
- claude_mpm-5.6.37.dist-info/RECORD,,
1126
+ claude_mpm-5.6.39.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1127
+ claude_mpm-5.6.39.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1128
+ claude_mpm-5.6.39.dist-info/METADATA,sha256=pLeyCZn0vH_Ka6O0vA6FEajtYxMrkSaPehVFZRStIgo,15245
1129
+ claude_mpm-5.6.39.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1130
+ claude_mpm-5.6.39.dist-info/entry_points.txt,sha256=1zA7qb37iArFuimIPKvNMoJz1WtKPNKfxfr8E_ijk30,290
1131
+ claude_mpm-5.6.39.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1132
+ claude_mpm-5.6.39.dist-info/RECORD,,
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ claude-hook = claude_mpm.hooks.claude_hooks.hook_handler:main
2
3
  claude-mpm = claude_mpm.cli:main
3
4
  claude-mpm-doctor = claude_mpm.scripts.mpm_doctor:main
4
5
  claude-mpm-monitor = claude_mpm.scripts.launch_monitor:main