claude-mpm 2.1.0__py3-none-any.whl → 3.0.0__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 (31) hide show
  1. claude_mpm/_version.py +2 -2
  2. claude_mpm/agents/agent_loader.py +682 -102
  3. claude_mpm/agents/base_agent_loader.py +23 -8
  4. claude_mpm/agents/schema/agent_schema.json +237 -83
  5. claude_mpm/agents/templates/data_engineer.json +6 -3
  6. claude_mpm/agents/templates/documentation.json +6 -3
  7. claude_mpm/agents/templates/engineer.json +7 -4
  8. claude_mpm/agents/templates/ops.json +6 -3
  9. claude_mpm/agents/templates/qa.json +10 -5
  10. claude_mpm/agents/templates/research.json +31 -42
  11. claude_mpm/agents/templates/security.json +14 -6
  12. claude_mpm/agents/templates/version_control.json +9 -5
  13. claude_mpm/core/base_service.py +61 -1
  14. claude_mpm/hooks/claude_hooks/hook_handler.py +224 -20
  15. claude_mpm/schemas/README_SECURITY.md +92 -0
  16. claude_mpm/schemas/agent_schema.json +130 -51
  17. claude_mpm/schemas/agent_schema_security_notes.md +165 -0
  18. claude_mpm/services/agent_capabilities_generator.py +0 -1
  19. claude_mpm/services/agent_deployment.py +479 -91
  20. claude_mpm/services/agent_lifecycle_manager.py +62 -4
  21. claude_mpm/services/deployed_agent_discovery.py +6 -2
  22. claude_mpm/services/version_control/semantic_versioning.py +165 -16
  23. claude_mpm/validation/agent_validator.py +147 -13
  24. {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/METADATA +4 -2
  25. {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/RECORD +29 -28
  26. claude_mpm-3.0.0.dist-info/licenses/LICENSE +21 -0
  27. claude_mpm/cli_old/__init__.py +0 -1
  28. claude_mpm/cli_old/ticket_cli.py +0 -102
  29. {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/WHEEL +0 -0
  30. {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/entry_points.txt +0 -0
  31. {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/top_level.txt +0 -0
@@ -3,6 +3,20 @@ Agent validation framework using JSON Schema validation.
3
3
 
4
4
  This module provides comprehensive validation for agent configurations
5
5
  using the standardized JSON schema with direct validation approach.
6
+
7
+ Security Features:
8
+ - Input validation using JSON Schema to prevent malformed data
9
+ - Path traversal protection in file operations
10
+ - Resource limit validation to prevent resource exhaustion
11
+ - Strict schema validation with no additional properties allowed
12
+ - Character limit enforcement to prevent memory exhaustion
13
+ - Safe JSON parsing with error handling
14
+
15
+ Security Considerations:
16
+ - All file paths should be validated and sanitized
17
+ - Agent IDs must follow strict naming conventions
18
+ - Resource limits prevent denial of service attacks
19
+ - Schema validation prevents injection of unexpected fields
6
20
  """
7
21
 
8
22
  import json
@@ -27,7 +41,16 @@ class ValidationResult:
27
41
 
28
42
 
29
43
  class AgentValidator:
30
- """Validates agent configurations against JSON schema."""
44
+ """Validates agent configurations against JSON schema.
45
+
46
+ SECURITY CRITICAL: This class is the primary defense against malicious agent
47
+ configurations. All agent data must pass through this validator before being
48
+ used by the system. Bypassing this validator could lead to:
49
+ - Arbitrary code execution (via tool access)
50
+ - Resource exhaustion (via resource limits)
51
+ - Data exfiltration (via file/network access)
52
+ - Privilege escalation (via tool combinations)
53
+ """
31
54
 
32
55
  def __init__(self, schema_path: Optional[Path] = None):
33
56
  """Initialize the validator with the agent schema."""
@@ -39,8 +62,20 @@ class AgentValidator:
39
62
  self.validator = Draft7Validator(self.schema)
40
63
 
41
64
  def _load_schema(self) -> Dict[str, Any]:
42
- """Load the JSON schema from file."""
65
+ """Load the JSON schema from file.
66
+
67
+ Security Considerations:
68
+ - Schema file path is validated to exist and be a file
69
+ - JSON parsing errors are caught and logged
70
+ - Schema tampering would be detected by validation failures
71
+ """
43
72
  try:
73
+ # SECURITY: Validate schema path exists and is a file
74
+ if not self.schema_path.exists():
75
+ raise FileNotFoundError(f"Schema file not found: {self.schema_path}")
76
+ if not self.schema_path.is_file():
77
+ raise ValueError(f"Schema path is not a file: {self.schema_path}")
78
+
44
79
  with open(self.schema_path, 'r') as f:
45
80
  return json.load(f)
46
81
  except Exception as e:
@@ -51,6 +86,12 @@ class AgentValidator:
51
86
  """
52
87
  Validate a single agent configuration against the schema.
53
88
 
89
+ Security Features:
90
+ - Strict JSON Schema validation prevents unexpected fields
91
+ - Business rule validation adds additional security checks
92
+ - Input size limits prevent memory exhaustion
93
+ - Agent ID format validation prevents injection attacks
94
+
54
95
  Args:
55
96
  agent_data: Agent configuration dictionary
56
97
 
@@ -71,28 +112,38 @@ class AgentValidator:
71
112
  path = ".".join(str(p) for p in e.path)
72
113
  result.errors.append(f"Error at path: {path}")
73
114
 
74
- # Additional business rule validations
115
+ # SECURITY: Additional business rule validations beyond schema
116
+ # These provide defense-in-depth security checks
75
117
  if result.is_valid:
76
118
  self._validate_business_rules(agent_data, result)
77
119
 
78
120
  # Add metadata
79
121
  result.metadata = {
80
122
  "validated_at": datetime.utcnow().isoformat(),
81
- "schema_version": self.schema.get("version", "1.0.0"),
123
+ "schema_version": self.schema.get("version", "1.1.0"),
82
124
  "agent_id": agent_data.get("id", "unknown")
83
125
  }
84
126
 
85
127
  return result
86
128
 
87
129
  def _validate_business_rules(self, agent_data: Dict[str, Any], result: ValidationResult) -> None:
88
- """Apply additional business rule validations beyond schema."""
130
+ """Apply additional business rule validations beyond schema.
131
+
132
+ Security Validations:
133
+ - Resource limits to prevent DoS attacks
134
+ - Instruction length limits to prevent memory exhaustion
135
+ - Agent ID format to prevent injection attacks
136
+ - Tool compatibility to prevent privilege escalation
137
+ - Self-reference prevention in handoff agents
138
+ """
89
139
 
90
140
  # Validate resource tier consistency
91
141
  resource_tier = agent_data.get("capabilities", {}).get("resource_tier")
92
142
  if resource_tier:
93
143
  self._validate_resource_tier_limits(agent_data, resource_tier, result)
94
144
 
95
- # Validate instruction length (double-check)
145
+ # SECURITY: Validate instruction length to prevent memory exhaustion
146
+ # Double-check even though schema enforces this - defense in depth
96
147
  instructions = agent_data.get("instructions", "")
97
148
  if len(instructions) > 8000:
98
149
  result.errors.append(f"Instructions exceed 8000 character limit: {len(instructions)} characters")
@@ -101,19 +152,36 @@ class AgentValidator:
101
152
  # Validate model compatibility with tools
102
153
  self._validate_model_tool_compatibility(agent_data, result)
103
154
 
104
- # Validate agent ID format (clean IDs without _agent suffix)
155
+ # SECURITY: Validate agent ID format to prevent injection attacks
156
+ # Pattern enforced: ^[a-z][a-z0-9_]*$ prevents special characters
105
157
  agent_id = agent_data.get("id", "")
106
158
  if agent_id.endswith("_agent"):
107
159
  result.warnings.append(f"Agent ID '{agent_id}' contains deprecated '_agent' suffix")
108
160
 
109
- # Validate handoff agents exist
161
+ # SECURITY: Additional ID validation for defense in depth
162
+ if agent_id and not agent_id.replace('_', '').replace('-', '').isalnum():
163
+ result.errors.append(f"Agent ID '{agent_id}' contains invalid characters")
164
+ result.is_valid = False
165
+
166
+ # SECURITY: Validate handoff agents to prevent circular references and privilege escalation
110
167
  handoff_agents = agent_data.get("interactions", {}).get("handoff_agents", [])
111
168
  for handoff_id in handoff_agents:
112
169
  if handoff_id == agent_id:
113
170
  result.warnings.append(f"Agent '{agent_id}' references itself in handoff_agents")
171
+ # SECURITY: Ensure handoff IDs follow same pattern as agent IDs
172
+ if handoff_id and not handoff_id.replace('_', '').replace('-', '').isalnum():
173
+ result.errors.append(f"Handoff agent ID '{handoff_id}' contains invalid characters")
174
+ result.is_valid = False
114
175
 
115
176
  def _validate_resource_tier_limits(self, agent_data: Dict[str, Any], tier: str, result: ValidationResult) -> None:
116
- """Validate resource limits match the tier constraints."""
177
+ """Validate resource limits match the tier constraints.
178
+
179
+ Security Purpose:
180
+ - Prevents resource exhaustion attacks
181
+ - Ensures agents can't request excessive resources
182
+ - Enforces fair resource allocation
183
+ - Prevents denial of service through resource hogging
184
+ """
117
185
  tier_limits = {
118
186
  "intensive": {
119
187
  "memory_limit": (4096, 8192),
@@ -182,7 +250,8 @@ class AgentValidator:
182
250
  f"Haiku model '{model}' using resource-intensive tools: {used_intensive}"
183
251
  )
184
252
 
185
- # Network access requirement
253
+ # SECURITY: Network access requirement validation
254
+ # Ensures agents can't use network tools without explicit permission
186
255
  network_tools = {"WebSearch", "WebFetch", "aws", "gcloud", "azure"}
187
256
  needs_network = bool(set(tools) & network_tools)
188
257
  has_network = agent_data.get("capabilities", {}).get("network_access", False)
@@ -191,10 +260,38 @@ class AgentValidator:
191
260
  result.warnings.append(
192
261
  f"Agent uses network tools {set(tools) & network_tools} but network_access is False"
193
262
  )
263
+
264
+ # SECURITY: Check for potentially dangerous tool combinations
265
+ dangerous_combos = [
266
+ ({"Bash", "Write"}, "Can execute arbitrary code by writing and running scripts"),
267
+ ({"docker", "kubectl"}, "Container escape potential with both tools"),
268
+ ({"aws", "gcloud", "azure"}, "Multiple cloud access increases attack surface")
269
+ ]
270
+
271
+ for combo, risk in dangerous_combos:
272
+ if combo.issubset(set(tools)):
273
+ result.warnings.append(f"Potentially dangerous tool combination: {combo} - {risk}")
194
274
 
195
275
  def validate_file(self, file_path: Path) -> ValidationResult:
196
- """Validate an agent configuration file."""
276
+ """Validate an agent configuration file.
277
+
278
+ Security Measures:
279
+ - Path traversal protection through Path object
280
+ - Safe JSON parsing with error handling
281
+ - File size limits should be enforced by caller
282
+ """
197
283
  try:
284
+ # SECURITY: Validate file path
285
+ if not file_path.exists():
286
+ raise FileNotFoundError(f"File not found: {file_path}")
287
+ if not file_path.is_file():
288
+ raise ValueError(f"Path is not a file: {file_path}")
289
+
290
+ # SECURITY: Check file size to prevent memory exhaustion
291
+ file_size = file_path.stat().st_size
292
+ max_size = 1024 * 1024 # 1MB limit for agent configs
293
+ if file_size > max_size:
294
+ raise ValueError(f"File too large: {file_size} bytes (max {max_size} bytes)")
198
295
  with open(file_path, 'r') as f:
199
296
  agent_data = json.load(f)
200
297
 
@@ -212,13 +309,39 @@ class AgentValidator:
212
309
  return result
213
310
 
214
311
  def validate_directory(self, directory: Path) -> Dict[str, ValidationResult]:
215
- """Validate all agent files in a directory."""
312
+ """Validate all agent files in a directory.
313
+
314
+ Security Considerations:
315
+ - Directory traversal prevention through Path.glob
316
+ - Symlink following should be disabled in production
317
+ - Large directory DoS prevention through file count limits
318
+ """
216
319
  results = {}
217
320
 
321
+ # SECURITY: Validate directory exists and is accessible
322
+ if not directory.exists():
323
+ raise FileNotFoundError(f"Directory not found: {directory}")
324
+ if not directory.is_dir():
325
+ raise ValueError(f"Path is not a directory: {directory}")
326
+
327
+ # SECURITY: Limit number of files to prevent DoS
328
+ max_files = 100
329
+ file_count = 0
330
+
218
331
  for json_file in directory.glob("*.json"):
219
332
  if json_file.name == "agent_schema.json":
220
333
  continue
221
334
 
335
+ # SECURITY: Skip symlinks to prevent directory traversal
336
+ if json_file.is_symlink():
337
+ logger.warning(f"Skipping symlink: {json_file}")
338
+ continue
339
+
340
+ file_count += 1
341
+ if file_count > max_files:
342
+ logger.warning(f"Reached maximum file limit ({max_files}), stopping validation")
343
+ break
344
+
222
345
  logger.info(f"Validating {json_file}")
223
346
  results[json_file.name] = self.validate_file(json_file)
224
347
 
@@ -239,6 +362,11 @@ def validate_agent_migration(old_agent: Dict[str, Any], new_agent: Dict[str, Any
239
362
  """
240
363
  Validate that a migrated agent maintains compatibility.
241
364
 
365
+ Security Importance:
366
+ - Ensures privilege escalation doesn't occur during migration
367
+ - Validates that security constraints are preserved
368
+ - Prevents addition of dangerous tools without review
369
+
242
370
  Args:
243
371
  old_agent: Original agent configuration
244
372
  new_agent: Migrated agent configuration
@@ -248,7 +376,7 @@ def validate_agent_migration(old_agent: Dict[str, Any], new_agent: Dict[str, Any
248
376
  """
249
377
  result = ValidationResult(is_valid=True)
250
378
 
251
- # Check that core functionality is preserved
379
+ # SECURITY: Check that core functionality is preserved without privilege escalation
252
380
  old_tools = set(old_agent.get("configuration_fields", {}).get("tools", []))
253
381
  new_tools = set(new_agent.get("capabilities", {}).get("tools", []))
254
382
 
@@ -259,6 +387,12 @@ def validate_agent_migration(old_agent: Dict[str, Any], new_agent: Dict[str, Any
259
387
  result.warnings.append(f"Tools removed in migration: {missing}")
260
388
  if added:
261
389
  result.warnings.append(f"Tools added in migration: {added}")
390
+ # SECURITY: Flag addition of dangerous tools
391
+ dangerous_tools = {"Bash", "docker", "kubectl", "aws", "gcloud", "azure"}
392
+ dangerous_added = added & dangerous_tools
393
+ if dangerous_added:
394
+ result.errors.append(f"SECURITY: Dangerous tools added in migration: {dangerous_added}")
395
+ result.is_valid = False
262
396
 
263
397
  # Check instruction preservation
264
398
  old_instructions = old_agent.get("narrative_fields", {}).get("instructions", "")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 2.1.0
3
+ Version: 3.0.0
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
@@ -18,7 +18,8 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Requires-Python: >=3.8
20
20
  Description-Content-Type: text/markdown
21
- Requires-Dist: ai-trackdown-pytools>=1.2.0
21
+ License-File: LICENSE
22
+ Requires-Dist: ai-trackdown-pytools>=1.4.0
22
23
  Requires-Dist: pyyaml>=6.0
23
24
  Requires-Dist: python-dotenv>=0.19.0
24
25
  Requires-Dist: rich>=13.0.0
@@ -40,6 +41,7 @@ Requires-Dist: flake8; extra == "dev"
40
41
  Requires-Dist: mypy; extra == "dev"
41
42
  Dynamic: author-email
42
43
  Dynamic: home-page
44
+ Dynamic: license-file
43
45
  Dynamic: requires-python
44
46
 
45
47
  # Claude MPM - Multi-Agent Project Manager
@@ -1,6 +1,6 @@
1
1
  claude_mpm/__init__.py,sha256=sAbTZkHe3vWYAKDWdGyGVue5zwLD7nCOHZwZrLALM8A,395
2
2
  claude_mpm/__main__.py,sha256=smBw-5J3nf5s6GgQjj384GUr28YotIX-WNOxqpP0wnE,310
3
- claude_mpm/_version.py,sha256=HBkjBFMyGB0Jyz0lTkWhWTEalldfBZqkqfHkyuIxBJk,159
3
+ claude_mpm/_version.py,sha256=XOBUW134_JPZxC1dQDfnUpr93VyEj_9jTy9j5A-WR_s,159
4
4
  claude_mpm/cli.py,sha256=_6tUSY0FqBN6cHR6awuXgqm2-Hlh-L508rB-RDgflPU,26036
5
5
  claude_mpm/cli_enhancements.py,sha256=nwdOrbXITRqvcq_vrJtPKW1GDS7dLIG4UqjoUet2vR0,10890
6
6
  claude_mpm/cli_main.py,sha256=KCAe-ws73NrIg5qmFhPdZ1a4uoiaEZ-lldYzQ6KfnJg,306
@@ -10,22 +10,22 @@ claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=TYgSd9jNBMWp4mAOBUl9dconX4RcGbvm
10
10
  claude_mpm/agents/INSTRUCTIONS.md,sha256=X6bOhSII3pZVZh_Vw_zMYRdfLtyl5Mmf_jhrVYfNxFs,7200
11
11
  claude_mpm/agents/__init__.py,sha256=r-p7ervzjLPD7_8dm2tXX_fwvdTZy6KwKA03ofxN3sA,3275
12
12
  claude_mpm/agents/agent-template.yaml,sha256=koKJn8MCAJx0QNQMHouvIZrwvw5qjPV0U-aV-YVyk6s,2036
13
- claude_mpm/agents/agent_loader.py,sha256=aZiTX8u0__8ueHzwney98PHfVMSkrpF3Nh-DoFlso74,18675
13
+ claude_mpm/agents/agent_loader.py,sha256=UZf3Od23gSKe_k-EokatQdQKqS38lRQq_ifUYU5I0qU,44024
14
14
  claude_mpm/agents/agent_loader_integration.py,sha256=z_DXxAIeuUD71HBYdxxvcFKoQYQxITLo8oAdN_M4LTA,7610
15
15
  claude_mpm/agents/agents_metadata.py,sha256=Xju9Yim6XSv2u1J_Swre5VJySbdxxC-9TzpOfXG8ibg,5170
16
16
  claude_mpm/agents/base_agent.json,sha256=wvopTu58PEdvgvjBi45J5aBA6bxs5_v1KC84CbJeRzY,3820
17
- claude_mpm/agents/base_agent_loader.py,sha256=DJ0BDP_7ic3q0Zv5YQFZCYZp2V3bC3bB1v11ohbN8yU,18418
17
+ claude_mpm/agents/base_agent_loader.py,sha256=0cVD__2y-kPHr3G2YxqRazMGYUZvqKWp0O-VCFN6cxg,18993
18
18
  claude_mpm/agents/system_agent_config.py,sha256=Lke4FFjU0Vq3LLo4O7KvtHxadP7agAwC-ljCXK40h_A,23526
19
- claude_mpm/agents/schema/agent_schema.json,sha256=Ca_8E0QkFpGwQd7XjVy3jnBMv_-Yo2rL7Po-ziHut2U,5472
19
+ claude_mpm/agents/schema/agent_schema.json,sha256=7zuSk4VfBNTlQN33AkfJp0Y1GltlviwengIM0mb7dGg,8741
20
20
  claude_mpm/agents/templates/__init__.py,sha256=7UyIChghCnkrDctvmCRYr0Wrnn8Oj-eCdgL0KpFy1Mo,2668
21
- claude_mpm/agents/templates/data_engineer.json,sha256=3qLAOSBO47O5bj8gnUNvEjeIe9bRc6Hzaj3w_pTvmvI,5811
22
- claude_mpm/agents/templates/documentation.json,sha256=W6gF0p2XpXrYPng7aUjbpE0Z3IW193EbP3nKoNmY4yc,3043
23
- claude_mpm/agents/templates/engineer.json,sha256=vRAr9sEgKt7_IVg2e3iZmLQFQHTzjgM-YQepS-TL6rY,8829
24
- claude_mpm/agents/templates/ops.json,sha256=mNoS_OS_e4Ht2drx3d7H0I18x38LX16E-mhsJn95ydQ,2899
25
- claude_mpm/agents/templates/qa.json,sha256=qEsJzkXbqM4pAdl4vyW1HeaQME5SvnIk4XttPWI2Dhw,2942
26
- claude_mpm/agents/templates/research.json,sha256=nwqExnDvMVGih7RGzbwpYGBb1NbAdHRq3L03S4QtzKs,10180
27
- claude_mpm/agents/templates/security.json,sha256=T0hRMeHq54ryblR2QsBFBJtNx-mYR3VEtwQYOvx4EOU,2945
28
- claude_mpm/agents/templates/version_control.json,sha256=RsV0WLs58boDOzurwB75Zdol4uXf_Za0VHOqQ3Og2Rw,2923
21
+ claude_mpm/agents/templates/data_engineer.json,sha256=qoUz4nR5dP3ANu-e6Lr5bP_aa1A8_L9cN3iGwZk_B4k,5910
22
+ claude_mpm/agents/templates/documentation.json,sha256=ClQ3_zWRSxkCm1_bLuVRi5bl2IYUIjPEINZm82HjJak,3142
23
+ claude_mpm/agents/templates/engineer.json,sha256=Vqvxdifa1ldDUiFG1EXYupHCjg1hFYT80YE7Ef1owAk,8922
24
+ claude_mpm/agents/templates/ops.json,sha256=uxIu5Tyw-FsnV-RtT-hk2QSy9EJgesmK7eampglL5tk,2988
25
+ claude_mpm/agents/templates/qa.json,sha256=ByZw4FT1RW5sRoim2ouUPYipCi-6xI8LDaYEZ26lc6U,3076
26
+ claude_mpm/agents/templates/research.json,sha256=omkijtxuVMFweqGa6OzGS8qy0Xrlr1WwfZq361-mQtk,9943
27
+ claude_mpm/agents/templates/security.json,sha256=5RzIlGtRjPIVSKvH_jjx-hzPbjh0TP2SeDBw_7LyfEA,3118
28
+ claude_mpm/agents/templates/version_control.json,sha256=YPxSufd32PMFTyVzDkOteoS944r74MD3VIToYm4DRCE,3043
29
29
  claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json,sha256=lLso4RHXVTQmX4A1XwF84kT59zZDblPO1xCgBj4S4x8,5060
30
30
  claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json,sha256=snfJW2yW9aMv9ldCSIWW7zwnyoQRx5u7xLMkNlfus9I,2258
31
31
  claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json,sha256=21o8TGCM9TO6eocSV9Ev5MmCq-xYwwCqMU7KQESaY2Q,8479
@@ -40,15 +40,13 @@ claude_mpm/cli_module/args.py,sha256=nilYpziBsoEySO4W1hQ2MRJyn9TFx3c3TrucyMMhRtk
40
40
  claude_mpm/cli_module/commands.py,sha256=CBNfO-bXrZ0spjeW_7-swprEq5V4PQSc0qhl9SLP5UU,7168
41
41
  claude_mpm/cli_module/migration_example.py,sha256=C-_GbsW8dGzutnNeRLLld74ibDLyAOQx0stdpYZS0hs,6137
42
42
  claude_mpm/cli_module/refactoring_guide.md,sha256=fl1PGwLZAj4OYWmU0syg1jDd81PqK7rC7rhwgFId5BE,7048
43
- claude_mpm/cli_old/__init__.py,sha256=v7mFJSN0p6NOIcURZp5ibZaZBn6iGrLwyGl7tA_lh4c,32
44
- claude_mpm/cli_old/ticket_cli.py,sha256=oKIT2LR1tToHybwypRfsNdnYlwdRzjWyjlQN5lYwTOk,3795
45
43
  claude_mpm/config/__init__.py,sha256=p31JuaXLDHgIgoAbHApNvctN2IEZYq2MBkkXROdhbH8,105
46
44
  claude_mpm/core/__init__.py,sha256=hE29BeE3qb8vC1-wiKjPh60WZebCwfo9UAUGM1zQnkc,1206
47
45
  claude_mpm/core/agent_name_normalizer.py,sha256=-X68oz3_74t9BRbHA54NEGyjy0xjTsGp_sCUHDtKp1s,9269
48
46
  claude_mpm/core/agent_registry.py,sha256=4MAfc7xDlrYWWkHmDMRmWE8q32teuCmIcud9D0I0dLo,20496
49
47
  claude_mpm/core/agent_registry.py.bak,sha256=cXB0yqhonE1XsXmWcdwyNuvv8yddK_PyZILDCmwCZ_Q,10161
50
48
  claude_mpm/core/agent_session_manager.py,sha256=6alXQr4gnMR-unT4J1ryEtTxJqQolA0-NgPQN6X3lqY,11212
51
- claude_mpm/core/base_service.py,sha256=b4KrjxzqStDhVqsE37ApzwMRNQM7WGGdHciEuWdH4mE,26824
49
+ claude_mpm/core/base_service.py,sha256=qWI_rUybHmmKroptJxcE4rzPBhK8yeMKIt2JqnqJB7E,29125
52
50
  claude_mpm/core/base_service.py.bak,sha256=48A8eI_HPqxYm42X5jaTo8zQVOfFFXe7SqIUo-8IyC4,13124
53
51
  claude_mpm/core/config.py,sha256=QNPufRWzXl99wAz14Gm2T_CG5K5n8d4eOjmpaxVllv0,12371
54
52
  claude_mpm/core/config_aliases.py,sha256=8eqA4wpWViIDm_9pL3f9j7cR_ssmhOYYiY2UzHrfUzg,10058
@@ -81,7 +79,7 @@ claude_mpm/hooks/builtin/ticket_extraction_hook_example.py,sha256=4wNhS2tFUXgdcv
81
79
  claude_mpm/hooks/builtin/todo_agent_prefix_hook.py,sha256=v_4w2vcZIt0bkZxqdHmgtN79yHZ1gviuhhBws0FHpIQ,10226
82
80
  claude_mpm/hooks/builtin/workflow_start_hook.py,sha256=EQrtYD9qLMLSYPl3oQinEheZAJ2i5EO_h2jhhR8lmt0,7490
83
81
  claude_mpm/hooks/claude_hooks/__init__.py,sha256=bMUwt2RzDGAcEbtDMA7vWS1uJsauOY0OixIe4pHwgQ0,129
84
- claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=r1OqgtXw04u47FVV8Ks2ppHh8hC4xSQrj3Q3hWHuHxs,21627
82
+ claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=FpmG0TfPTT-JL_dFdae-XVwNnvCvB6BJtRpT5PlZi7g,30538
85
83
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=6n0-G317jIrPuNRGnAyFvBbNM4gVzKEat_WSbpvKN-g,1742
86
84
  claude_mpm/orchestration/SUBPROCESS_DESIGN.md,sha256=YwToiT1_NXblv1XIWhWPNc2uKzDvqY2E_Nix8qK7qk0,2136
87
85
  claude_mpm/orchestration/__init__.py,sha256=C-cwldtfBCgV19mKnJa5U1XiKw1rAZvx-kK61nIdcao,205
@@ -97,19 +95,21 @@ claude_mpm/orchestration/archive/simple_orchestrator.py,sha256=Booy_eeuC5H3i-1HA
97
95
  claude_mpm/orchestration/archive/subprocess_orchestrator.py,sha256=TYTAHX6p4OpgBsfU-CF2D6r_wmZHIASc9GR8l3-qXQM,31982
98
96
  claude_mpm/orchestration/archive/system_prompt_orchestrator.py,sha256=R16sc-94kQVeGjJzTYmvKn0aYgj_9qxyzShDy1E5zpE,12853
99
97
  claude_mpm/orchestration/archive/wrapper_orchestrator.py,sha256=cvL0NJf9kCWf3QJl67ySwvtR1Hd9Rym28Ii8Rtsdi6Q,6806
100
- claude_mpm/schemas/agent_schema.json,sha256=xPqYaZ8VNFyabdpEL91kufKPsWk36v6hYbqoMfUsvs4,9645
98
+ claude_mpm/schemas/README_SECURITY.md,sha256=6BiFZ9VuMllijQkYEx_lAT7wwXhMeO3FQtih7WMvsAI,3297
99
+ claude_mpm/schemas/agent_schema.json,sha256=vEp9dFCqUmxLzkNLmB34uvCmGemNv1DiVYNcUXBDONc,15963
100
+ claude_mpm/schemas/agent_schema_security_notes.md,sha256=gzx6Z4xL5x0QISiXVDcwRGNnfegRgVK7jx7jAcc5910,6449
101
101
  claude_mpm/scripts/__init__.py,sha256=M2n9fQeyfILC8gogXvJv6ixnu7hwpqLEqLWJRaUN0MU,37
102
102
  claude_mpm/scripts/ticket.py,sha256=GmFimtTJxc927cCzJvvJH3gvoxXQtAB-W-xnuclcvNs,9350
103
103
  claude_mpm/services/__init__.py,sha256=-EBm07Lh9mjcofiQHCqyCCQJMLi9akVArPlz8i_kEOo,226
104
- claude_mpm/services/agent_capabilities_generator.py,sha256=K0oO2N4yjRXmf27FF6dbWCXcugT-7uGWz5p0p0APDSg,6658
105
- claude_mpm/services/agent_deployment.py,sha256=23nvYNyDj7QXxaiDsbwhuYhNDAv9vJ-KJI-SEHWcH5I,49837
106
- claude_mpm/services/agent_lifecycle_manager.py,sha256=VZBVONepomFpMqL7soaXIawS4NoaltFWKed7tU6bS3w,39057
104
+ claude_mpm/services/agent_capabilities_generator.py,sha256=hWG0zV2InmzrDMxSbQzjVBBTzEaxg0bFxl8tmTMJ8qA,6565
105
+ claude_mpm/services/agent_deployment.py,sha256=DtK1BX2yCrutUkQdVPD01mYHm-ya36l3EPOnEcaDfog,67961
106
+ claude_mpm/services/agent_lifecycle_manager.py,sha256=LPKTr6Oo2EzZ2vpk1a2uscdEeO9Vagz5UwatF3Zj0ZI,41913
107
107
  claude_mpm/services/agent_management_service.py,sha256=eX5n6w17b9urcogVdr4V-kXcuo7yyjORTrIihjF8PeQ,22853
108
108
  claude_mpm/services/agent_modification_tracker.py,sha256=7FRDXuCNANUnLatCgtBArG-AxZNtKbGQjgCKjnzmJ80,34050
109
109
  claude_mpm/services/agent_profile_loader.py,sha256=4D1Xj0vgqV8wN7Y3r8lijh7ghy5cVGU5t5s931sVqGc,23133
110
110
  claude_mpm/services/agent_registry.py,sha256=vn8CEW0vppj_0EY2NofmNRZEnpV70mlWiX2kAViFDRg,24374
111
111
  claude_mpm/services/base_agent_manager.py,sha256=WEcfzdMaFXmXUSoEYEPNeGu8dvqjIv53zyUU0ITrhsM,14987
112
- claude_mpm/services/deployed_agent_discovery.py,sha256=suzDPVt3eSGjyO1tkpuYNrMbgPz_uUuAWHWimtjvT3A,9299
112
+ claude_mpm/services/deployed_agent_discovery.py,sha256=GoXhho5EBz_FZDDl4xUWW_BnP3hfymbV1ePorRrhO_U,9443
113
113
  claude_mpm/services/framework_agent_loader.py,sha256=QdRSYRurYF3YbAXJwIGei71BffD5AqOVcV3ktRPdk7g,14018
114
114
  claude_mpm/services/framework_claude_md_generator.py,sha256=3kHmkRLHTex6HFZ4DhbLVQb48j-5dAoy1q6UW1Qf7U8,22914
115
115
  claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
@@ -153,7 +153,7 @@ claude_mpm/services/version_control/__init__.py,sha256=5BFbqFUMtpCyDbMcekRjCQ4jg
153
153
  claude_mpm/services/version_control/branch_strategy.py,sha256=MTjWinbJEp4N-QqBi6Olop7LNtvhCEPVnfCwK-29O-A,22999
154
154
  claude_mpm/services/version_control/conflict_resolution.py,sha256=yWa9fzmkds1U0EBw-LyTZvlj56MpEEsRmryLQg4KDdU,26084
155
155
  claude_mpm/services/version_control/git_operations.py,sha256=L69Aduzwq4IipIGV3iiwNQTlgVi6peh-LzJTks7bvxo,27499
156
- claude_mpm/services/version_control/semantic_versioning.py,sha256=FF5Is4iI0jxRLhMUCpmehsXGaYM-ot7lfbCD2SSWEfo,23242
156
+ claude_mpm/services/version_control/semantic_versioning.py,sha256=xiDsirwq8CApnOBc4UMf4VcrgolzQgfK2T_Yi3mY7Bk,29039
157
157
  claude_mpm/ui/__init__.py,sha256=Snxxm3pYXPKfv9gBG_MZKxXkZk8c4ZJAQIvh-rjjCFo,45
158
158
  claude_mpm/ui/rich_terminal_ui.py,sha256=gx_9TD0kR4Exq867pHjVVs_b-gw1q267t5oA2ZDSkQU,10078
159
159
  claude_mpm/ui/terminal_ui.py,sha256=E_M-L-6EuGp6L8pRpaWEhTqf-ddDXhZp5W85D0XNRPw,11928
@@ -166,9 +166,10 @@ claude_mpm/utils/imports.py,sha256=wX-SOXUHbemx01MHRGQpVwajzXH6qYdQkYNFCIbb2mw,6
166
166
  claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E_eT-kM,11614
167
167
  claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,10153
168
168
  claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
169
- claude_mpm/validation/agent_validator.py,sha256=gxBn3m3NyJiHymIoNGUBk4dzRjIrw3TVL6lWPpmZmW8,11693
170
- claude_mpm-2.1.0.dist-info/METADATA,sha256=WOaRAE-7Fy72GQtEEJ1BvK7IIRKbqbpdUvnHTzR7RQE,13862
171
- claude_mpm-2.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
172
- claude_mpm-2.1.0.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
173
- claude_mpm-2.1.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
174
- claude_mpm-2.1.0.dist-info/RECORD,,
169
+ claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
170
+ claude_mpm-3.0.0.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
171
+ claude_mpm-3.0.0.dist-info/METADATA,sha256=pAc6wBy6kH__N3J2u_LvzGdpt5N_abYBgoPoKBLXWA0,13906
172
+ claude_mpm-3.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
173
+ claude_mpm-3.0.0.dist-info/entry_points.txt,sha256=PknO31um7d8bt6GjOiVeYpdJpjND0_C1z-LQfY6UfiU,142
174
+ claude_mpm-3.0.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
175
+ claude_mpm-3.0.0.dist-info/RECORD,,
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Claude MPM Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1 +0,0 @@
1
- """CLI module for claude-mpm."""
@@ -1,102 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Ticket Management CLI - delegates to aitrackdown.
4
-
5
- This module provides a wrapper that delegates all ticket operations
6
- to the aitrackdown command-line tool.
7
- """
8
-
9
- import sys
10
- import subprocess
11
- import argparse
12
-
13
-
14
- def main():
15
- """Main entry point that delegates to aitrackdown."""
16
- parser = argparse.ArgumentParser(
17
- description="Ticket management for Claude MPM (delegates to aitrackdown)",
18
- add_help=False
19
- )
20
-
21
- # Capture all arguments
22
- parser.add_argument('command', nargs='?', help='Command to run')
23
- parser.add_argument('args', nargs=argparse.REMAINDER, help='Arguments for the command')
24
-
25
- args = parser.parse_args()
26
-
27
- # Map common commands to aitrackdown equivalents
28
- if args.command == 'create':
29
- # Check if type is specified
30
- if any(arg in ['-t', '--type'] for arg in args.args):
31
- try:
32
- type_idx = args.args.index('-t') if '-t' in args.args else args.args.index('--type')
33
- if type_idx + 1 < len(args.args):
34
- ticket_type = args.args[type_idx + 1]
35
- # Remove type arguments
36
- remaining_args = args.args[:type_idx] + args.args[type_idx + 2:]
37
-
38
- if ticket_type == 'epic':
39
- cmd = ['aitrackdown', 'epic', 'create'] + remaining_args
40
- elif ticket_type == 'issue':
41
- cmd = ['aitrackdown', 'issue', 'create'] + remaining_args
42
- else:
43
- cmd = ['aitrackdown', 'task', 'create'] + remaining_args
44
- else:
45
- cmd = ['aitrackdown', 'task', 'create'] + args.args
46
- except:
47
- cmd = ['aitrackdown', 'task', 'create'] + args.args
48
- else:
49
- cmd = ['aitrackdown', 'task', 'create'] + args.args
50
-
51
- elif args.command == 'list':
52
- cmd = ['aitrackdown', 'task', 'list'] + args.args
53
-
54
- elif args.command in ['view', 'show']:
55
- cmd = ['aitrackdown', 'task', 'show'] + args.args
56
-
57
- elif args.command == 'update':
58
- cmd = ['aitrackdown', 'task', 'update'] + args.args
59
-
60
- elif args.command == 'close':
61
- if args.args:
62
- cmd = ['aitrackdown', 'task', 'complete', args.args[0]] + args.args[1:]
63
- else:
64
- cmd = ['aitrackdown', 'task', 'complete']
65
-
66
- elif args.command in ['help', '--help', '-h', None]:
67
- print("Claude MPM Ticket Management (powered by aitrackdown)")
68
- print()
69
- print("Usage:")
70
- print(" claude-mpm-ticket create <title> [options]")
71
- print(" claude-mpm-ticket list [options]")
72
- print(" claude-mpm-ticket view <id>")
73
- print(" claude-mpm-ticket update <id> [options]")
74
- print(" claude-mpm-ticket close <id>")
75
- print()
76
- print("Examples:")
77
- print(' claude-mpm-ticket create "Fix bug" -p high')
78
- print(' claude-mpm-ticket create "New feature" -t issue')
79
- print(' claude-mpm-ticket create "Roadmap" -t epic')
80
- print(' claude-mpm-ticket list')
81
- print(' claude-mpm-ticket view TSK-0001')
82
- print()
83
- print("For full options, use: aitrackdown --help")
84
- return
85
-
86
- else:
87
- # Pass through to aitrackdown
88
- cmd = ['aitrackdown'] + ([args.command] if args.command else []) + args.args
89
-
90
- # Execute the command
91
- try:
92
- subprocess.run(cmd, check=True)
93
- except subprocess.CalledProcessError as e:
94
- sys.exit(e.returncode)
95
- except FileNotFoundError:
96
- print("Error: aitrackdown not found. Please ensure ai-trackdown-pytools is installed.")
97
- print("Install with: pip install ai-trackdown-pytools")
98
- sys.exit(1)
99
-
100
-
101
- if __name__ == "__main__":
102
- main()