claude-mpm 3.4.2__py3-none-any.whl → 3.4.5__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/agents/INSTRUCTIONS.md +20 -3
- claude_mpm/agents/backups/INSTRUCTIONS.md +119 -5
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/cli/__init__.py +3 -1
- claude_mpm/cli/commands/__init__.py +3 -1
- claude_mpm/cli/commands/monitor.py +328 -0
- claude_mpm/cli/commands/run.py +9 -17
- claude_mpm/cli/parser.py +69 -1
- claude_mpm/constants.py +9 -0
- claude_mpm/services/memory_router.py +99 -6
- claude_mpm/ticket_wrapper.py +29 -0
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/METADATA +1 -1
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/RECORD +17 -24
- claude_mpm/scripts/__init__.py +0 -1
- claude_mpm/scripts/claude-mpm-socketio +0 -32
- claude_mpm/scripts/claude_mpm_monitor.html +0 -567
- claude_mpm/scripts/install_socketio_server.py +0 -407
- claude_mpm/scripts/launch_monitor.py +0 -132
- claude_mpm/scripts/launch_socketio_dashboard.py +0 -261
- claude_mpm/scripts/manage_version.py +0 -479
- claude_mpm/scripts/socketio_daemon.py +0 -221
- claude_mpm/scripts/socketio_server_manager.py +0 -753
- claude_mpm/scripts/ticket.py +0 -269
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.4.2.dist-info → claude_mpm-3.4.5.dist-info}/top_level.txt +0 -0
claude_mpm/scripts/ticket.py
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Ticket Management Wrapper for ai-trackdown
|
|
4
|
-
|
|
5
|
-
A simplified interface for creating and managing tickets using ai-trackdown-pytools.
|
|
6
|
-
This wrapper provides an intuitive CLI that aliases ai-trackdown commands.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
ticket create <title> [options]
|
|
10
|
-
ticket list [options]
|
|
11
|
-
ticket view <id>
|
|
12
|
-
ticket update <id> [options]
|
|
13
|
-
ticket close <id>
|
|
14
|
-
ticket help
|
|
15
|
-
|
|
16
|
-
Examples:
|
|
17
|
-
ticket create "Fix login bug" -t bug -p high
|
|
18
|
-
ticket create "Add dark mode feature" -t feature -d "Users want dark mode support"
|
|
19
|
-
ticket list --limit 10
|
|
20
|
-
ticket view TSK-0001
|
|
21
|
-
ticket update TSK-0001 -s in_progress
|
|
22
|
-
ticket close TSK-0001
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
import sys
|
|
26
|
-
import argparse
|
|
27
|
-
from pathlib import Path
|
|
28
|
-
from typing import Optional, List
|
|
29
|
-
import subprocess
|
|
30
|
-
|
|
31
|
-
from claude_mpm.services.ticket_manager import TicketManager
|
|
32
|
-
from claude_mpm.core.logger import get_logger
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class TicketCLI:
|
|
36
|
-
"""CLI wrapper for ticket management."""
|
|
37
|
-
|
|
38
|
-
def __init__(self):
|
|
39
|
-
self.logger = get_logger("ticket_cli")
|
|
40
|
-
self.ticket_manager = TicketManager()
|
|
41
|
-
|
|
42
|
-
def create(self, args):
|
|
43
|
-
"""Create a new ticket."""
|
|
44
|
-
# Parse description from remaining args or use default
|
|
45
|
-
description = " ".join(args.description) if args.description else ""
|
|
46
|
-
|
|
47
|
-
# Parse tags
|
|
48
|
-
tags = args.tags.split(",") if args.tags else []
|
|
49
|
-
|
|
50
|
-
# Create ticket
|
|
51
|
-
ticket_id = self.ticket_manager.create_ticket(
|
|
52
|
-
title=args.title,
|
|
53
|
-
ticket_type=args.type,
|
|
54
|
-
description=description,
|
|
55
|
-
priority=args.priority,
|
|
56
|
-
tags=tags,
|
|
57
|
-
source="ticket-cli"
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
if ticket_id:
|
|
61
|
-
print(f"✅ Created ticket: {ticket_id}")
|
|
62
|
-
if args.verbose:
|
|
63
|
-
print(f" Type: {args.type}")
|
|
64
|
-
print(f" Priority: {args.priority}")
|
|
65
|
-
if tags:
|
|
66
|
-
print(f" Tags: {', '.join(tags)}")
|
|
67
|
-
else:
|
|
68
|
-
print("❌ Failed to create ticket")
|
|
69
|
-
sys.exit(1)
|
|
70
|
-
|
|
71
|
-
def list(self, args):
|
|
72
|
-
"""List recent tickets."""
|
|
73
|
-
tickets = self.ticket_manager.list_recent_tickets(limit=args.limit)
|
|
74
|
-
|
|
75
|
-
if not tickets:
|
|
76
|
-
print("No tickets found.")
|
|
77
|
-
return
|
|
78
|
-
|
|
79
|
-
print(f"Recent tickets (showing {len(tickets)}):")
|
|
80
|
-
print("-" * 80)
|
|
81
|
-
|
|
82
|
-
for ticket in tickets:
|
|
83
|
-
status_emoji = "🔵" if ticket['status'] == 'open' else "✅"
|
|
84
|
-
print(f"{status_emoji} [{ticket['id']}] {ticket['title']}")
|
|
85
|
-
|
|
86
|
-
if args.verbose:
|
|
87
|
-
print(f" Status: {ticket['status']} | Priority: {ticket['priority']}")
|
|
88
|
-
if ticket.get('tags'):
|
|
89
|
-
print(f" Tags: {', '.join(ticket['tags'])}")
|
|
90
|
-
print(f" Created: {ticket['created_at']}")
|
|
91
|
-
print()
|
|
92
|
-
|
|
93
|
-
def view(self, args):
|
|
94
|
-
"""View a specific ticket."""
|
|
95
|
-
ticket = self.ticket_manager.get_ticket(args.id)
|
|
96
|
-
|
|
97
|
-
if not ticket:
|
|
98
|
-
print(f"❌ Ticket {args.id} not found")
|
|
99
|
-
sys.exit(1)
|
|
100
|
-
|
|
101
|
-
print(f"Ticket: {ticket['id']}")
|
|
102
|
-
print("=" * 80)
|
|
103
|
-
print(f"Title: {ticket['title']}")
|
|
104
|
-
print(f"Type: {ticket.get('metadata', {}).get('ticket_type', 'unknown')}")
|
|
105
|
-
print(f"Status: {ticket['status']}")
|
|
106
|
-
print(f"Priority: {ticket['priority']}")
|
|
107
|
-
|
|
108
|
-
if ticket.get('tags'):
|
|
109
|
-
print(f"Tags: {', '.join(ticket['tags'])}")
|
|
110
|
-
|
|
111
|
-
if ticket.get('assignees'):
|
|
112
|
-
print(f"Assignees: {', '.join(ticket['assignees'])}")
|
|
113
|
-
|
|
114
|
-
print(f"\nDescription:")
|
|
115
|
-
print("-" * 40)
|
|
116
|
-
print(ticket.get('description', 'No description'))
|
|
117
|
-
|
|
118
|
-
print(f"\nCreated: {ticket['created_at']}")
|
|
119
|
-
print(f"Updated: {ticket['updated_at']}")
|
|
120
|
-
|
|
121
|
-
if args.verbose and ticket.get('metadata'):
|
|
122
|
-
print(f"\nMetadata:")
|
|
123
|
-
print("-" * 40)
|
|
124
|
-
for key, value in ticket['metadata'].items():
|
|
125
|
-
print(f" {key}: {value}")
|
|
126
|
-
|
|
127
|
-
def update(self, args):
|
|
128
|
-
"""Update a ticket (using ai-trackdown directly)."""
|
|
129
|
-
# For update operations, delegate to ai-trackdown CLI
|
|
130
|
-
cmd = ["ai-trackdown", "update", args.id]
|
|
131
|
-
|
|
132
|
-
if args.status:
|
|
133
|
-
cmd.extend(["--status", args.status])
|
|
134
|
-
if args.priority:
|
|
135
|
-
cmd.extend(["--priority", args.priority])
|
|
136
|
-
if args.assign:
|
|
137
|
-
cmd.extend(["--assign", args.assign])
|
|
138
|
-
if args.tags:
|
|
139
|
-
cmd.extend(["--tags", args.tags])
|
|
140
|
-
|
|
141
|
-
try:
|
|
142
|
-
subprocess.run(cmd, check=True)
|
|
143
|
-
print(f"✅ Updated ticket: {args.id}")
|
|
144
|
-
except subprocess.CalledProcessError:
|
|
145
|
-
print(f"❌ Failed to update ticket: {args.id}")
|
|
146
|
-
sys.exit(1)
|
|
147
|
-
|
|
148
|
-
def close(self, args):
|
|
149
|
-
"""Close a ticket."""
|
|
150
|
-
# Use update with status=closed
|
|
151
|
-
cmd = ["ai-trackdown", "update", args.id, "--status", "closed"]
|
|
152
|
-
|
|
153
|
-
try:
|
|
154
|
-
subprocess.run(cmd, check=True)
|
|
155
|
-
print(f"✅ Closed ticket: {args.id}")
|
|
156
|
-
except subprocess.CalledProcessError:
|
|
157
|
-
print(f"❌ Failed to close ticket: {args.id}")
|
|
158
|
-
sys.exit(1)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def main():
|
|
162
|
-
"""Main CLI entry point."""
|
|
163
|
-
parser = argparse.ArgumentParser(
|
|
164
|
-
description="Simplified ticket management for ai-trackdown",
|
|
165
|
-
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
166
|
-
epilog="""
|
|
167
|
-
Examples:
|
|
168
|
-
ticket create "Fix login bug" -t bug -p high
|
|
169
|
-
ticket create "Add feature" -t feature -d "Detailed description here"
|
|
170
|
-
ticket list
|
|
171
|
-
ticket list -v --limit 20
|
|
172
|
-
ticket view TSK-0001
|
|
173
|
-
ticket update TSK-0001 -s in_progress
|
|
174
|
-
ticket close TSK-0001
|
|
175
|
-
|
|
176
|
-
Ticket Types:
|
|
177
|
-
task - General task (default)
|
|
178
|
-
bug - Bug report
|
|
179
|
-
feature - Feature request
|
|
180
|
-
issue - General issue
|
|
181
|
-
|
|
182
|
-
Priority Levels:
|
|
183
|
-
low, medium (default), high, critical
|
|
184
|
-
"""
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
subparsers = parser.add_subparsers(dest='command', help='Available commands')
|
|
188
|
-
|
|
189
|
-
# Create command
|
|
190
|
-
create_parser = subparsers.add_parser('create', help='Create a new ticket')
|
|
191
|
-
create_parser.add_argument('title', help='Ticket title')
|
|
192
|
-
create_parser.add_argument('-t', '--type', default='task',
|
|
193
|
-
choices=['task', 'bug', 'feature', 'issue'],
|
|
194
|
-
help='Ticket type (default: task)')
|
|
195
|
-
create_parser.add_argument('-p', '--priority', default='medium',
|
|
196
|
-
choices=['low', 'medium', 'high', 'critical'],
|
|
197
|
-
help='Priority level (default: medium)')
|
|
198
|
-
create_parser.add_argument('-d', '--description', nargs='*',
|
|
199
|
-
help='Ticket description')
|
|
200
|
-
create_parser.add_argument('--tags', help='Comma-separated tags')
|
|
201
|
-
create_parser.add_argument('-v', '--verbose', action='store_true',
|
|
202
|
-
help='Verbose output')
|
|
203
|
-
|
|
204
|
-
# List command
|
|
205
|
-
list_parser = subparsers.add_parser('list', help='List recent tickets')
|
|
206
|
-
list_parser.add_argument('--limit', type=int, default=10,
|
|
207
|
-
help='Number of tickets to show (default: 10)')
|
|
208
|
-
list_parser.add_argument('-v', '--verbose', action='store_true',
|
|
209
|
-
help='Show detailed ticket information')
|
|
210
|
-
|
|
211
|
-
# View command
|
|
212
|
-
view_parser = subparsers.add_parser('view', help='View a specific ticket')
|
|
213
|
-
view_parser.add_argument('id', help='Ticket ID (e.g., TSK-0001)')
|
|
214
|
-
view_parser.add_argument('-v', '--verbose', action='store_true',
|
|
215
|
-
help='Show metadata')
|
|
216
|
-
|
|
217
|
-
# Update command
|
|
218
|
-
update_parser = subparsers.add_parser('update', help='Update a ticket')
|
|
219
|
-
update_parser.add_argument('id', help='Ticket ID')
|
|
220
|
-
update_parser.add_argument('-s', '--status',
|
|
221
|
-
choices=['open', 'in_progress', 'closed', 'on_hold'],
|
|
222
|
-
help='Update status')
|
|
223
|
-
update_parser.add_argument('-p', '--priority',
|
|
224
|
-
choices=['low', 'medium', 'high', 'critical'],
|
|
225
|
-
help='Update priority')
|
|
226
|
-
update_parser.add_argument('-a', '--assign', help='Assign to user')
|
|
227
|
-
update_parser.add_argument('--tags', help='Update tags (comma-separated)')
|
|
228
|
-
|
|
229
|
-
# Close command
|
|
230
|
-
close_parser = subparsers.add_parser('close', help='Close a ticket')
|
|
231
|
-
close_parser.add_argument('id', help='Ticket ID')
|
|
232
|
-
|
|
233
|
-
# Help command
|
|
234
|
-
help_parser = subparsers.add_parser('help', help='Show this help message')
|
|
235
|
-
|
|
236
|
-
# Parse arguments
|
|
237
|
-
args = parser.parse_args()
|
|
238
|
-
|
|
239
|
-
# Show help if no command
|
|
240
|
-
if not args.command or args.command == 'help':
|
|
241
|
-
parser.print_help()
|
|
242
|
-
return 0
|
|
243
|
-
|
|
244
|
-
# Execute command
|
|
245
|
-
cli = TicketCLI()
|
|
246
|
-
|
|
247
|
-
try:
|
|
248
|
-
if args.command == 'create':
|
|
249
|
-
cli.create(args)
|
|
250
|
-
elif args.command == 'list':
|
|
251
|
-
cli.list(args)
|
|
252
|
-
elif args.command == 'view':
|
|
253
|
-
cli.view(args)
|
|
254
|
-
elif args.command == 'update':
|
|
255
|
-
cli.update(args)
|
|
256
|
-
elif args.command == 'close':
|
|
257
|
-
cli.close(args)
|
|
258
|
-
except KeyboardInterrupt:
|
|
259
|
-
print("\nOperation cancelled.")
|
|
260
|
-
return 1
|
|
261
|
-
except Exception as e:
|
|
262
|
-
print(f"❌ Error: {e}")
|
|
263
|
-
return 1
|
|
264
|
-
|
|
265
|
-
return 0
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
if __name__ == "__main__":
|
|
269
|
-
sys.exit(main())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|