claude-mpm 3.3.2__py3-none-any.whl → 3.4.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/cli/commands/memory.py +186 -13
- claude_mpm/cli/parser.py +13 -1
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +61 -0
- claude_mpm/core/config.py +1 -1
- claude_mpm/core/simple_runner.py +61 -0
- claude_mpm/hooks/builtin/mpm_command_hook.py +5 -5
- claude_mpm/hooks/claude_hooks/hook_handler.py +211 -4
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +9 -2
- claude_mpm/hooks/memory_integration_hook.py +51 -5
- claude_mpm/services/__init__.py +23 -5
- claude_mpm/services/agent_memory_manager.py +536 -48
- claude_mpm/services/memory_builder.py +338 -6
- claude_mpm/services/project_analyzer.py +771 -0
- claude_mpm/services/socketio_server.py +473 -33
- claude_mpm/services/version_control/git_operations.py +26 -0
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/METADATA +34 -10
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/RECORD +22 -39
- claude_mpm/agents/agent-template.yaml +0 -83
- claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json +0 -6
- claude_mpm/cli/README.md +0 -109
- claude_mpm/cli_module/refactoring_guide.md +0 -253
- claude_mpm/core/agent_registry.py.bak +0 -312
- claude_mpm/core/base_service.py.bak +0 -406
- claude_mpm/hooks/README.md +0 -97
- claude_mpm/orchestration/SUBPROCESS_DESIGN.md +0 -66
- claude_mpm/schemas/README_SECURITY.md +0 -92
- claude_mpm/schemas/agent_schema.json +0 -395
- claude_mpm/schemas/agent_schema_documentation.md +0 -181
- claude_mpm/schemas/agent_schema_security_notes.md +0 -165
- claude_mpm/schemas/examples/standard_workflow.json +0 -505
- claude_mpm/schemas/ticket_workflow_documentation.md +0 -482
- claude_mpm/schemas/ticket_workflow_schema.json +0 -590
- claude_mpm/services/framework_claude_md_generator/README.md +0 -92
- claude_mpm/services/parent_directory_manager/README.md +0 -83
- claude_mpm/services/version_control/VERSION +0 -1
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/WHEEL +0 -0
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.3.2.dist-info → claude_mpm-3.4.0.dist-info}/top_level.txt +0 -0
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# Security Analysis: Agent Schema and Validation System
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
This document provides a comprehensive security analysis of the claude-mpm agent validation system, highlighting security features, considerations, and recommendations.
|
|
5
|
-
|
|
6
|
-
## Schema Security Features (agent_schema.json)
|
|
7
|
-
|
|
8
|
-
### 1. Input Validation
|
|
9
|
-
- **Strict Type Enforcement**: All fields have explicit types preventing type confusion attacks
|
|
10
|
-
- **Pattern Validation**: Agent IDs use pattern `^[a-z][a-z0-9_]*$` preventing injection attacks
|
|
11
|
-
- **Enum Restrictions**: Tools and models restricted to known safe values
|
|
12
|
-
- **Length Limits**: All string fields have min/max length to prevent memory exhaustion
|
|
13
|
-
- Instructions: max 8000 characters
|
|
14
|
-
- Name: max 50 characters
|
|
15
|
-
- Description: max 200 characters
|
|
16
|
-
|
|
17
|
-
### 2. Resource Controls
|
|
18
|
-
- **Memory Limits**: 512MB-8192MB range prevents OOM attacks
|
|
19
|
-
- **CPU Limits**: 10%-100% prevents resource hogging
|
|
20
|
-
- **Timeout Limits**: 30s-3600s prevents infinite operations
|
|
21
|
-
- **Token Limits**: 1000-200000 prevents API abuse
|
|
22
|
-
|
|
23
|
-
### 3. Access Controls
|
|
24
|
-
- **Network Access**: Default false, explicit opt-in required
|
|
25
|
-
- **File Access Paths**: Explicit read/write path restrictions
|
|
26
|
-
- **Tool Access**: Enumerated list prevents arbitrary tool usage
|
|
27
|
-
- **Additional Properties**: Set to false preventing field injection
|
|
28
|
-
|
|
29
|
-
### 4. Dangerous Tool Combinations
|
|
30
|
-
The schema allows these potentially dangerous combinations:
|
|
31
|
-
- **Bash + Write**: Can create and execute arbitrary scripts
|
|
32
|
-
- **docker + kubectl**: Container escape potential
|
|
33
|
-
- **aws + gcloud + azure**: Multiple cloud access increases attack surface
|
|
34
|
-
|
|
35
|
-
## Validator Security Features (agent_validator.py)
|
|
36
|
-
|
|
37
|
-
### 1. File Operation Security
|
|
38
|
-
- **Path Validation**: Checks file exists and is regular file
|
|
39
|
-
- **File Size Limits**: 1MB max prevents memory exhaustion
|
|
40
|
-
- **Symlink Protection**: Skips symlinks to prevent directory traversal
|
|
41
|
-
- **Directory Limits**: Max 100 files per directory prevents DoS
|
|
42
|
-
|
|
43
|
-
### 2. Business Rule Security
|
|
44
|
-
- **Double Validation**: Schema + business rules for defense in depth
|
|
45
|
-
- **ID Format Checking**: Additional validation beyond schema pattern
|
|
46
|
-
- **Resource Tier Validation**: Ensures limits match tier constraints
|
|
47
|
-
- **Tool Compatibility**: Validates dangerous tool combinations
|
|
48
|
-
|
|
49
|
-
### 3. Migration Security
|
|
50
|
-
- **Privilege Escalation Prevention**: Flags dangerous tools added during migration
|
|
51
|
-
- **Functionality Preservation**: Ensures security constraints maintained
|
|
52
|
-
- **Instruction Validation**: Prevents loss of security instructions
|
|
53
|
-
|
|
54
|
-
## Security Recommendations
|
|
55
|
-
|
|
56
|
-
### 1. Immediate Improvements
|
|
57
|
-
```python
|
|
58
|
-
# Add to validator.py
|
|
59
|
-
def _validate_path_injection(self, path: str) -> bool:
|
|
60
|
-
"""Prevent path traversal attacks"""
|
|
61
|
-
if '..' in path or path.startswith('/'):
|
|
62
|
-
return False
|
|
63
|
-
return True
|
|
64
|
-
|
|
65
|
-
def _validate_command_injection(self, value: str) -> bool:
|
|
66
|
-
"""Prevent command injection in string values"""
|
|
67
|
-
dangerous_chars = ['$', '`', ';', '&', '|', '>', '<']
|
|
68
|
-
return not any(char in value for char in dangerous_chars)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 2. Schema Enhancements
|
|
72
|
-
```json
|
|
73
|
-
{
|
|
74
|
-
"capabilities": {
|
|
75
|
-
"properties": {
|
|
76
|
-
"sandbox_mode": {
|
|
77
|
-
"type": "boolean",
|
|
78
|
-
"default": true,
|
|
79
|
-
"description": "Run agent in sandboxed environment"
|
|
80
|
-
},
|
|
81
|
-
"max_file_size": {
|
|
82
|
-
"type": "integer",
|
|
83
|
-
"default": 10485760,
|
|
84
|
-
"description": "Maximum file size agent can read/write (10MB default)"
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### 3. Audit Logging
|
|
92
|
-
```python
|
|
93
|
-
def validate_agent(self, agent_data: Dict[str, Any]) -> ValidationResult:
|
|
94
|
-
# Add security audit logging
|
|
95
|
-
audit_log = {
|
|
96
|
-
"timestamp": datetime.utcnow().isoformat(),
|
|
97
|
-
"agent_id": agent_data.get("id"),
|
|
98
|
-
"tools": agent_data.get("capabilities", {}).get("tools", []),
|
|
99
|
-
"network_access": agent_data.get("capabilities", {}).get("network_access", False),
|
|
100
|
-
"validation_result": "pending"
|
|
101
|
-
}
|
|
102
|
-
# Log to security audit trail
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### 4. Runtime Security Checks
|
|
106
|
-
- Implement runtime validation of actual tool usage vs declared tools
|
|
107
|
-
- Monitor resource usage against declared limits
|
|
108
|
-
- Validate file access against declared paths
|
|
109
|
-
- Check for privilege escalation attempts
|
|
110
|
-
|
|
111
|
-
## Potential Security Issues
|
|
112
|
-
|
|
113
|
-
### 1. Missing Validations
|
|
114
|
-
- No validation of hook configurations
|
|
115
|
-
- No validation of file path patterns for malicious patterns
|
|
116
|
-
- No rate limiting on validation operations
|
|
117
|
-
- No cryptographic signing of agent configurations
|
|
118
|
-
|
|
119
|
-
### 2. Information Disclosure
|
|
120
|
-
- Error messages may reveal system paths
|
|
121
|
-
- Schema version in metadata could aid attackers
|
|
122
|
-
- No sanitization of user-provided descriptions
|
|
123
|
-
|
|
124
|
-
### 3. Trust Boundaries
|
|
125
|
-
- No verification of agent template sources
|
|
126
|
-
- No integrity checking of loaded schemas
|
|
127
|
-
- Migration process trusts old configurations
|
|
128
|
-
|
|
129
|
-
## Security Best Practices for Agent Authors
|
|
130
|
-
|
|
131
|
-
1. **Principle of Least Privilege**: Only request tools actually needed
|
|
132
|
-
2. **Avoid Dangerous Combinations**: Don't combine Bash with Write unless essential
|
|
133
|
-
3. **Explicit Path Restrictions**: Always specify file access paths
|
|
134
|
-
4. **Network Isolation**: Only enable network_access when required
|
|
135
|
-
5. **Resource Limits**: Set appropriate limits for agent workload
|
|
136
|
-
6. **Input Sanitization**: Never trust user input in agent instructions
|
|
137
|
-
7. **Secure Defaults**: Start with minimal permissions and add as needed
|
|
138
|
-
|
|
139
|
-
## Compliance Considerations
|
|
140
|
-
|
|
141
|
-
### OWASP Top 10 Coverage
|
|
142
|
-
- **A01:2021 Broken Access Control**: ✓ Tool and file access restrictions
|
|
143
|
-
- **A02:2021 Cryptographic Failures**: ⚠️ No encryption of agent configs
|
|
144
|
-
- **A03:2021 Injection**: ✓ Pattern validation, enum restrictions
|
|
145
|
-
- **A04:2021 Insecure Design**: ✓ Defense in depth validation
|
|
146
|
-
- **A05:2021 Security Misconfiguration**: ✓ Secure defaults, explicit opt-in
|
|
147
|
-
- **A06:2021 Vulnerable Components**: ⚠️ No component version checking
|
|
148
|
-
- **A07:2021 Identification and Authentication**: N/A (handled elsewhere)
|
|
149
|
-
- **A08:2021 Software and Data Integrity**: ⚠️ No integrity verification
|
|
150
|
-
- **A09:2021 Security Logging**: ⚠️ Limited security event logging
|
|
151
|
-
- **A10:2021 SSRF**: ✓ Network access controls
|
|
152
|
-
|
|
153
|
-
## Conclusion
|
|
154
|
-
|
|
155
|
-
The claude-mpm validation system implements strong security controls through:
|
|
156
|
-
- Strict schema validation with type safety
|
|
157
|
-
- Resource limits preventing DoS attacks
|
|
158
|
-
- Access controls for tools and files
|
|
159
|
-
- Defense in depth with multiple validation layers
|
|
160
|
-
|
|
161
|
-
Key areas for improvement:
|
|
162
|
-
- Cryptographic signing of configurations
|
|
163
|
-
- Enhanced audit logging
|
|
164
|
-
- Runtime security monitoring
|
|
165
|
-
- Integrity verification
|
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema_version": "1.0.0",
|
|
3
|
-
"workflow_id": "standard_workflow",
|
|
4
|
-
"workflow_version": "1.0.0",
|
|
5
|
-
"metadata": {
|
|
6
|
-
"name": "Standard Ticket Workflow",
|
|
7
|
-
"description": "Default workflow for general ticket management with clear status-resolution separation",
|
|
8
|
-
"workflow_type": "standard",
|
|
9
|
-
"author": "Claude MPM Team",
|
|
10
|
-
"created_at": "2025-01-28T00:00:00Z",
|
|
11
|
-
"updated_at": "2025-01-28T00:00:00Z",
|
|
12
|
-
"tags": ["default", "general", "support"]
|
|
13
|
-
},
|
|
14
|
-
"status_states": {
|
|
15
|
-
"states": [
|
|
16
|
-
{
|
|
17
|
-
"id": "open",
|
|
18
|
-
"name": "Open",
|
|
19
|
-
"description": "Ticket has been created but not yet assigned or started",
|
|
20
|
-
"category": "initial",
|
|
21
|
-
"is_default": true,
|
|
22
|
-
"color": "#9E9E9E",
|
|
23
|
-
"icon": "circle-o",
|
|
24
|
-
"sla_hours": 24
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "in_progress",
|
|
28
|
-
"name": "In Progress",
|
|
29
|
-
"description": "Ticket is actively being worked on by an assignee",
|
|
30
|
-
"category": "active",
|
|
31
|
-
"color": "#2196F3",
|
|
32
|
-
"icon": "spinner",
|
|
33
|
-
"sla_hours": 48
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"id": "pending",
|
|
37
|
-
"name": "Pending",
|
|
38
|
-
"description": "Ticket is waiting for external input, dependencies, or customer response",
|
|
39
|
-
"category": "waiting",
|
|
40
|
-
"color": "#FF9800",
|
|
41
|
-
"icon": "clock-o"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"id": "resolved",
|
|
45
|
-
"name": "Resolved",
|
|
46
|
-
"description": "Work is complete and solution has been implemented",
|
|
47
|
-
"category": "terminal",
|
|
48
|
-
"color": "#4CAF50",
|
|
49
|
-
"icon": "check-circle"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"id": "closed",
|
|
53
|
-
"name": "Closed",
|
|
54
|
-
"description": "Ticket is closed and no further action is required",
|
|
55
|
-
"category": "terminal",
|
|
56
|
-
"color": "#607D8B",
|
|
57
|
-
"icon": "archive"
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"id": "reopened",
|
|
61
|
-
"name": "Reopened",
|
|
62
|
-
"description": "Previously closed ticket has been reopened for additional work",
|
|
63
|
-
"category": "active",
|
|
64
|
-
"color": "#9C27B0",
|
|
65
|
-
"icon": "refresh"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"id": "on_hold",
|
|
69
|
-
"name": "On Hold",
|
|
70
|
-
"description": "Work is temporarily suspended due to blockers or priorities",
|
|
71
|
-
"category": "waiting",
|
|
72
|
-
"color": "#795548",
|
|
73
|
-
"icon": "pause-circle"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"id": "escalated",
|
|
77
|
-
"name": "Escalated",
|
|
78
|
-
"description": "Ticket has been escalated to higher priority or management attention",
|
|
79
|
-
"category": "active",
|
|
80
|
-
"color": "#F44336",
|
|
81
|
-
"icon": "exclamation-triangle",
|
|
82
|
-
"sla_hours": 4
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"id": "canceled",
|
|
86
|
-
"name": "Canceled",
|
|
87
|
-
"description": "Ticket has been canceled before completion",
|
|
88
|
-
"category": "terminal",
|
|
89
|
-
"color": "#E91E63",
|
|
90
|
-
"icon": "times-circle"
|
|
91
|
-
}
|
|
92
|
-
],
|
|
93
|
-
"default_status": "open"
|
|
94
|
-
},
|
|
95
|
-
"resolution_types": {
|
|
96
|
-
"types": [
|
|
97
|
-
{
|
|
98
|
-
"id": "fixed",
|
|
99
|
-
"name": "Fixed/Resolved",
|
|
100
|
-
"description": "Issue was successfully fixed or request was fulfilled",
|
|
101
|
-
"category": "successful",
|
|
102
|
-
"requires_comment": false,
|
|
103
|
-
"color": "#4CAF50",
|
|
104
|
-
"icon": "check"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"id": "wont_fix",
|
|
108
|
-
"name": "Won't Fix",
|
|
109
|
-
"description": "Deliberate decision made not to address the issue",
|
|
110
|
-
"category": "unsuccessful",
|
|
111
|
-
"requires_comment": true,
|
|
112
|
-
"color": "#F44336",
|
|
113
|
-
"icon": "ban"
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"id": "duplicate",
|
|
117
|
-
"name": "Duplicate",
|
|
118
|
-
"description": "Issue is a duplicate of another existing ticket",
|
|
119
|
-
"category": "invalid",
|
|
120
|
-
"requires_comment": true,
|
|
121
|
-
"color": "#9E9E9E",
|
|
122
|
-
"icon": "copy"
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
"id": "cannot_reproduce",
|
|
126
|
-
"name": "Cannot Reproduce",
|
|
127
|
-
"description": "Issue cannot be reproduced or verified",
|
|
128
|
-
"category": "invalid",
|
|
129
|
-
"requires_comment": true,
|
|
130
|
-
"color": "#FF9800",
|
|
131
|
-
"icon": "question-circle"
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"id": "works_as_designed",
|
|
135
|
-
"name": "Works as Designed",
|
|
136
|
-
"description": "Reported behavior is intentional and not a bug",
|
|
137
|
-
"category": "invalid",
|
|
138
|
-
"requires_comment": false,
|
|
139
|
-
"color": "#3F51B5",
|
|
140
|
-
"icon": "info-circle"
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"id": "incomplete",
|
|
144
|
-
"name": "Incomplete",
|
|
145
|
-
"description": "Insufficient information provided to proceed",
|
|
146
|
-
"category": "unsuccessful",
|
|
147
|
-
"requires_comment": true,
|
|
148
|
-
"color": "#795548",
|
|
149
|
-
"icon": "file-text-o"
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
"id": "user_error",
|
|
153
|
-
"name": "User Error",
|
|
154
|
-
"description": "Issue was due to user error or misunderstanding",
|
|
155
|
-
"category": "invalid",
|
|
156
|
-
"requires_comment": true,
|
|
157
|
-
"color": "#607D8B",
|
|
158
|
-
"icon": "user-times"
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"id": "configuration",
|
|
162
|
-
"name": "Configuration",
|
|
163
|
-
"description": "Issue was resolved through configuration changes only",
|
|
164
|
-
"category": "successful",
|
|
165
|
-
"requires_comment": false,
|
|
166
|
-
"color": "#00BCD4",
|
|
167
|
-
"icon": "cog"
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
"id": "workaround",
|
|
171
|
-
"name": "Workaround",
|
|
172
|
-
"description": "A workaround has been provided as an alternative solution",
|
|
173
|
-
"category": "successful",
|
|
174
|
-
"requires_comment": true,
|
|
175
|
-
"color": "#CDDC39",
|
|
176
|
-
"icon": "lightbulb-o"
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
"id": "documentation",
|
|
180
|
-
"name": "Documentation",
|
|
181
|
-
"description": "Issue was resolved by updating or providing documentation",
|
|
182
|
-
"category": "successful",
|
|
183
|
-
"requires_comment": false,
|
|
184
|
-
"color": "#009688",
|
|
185
|
-
"icon": "book"
|
|
186
|
-
}
|
|
187
|
-
]
|
|
188
|
-
},
|
|
189
|
-
"transitions": {
|
|
190
|
-
"rules": [
|
|
191
|
-
{
|
|
192
|
-
"from_status": "open",
|
|
193
|
-
"to_status": "in_progress",
|
|
194
|
-
"name": "Start Work",
|
|
195
|
-
"description": "Begin working on the ticket",
|
|
196
|
-
"required_fields": ["assignee"],
|
|
197
|
-
"auto_assign": true
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
"from_status": "open",
|
|
201
|
-
"to_status": "escalated",
|
|
202
|
-
"name": "Escalate",
|
|
203
|
-
"description": "Escalate ticket for immediate attention",
|
|
204
|
-
"permissions": ["escalate_ticket"]
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"from_status": "open",
|
|
208
|
-
"to_status": "canceled",
|
|
209
|
-
"name": "Cancel",
|
|
210
|
-
"description": "Cancel ticket without starting work",
|
|
211
|
-
"required_fields": ["resolution"]
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
"from_status": "in_progress",
|
|
215
|
-
"to_status": "pending",
|
|
216
|
-
"name": "Wait for Input",
|
|
217
|
-
"description": "Pause work to wait for external input"
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
"from_status": "in_progress",
|
|
221
|
-
"to_status": "on_hold",
|
|
222
|
-
"name": "Put on Hold",
|
|
223
|
-
"description": "Temporarily suspend work"
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
"from_status": "in_progress",
|
|
227
|
-
"to_status": "resolved",
|
|
228
|
-
"name": "Resolve",
|
|
229
|
-
"description": "Mark work as complete",
|
|
230
|
-
"required_fields": ["resolution"]
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
"from_status": "in_progress",
|
|
234
|
-
"to_status": "escalated",
|
|
235
|
-
"name": "Escalate",
|
|
236
|
-
"description": "Escalate active ticket",
|
|
237
|
-
"permissions": ["escalate_ticket"]
|
|
238
|
-
},
|
|
239
|
-
{
|
|
240
|
-
"from_status": "pending",
|
|
241
|
-
"to_status": "in_progress",
|
|
242
|
-
"name": "Resume Work",
|
|
243
|
-
"description": "Resume work after receiving input"
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
"from_status": "on_hold",
|
|
247
|
-
"to_status": "in_progress",
|
|
248
|
-
"name": "Resume Work",
|
|
249
|
-
"description": "Resume work from hold status"
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
"from_status": "resolved",
|
|
253
|
-
"to_status": "closed",
|
|
254
|
-
"name": "Close",
|
|
255
|
-
"description": "Close resolved ticket"
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
"from_status": "resolved",
|
|
259
|
-
"to_status": "reopened",
|
|
260
|
-
"name": "Reopen",
|
|
261
|
-
"description": "Reopen resolved ticket for additional work"
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
"from_status": "closed",
|
|
265
|
-
"to_status": "reopened",
|
|
266
|
-
"name": "Reopen",
|
|
267
|
-
"description": "Reopen closed ticket",
|
|
268
|
-
"permissions": ["reopen_ticket"]
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
"from_status": "reopened",
|
|
272
|
-
"to_status": "in_progress",
|
|
273
|
-
"name": "Start Rework",
|
|
274
|
-
"description": "Begin working on reopened ticket",
|
|
275
|
-
"required_fields": ["assignee"]
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"from_status": "escalated",
|
|
279
|
-
"to_status": "in_progress",
|
|
280
|
-
"name": "De-escalate",
|
|
281
|
-
"description": "Return to normal priority",
|
|
282
|
-
"permissions": ["escalate_ticket"]
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
"from_status": "escalated",
|
|
286
|
-
"to_status": "resolved",
|
|
287
|
-
"name": "Resolve",
|
|
288
|
-
"description": "Resolve escalated ticket",
|
|
289
|
-
"required_fields": ["resolution"]
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"from_status": "*",
|
|
293
|
-
"to_status": "canceled",
|
|
294
|
-
"name": "Force Cancel",
|
|
295
|
-
"description": "Cancel ticket from any state",
|
|
296
|
-
"permissions": ["admin_ticket"],
|
|
297
|
-
"required_fields": ["resolution"]
|
|
298
|
-
}
|
|
299
|
-
],
|
|
300
|
-
"allow_self_transitions": false
|
|
301
|
-
},
|
|
302
|
-
"status_resolution_mapping": {
|
|
303
|
-
"mappings": [
|
|
304
|
-
{
|
|
305
|
-
"status_id": "resolved",
|
|
306
|
-
"allowed_resolutions": [
|
|
307
|
-
"fixed",
|
|
308
|
-
"configuration",
|
|
309
|
-
"workaround",
|
|
310
|
-
"documentation"
|
|
311
|
-
],
|
|
312
|
-
"requires_resolution": true,
|
|
313
|
-
"default_resolution": "fixed"
|
|
314
|
-
},
|
|
315
|
-
{
|
|
316
|
-
"status_id": "closed",
|
|
317
|
-
"allowed_resolutions": [
|
|
318
|
-
"fixed",
|
|
319
|
-
"wont_fix",
|
|
320
|
-
"duplicate",
|
|
321
|
-
"cannot_reproduce",
|
|
322
|
-
"works_as_designed",
|
|
323
|
-
"incomplete",
|
|
324
|
-
"user_error",
|
|
325
|
-
"configuration",
|
|
326
|
-
"workaround",
|
|
327
|
-
"documentation"
|
|
328
|
-
],
|
|
329
|
-
"requires_resolution": true
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
"status_id": "canceled",
|
|
333
|
-
"allowed_resolutions": [
|
|
334
|
-
"duplicate",
|
|
335
|
-
"wont_fix",
|
|
336
|
-
"incomplete",
|
|
337
|
-
"user_error",
|
|
338
|
-
"works_as_designed"
|
|
339
|
-
],
|
|
340
|
-
"requires_resolution": true,
|
|
341
|
-
"default_resolution": "wont_fix"
|
|
342
|
-
},
|
|
343
|
-
{
|
|
344
|
-
"status_id": "open",
|
|
345
|
-
"allowed_resolutions": [],
|
|
346
|
-
"requires_resolution": false
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
"status_id": "in_progress",
|
|
350
|
-
"allowed_resolutions": [],
|
|
351
|
-
"requires_resolution": false
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
"status_id": "pending",
|
|
355
|
-
"allowed_resolutions": [],
|
|
356
|
-
"requires_resolution": false
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
"status_id": "on_hold",
|
|
360
|
-
"allowed_resolutions": [],
|
|
361
|
-
"requires_resolution": false
|
|
362
|
-
},
|
|
363
|
-
{
|
|
364
|
-
"status_id": "escalated",
|
|
365
|
-
"allowed_resolutions": [],
|
|
366
|
-
"requires_resolution": false
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
"status_id": "reopened",
|
|
370
|
-
"allowed_resolutions": [],
|
|
371
|
-
"requires_resolution": false
|
|
372
|
-
}
|
|
373
|
-
]
|
|
374
|
-
},
|
|
375
|
-
"business_rules": {
|
|
376
|
-
"auto_close": {
|
|
377
|
-
"enabled": true,
|
|
378
|
-
"days_after_resolved": 7,
|
|
379
|
-
"excluded_resolutions": ["workaround"]
|
|
380
|
-
},
|
|
381
|
-
"reopen_rules": {
|
|
382
|
-
"allow_reopen": true,
|
|
383
|
-
"from_statuses": ["resolved", "closed"],
|
|
384
|
-
"max_reopen_count": 3,
|
|
385
|
-
"reopen_window_days": 30
|
|
386
|
-
},
|
|
387
|
-
"escalation_rules": [
|
|
388
|
-
{
|
|
389
|
-
"name": "High Priority SLA",
|
|
390
|
-
"condition": {
|
|
391
|
-
"status": "open",
|
|
392
|
-
"hours_in_status": 4,
|
|
393
|
-
"priority": "high"
|
|
394
|
-
},
|
|
395
|
-
"action": {
|
|
396
|
-
"change_status": "escalated",
|
|
397
|
-
"notify": ["manager", "on_call"]
|
|
398
|
-
}
|
|
399
|
-
},
|
|
400
|
-
{
|
|
401
|
-
"name": "Critical Priority SLA",
|
|
402
|
-
"condition": {
|
|
403
|
-
"status": "open",
|
|
404
|
-
"hours_in_status": 1,
|
|
405
|
-
"priority": "critical"
|
|
406
|
-
},
|
|
407
|
-
"action": {
|
|
408
|
-
"change_status": "escalated",
|
|
409
|
-
"change_priority": "critical",
|
|
410
|
-
"notify": ["director", "manager", "on_call"]
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
"name": "Stale In Progress",
|
|
415
|
-
"condition": {
|
|
416
|
-
"status": "in_progress",
|
|
417
|
-
"hours_in_status": 168
|
|
418
|
-
},
|
|
419
|
-
"action": {
|
|
420
|
-
"notify": ["assignee", "manager"]
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
]
|
|
424
|
-
},
|
|
425
|
-
"ui_configuration": {
|
|
426
|
-
"status_display_order": [
|
|
427
|
-
"open",
|
|
428
|
-
"in_progress",
|
|
429
|
-
"pending",
|
|
430
|
-
"on_hold",
|
|
431
|
-
"escalated",
|
|
432
|
-
"reopened",
|
|
433
|
-
"resolved",
|
|
434
|
-
"closed",
|
|
435
|
-
"canceled"
|
|
436
|
-
],
|
|
437
|
-
"resolution_display_order": [
|
|
438
|
-
"fixed",
|
|
439
|
-
"configuration",
|
|
440
|
-
"workaround",
|
|
441
|
-
"documentation",
|
|
442
|
-
"duplicate",
|
|
443
|
-
"cannot_reproduce",
|
|
444
|
-
"works_as_designed",
|
|
445
|
-
"user_error",
|
|
446
|
-
"incomplete",
|
|
447
|
-
"wont_fix"
|
|
448
|
-
],
|
|
449
|
-
"quick_transitions": [
|
|
450
|
-
{
|
|
451
|
-
"from_status": "open",
|
|
452
|
-
"to_status": "in_progress",
|
|
453
|
-
"button_label": "Start Work",
|
|
454
|
-
"button_style": "primary"
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
"from_status": "in_progress",
|
|
458
|
-
"to_status": "resolved",
|
|
459
|
-
"button_label": "Resolve",
|
|
460
|
-
"button_style": "success"
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
"from_status": "in_progress",
|
|
464
|
-
"to_status": "pending",
|
|
465
|
-
"button_label": "Wait for Input",
|
|
466
|
-
"button_style": "warning"
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
"from_status": "resolved",
|
|
470
|
-
"to_status": "closed",
|
|
471
|
-
"button_label": "Close",
|
|
472
|
-
"button_style": "secondary"
|
|
473
|
-
},
|
|
474
|
-
{
|
|
475
|
-
"from_status": "resolved",
|
|
476
|
-
"to_status": "reopened",
|
|
477
|
-
"button_label": "Reopen",
|
|
478
|
-
"button_style": "danger"
|
|
479
|
-
}
|
|
480
|
-
]
|
|
481
|
-
},
|
|
482
|
-
"metrics": {
|
|
483
|
-
"cycle_time_statuses": {
|
|
484
|
-
"start": ["in_progress", "reopened"],
|
|
485
|
-
"end": ["resolved", "closed", "canceled"]
|
|
486
|
-
},
|
|
487
|
-
"resolution_metrics": [
|
|
488
|
-
{
|
|
489
|
-
"name": "Success Rate",
|
|
490
|
-
"resolution_ids": ["fixed", "configuration", "workaround", "documentation"],
|
|
491
|
-
"metric_type": "success_rate"
|
|
492
|
-
},
|
|
493
|
-
{
|
|
494
|
-
"name": "Invalid Rate",
|
|
495
|
-
"resolution_ids": ["duplicate", "cannot_reproduce", "works_as_designed", "user_error"],
|
|
496
|
-
"metric_type": "invalid_rate"
|
|
497
|
-
},
|
|
498
|
-
{
|
|
499
|
-
"name": "Incomplete Rate",
|
|
500
|
-
"resolution_ids": ["incomplete", "wont_fix"],
|
|
501
|
-
"metric_type": "incomplete_rate"
|
|
502
|
-
}
|
|
503
|
-
]
|
|
504
|
-
}
|
|
505
|
-
}
|