@proletariat/cli 0.3.98 → 0.3.100

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 (48) hide show
  1. package/dist/commands/orchestrate/index.js +30 -3
  2. package/dist/commands/orchestrate/index.js.map +1 -1
  3. package/dist/commands/qa/index.js +1 -1
  4. package/dist/commands/ticket/create.d.ts +44 -0
  5. package/dist/commands/ticket/create.js +754 -0
  6. package/dist/commands/ticket/create.js.map +1 -0
  7. package/dist/commands/ticket/delete.d.ts +17 -0
  8. package/dist/commands/ticket/delete.js +204 -0
  9. package/dist/commands/ticket/delete.js.map +1 -0
  10. package/dist/commands/ticket/edit.d.ts +28 -0
  11. package/dist/commands/ticket/edit.js +402 -0
  12. package/dist/commands/ticket/edit.js.map +1 -0
  13. package/dist/commands/ticket/index.d.ts +13 -0
  14. package/dist/commands/ticket/index.js +74 -0
  15. package/dist/commands/ticket/index.js.map +1 -0
  16. package/dist/commands/ticket/list.d.ts +33 -0
  17. package/dist/commands/ticket/list.js +519 -0
  18. package/dist/commands/ticket/list.js.map +1 -0
  19. package/dist/commands/ticket/move.d.ts +27 -0
  20. package/dist/commands/ticket/move.js +413 -0
  21. package/dist/commands/ticket/move.js.map +1 -0
  22. package/dist/commands/ticket/show.d.ts +14 -0
  23. package/dist/commands/ticket/show.js +110 -0
  24. package/dist/commands/ticket/show.js.map +1 -0
  25. package/dist/commands/ticket/update.d.ts +28 -0
  26. package/dist/commands/ticket/update.js +458 -0
  27. package/dist/commands/ticket/update.js.map +1 -0
  28. package/dist/lib/execution/preflight.js +1 -1
  29. package/dist/lib/execution/preflight.js.map +1 -1
  30. package/dist/lib/mcp/tools/action.d.ts +6 -0
  31. package/dist/lib/mcp/tools/action.js +123 -0
  32. package/dist/lib/mcp/tools/action.js.map +1 -0
  33. package/dist/lib/mcp/tools/index.d.ts +2 -0
  34. package/dist/lib/mcp/tools/index.js +2 -0
  35. package/dist/lib/mcp/tools/index.js.map +1 -1
  36. package/dist/lib/mcp/tools/ticket.d.ts +6 -0
  37. package/dist/lib/mcp/tools/ticket.js +464 -0
  38. package/dist/lib/mcp/tools/ticket.js.map +1 -0
  39. package/dist/lib/orchestrate/poller.d.ts +22 -0
  40. package/dist/lib/orchestrate/poller.js +109 -0
  41. package/dist/lib/orchestrate/poller.js.map +1 -1
  42. package/dist/lib/sync/engine.js +47 -5
  43. package/dist/lib/sync/engine.js.map +1 -1
  44. package/dist/lib/sync/reconciler.d.ts +27 -1
  45. package/dist/lib/sync/reconciler.js +109 -1
  46. package/dist/lib/sync/reconciler.js.map +1 -1
  47. package/oclif.manifest.json +2021 -1153
  48. package/package.json +1 -1
@@ -0,0 +1,402 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { autoExportToBoard, PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { getWorkspacePriorities } from '../../lib/work-lifecycle/settings.js';
5
+ import { styles } from '../../lib/styles.js';
6
+ import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
7
+ import { multiLineInput } from '../../lib/multiline-input.js';
8
+ export default class TicketEdit extends PMOCommand {
9
+ static description = 'Edit an existing ticket';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %> TICK-001',
12
+ '<%= config.bin %> <%= command.id %> TICK-001 --title "New title"',
13
+ '<%= config.bin %> <%= command.id %> TICK-001 --priority P1 --category bug',
14
+ '<%= config.bin %> <%= command.id %> TICK-001 --add-subtask "Implement feature" --add-subtask "Write tests"',
15
+ '<%= config.bin %> <%= command.id %> TICK-001 --owner "john" --assignee "agent-1"',
16
+ '<%= config.bin %> <%= command.id %> # Interactive mode',
17
+ ];
18
+ static args = {
19
+ ticketId: Args.string({
20
+ description: 'Ticket ID to edit - prompts with dropdown if not provided',
21
+ required: false,
22
+ }),
23
+ };
24
+ static flags = {
25
+ ...pmoBaseFlags,
26
+ title: Flags.string({
27
+ char: 't',
28
+ description: 'New ticket title',
29
+ }),
30
+ description: Flags.string({
31
+ char: 'd',
32
+ description: 'New ticket description',
33
+ }),
34
+ priority: Flags.string({
35
+ char: 'p',
36
+ description: 'New ticket priority (uses workspace priority scale, "none" to clear)',
37
+ }),
38
+ category: Flags.string({
39
+ description: 'New ticket category',
40
+ }),
41
+ owner: Flags.string({
42
+ char: 'o',
43
+ description: 'Ticket owner (human responsible)',
44
+ }),
45
+ assignee: Flags.string({
46
+ char: 'a',
47
+ description: 'Ticket assignee (who executes)',
48
+ }),
49
+ 'add-subtask': Flags.string({
50
+ description: 'Add a subtask (can be used multiple times)',
51
+ multiple: true,
52
+ }),
53
+ 'clear-subtasks': Flags.boolean({
54
+ description: 'Clear all existing subtasks before adding new ones',
55
+ default: false,
56
+ }),
57
+ 'add-label': Flags.string({
58
+ description: 'Add a label (can be used multiple times)',
59
+ multiple: true,
60
+ }),
61
+ 'remove-label': Flags.string({
62
+ description: 'Remove a label',
63
+ multiple: true,
64
+ }),
65
+ 'add-ac': Flags.string({
66
+ description: 'Add an acceptance criterion (can be used multiple times)',
67
+ multiple: true,
68
+ }),
69
+ 'clear-ac': Flags.boolean({
70
+ description: 'Clear all existing acceptance criteria before adding new ones',
71
+ default: false,
72
+ }),
73
+ interactive: Flags.boolean({
74
+ char: 'i',
75
+ description: 'Interactive mode - prompts for all fields',
76
+ default: false,
77
+ }),
78
+ };
79
+ async execute() {
80
+ const { args, flags } = await this.parse(TicketEdit);
81
+ const projectId = flags.project;
82
+ // Check if JSON output mode is active
83
+ const jsonMode = shouldOutputJson(flags);
84
+ // Helper to handle errors in JSON mode
85
+ const handleError = (code, message) => {
86
+ if (jsonMode) {
87
+ outputErrorAsJson(code, message, createMetadata('ticket edit', flags));
88
+ return;
89
+ }
90
+ this.error(message);
91
+ };
92
+ // Get ticketId - prompt if not provided
93
+ let ticketId = args.ticketId;
94
+ if (!ticketId) {
95
+ // Get all tickets for selection via provider
96
+ const listProvider = this.resolveProjectProvider(projectId || '');
97
+ const listResult = await listProvider.listTickets(projectId);
98
+ const allTickets = listResult.success ? listResult.tickets : [];
99
+ if (allTickets.length === 0) {
100
+ return handleError('NO_TICKETS', 'No tickets found. Create a ticket first with "prlt ticket create".');
101
+ }
102
+ // Use helper for ticket selection (handles JSON mode automatically)
103
+ const selected = await this.selectFromList({
104
+ message: 'Select ticket to edit:',
105
+ items: allTickets,
106
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
107
+ getValue: (t) => t.id,
108
+ getCommand: (t) => `prlt ticket edit ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
109
+ jsonMode: jsonMode ? { flags, commandName: 'ticket edit' } : null,
110
+ });
111
+ if (!selected) {
112
+ return; // Cancelled or JSON mode (already exited)
113
+ }
114
+ ticketId = selected;
115
+ }
116
+ // Get current ticket through provider
117
+ const ticketProvider = await this.resolveTicketProvider(ticketId, projectId || '');
118
+ const getResult = await ticketProvider.getTicket(ticketId);
119
+ if (!getResult.success || !getResult.ticket) {
120
+ return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
121
+ }
122
+ const ticket = getResult.ticket;
123
+ // Use resolved internal ID for all subsequent operations (external keys like PRLT-xxx resolve to TKT-xxx)
124
+ ticketId = ticket.id;
125
+ // Determine what to update
126
+ let updates = {};
127
+ const hasFlags = flags.title || flags.description || flags.priority || flags.category ||
128
+ flags.owner || flags.assignee || flags['add-subtask'] || flags['clear-subtasks'] ||
129
+ flags['add-label'] || flags['remove-label'] || flags['add-ac'] || flags['clear-ac'];
130
+ if (flags.interactive || !hasFlags) {
131
+ // In JSON mode without flags, output a form prompt instead of interactive prompts
132
+ if (jsonMode) {
133
+ const { outputPromptAsJson, buildFormPromptConfig } = await import('../../lib/prompt-json.js');
134
+ const db = this.storage.getDatabase();
135
+ const workspacePriorities = getWorkspacePriorities(db);
136
+ const formConfig = buildFormPromptConfig([
137
+ { type: 'input', name: 'title', message: 'Title:', default: ticket.title },
138
+ { type: 'multiline', name: 'description', message: 'Description:', default: ticket.description || '' },
139
+ { type: 'list', name: 'priority', message: 'Priority:', choices: [
140
+ { name: 'None', value: '' },
141
+ ...workspacePriorities.map(p => ({ name: p, value: p })),
142
+ ], default: ticket.priority || '' },
143
+ { type: 'input', name: 'category', message: 'Category:', default: ticket.category || '' },
144
+ ]);
145
+ formConfig.context = {
146
+ hint: `Edit ticket with: prlt ticket edit ${ticketId} --title "..." --description "..." --priority P0 --json`,
147
+ ticketId,
148
+ currentValues: { title: ticket.title, description: ticket.description, priority: ticket.priority, category: ticket.category },
149
+ };
150
+ outputPromptAsJson(formConfig, createMetadata('ticket edit', flags));
151
+ return;
152
+ }
153
+ // Interactive mode - prompt for all editable fields
154
+ const board = ticket.projectId ? await this.storage.getProjectBoard(ticket.projectId) : null;
155
+ const columns = board ? board.columns.map(col => col.name) : [];
156
+ updates = await this.promptForEdits(ticket, columns);
157
+ }
158
+ else {
159
+ // Use flag values
160
+ if (flags.title)
161
+ updates.title = flags.title;
162
+ if (flags.description)
163
+ updates.description = flags.description;
164
+ if (flags.priority) {
165
+ // 'none' clears the priority (sets to null in database), otherwise use the flag value
166
+ // Type assertion needed because Ticket interface uses string | undefined, but storage accepts null
167
+ updates.priority = flags.priority === 'none' ? null : flags.priority;
168
+ }
169
+ if (flags.category)
170
+ updates.category = flags.category;
171
+ if (flags.owner)
172
+ updates.owner = flags.owner;
173
+ if (flags.assignee)
174
+ updates.assignee = flags.assignee;
175
+ }
176
+ // Handle subtasks - sequential for consistent ordering
177
+ let subtasksChanged = false;
178
+ if (flags['clear-subtasks']) {
179
+ // Clear all subtasks first - get from ticket object
180
+ for (const subtask of ticket.subtasks) {
181
+ // eslint-disable-next-line no-await-in-loop
182
+ await this.storage.removeSubtask(ticketId, subtask.id);
183
+ }
184
+ subtasksChanged = true;
185
+ }
186
+ if (flags['add-subtask'] && flags['add-subtask'].length > 0) {
187
+ for (const subtaskTitle of flags['add-subtask']) {
188
+ // eslint-disable-next-line no-await-in-loop
189
+ await this.storage.addSubtask(ticketId, subtaskTitle);
190
+ }
191
+ subtasksChanged = true;
192
+ }
193
+ // Handle labels
194
+ let labelsChanged = false;
195
+ let currentLabels = [...ticket.labels];
196
+ if (flags['remove-label'] && flags['remove-label'].length > 0) {
197
+ currentLabels = currentLabels.filter(l => !flags['remove-label'].includes(l));
198
+ labelsChanged = true;
199
+ }
200
+ if (flags['add-label'] && flags['add-label'].length > 0) {
201
+ for (const label of flags['add-label']) {
202
+ if (!currentLabels.includes(label)) {
203
+ currentLabels.push(label);
204
+ labelsChanged = true;
205
+ }
206
+ }
207
+ }
208
+ // Handle acceptance criteria
209
+ let acChanged = false;
210
+ if (flags['clear-ac']) {
211
+ await this.storage.clearAcceptanceCriteria(ticketId);
212
+ acChanged = true;
213
+ }
214
+ if (flags['add-ac'] && flags['add-ac'].length > 0) {
215
+ // Sequential for consistent ordering
216
+ for (const criterion of flags['add-ac']) {
217
+ // eslint-disable-next-line no-await-in-loop
218
+ await this.storage.addAcceptanceCriterion(ticketId, criterion);
219
+ }
220
+ acChanged = true;
221
+ }
222
+ // Check if anything changed
223
+ const hasChanges = Object.keys(updates).length > 0 || subtasksChanged || labelsChanged || acChanged;
224
+ if (!hasChanges) {
225
+ this.log(styles.muted('\nNo changes made.'));
226
+ return;
227
+ }
228
+ // Update the ticket with labels if changed
229
+ if (labelsChanged) {
230
+ updates.labels = currentLabels;
231
+ }
232
+ // Update the ticket through provider
233
+ const updateResult = await ticketProvider.updateTicket(ticketId, updates);
234
+ if (!updateResult.success || !updateResult.ticket) {
235
+ return handleError('UPDATE_FAILED', `Failed to update ticket: ${updateResult.error}`);
236
+ }
237
+ const updatedTicket = updateResult.ticket;
238
+ // Auto-export to board.md
239
+ await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
240
+ // JSON output mode - match MCP tool response shape
241
+ if (jsonMode) {
242
+ // Re-fetch to get latest state including subtasks/AC changes
243
+ let finalTicket = updatedTicket;
244
+ if (subtasksChanged || acChanged) {
245
+ const refetch = await ticketProvider.getTicket(ticketId);
246
+ finalTicket = (refetch.success && refetch.ticket) ? refetch.ticket : updatedTicket;
247
+ }
248
+ this.log(JSON.stringify({
249
+ success: true,
250
+ ticket: {
251
+ id: finalTicket.id,
252
+ title: finalTicket.title,
253
+ priority: finalTicket.priority,
254
+ category: finalTicket.category,
255
+ statusName: finalTicket.statusName,
256
+ statusCategory: finalTicket.statusCategory,
257
+ projectId: finalTicket.projectId,
258
+ assignee: finalTicket.assignee,
259
+ owner: finalTicket.owner,
260
+ branch: finalTicket.branch,
261
+ epicId: finalTicket.epicId,
262
+ position: finalTicket.position,
263
+ },
264
+ }, null, 2));
265
+ return;
266
+ }
267
+ // Display updated ticket
268
+ this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(updatedTicket.id)}`));
269
+ const changedFields = [];
270
+ if (updates.title)
271
+ changedFields.push(`Title: ${updatedTicket.title}`);
272
+ if (updates.description !== undefined)
273
+ changedFields.push(`Description: ${updatedTicket.description || '(cleared)'}`);
274
+ if (updates.priority !== undefined)
275
+ changedFields.push(`Priority: ${updatedTicket.priority || 'none'}`);
276
+ if (updates.category !== undefined)
277
+ changedFields.push(`Category: ${updatedTicket.category || 'none'}`);
278
+ if (updates.owner !== undefined)
279
+ changedFields.push(`Owner: ${updatedTicket.owner || 'none'}`);
280
+ if (updates.assignee !== undefined)
281
+ changedFields.push(`Assignee: ${updatedTicket.assignee || 'none'}`);
282
+ if (subtasksChanged || acChanged) {
283
+ // Re-fetch ticket to get updated subtasks and AC
284
+ const refreshResult = await ticketProvider.getTicket(ticketId);
285
+ const refreshedTicket = refreshResult.success ? refreshResult.ticket : null;
286
+ if (subtasksChanged) {
287
+ changedFields.push(`Subtasks: ${refreshedTicket?.subtasks.length || 0} items`);
288
+ }
289
+ if (acChanged) {
290
+ changedFields.push(`Acceptance Criteria: ${refreshedTicket?.acceptanceCriteria?.length || 0} items`);
291
+ }
292
+ }
293
+ if (labelsChanged)
294
+ changedFields.push(`Labels: ${currentLabels.join(', ') || 'none'}`);
295
+ for (const field of changedFields) {
296
+ this.log(styles.muted(` ${field}`));
297
+ }
298
+ this.log('');
299
+ }
300
+ async promptForEdits(ticket, _columns) {
301
+ // First prompt for title
302
+ const { title } = await this.prompt([
303
+ {
304
+ type: 'input',
305
+ name: 'title',
306
+ message: 'Title:',
307
+ default: ticket.title,
308
+ validate: (input) => input.trim() ? true : 'Title cannot be empty',
309
+ },
310
+ ], null);
311
+ // Prompt for description using inline multiline input
312
+ const descResult = await multiLineInput({
313
+ message: 'Description:',
314
+ default: ticket.description || '',
315
+ hint: 'Ctrl+D to finish, Ctrl+C to cancel',
316
+ });
317
+ if (descResult.cancelled) {
318
+ throw new Error('Edit cancelled');
319
+ }
320
+ // Continue with remaining prompts - priority first (using workspace scale)
321
+ const db = this.storage.getDatabase();
322
+ const workspacePriorities = getWorkspacePriorities(db);
323
+ const { priority } = await this.prompt([
324
+ {
325
+ type: 'list',
326
+ name: 'priority',
327
+ message: 'Priority:',
328
+ choices: [
329
+ { name: 'None', value: '' },
330
+ ...workspacePriorities.map(p => ({ name: p, value: p })),
331
+ ],
332
+ default: ticket.priority || '',
333
+ },
334
+ ], null);
335
+ // Then category
336
+ const { categoryChoice } = await this.prompt([
337
+ {
338
+ type: 'list',
339
+ name: 'categoryChoice',
340
+ message: 'Category:',
341
+ choices: [
342
+ { name: 'None', value: '' },
343
+ new inquirer.Separator('── Conventional Commits ──'),
344
+ { name: 'feature - New feature or capability', value: 'feature' },
345
+ { name: 'bug - Bug fix', value: 'bug' },
346
+ { name: 'refactor - Code refactoring', value: 'refactor' },
347
+ { name: 'docs - Documentation', value: 'docs' },
348
+ { name: 'test - Test additions/fixes', value: 'test' },
349
+ { name: 'chore - Maintenance tasks', value: 'chore' },
350
+ { name: 'performance - Performance improvements', value: 'performance' },
351
+ { name: 'ci - CI/CD changes', value: 'ci' },
352
+ { name: 'build - Build system changes', value: 'build' },
353
+ new inquirer.Separator('── Extended Types ──'),
354
+ { name: 'security - Security fixes', value: 'security' },
355
+ { name: 'database - Database migrations', value: 'database' },
356
+ { name: 'release - Release preparation', value: 'release' },
357
+ new inquirer.Separator('── 5Tool Founder ──'),
358
+ { name: 'ship - Shipping and deployment', value: 'ship' },
359
+ { name: 'growth - Growth and marketing', value: 'growth' },
360
+ { name: 'support - Customer experience', value: 'support' },
361
+ { name: 'strategy - Strategy and planning', value: 'strategy' },
362
+ { name: 'ops - Business operations', value: 'ops' },
363
+ new inquirer.Separator('───────────────────'),
364
+ { name: 'Custom...', value: '__custom__' },
365
+ ],
366
+ default: ticket.category || '',
367
+ },
368
+ ], null);
369
+ // Custom category prompt if needed
370
+ let customCategory;
371
+ if (categoryChoice === '__custom__') {
372
+ const result = await this.prompt([{
373
+ type: 'input',
374
+ name: 'customCategory',
375
+ message: 'Enter custom category:',
376
+ validate: (input) => input.trim() ? true : 'Category cannot be empty',
377
+ }], null);
378
+ customCategory = result.customCategory;
379
+ }
380
+ const answers = { priority, categoryChoice, customCategory };
381
+ // Build updates object with only changed fields
382
+ const updates = {};
383
+ if (title !== ticket.title) {
384
+ updates.title = title;
385
+ }
386
+ if (descResult.value !== (ticket.description || '')) {
387
+ // Preserve empty string to allow clearing the description
388
+ updates.description = descResult.value;
389
+ }
390
+ if (answers.priority !== (ticket.priority || '')) {
391
+ updates.priority = answers.priority || undefined;
392
+ }
393
+ const newCategory = answers.categoryChoice === '__custom__'
394
+ ? answers.customCategory
395
+ : answers.categoryChoice;
396
+ if (newCategory !== (ticket.category || '')) {
397
+ updates.category = newCategory || undefined;
398
+ }
399
+ return updates;
400
+ }
401
+ }
402
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/commands/ticket/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PromptCommand } from '../../lib/prompt-command.js';
2
+ export default class Ticket extends PromptCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ protected getPMOOptions(): {
10
+ promptIfMultiple: boolean;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,74 @@
1
+ import inquirer from 'inquirer';
2
+ import { PromptCommand } from '../../lib/prompt-command.js';
3
+ import { machineOutputFlags } from '../../lib/pmo/index.js';
4
+ import { shouldOutputJson, outputPromptAsJson, createMetadata, buildPromptConfig, } from '../../lib/prompt-json.js';
5
+ export default class Ticket extends PromptCommand {
6
+ static description = 'Interactive menu for ticket operations';
7
+ static examples = [
8
+ '<%= config.bin %> <%= command.id %>',
9
+ ];
10
+ static flags = {
11
+ ...machineOutputFlags,
12
+ };
13
+ getPMOOptions() {
14
+ return { promptIfMultiple: false };
15
+ }
16
+ async run() {
17
+ const { flags } = await this.parse(Ticket);
18
+ // Check if JSON output mode is active
19
+ const jsonMode = shouldOutputJson(flags);
20
+ // Define choices once, use for both JSON and interactive modes
21
+ // Each choice includes the full command for AI agents to execute
22
+ const menuChoices = [
23
+ { name: 'Create new ticket', value: 'create', command: 'prlt ticket create --json' },
24
+ { name: 'List all tickets', value: 'list', command: 'prlt ticket list --format json' },
25
+ { name: 'Edit ticket', value: 'edit', command: 'prlt ticket edit --json' },
26
+ { name: 'Move ticket (status)', value: 'move', command: 'prlt ticket move --json' },
27
+ { name: 'Show ticket details', value: 'show', command: 'prlt ticket show --json' },
28
+ { name: 'Delete ticket', value: 'delete', command: 'prlt ticket delete --json' },
29
+ { name: 'Cancel', value: 'cancel' },
30
+ ];
31
+ const message = 'Ticket Operations - What would you like to do?';
32
+ // In JSON mode, output action selection prompt
33
+ if (jsonMode) {
34
+ outputPromptAsJson(buildPromptConfig('list', 'action', message, menuChoices), createMetadata('ticket', flags));
35
+ return;
36
+ }
37
+ // Show interactive menu
38
+ const { action } = await this.prompt([{
39
+ type: 'list',
40
+ name: 'action',
41
+ message: '🎫 ' + message,
42
+ choices: [
43
+ ...menuChoices.slice(0, -1),
44
+ new inquirer.Separator('──────────────'),
45
+ menuChoices[menuChoices.length - 1],
46
+ ],
47
+ }], null);
48
+ if (action === 'cancel') {
49
+ return;
50
+ }
51
+ // Run the selected subcommand
52
+ switch (action) {
53
+ case 'create':
54
+ await this.config.runCommand('ticket:create', []);
55
+ break;
56
+ case 'list':
57
+ await this.config.runCommand('ticket:list', []);
58
+ break;
59
+ case 'edit':
60
+ await this.config.runCommand('ticket:edit', []);
61
+ break;
62
+ case 'move':
63
+ await this.config.runCommand('ticket:move', []);
64
+ break;
65
+ case 'show':
66
+ await this.config.runCommand('ticket:show', []);
67
+ break;
68
+ case 'delete':
69
+ await this.config.runCommand('ticket:delete', []);
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ticket/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class TicketList extends Command {
3
+ static description: string;
4
+ /** Dynamic priority order (set from workspace settings in run()) */
5
+ private priorityOrder;
6
+ static examples: string[];
7
+ static flags: {
8
+ column: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ category: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ format: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ label: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'group-by': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ offset: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ source: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
19
+ team: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ };
24
+ run(): Promise<void>;
25
+ private outputCrossProjectTable;
26
+ private outputCrossProjectTableByPriority;
27
+ private outputCrossProjectCompact;
28
+ private outputCrossProjectCompactByPriority;
29
+ private outputTable;
30
+ private outputTableByPriority;
31
+ private outputCompact;
32
+ private outputCompactByPriority;
33
+ }