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.
- claude_mpm/_version.py +2 -2
- claude_mpm/agents/agent_loader.py +682 -102
- claude_mpm/agents/base_agent_loader.py +23 -8
- claude_mpm/agents/schema/agent_schema.json +237 -83
- claude_mpm/agents/templates/data_engineer.json +6 -3
- claude_mpm/agents/templates/documentation.json +6 -3
- claude_mpm/agents/templates/engineer.json +7 -4
- claude_mpm/agents/templates/ops.json +6 -3
- claude_mpm/agents/templates/qa.json +10 -5
- claude_mpm/agents/templates/research.json +31 -42
- claude_mpm/agents/templates/security.json +14 -6
- claude_mpm/agents/templates/version_control.json +9 -5
- claude_mpm/core/base_service.py +61 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +224 -20
- claude_mpm/schemas/README_SECURITY.md +92 -0
- claude_mpm/schemas/agent_schema.json +130 -51
- claude_mpm/schemas/agent_schema_security_notes.md +165 -0
- claude_mpm/services/agent_capabilities_generator.py +0 -1
- claude_mpm/services/agent_deployment.py +479 -91
- claude_mpm/services/agent_lifecycle_manager.py +62 -4
- claude_mpm/services/deployed_agent_discovery.py +6 -2
- claude_mpm/services/version_control/semantic_versioning.py +165 -16
- claude_mpm/validation/agent_validator.py +147 -13
- {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/METADATA +4 -2
- {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/RECORD +29 -28
- claude_mpm-3.0.0.dist-info/licenses/LICENSE +21 -0
- claude_mpm/cli_old/__init__.py +0 -1
- claude_mpm/cli_old/ticket_cli.py +0 -102
- {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/WHEEL +0 -0
- {claude_mpm-2.1.0.dist-info → claude_mpm-3.0.0.dist-info}/entry_points.txt +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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:
|
|
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
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
22
|
-
claude_mpm/agents/templates/documentation.json,sha256=
|
|
23
|
-
claude_mpm/agents/templates/engineer.json,sha256=
|
|
24
|
-
claude_mpm/agents/templates/ops.json,sha256=
|
|
25
|
-
claude_mpm/agents/templates/qa.json,sha256=
|
|
26
|
-
claude_mpm/agents/templates/research.json,sha256=
|
|
27
|
-
claude_mpm/agents/templates/security.json,sha256=
|
|
28
|
-
claude_mpm/agents/templates/version_control.json,sha256=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
105
|
-
claude_mpm/services/agent_deployment.py,sha256=
|
|
106
|
-
claude_mpm/services/agent_lifecycle_manager.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
170
|
-
claude_mpm-
|
|
171
|
-
claude_mpm-
|
|
172
|
-
claude_mpm-
|
|
173
|
-
claude_mpm-
|
|
174
|
-
claude_mpm-
|
|
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.
|
claude_mpm/cli_old/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""CLI module for claude-mpm."""
|
claude_mpm/cli_old/ticket_cli.py
DELETED
|
@@ -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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|