claude-mpm 3.4.3__py3-none-any.whl → 3.4.6__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.
@@ -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())