claude-mpm 4.0.8__py3-none-any.whl → 4.0.10__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.
@@ -0,0 +1 @@
1
+ 287
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 4.0.8
1
+ 4.0.10
@@ -16,6 +16,37 @@ from typing import List, Optional
16
16
  from ...constants import CLICommands, CLIPrefix, LogLevel
17
17
 
18
18
 
19
+ def _get_enhanced_version(base_version: str) -> str:
20
+ """
21
+ Get enhanced version string with build number if available.
22
+
23
+ Args:
24
+ base_version: Base version string (e.g., "4.0.8")
25
+
26
+ Returns:
27
+ Enhanced version string with build number if available
28
+ """
29
+ try:
30
+ # Try to use VersionService for enhanced version display
31
+ from ...services.version_service import VersionService
32
+
33
+ version_service = VersionService()
34
+ enhanced = version_service.get_version()
35
+
36
+ # If we got an enhanced version (with build number), use it
37
+ # Remove the 'v' prefix since argparse will add the program name
38
+ if enhanced and enhanced.startswith('v'):
39
+ enhanced = enhanced[1:] # Remove 'v' prefix
40
+
41
+ if enhanced and enhanced != base_version:
42
+ return enhanced
43
+ except Exception:
44
+ # If anything fails, fall back to base version
45
+ pass
46
+
47
+ return base_version
48
+
49
+
19
50
  def add_common_arguments(parser: argparse.ArgumentParser, version: str = None) -> None:
20
51
  """
21
52
  Add common arguments that apply to all commands.
@@ -29,8 +60,10 @@ def add_common_arguments(parser: argparse.ArgumentParser, version: str = None) -
29
60
  """
30
61
  # Version - only add to main parser, not subparsers
31
62
  if version is not None:
63
+ # Use enhanced version display with build number if available
64
+ enhanced_version = _get_enhanced_version(version)
32
65
  parser.add_argument(
33
- "--version", action="version", version=f"%(prog)s {version}"
66
+ "--version", action="version", version=f"%(prog)s {enhanced_version}"
34
67
  )
35
68
 
36
69
  # Logging arguments
@@ -721,31 +721,47 @@ Extract tickets from these patterns:
721
721
  Path.home() / ".claude" / "agents", # User's system agents
722
722
  ]
723
723
 
724
- agents_dir = None
725
- for potential_dir in agents_dirs:
724
+ # Collect agents from all directories with proper precedence
725
+ # Project agents override user agents with the same name
726
+ all_agents = {} # key: agent_id, value: (agent_data, priority)
727
+
728
+ for priority, potential_dir in enumerate(agents_dirs):
726
729
  if potential_dir.exists() and any(potential_dir.glob("*.md")):
727
- agents_dir = potential_dir
728
- self.logger.debug(f"Found agents directory at: {agents_dir}")
729
- break
730
-
731
-
732
- if not agents_dir:
733
- self.logger.warning(f"No .claude/agents directory found in any location: {agents_dirs}")
730
+ self.logger.debug(f"Found agents directory at: {potential_dir}")
731
+
732
+ # Collect agents from this directory
733
+ for agent_file in potential_dir.glob("*.md"):
734
+ if agent_file.name.startswith("."):
735
+ continue
736
+
737
+ # Parse agent metadata
738
+ agent_data = self._parse_agent_metadata(agent_file)
739
+ if agent_data:
740
+ agent_id = agent_data["id"]
741
+ # Only add if not already present (project has priority 0, user has priority 1)
742
+ # Lower priority number wins (project > user)
743
+ if agent_id not in all_agents or priority < all_agents[agent_id][1]:
744
+ all_agents[agent_id] = (agent_data, priority)
745
+ self.logger.debug(f"Added/Updated agent {agent_id} from {potential_dir} (priority {priority})")
746
+
747
+ if not all_agents:
748
+ self.logger.warning(f"No agents found in any location: {agents_dirs}")
734
749
  return self._get_fallback_capabilities()
735
-
750
+
751
+ # Log agent collection summary
752
+ project_agents = [aid for aid, (_, pri) in all_agents.items() if pri == 0]
753
+ user_agents = [aid for aid, (_, pri) in all_agents.items() if pri == 1]
754
+
755
+ if project_agents:
756
+ self.logger.info(f"Loaded {len(project_agents)} project agents: {', '.join(sorted(project_agents))}")
757
+ if user_agents:
758
+ self.logger.info(f"Loaded {len(user_agents)} user agents: {', '.join(sorted(user_agents))}")
759
+
736
760
  # Build capabilities section
737
761
  section = "\n\n## Available Agent Capabilities\n\n"
738
762
 
739
- # Collect deployed agents
740
- deployed_agents = []
741
- for agent_file in agents_dir.glob("*.md"):
742
- if agent_file.name.startswith("."):
743
- continue
744
-
745
- # Parse agent metadata
746
- agent_data = self._parse_agent_metadata(agent_file)
747
- if agent_data:
748
- deployed_agents.append(agent_data)
763
+ # Extract just the agent data (drop priority info) and sort
764
+ deployed_agents = [agent_data for agent_data, _ in all_agents.values()]
749
765
 
750
766
  if not deployed_agents:
751
767
  return self._get_fallback_capabilities()
File without changes
File without changes
@@ -8,6 +8,7 @@ This service handles:
8
8
  Extracted from ClaudeRunner to follow Single Responsibility Principle.
9
9
  """
10
10
 
11
+ from pathlib import Path
11
12
  from typing import Any, Dict, Optional
12
13
 
13
14
  from claude_mpm.config.paths import paths
@@ -122,17 +123,23 @@ class VersionService(BaseService, VersionServiceInterface):
122
123
  Returns:
123
124
  Build number as integer or None if not available
124
125
  """
125
- try:
126
- build_file = paths.project_root / "BUILD_NUMBER"
127
- if build_file.exists():
128
- build_content = build_file.read_text().strip()
129
- build_number = int(build_content)
130
- self.logger.debug(f"Build number obtained from file: {build_number}")
131
- return build_number
132
- except (ValueError, IOError) as e:
133
- self.logger.debug(f"Could not read BUILD_NUMBER: {e}")
134
- except Exception as e:
135
- self.logger.debug(f"Unexpected error reading BUILD_NUMBER: {e}")
126
+ # Try multiple locations for BUILD_NUMBER file
127
+ build_file_locations = [
128
+ paths.project_root / "BUILD_NUMBER", # Development location
129
+ Path(__file__).parent.parent / "BUILD_NUMBER", # Package location
130
+ ]
131
+
132
+ for build_file in build_file_locations:
133
+ try:
134
+ if build_file.exists():
135
+ build_content = build_file.read_text().strip()
136
+ build_number = int(build_content)
137
+ self.logger.debug(f"Build number obtained from {build_file}: {build_number}")
138
+ return build_number
139
+ except (ValueError, IOError) as e:
140
+ self.logger.debug(f"Could not read BUILD_NUMBER from {build_file}: {e}")
141
+ except Exception as e:
142
+ self.logger.debug(f"Unexpected error reading BUILD_NUMBER from {build_file}: {e}")
136
143
 
137
144
  return None
138
145
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.0.8
3
+ Version: 4.0.10
4
4
  Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
5
5
  Home-page: https://github.com/bobmatnyc/claude-mpm
6
6
  Author: Claude MPM Team
@@ -1,4 +1,5 @@
1
- claude_mpm/VERSION,sha256=-I9gP6W4u73Wvm98nmVZAlkBStGQ8UTGc-iez1NsGRI,6
1
+ claude_mpm/BUILD_NUMBER,sha256=ra2KPUYLh7RotFiDIuCPImXsbEcwnA847UFNgGToN-0,4
2
+ claude_mpm/VERSION,sha256=Xm0N5pw0LsSAcOK92caP5MeunVmgHR49Xdv_Ai2jKCg,7
2
3
  claude_mpm/__init__.py,sha256=lyTZAYGH4DTaFGLRNWJKk5Q5oTjzN5I6AXmfVX-Jff0,1512
3
4
  claude_mpm/__main__.py,sha256=Lfi2z17WSKiMrTAhA0LNsdLJRiV-J2dAezXPt0R9Qis,643
4
5
  claude_mpm/constants.py,sha256=cwfhDsstU5KK7esKnoq0PtSUg7LjneujdHjR-o5dX00,5597
@@ -71,7 +72,7 @@ claude_mpm/cli/commands/socketio_monitor.py,sha256=3QnUrbd7l6wZyYKA3mGoT_AbenhSg
71
72
  claude_mpm/cli/commands/tickets.py,sha256=CU8_SupT6KCRKqGKAY8eE3_3K5nSvBC8PBD-WQFsdUM,25977
72
73
  claude_mpm/cli/parsers/__init__.py,sha256=z6xJz7lumf54qkqv5hvDYr3P1ib_MqvoxSW8-gFz9Kg,1005
73
74
  claude_mpm/cli/parsers/agents_parser.py,sha256=KK2XQjheedr2OpQ2vGfH1iOWHYLgGgpNZx0yU5un_Aw,4576
74
- claude_mpm/cli/parsers/base_parser.py,sha256=0SOo8btDOTC9Fc5ZuoMeA4LlJ3g4nXbY750BzwUtDl8,10395
75
+ claude_mpm/cli/parsers/base_parser.py,sha256=DfQC148y86Alo5jYSur3cyuZMKOlWHcyYanoyjhOyfU,11486
75
76
  claude_mpm/cli/parsers/config_parser.py,sha256=wp6NbV8_p9txP28MXFcQrri0JDIfGFM7u4aJbYJXcYQ,2699
76
77
  claude_mpm/cli/parsers/mcp_parser.py,sha256=SUwOagXlNP3qbRUvjuNU17plTyCD2ppJXBIPLQ0rmvw,5050
77
78
  claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
@@ -101,7 +102,7 @@ claude_mpm/core/constants.py,sha256=6e_IMQMOeW3oMgUsLFGvbqzM8Sf4fDYMpn3rGpfWVhM,
101
102
  claude_mpm/core/container.py,sha256=SERH3YOH9BXtHbv-kWu0bViNpdcGccDXR0NXFXbw1Pc,32155
102
103
  claude_mpm/core/exceptions.py,sha256=lNVLqVuRjygHe89NJg1rPAyevVdzpLOKgHFMQtGSxdA,19654
103
104
  claude_mpm/core/factories.py,sha256=A7WcjYWjhkc-tzUnef0YaW0Jj8oxMP-7_g2jIj1XYa8,7265
104
- claude_mpm/core/framework_loader.py,sha256=wRIkE7FeawWrvM3VF7uY1jJGRBalnuHZ4-PUayAhKD8,40727
105
+ claude_mpm/core/framework_loader.py,sha256=E_l5hrqwrGvAWCE-CHwjqAQErjxdzwgJ7AY31au5Hhk,42122
105
106
  claude_mpm/core/hook_manager.py,sha256=N-54QwNsyrUZSrH533HAo6hlJKPFbgMeDirg92H8en8,11014
106
107
  claude_mpm/core/hook_performance_config.py,sha256=Cqf-89mjiLlFJ-v4PhxfzsaOVovYYQa5pa-RMm42Ki8,5748
107
108
  claude_mpm/core/injectable_service.py,sha256=HXuviYX-h0sNxOFzgZiYjf-gLDUnQIeG-0-KuWdfCzk,7397
@@ -219,7 +220,7 @@ claude_mpm/services/subprocess_launcher_service.py,sha256=ZfMPJ2TvHP3SIho5wtCiBC
219
220
  claude_mpm/services/system_instructions_service.py,sha256=OVrTABcN99Hb7hcr95UEObUyLj45CVj_-aTvDsfioLY,10058
220
221
  claude_mpm/services/ticket_manager.py,sha256=SJCaVqDnsv-ZyjBZ38zwR-GhoCMTXhr0HF7fJjP7dYo,606
221
222
  claude_mpm/services/utility_service.py,sha256=zAt1EaTXfsyXymRD6UTuFFAM6kZORkdGaKFV0jhBGlI,8465
222
- claude_mpm/services/version_service.py,sha256=ys_ZTY_VAUEpzUhuOUz6Yg9V6f9COZSqqmttflRS9kc,9812
223
+ claude_mpm/services/version_service.py,sha256=MG88cKmDQTcxVKXB_X0dI1CNNvXYZoxACfJii2cMlVE,10159
223
224
  claude_mpm/services/agents/__init__.py,sha256=ExaFbDQt4cf1bpLvrVHkZA-ev8chEBeZPI35AQRGh_E,2175
224
225
  claude_mpm/services/agents/deployment/__init__.py,sha256=d9l1uaf-G7v_mCxcz8OUQMFtgG8-JZviqXacOOlaU4g,539
225
226
  claude_mpm/services/agents/deployment/agent_config_provider.py,sha256=iH_N4Qi7gq_Pc4OYqsnaaX5KPVMlJ2dYkQS_PEVmLtY,13312
@@ -409,9 +410,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=e74VlIPozCljZss_0SwLO3J1ZuIKRT9FrrFi
409
410
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
410
411
  claude_mpm/validation/agent_validator.py,sha256=szbK9d29v_T6xE_KvW845WLKXbS_yYpXQscrSrSeldI,20937
411
412
  claude_mpm/validation/frontmatter_validator.py,sha256=Q_aTyjigfKZQG7eSwLtwMfd0h_eyS9FQAm59ZFf5VYA,7036
412
- claude_mpm-4.0.8.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
413
- claude_mpm-4.0.8.dist-info/METADATA,sha256=HH6B43toU3GLSIG4Ozx7p2rYY5BbBcbRWLeJmEc6uNc,11818
414
- claude_mpm-4.0.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
415
- claude_mpm-4.0.8.dist-info/entry_points.txt,sha256=uafLVeHm4AXrzvdR77fXO3a2MmvvfGtmVU2iY8uIPt8,403
416
- claude_mpm-4.0.8.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
417
- claude_mpm-4.0.8.dist-info/RECORD,,
413
+ claude_mpm-4.0.10.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
414
+ claude_mpm-4.0.10.dist-info/METADATA,sha256=sCeWoa3vLWYxaX2_PRoWeyQraB037QdGukeFuEELcSc,11819
415
+ claude_mpm-4.0.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
416
+ claude_mpm-4.0.10.dist-info/entry_points.txt,sha256=uafLVeHm4AXrzvdR77fXO3a2MmvvfGtmVU2iY8uIPt8,403
417
+ claude_mpm-4.0.10.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
418
+ claude_mpm-4.0.10.dist-info/RECORD,,