claude-mpm 3.1.1__py3-none-any.whl → 3.1.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.
@@ -43,10 +43,12 @@ from claude_mpm.services.agent_modification_tracker import (
43
43
  )
44
44
  from claude_mpm.services.agent_persistence_service import (
45
45
  AgentPersistenceService,
46
- PersistenceRecord,
47
46
  PersistenceStrategy,
47
+ PersistenceRecord,
48
48
  PersistenceOperation
49
49
  )
50
+ from claude_mpm.services.agent_management_service import AgentManager
51
+ from claude_mpm.models.agent_definition import AgentDefinition, AgentType
50
52
  from claude_mpm.core.base_service import BaseService
51
53
  from claude_mpm.utils.path_operations import path_ops
52
54
  from claude_mpm.utils.config_manager import ConfigurationManager
@@ -149,6 +151,7 @@ class AgentLifecycleManager(BaseService):
149
151
  self.agent_registry: Optional[AgentRegistry] = None
150
152
  self.modification_tracker: Optional[AgentModificationTracker] = None
151
153
  self.persistence_service: Optional[AgentPersistenceService] = None
154
+ self.agent_manager: Optional[AgentManager] = None
152
155
 
153
156
  # Lifecycle tracking
154
157
  self.agent_records: Dict[str, AgentLifecycleRecord] = {}
@@ -246,6 +249,9 @@ class AgentLifecycleManager(BaseService):
246
249
  self.persistence_service = AgentPersistenceService()
247
250
  await self.persistence_service.start()
248
251
 
252
+ # Initialize AgentManager
253
+ self.agent_manager = AgentManager()
254
+
249
255
  self.logger.info("Core services initialized successfully")
250
256
 
251
257
  except Exception as e:
@@ -319,9 +325,9 @@ class AgentLifecycleManager(BaseService):
319
325
  if not self.agent_registry:
320
326
  return
321
327
 
322
- # Discover all agents via registry
323
- await self.agent_registry.discover_agents()
324
- all_agents = await self.agent_registry.list_agents()
328
+ # Discover all agents via registry (sync methods)
329
+ self.agent_registry.discover_agents()
330
+ all_agents = self.agent_registry.list_agents()
325
331
 
326
332
  # Update lifecycle records with registry data
327
333
  for agent_metadata in all_agents:
@@ -391,8 +397,32 @@ class AgentLifecycleManager(BaseService):
391
397
  error_message="Agent already exists"
392
398
  )
393
399
 
394
- # Determine file path
395
- file_path = await self._determine_agent_file_path(agent_name, tier)
400
+ # Create agent definition
401
+ agent_def = await self._create_agent_definition(
402
+ agent_name, agent_content, tier, agent_type, **kwargs
403
+ )
404
+
405
+ # Determine location based on tier
406
+ location = "project" if tier == ModificationTier.PROJECT else "framework"
407
+
408
+ # Create agent using AgentManager (sync call in executor)
409
+ try:
410
+ if self.agent_manager:
411
+ file_path = await self._run_sync_in_executor(
412
+ self.agent_manager.create_agent,
413
+ agent_name, agent_def, location
414
+ )
415
+ else:
416
+ # Fallback to direct file creation if AgentManager not available
417
+ file_path = await self._determine_agent_file_path(agent_name, tier)
418
+ path_ops.ensure_dir(file_path.parent)
419
+ path_ops.safe_write(file_path, agent_content)
420
+ except Exception as e:
421
+ self.logger.error(f"AgentManager failed to create agent: {e}")
422
+ # Fallback to direct file creation
423
+ file_path = await self._determine_agent_file_path(agent_name, tier)
424
+ path_ops.ensure_dir(file_path.parent)
425
+ path_ops.safe_write(file_path, agent_content)
396
426
 
397
427
  # Track modification
398
428
  modification = await self.modification_tracker.track_modification(
@@ -404,13 +434,18 @@ class AgentLifecycleManager(BaseService):
404
434
  **kwargs
405
435
  )
406
436
 
407
- # Persist agent
408
- persistence_record = await self.persistence_service.persist_agent(
437
+ # Note: We don't use persistence_service for the actual write anymore
438
+ # since AgentManager handles that. We create a synthetic record for compatibility.
439
+ persistence_record = PersistenceRecord(
440
+ operation_id=f"create_{agent_name}_{time.time()}",
441
+ operation_type=PersistenceOperation.CREATE,
409
442
  agent_name=agent_name,
410
- agent_content=agent_content,
411
443
  source_tier=tier,
412
444
  target_tier=tier,
413
- strategy=self.default_persistence_strategy
445
+ strategy=self.default_persistence_strategy,
446
+ success=True,
447
+ timestamp=time.time(),
448
+ file_path=str(file_path)
414
449
  )
415
450
 
416
451
  # Create lifecycle record
@@ -512,6 +547,48 @@ class AgentLifecycleManager(BaseService):
512
547
 
513
548
  record = self.agent_records[agent_name]
514
549
 
550
+ # Update agent using AgentManager
551
+ try:
552
+ if self.agent_manager:
553
+ # Read current agent to get full definition
554
+ current_def = await self._run_sync_in_executor(
555
+ self.agent_manager.read_agent, agent_name
556
+ )
557
+
558
+ if current_def:
559
+ # Update raw content
560
+ current_def.raw_content = agent_content
561
+
562
+ # Apply any metadata updates from kwargs
563
+ if 'model_preference' in kwargs:
564
+ current_def.metadata.model_preference = kwargs['model_preference']
565
+ if 'tags' in kwargs:
566
+ current_def.metadata.tags = kwargs['tags']
567
+ if 'specializations' in kwargs:
568
+ current_def.metadata.specializations = kwargs['specializations']
569
+
570
+ # Update via AgentManager
571
+ updated_def = await self._run_sync_in_executor(
572
+ self.agent_manager.update_agent,
573
+ agent_name, {"raw_content": agent_content}, True
574
+ )
575
+
576
+ if not updated_def:
577
+ raise Exception("AgentManager update failed")
578
+ else:
579
+ raise Exception("Could not read current agent definition")
580
+ else:
581
+ # Fallback to direct file update
582
+ file_path = Path(record.file_path)
583
+ if path_ops.validate_exists(file_path):
584
+ path_ops.safe_write(file_path, agent_content)
585
+ except Exception as e:
586
+ self.logger.error(f"AgentManager failed to update agent: {e}")
587
+ # Fallback to direct file update
588
+ file_path = Path(record.file_path)
589
+ if path_ops.validate_exists(file_path):
590
+ path_ops.safe_write(file_path, agent_content)
591
+
515
592
  # Track modification
516
593
  modification = await self.modification_tracker.track_modification(
517
594
  agent_name=agent_name,
@@ -521,12 +598,17 @@ class AgentLifecycleManager(BaseService):
521
598
  **kwargs
522
599
  )
523
600
 
524
- # Persist agent
525
- persistence_record = await self.persistence_service.persist_agent(
601
+ # Create synthetic persistence record for compatibility
602
+ persistence_record = PersistenceRecord(
603
+ operation_id=f"update_{agent_name}_{time.time()}",
604
+ operation_type=PersistenceOperation.UPDATE,
526
605
  agent_name=agent_name,
527
- agent_content=agent_content,
528
606
  source_tier=record.tier,
529
- strategy=self.default_persistence_strategy
607
+ target_tier=record.tier,
608
+ strategy=self.default_persistence_strategy,
609
+ success=True,
610
+ timestamp=time.time(),
611
+ file_path=record.file_path
530
612
  )
531
613
 
532
614
  # Update lifecycle record
@@ -631,10 +713,28 @@ class AgentLifecycleManager(BaseService):
631
713
  **kwargs
632
714
  )
633
715
 
634
- # Delete file
635
- file_path = Path(record.file_path)
636
- if path_ops.validate_exists(file_path):
637
- path_ops.safe_delete(file_path)
716
+ # Delete agent using AgentManager
717
+ deletion_success = False
718
+ try:
719
+ if self.agent_manager:
720
+ deletion_success = await self._run_sync_in_executor(
721
+ self.agent_manager.delete_agent, agent_name
722
+ )
723
+ if not deletion_success:
724
+ raise Exception("AgentManager delete failed")
725
+ else:
726
+ # Fallback to direct file deletion
727
+ file_path = Path(record.file_path)
728
+ if path_ops.validate_exists(file_path):
729
+ path_ops.safe_delete(file_path)
730
+ deletion_success = True
731
+ except Exception as e:
732
+ self.logger.error(f"AgentManager failed to delete agent: {e}")
733
+ # Fallback to direct file deletion
734
+ file_path = Path(record.file_path)
735
+ if path_ops.validate_exists(file_path):
736
+ path_ops.safe_delete(file_path)
737
+ deletion_success = True
638
738
 
639
739
  # Update lifecycle record
640
740
  record.current_state = LifecycleState.DELETED
@@ -749,8 +849,8 @@ class AgentLifecycleManager(BaseService):
749
849
  return False
750
850
 
751
851
  try:
752
- # Refresh specific agent in registry
753
- await self.agent_registry.refresh_agent(agent_name)
852
+ # Refresh registry (discover_agents is synchronous)
853
+ self.agent_registry.discover_agents()
754
854
  return True
755
855
 
756
856
  except Exception as e:
@@ -950,6 +1050,69 @@ class AgentLifecycleManager(BaseService):
950
1050
 
951
1051
  return stats
952
1052
 
1053
+ async def _create_agent_definition(self, agent_name: str, agent_content: str,
1054
+ tier: ModificationTier, agent_type: str, **kwargs) -> AgentDefinition:
1055
+ """
1056
+ Create an AgentDefinition from lifecycle parameters.
1057
+
1058
+ WHY: This method bridges the gap between the lifecycle manager's parameters
1059
+ and the AgentManager's expected AgentDefinition model.
1060
+
1061
+ DESIGN DECISION: Creating a minimal AgentDefinition here because:
1062
+ - The full markdown parsing happens in AgentManager
1063
+ - We only need to provide the essential metadata
1064
+ - This keeps the lifecycle manager focused on orchestration
1065
+ """
1066
+ # Map tier to AgentType
1067
+ type_map = {
1068
+ ModificationTier.USER: AgentType.CUSTOM,
1069
+ ModificationTier.PROJECT: AgentType.PROJECT,
1070
+ ModificationTier.SYSTEM: AgentType.SYSTEM
1071
+ }
1072
+
1073
+ # Create metadata
1074
+ from claude_mpm.models.agent_definition import AgentMetadata, AgentPermissions
1075
+ metadata = AgentMetadata(
1076
+ type=type_map.get(tier, AgentType.CUSTOM),
1077
+ model_preference=kwargs.get('model_preference', 'claude-3-sonnet'),
1078
+ version="1.0.0",
1079
+ author=kwargs.get('author', 'claude-mpm'),
1080
+ tags=kwargs.get('tags', []),
1081
+ specializations=kwargs.get('specializations', [])
1082
+ )
1083
+
1084
+ # Create minimal definition
1085
+ definition = AgentDefinition(
1086
+ name=agent_name,
1087
+ title=agent_name.replace('-', ' ').title(),
1088
+ file_path="", # Will be set by AgentManager
1089
+ metadata=metadata,
1090
+ primary_role=kwargs.get('primary_role', f"{agent_name} agent"),
1091
+ when_to_use={"select": [], "do_not_select": []},
1092
+ capabilities=[],
1093
+ authority=AgentPermissions(),
1094
+ workflows=[],
1095
+ escalation_triggers=[],
1096
+ kpis=[],
1097
+ dependencies=[],
1098
+ tools_commands="",
1099
+ raw_content=agent_content
1100
+ )
1101
+
1102
+ return definition
1103
+
1104
+ async def _run_sync_in_executor(self, func, *args, **kwargs):
1105
+ """
1106
+ Run a synchronous function in an executor to avoid blocking.
1107
+
1108
+ WHY: AgentManager has synchronous methods but AgentLifecycleManager is async.
1109
+ This allows us to call sync methods without blocking the event loop.
1110
+
1111
+ PERFORMANCE: Uses the default executor which manages a thread pool efficiently.
1112
+ """
1113
+ loop = asyncio.get_event_loop()
1114
+ return await loop.run_in_executor(None, func, *args, **kwargs)
1115
+
953
1116
  async def restore_agent(self, agent_name: str, backup_path: Optional[str] = None) -> LifecycleOperationResult:
954
1117
  """Restore agent from backup."""
955
1118
  start_time = time.time()
@@ -341,6 +341,14 @@ class AgentModificationTracker(BaseService):
341
341
  backup_path = await self._create_backup(file_path, modification_id)
342
342
 
343
343
  # Create modification record
344
+ # Only include valid AgentModification fields from file_metadata
345
+ valid_metadata_fields = {'file_hash_after', 'file_size_after'}
346
+ filtered_metadata = {k: v for k, v in file_metadata.items() if k in valid_metadata_fields}
347
+
348
+ # Add other metadata to the metadata field
349
+ extra_metadata = {k: v for k, v in file_metadata.items() if k not in valid_metadata_fields}
350
+ extra_metadata.update(kwargs)
351
+
344
352
  modification = AgentModification(
345
353
  modification_id=modification_id,
346
354
  agent_name=agent_name,
@@ -349,8 +357,8 @@ class AgentModificationTracker(BaseService):
349
357
  file_path=file_path,
350
358
  timestamp=time.time(),
351
359
  backup_path=backup_path,
352
- **file_metadata,
353
- **kwargs
360
+ metadata=extra_metadata,
361
+ **filtered_metadata
354
362
  )
355
363
 
356
364
  # Validate modification if enabled
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Agent Persistence Service (Stub)
4
+ ================================
5
+
6
+ WHY: This is a stub implementation to support the AgentLifecycleManager integration.
7
+ The actual persistence is now handled by AgentManager, but we maintain this interface
8
+ for backward compatibility.
9
+
10
+ DESIGN DECISION: Creating a minimal stub because:
11
+ - AgentManager handles the actual file persistence
12
+ - This maintains the existing API contract
13
+ - Allows for future extension if needed
14
+ """
15
+
16
+ from dataclasses import dataclass
17
+ from enum import Enum
18
+ from typing import Optional, Any, Dict
19
+ import time
20
+
21
+
22
+ class PersistenceStrategy(Enum):
23
+ """Agent persistence strategies."""
24
+ USER_OVERRIDE = "user_override"
25
+ PROJECT_SPECIFIC = "project_specific"
26
+ SYSTEM_DEFAULT = "system_default"
27
+
28
+
29
+ class PersistenceOperation(Enum):
30
+ """Persistence operation types."""
31
+ CREATE = "create"
32
+ UPDATE = "update"
33
+ DELETE = "delete"
34
+ BACKUP = "backup"
35
+ RESTORE = "restore"
36
+
37
+
38
+ @dataclass
39
+ class PersistenceRecord:
40
+ """Record of a persistence operation."""
41
+ operation_id: str
42
+ operation_type: PersistenceOperation
43
+ agent_name: str
44
+ source_tier: Any
45
+ target_tier: Optional[Any] = None
46
+ strategy: Optional[PersistenceStrategy] = None
47
+ success: bool = True
48
+ timestamp: float = 0.0
49
+ file_path: Optional[str] = None
50
+ error_message: Optional[str] = None
51
+ metadata: Dict[str, Any] = None
52
+
53
+
54
+ class AgentPersistenceService:
55
+ """
56
+ Stub implementation for agent persistence service.
57
+
58
+ WHY: Maintains compatibility with AgentLifecycleManager while
59
+ actual persistence is delegated to AgentManager.
60
+ """
61
+
62
+ def __init__(self):
63
+ """Initialize the persistence service."""
64
+ pass
65
+
66
+ async def start(self) -> None:
67
+ """Start the persistence service."""
68
+ # No-op for stub
69
+ pass
70
+
71
+ async def stop(self) -> None:
72
+ """Stop the persistence service."""
73
+ # No-op for stub
74
+ pass
75
+
76
+ async def persist_agent(self, agent_name: str, agent_content: str,
77
+ source_tier: Any, target_tier: Optional[Any] = None,
78
+ strategy: Optional[PersistenceStrategy] = None) -> PersistenceRecord:
79
+ """
80
+ Create a persistence record (actual persistence handled by AgentManager).
81
+
82
+ WHY: This method exists for API compatibility but doesn't perform
83
+ actual file operations since AgentManager handles that.
84
+ """
85
+ return PersistenceRecord(
86
+ operation_id=f"persist_{agent_name}_{time.time()}",
87
+ operation_type=PersistenceOperation.UPDATE,
88
+ agent_name=agent_name,
89
+ source_tier=source_tier,
90
+ target_tier=target_tier or source_tier,
91
+ strategy=strategy or PersistenceStrategy.USER_OVERRIDE,
92
+ success=True,
93
+ timestamp=time.time()
94
+ )
@@ -0,0 +1,37 @@
1
+ """
2
+ Agent Version Manager - Stub implementation for testing
3
+ """
4
+
5
+ class AgentVersionManager:
6
+ """Stub implementation of AgentVersionManager for integration testing."""
7
+
8
+ def __init__(self):
9
+ """Initialize version manager."""
10
+ pass
11
+
12
+ def get_next_version(self, current_version: str, change_type: str = "patch") -> str:
13
+ """Get next version number."""
14
+ parts = current_version.split(".")
15
+ if len(parts) != 3:
16
+ return "1.0.0"
17
+
18
+ major, minor, patch = map(int, parts)
19
+
20
+ if change_type == "major":
21
+ return f"{major + 1}.0.0"
22
+ elif change_type == "minor":
23
+ return f"{major}.{minor + 1}.0"
24
+ else: # patch
25
+ return f"{major}.{minor}.{patch + 1}"
26
+
27
+ def validate_version(self, version: str) -> bool:
28
+ """Validate version format."""
29
+ try:
30
+ parts = version.split(".")
31
+ if len(parts) != 3:
32
+ return False
33
+ for part in parts:
34
+ int(part)
35
+ return True
36
+ except:
37
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 3.1.1
3
+ Version: 3.1.2
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,8 +1,7 @@
1
1
  claude_mpm/__init__.py,sha256=TRneXzyApGyF7cRerpTn7aCbYLu-AJhPHjQf-dMBElQ,666
2
- claude_mpm/__main__.py,sha256=smBw-5J3nf5s6GgQjj384GUr28YotIX-WNOxqpP0wnE,310
3
- claude_mpm/cli.py,sha256=5GeRclnY-VNDaGnv7XUXDOniHZfACJ8HUYVUUXEHh9g,26340
4
- claude_mpm/cli_enhancements.py,sha256=nwdOrbXITRqvcq_vrJtPKW1GDS7dLIG4UqjoUet2vR0,10890
5
- claude_mpm/cli_main.py,sha256=KCAe-ws73NrIg5qmFhPdZ1a4uoiaEZ-lldYzQ6KfnJg,306
2
+ claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
3
+ claude_mpm/cli_enhancements.py,sha256=-N5f2u9TaxUcOJegUd3lt1FRz5ErEyYUvvgrNmMRL7Q,11814
4
+ claude_mpm/cli_old.py,sha256=5GeRclnY-VNDaGnv7XUXDOniHZfACJ8HUYVUUXEHh9g,26340
6
5
  claude_mpm/constants.py,sha256=5AG5hgBxOC7gMNHDx0lAhS-FQ8gXhtGtqJ9Moj3S6ro,4044
7
6
  claude_mpm/init.py,sha256=gOreOf7BLXkT0_HrQk_As4Kz1OT_NJG_RG0i0hbY0z0,8088
8
7
  claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=TYgSd9jNBMWp4mAOBUl9dconX4RcGbvmMEScRy5uyko,3343
@@ -24,6 +23,7 @@ claude_mpm/agents/templates/ops.json,sha256=uxIu5Tyw-FsnV-RtT-hk2QSy9EJgesmK7eam
24
23
  claude_mpm/agents/templates/qa.json,sha256=ByZw4FT1RW5sRoim2ouUPYipCi-6xI8LDaYEZ26lc6U,3076
25
24
  claude_mpm/agents/templates/research.json,sha256=omkijtxuVMFweqGa6OzGS8qy0Xrlr1WwfZq361-mQtk,9943
26
25
  claude_mpm/agents/templates/security.json,sha256=5RzIlGtRjPIVSKvH_jjx-hzPbjh0TP2SeDBw_7LyfEA,3118
26
+ claude_mpm/agents/templates/test-integration-agent.md,sha256=xyauhBApzj8qD24E0G32BF-mPCrGKES1g5S4OWPUtgc,505
27
27
  claude_mpm/agents/templates/version_control.json,sha256=YPxSufd32PMFTyVzDkOteoS944r74MD3VIToYm4DRCE,3043
28
28
  claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json,sha256=lLso4RHXVTQmX4A1XwF84kT59zZDblPO1xCgBj4S4x8,5060
29
29
  claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json,sha256=snfJW2yW9aMv9ldCSIWW7zwnyoQRx5u7xLMkNlfus9I,2258
@@ -34,6 +34,16 @@ claude_mpm/agents/templates/backup/research_agent_20250726_234551.json,sha256=o4
34
34
  claude_mpm/agents/templates/backup/security_agent_20250726_234551.json,sha256=l5YuD-27CxKSOsRLv0bDY_tCZyds0yGbeizLb8paeFY,2322
35
35
  claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json,sha256=too38RPTLJ9HutCMn0nfmEdCj2me241dx5tUYDFtu94,2143
36
36
  claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json,sha256=YZQgq2ri2_Y3qKzvPlC6TmzZKviDv0__GuyUOo1LbT8,146
37
+ claude_mpm/cli/README.md,sha256=exe9V_UEsMSPXOMlvQUv5FsCuhUpPOsMvIhyDSyuFdI,3423
38
+ claude_mpm/cli/__init__.py,sha256=gB5zDPjcHbW-I6Z5-zS0odgF0Qm4GRgSC2X2gUVRRcY,5255
39
+ claude_mpm/cli/parser.py,sha256=GsyaMK2td3kPji-OLfNjfgIza2Qe4iEeq6Wr-sebVKc,10737
40
+ claude_mpm/cli/utils.py,sha256=k_EHLcjDAzYhDeVeWvE-vqvHsEoG6Cc6Yk7fs3YoRVA,6022
41
+ claude_mpm/cli/commands/__init__.py,sha256=3Exhq4RH-2Sq2ugwc9fFW3vDbzJgSu2JaoX01vXjdRE,454
42
+ claude_mpm/cli/commands/agents.py,sha256=FqqEQcfAfCxjz_E7fGQUtLznloJLz8fWQtnjQhkbalQ,6795
43
+ claude_mpm/cli/commands/info.py,sha256=ETL6jC08OTQVTPjs219Y0m3FzfKOUlI0-yI81AI8FXY,2990
44
+ claude_mpm/cli/commands/run.py,sha256=6A-W4zBPFw1-TCHKFD6YhWuOqsG1zC0wvHJzByBS8a0,2946
45
+ claude_mpm/cli/commands/tickets.py,sha256=SXyGtHSyGJwTeJwDAHf7kRbdiG1DlZkXkod5UoNy7Ik,2150
46
+ claude_mpm/cli/commands/ui.py,sha256=FhBQiOKW61cNduyryRu0UhC366d6o1eEkBgbPd7Au1w,1900
37
47
  claude_mpm/cli_module/__init__.py,sha256=CkMp4gzWKoZZF_qKyBDi2sQaZw_GLWZYLtKouv-4f8s,390
38
48
  claude_mpm/cli_module/args.py,sha256=nilYpziBsoEySO4W1hQ2MRJyn9TFx3c3TrucyMMhRtk,7970
39
49
  claude_mpm/cli_module/commands.py,sha256=CBNfO-bXrZ0spjeW_7-swprEq5V4PQSc0qhl9SLP5UU,7168
@@ -80,6 +90,8 @@ claude_mpm/hooks/builtin/workflow_start_hook.py,sha256=EQrtYD9qLMLSYPl3oQinEheZA
80
90
  claude_mpm/hooks/claude_hooks/__init__.py,sha256=bMUwt2RzDGAcEbtDMA7vWS1uJsauOY0OixIe4pHwgQ0,129
81
91
  claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=FpmG0TfPTT-JL_dFdae-XVwNnvCvB6BJtRpT5PlZi7g,30538
82
92
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=6n0-G317jIrPuNRGnAyFvBbNM4gVzKEat_WSbpvKN-g,1742
93
+ claude_mpm/models/__init__.py,sha256=vy2NLX2KT9QeH76SjCYh9dOYKPLRgxGrnwkQFAg08gc,465
94
+ claude_mpm/models/agent_definition.py,sha256=y9XQOED_maOyiYKhNB8H8MfJJMBN0vIYPS_wCXnRJmA,6647
83
95
  claude_mpm/orchestration/SUBPROCESS_DESIGN.md,sha256=YwToiT1_NXblv1XIWhWPNc2uKzDvqY2E_Nix8qK7qk0,2136
84
96
  claude_mpm/orchestration/__init__.py,sha256=C-cwldtfBCgV19mKnJa5U1XiKw1rAZvx-kK61nIdcao,205
85
97
  claude_mpm/orchestration/archive/direct_orchestrator.py,sha256=j-IP-st-Xi9Xf33i-BLPZOE_kkxSZxNNuFZmp6MTuZY,7884
@@ -107,11 +119,13 @@ claude_mpm/scripts/ticket.py,sha256=GmFimtTJxc927cCzJvvJH3gvoxXQtAB-W-xnuclcvNs,
107
119
  claude_mpm/services/__init__.py,sha256=-EBm07Lh9mjcofiQHCqyCCQJMLi9akVArPlz8i_kEOo,226
108
120
  claude_mpm/services/agent_capabilities_generator.py,sha256=hWG0zV2InmzrDMxSbQzjVBBTzEaxg0bFxl8tmTMJ8qA,6565
109
121
  claude_mpm/services/agent_deployment.py,sha256=DtK1BX2yCrutUkQdVPD01mYHm-ya36l3EPOnEcaDfog,67961
110
- claude_mpm/services/agent_lifecycle_manager.py,sha256=LPKTr6Oo2EzZ2vpk1a2uscdEeO9Vagz5UwatF3Zj0ZI,41913
122
+ claude_mpm/services/agent_lifecycle_manager.py,sha256=fWggWu5rT7FkDQrRHyw05Y4KaNN9cXeaCinsymPJwM4,50127
111
123
  claude_mpm/services/agent_management_service.py,sha256=eX5n6w17b9urcogVdr4V-kXcuo7yyjORTrIihjF8PeQ,22853
112
- claude_mpm/services/agent_modification_tracker.py,sha256=7FRDXuCNANUnLatCgtBArG-AxZNtKbGQjgCKjnzmJ80,34050
124
+ claude_mpm/services/agent_modification_tracker.py,sha256=uxELrXtFt5Xlv0mhRbq5ynagEowczTRrv3mAp-aRZFc,34519
125
+ claude_mpm/services/agent_persistence_service.py,sha256=B_Vz43zCKWq47zWkoibcia-Qwn2y3gARu7MV5Cpiptc,2893
113
126
  claude_mpm/services/agent_profile_loader.py,sha256=4D1Xj0vgqV8wN7Y3r8lijh7ghy5cVGU5t5s931sVqGc,23133
114
127
  claude_mpm/services/agent_registry.py,sha256=vn8CEW0vppj_0EY2NofmNRZEnpV70mlWiX2kAViFDRg,24374
128
+ claude_mpm/services/agent_versioning.py,sha256=y4SiKGKdTn-9_Ht6nGlmKGJW6MLgEHZUy5SR1OPTZZM,1108
115
129
  claude_mpm/services/base_agent_manager.py,sha256=WEcfzdMaFXmXUSoEYEPNeGu8dvqjIv53zyUU0ITrhsM,14987
116
130
  claude_mpm/services/deployed_agent_discovery.py,sha256=GoXhho5EBz_FZDDl4xUWW_BnP3hfymbV1ePorRrhO_U,9443
117
131
  claude_mpm/services/framework_agent_loader.py,sha256=QdRSYRurYF3YbAXJwIGei71BffD5AqOVcV3ktRPdk7g,14018
@@ -171,9 +185,9 @@ claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E
171
185
  claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,10153
172
186
  claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
173
187
  claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
174
- claude_mpm-3.1.1.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
175
- claude_mpm-3.1.1.dist-info/METADATA,sha256=oQnytf26RtggLVb5S5WJGz41zJshlxeJmwKneQHLwDw,14139
176
- claude_mpm-3.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
177
- claude_mpm-3.1.1.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
178
- claude_mpm-3.1.1.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
179
- claude_mpm-3.1.1.dist-info/RECORD,,
188
+ claude_mpm-3.1.2.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
189
+ claude_mpm-3.1.2.dist-info/METADATA,sha256=C7fZn0Mcw9CZtmtJox-mWaqGZGrktZPpLAtYhp53j8c,14139
190
+ claude_mpm-3.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
191
+ claude_mpm-3.1.2.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
192
+ claude_mpm-3.1.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
193
+ claude_mpm-3.1.2.dist-info/RECORD,,
claude_mpm/cli_main.py DELETED
@@ -1,13 +0,0 @@
1
- """Main entry point for CLI that can be run directly."""
2
-
3
- import sys
4
- from pathlib import Path
5
-
6
- # Add src directory to path so claude_mpm can be imported
7
- src_dir = Path(__file__).parent.parent
8
- sys.path.insert(0, str(src_dir))
9
-
10
- from claude_mpm.cli import main
11
-
12
- if __name__ == "__main__":
13
- sys.exit(main())
File without changes