@proletariat/cli 0.3.97 → 0.3.98

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 (135) hide show
  1. package/dist/commands/orchestrate/index.js +18 -10
  2. package/dist/commands/orchestrate/index.js.map +1 -1
  3. package/dist/commands/qa/index.js +1 -1
  4. package/dist/commands/watch/index.d.ts +28 -0
  5. package/dist/commands/watch/index.js +172 -0
  6. package/dist/commands/watch/index.js.map +1 -0
  7. package/dist/commands/work/complete.js +11 -6
  8. package/dist/commands/work/complete.js.map +1 -1
  9. package/dist/commands/work/linear.js +1 -1
  10. package/dist/commands/work/linear.js.map +1 -1
  11. package/dist/commands/work/ready.js +20 -5
  12. package/dist/commands/work/ready.js.map +1 -1
  13. package/dist/commands/work/ship.js +24 -9
  14. package/dist/commands/work/ship.js.map +1 -1
  15. package/dist/commands/work/start.js +95 -58
  16. package/dist/commands/work/start.js.map +1 -1
  17. package/dist/lib/asana/client.d.ts +4 -1
  18. package/dist/lib/asana/client.js +15 -0
  19. package/dist/lib/asana/client.js.map +1 -1
  20. package/dist/lib/asana/index.d.ts +1 -1
  21. package/dist/lib/asana/types.d.ts +4 -0
  22. package/dist/lib/database/credential-store.js +1 -0
  23. package/dist/lib/database/credential-store.js.map +1 -1
  24. package/dist/lib/execution/preflight.js +1 -1
  25. package/dist/lib/execution/preflight.js.map +1 -1
  26. package/dist/lib/execution/storage.d.ts +6 -0
  27. package/dist/lib/execution/storage.js +18 -0
  28. package/dist/lib/execution/storage.js.map +1 -1
  29. package/dist/lib/external-issues/index.d.ts +1 -0
  30. package/dist/lib/external-issues/index.js +2 -0
  31. package/dist/lib/external-issues/index.js.map +1 -1
  32. package/dist/lib/external-issues/linear.js +1 -1
  33. package/dist/lib/external-issues/linear.js.map +1 -1
  34. package/dist/lib/external-issues/ticket-builder.d.ts +21 -0
  35. package/dist/lib/external-issues/ticket-builder.js +43 -0
  36. package/dist/lib/external-issues/ticket-builder.js.map +1 -0
  37. package/dist/lib/external-issues/work-start.js +1 -1
  38. package/dist/lib/external-issues/work-start.js.map +1 -1
  39. package/dist/lib/gc/index.d.ts +8 -0
  40. package/dist/lib/gc/index.js +35 -2
  41. package/dist/lib/gc/index.js.map +1 -1
  42. package/dist/lib/github/client.d.ts +84 -0
  43. package/dist/lib/github/client.js +123 -0
  44. package/dist/lib/github/client.js.map +1 -0
  45. package/dist/lib/github/config.d.ts +42 -0
  46. package/dist/lib/github/config.js +115 -0
  47. package/dist/lib/github/config.js.map +1 -0
  48. package/dist/lib/github/types.d.ts +71 -0
  49. package/dist/lib/github/types.js +50 -0
  50. package/dist/lib/github/types.js.map +1 -0
  51. package/dist/lib/jira/client.d.ts +113 -0
  52. package/dist/lib/jira/client.js +208 -0
  53. package/dist/lib/jira/client.js.map +1 -0
  54. package/dist/lib/jira/config.d.ts +9 -0
  55. package/dist/lib/jira/config.js +30 -0
  56. package/dist/lib/jira/config.js.map +1 -1
  57. package/dist/lib/jira/index.d.ts +6 -2
  58. package/dist/lib/jira/index.js +4 -2
  59. package/dist/lib/jira/index.js.map +1 -1
  60. package/dist/lib/jira/types.d.ts +118 -0
  61. package/dist/lib/jira/types.js +45 -0
  62. package/dist/lib/jira/types.js.map +1 -0
  63. package/dist/lib/linear/config.d.ts +10 -0
  64. package/dist/lib/linear/config.js +33 -0
  65. package/dist/lib/linear/config.js.map +1 -1
  66. package/dist/lib/mcp/tools/index.d.ts +0 -2
  67. package/dist/lib/mcp/tools/index.js +0 -2
  68. package/dist/lib/mcp/tools/index.js.map +1 -1
  69. package/dist/lib/orchestrate/index.d.ts +2 -0
  70. package/dist/lib/orchestrate/index.js +1 -0
  71. package/dist/lib/orchestrate/index.js.map +1 -1
  72. package/dist/lib/orchestrate/simple-poller.d.ts +57 -0
  73. package/dist/lib/orchestrate/simple-poller.js +324 -0
  74. package/dist/lib/orchestrate/simple-poller.js.map +1 -0
  75. package/dist/lib/pmo/storage/index.js +16 -5
  76. package/dist/lib/pmo/storage/index.js.map +1 -1
  77. package/dist/lib/providers/asana-provider.d.ts +27 -0
  78. package/dist/lib/providers/asana-provider.js +426 -0
  79. package/dist/lib/providers/asana-provider.js.map +1 -0
  80. package/dist/lib/providers/auto-mapper.d.ts +1 -1
  81. package/dist/lib/providers/auto-mapper.js +23 -0
  82. package/dist/lib/providers/auto-mapper.js.map +1 -1
  83. package/dist/lib/providers/github-provider.d.ts +34 -0
  84. package/dist/lib/providers/github-provider.js +418 -0
  85. package/dist/lib/providers/github-provider.js.map +1 -0
  86. package/dist/lib/providers/index.d.ts +3 -0
  87. package/dist/lib/providers/index.js +3 -0
  88. package/dist/lib/providers/index.js.map +1 -1
  89. package/dist/lib/providers/jira-provider.d.ts +31 -0
  90. package/dist/lib/providers/jira-provider.js +383 -0
  91. package/dist/lib/providers/jira-provider.js.map +1 -0
  92. package/dist/lib/providers/linear-provider.js +6 -7
  93. package/dist/lib/providers/linear-provider.js.map +1 -1
  94. package/dist/lib/providers/resolver.js +54 -0
  95. package/dist/lib/providers/resolver.js.map +1 -1
  96. package/dist/lib/providers/types.d.ts +1 -1
  97. package/dist/lib/work-lifecycle/post-execution.js +26 -1
  98. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  99. package/dist/lib/work-lifecycle/transition.js +24 -10
  100. package/dist/lib/work-lifecycle/transition.js.map +1 -1
  101. package/dist/lib/work-source/config.d.ts +1 -1
  102. package/dist/lib/work-source/config.js +11 -1
  103. package/dist/lib/work-source/config.js.map +1 -1
  104. package/oclif.manifest.json +1098 -1896
  105. package/package.json +1 -1
  106. package/dist/commands/ticket/create.d.ts +0 -44
  107. package/dist/commands/ticket/create.js +0 -760
  108. package/dist/commands/ticket/create.js.map +0 -1
  109. package/dist/commands/ticket/delete.d.ts +0 -17
  110. package/dist/commands/ticket/delete.js +0 -204
  111. package/dist/commands/ticket/delete.js.map +0 -1
  112. package/dist/commands/ticket/edit.d.ts +0 -28
  113. package/dist/commands/ticket/edit.js +0 -402
  114. package/dist/commands/ticket/edit.js.map +0 -1
  115. package/dist/commands/ticket/index.d.ts +0 -13
  116. package/dist/commands/ticket/index.js +0 -74
  117. package/dist/commands/ticket/index.js.map +0 -1
  118. package/dist/commands/ticket/list.d.ts +0 -33
  119. package/dist/commands/ticket/list.js +0 -519
  120. package/dist/commands/ticket/list.js.map +0 -1
  121. package/dist/commands/ticket/move.d.ts +0 -27
  122. package/dist/commands/ticket/move.js +0 -413
  123. package/dist/commands/ticket/move.js.map +0 -1
  124. package/dist/commands/ticket/show.d.ts +0 -14
  125. package/dist/commands/ticket/show.js +0 -110
  126. package/dist/commands/ticket/show.js.map +0 -1
  127. package/dist/commands/ticket/update.d.ts +0 -28
  128. package/dist/commands/ticket/update.js +0 -458
  129. package/dist/commands/ticket/update.js.map +0 -1
  130. package/dist/lib/mcp/tools/action.d.ts +0 -6
  131. package/dist/lib/mcp/tools/action.js +0 -123
  132. package/dist/lib/mcp/tools/action.js.map +0 -1
  133. package/dist/lib/mcp/tools/ticket.d.ts +0 -6
  134. package/dist/lib/mcp/tools/ticket.js +0 -464
  135. package/dist/lib/mcp/tools/ticket.js.map +0 -1
@@ -1,458 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { Args, Flags } from '@oclif/core';
3
- import { PMOCommand, pmoBaseFlags, autoExportToBoard } 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 { formatTicket } from '../../lib/mcp/helpers.js';
8
- import { trackTicketOperation } from '../../lib/telemetry/analytics.js';
9
- export default class TicketUpdate extends PMOCommand {
10
- static description = 'Update ticket fields (title, description, priority, category, labels, status)';
11
- static examples = [
12
- '<%= config.bin %> <%= command.id %> TKT-001 --title "New title"',
13
- '<%= config.bin %> <%= command.id %> TKT-001 --description "Updated description"',
14
- '<%= config.bin %> <%= command.id %> TKT-001 --description-file ./spec.md',
15
- '<%= config.bin %> <%= command.id %> TKT-001 --priority P1',
16
- '<%= config.bin %> <%= command.id %> TKT-001 --category bug',
17
- '<%= config.bin %> <%= command.id %> TKT-001 --labels frontend,urgent',
18
- '<%= config.bin %> <%= command.id %> TKT-001 --status "In Progress"',
19
- '<%= config.bin %> <%= command.id %> TKT-001 --title "Fix auth" --priority P0 --status "In Progress" --json',
20
- '<%= config.bin %> <%= command.id %> --bulk --priority P1',
21
- ];
22
- static args = {
23
- ticketId: Args.string({
24
- description: 'Ticket ID - prompts with dropdown if not provided',
25
- required: false,
26
- }),
27
- };
28
- static flags = {
29
- ...pmoBaseFlags,
30
- title: Flags.string({
31
- char: 't',
32
- description: 'Set ticket title',
33
- }),
34
- description: Flags.string({
35
- char: 'd',
36
- description: 'Set ticket description',
37
- }),
38
- 'description-file': Flags.string({
39
- description: 'Read ticket description from a file',
40
- }),
41
- priority: Flags.string({
42
- char: 'p',
43
- description: 'Set priority (uses workspace priority scale, "none" to clear)',
44
- }),
45
- category: Flags.string({
46
- char: 'c',
47
- description: 'Set category (e.g., feature, bug, refactor, "none" to clear)',
48
- }),
49
- labels: Flags.string({
50
- char: 'l',
51
- description: 'Set labels (comma-separated, replaces existing labels; use "" to clear)',
52
- }),
53
- status: Flags.string({
54
- char: 's',
55
- description: 'Set status/column (e.g., "In Progress", "Done")',
56
- }),
57
- bulk: Flags.boolean({
58
- char: 'b',
59
- description: 'Enable bulk mode to update multiple tickets',
60
- default: false,
61
- }),
62
- force: Flags.boolean({
63
- char: 'f',
64
- description: 'Skip confirmation prompt',
65
- default: false,
66
- }),
67
- };
68
- async execute() {
69
- const { args, flags } = await this.parse(TicketUpdate);
70
- const projectId = flags.project;
71
- // Check if JSON output mode is active
72
- const jsonMode = shouldOutputJson(flags);
73
- // Helper to handle errors in JSON mode
74
- const handleError = (code, message) => {
75
- if (jsonMode) {
76
- outputErrorAsJson(code, message, createMetadata('ticket update', flags));
77
- return;
78
- }
79
- this.error(message);
80
- };
81
- // Validate --description and --description-file are not both provided
82
- if (flags.description !== undefined && flags['description-file'] !== undefined) {
83
- return handleError('INVALID_FLAGS', 'Cannot use both --description and --description-file.');
84
- }
85
- // Get all tickets
86
- const allTickets = await this.storage.listTickets(projectId);
87
- if (allTickets.length === 0) {
88
- return handleError('NO_TICKETS', 'No tickets found.');
89
- }
90
- // Bulk mode
91
- if (flags.bulk) {
92
- await this.executeBulk(allTickets, flags);
93
- return;
94
- }
95
- // Single ticket mode
96
- let ticketId = args.ticketId;
97
- if (!ticketId) {
98
- const selected = await this.selectFromList({
99
- message: 'Select ticket to update:',
100
- items: allTickets,
101
- getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
102
- getValue: (t) => t.id,
103
- getCommand: (t) => `prlt ticket update ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
104
- jsonMode: jsonMode ? { flags, commandName: 'ticket update' } : null,
105
- });
106
- if (!selected) {
107
- return;
108
- }
109
- ticketId = selected;
110
- }
111
- // Get ticket
112
- const ticket = await this.storage.getTicket(ticketId);
113
- if (!ticket) {
114
- return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
115
- }
116
- // Use resolved internal ID for all subsequent operations (external keys like PRLT-xxx resolve to TKT-xxx)
117
- ticketId = ticket.id;
118
- // Check if any flags were provided
119
- const hasFlags = flags.title !== undefined || flags.description !== undefined ||
120
- flags['description-file'] !== undefined || flags.priority !== undefined ||
121
- flags.category !== undefined || flags.labels !== undefined ||
122
- flags.status !== undefined;
123
- if (!hasFlags) {
124
- // No flags provided - fall back to interactive priority/category selection
125
- await this.executeInteractive(ticketId, ticket, projectId, jsonMode, flags);
126
- return;
127
- }
128
- // Build changes from flags
129
- const changes = {};
130
- const changedFields = [];
131
- if (flags.title !== undefined) {
132
- changes.title = flags.title;
133
- changedFields.push(`Title: ${flags.title}`);
134
- }
135
- // Handle description (--description or --description-file)
136
- if (flags['description-file'] !== undefined) {
137
- try {
138
- const content = readFileSync(flags['description-file'], 'utf-8');
139
- changes.description = content;
140
- changedFields.push(`Description: (from file ${flags['description-file']})`);
141
- }
142
- catch (error) {
143
- return handleError('FILE_READ_ERROR', `Failed to read description file "${flags['description-file']}": ${error instanceof Error ? error.message : String(error)}`);
144
- }
145
- }
146
- else if (flags.description !== undefined) {
147
- changes.description = flags.description;
148
- changedFields.push(`Description: ${flags.description.length > 60 ? flags.description.slice(0, 60) + '...' : flags.description}`);
149
- }
150
- if (flags.priority !== undefined) {
151
- changes.priority = flags.priority === 'none' ? null : flags.priority;
152
- changedFields.push(`Priority: ${flags.priority === 'none' ? 'none' : flags.priority}`);
153
- }
154
- if (flags.category !== undefined) {
155
- changes.category = flags.category === 'none' ? undefined : flags.category;
156
- changedFields.push(`Category: ${flags.category === 'none' ? 'none' : flags.category}`);
157
- }
158
- if (flags.labels !== undefined) {
159
- const labelList = flags.labels === '' ? [] : flags.labels.split(',').map(l => l.trim()).filter(Boolean);
160
- changes.labels = labelList;
161
- changedFields.push(`Labels: ${labelList.length > 0 ? labelList.join(', ') : 'none'}`);
162
- }
163
- // Resolve provider once for all operations (routes to Linear/Jira/PMO as appropriate)
164
- const provider = await this.resolveTicketProvider(ticketId, ticket.projectId || '');
165
- // Apply field changes (everything except status) through provider
166
- if (Object.keys(changes).length > 0) {
167
- const updateStart = Date.now();
168
- const updateResult = await provider.updateTicket(ticketId, changes);
169
- trackTicketOperation({ operation: 'update', provider: updateResult.provider, durationMs: Date.now() - updateStart, success: updateResult.success });
170
- if (!updateResult.success) {
171
- return handleError('UPDATE_FAILED', `Failed to update ticket: ${updateResult.error}`);
172
- }
173
- }
174
- // Handle status change separately via provider
175
- if (flags.status !== undefined) {
176
- const moveResult = await provider.moveTicket(ticketId, flags.status);
177
- if (!moveResult.success) {
178
- return handleError('STATUS_CHANGE_FAILED', `Failed to change status to "${flags.status}": ${moveResult.error}`);
179
- }
180
- changedFields.push(`Status: ${flags.status}`);
181
- }
182
- // Auto-export
183
- await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
184
- // Refresh ticket for output
185
- const updatedTicket = await this.storage.getTicket(ticketId) || ticket;
186
- // JSON output mode
187
- if (jsonMode) {
188
- this.log(JSON.stringify({
189
- success: true,
190
- ticket: formatTicket(updatedTicket),
191
- }, null, 2));
192
- return;
193
- }
194
- this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(ticketId)}`));
195
- for (const field of changedFields) {
196
- this.log(styles.muted(` ${field}`));
197
- }
198
- }
199
- /**
200
- * Interactive mode when no flags are provided - original priority/category selection flow
201
- */
202
- async executeInteractive(ticketId, ticket, projectId, jsonMode, flags) {
203
- const jsonModeConfig = jsonMode ? { flags, commandName: 'ticket update' } : null;
204
- const { updateType } = await this.prompt([{
205
- type: 'list',
206
- name: 'updateType',
207
- message: 'What would you like to update?',
208
- choices: [
209
- { name: 'Priority', value: 'priority', command: `prlt ticket update ${ticketId} --priority <P0|P1|P2|P3>${projectId ? ` -P ${projectId}` : ''} --json` },
210
- { name: 'Category', value: 'category', command: `prlt ticket update ${ticketId} --category <category>${projectId ? ` -P ${projectId}` : ''} --json` },
211
- { name: 'Both', value: 'both', command: `prlt ticket update ${ticketId} --priority <P0|P1|P2|P3> --category <category>${projectId ? ` -P ${projectId}` : ''} --json` },
212
- ],
213
- }], jsonModeConfig);
214
- let updatePriority;
215
- let updateCategory;
216
- if (updateType === 'priority' || updateType === 'both') {
217
- const db = this.storage.getDatabase();
218
- const workspacePriorities = getWorkspacePriorities(db);
219
- const { priority } = await this.prompt([{
220
- type: 'list',
221
- name: 'priority',
222
- message: 'Set priority to:',
223
- choices: [
224
- { name: `(Keep existing: ${ticket.priority || 'none'})`, value: null, command: '' },
225
- ...workspacePriorities.map(p => ({ name: p, value: p, command: `prlt ticket update ${ticketId} --priority ${p}${projectId ? ` -P ${projectId}` : ''} --json` })),
226
- { name: 'None (clear priority)', value: '', command: `prlt ticket update ${ticketId} --priority none${projectId ? ` -P ${projectId}` : ''} --json` },
227
- ],
228
- }], jsonModeConfig);
229
- if (priority !== null) {
230
- updatePriority = priority;
231
- }
232
- }
233
- if (updateType === 'category' || updateType === 'both') {
234
- const { categoryChoice } = await this.prompt([{
235
- type: 'list',
236
- name: 'categoryChoice',
237
- message: 'Set category to:',
238
- choices: [
239
- { name: `(Keep existing: ${ticket.category || 'none'})`, value: null, command: '' },
240
- { name: 'feature', value: 'feature', command: `prlt ticket update ${ticketId} --category feature${projectId ? ` -P ${projectId}` : ''} --json` },
241
- { name: 'bug', value: 'bug', command: `prlt ticket update ${ticketId} --category bug${projectId ? ` -P ${projectId}` : ''} --json` },
242
- { name: 'refactor', value: 'refactor', command: `prlt ticket update ${ticketId} --category refactor${projectId ? ` -P ${projectId}` : ''} --json` },
243
- { name: 'docs', value: 'docs', command: `prlt ticket update ${ticketId} --category docs${projectId ? ` -P ${projectId}` : ''} --json` },
244
- { name: 'test', value: 'test', command: `prlt ticket update ${ticketId} --category test${projectId ? ` -P ${projectId}` : ''} --json` },
245
- { name: 'chore', value: 'chore', command: `prlt ticket update ${ticketId} --category chore${projectId ? ` -P ${projectId}` : ''} --json` },
246
- { name: 'None (clear category)', value: '', command: `prlt ticket update ${ticketId} --category none${projectId ? ` -P ${projectId}` : ''} --json` },
247
- { name: 'Custom...', value: '__custom__', command: `prlt ticket update ${ticketId} --category <category>${projectId ? ` -P ${projectId}` : ''} --json` },
248
- ],
249
- }], jsonModeConfig);
250
- if (categoryChoice === '__custom__') {
251
- const { customCategory } = await this.prompt([{
252
- type: 'input',
253
- name: 'customCategory',
254
- message: 'Enter custom category:',
255
- validate: (input) => input.length > 0 || 'Category is required',
256
- }], jsonModeConfig);
257
- updateCategory = customCategory;
258
- }
259
- else if (categoryChoice !== null) {
260
- updateCategory = categoryChoice;
261
- }
262
- }
263
- // Check if anything to update
264
- if (updatePriority === undefined && updateCategory === undefined) {
265
- this.log(styles.muted('Nothing to update.'));
266
- return;
267
- }
268
- // Build changes
269
- const changes = {};
270
- if (updatePriority !== undefined) {
271
- changes.priority = updatePriority || undefined;
272
- }
273
- if (updateCategory !== undefined) {
274
- changes.category = updateCategory || undefined;
275
- }
276
- // Update ticket through provider (routes to Linear/Jira/PMO as appropriate)
277
- const provider = await this.resolveTicketProvider(ticketId, ticket?.projectId || '');
278
- const result = await provider.updateTicket(ticketId, changes);
279
- if (!result.success) {
280
- this.error(`Failed to update ticket: ${result.error}`);
281
- }
282
- // Auto-export
283
- await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
284
- const updates = [];
285
- if (updatePriority !== undefined)
286
- updates.push(`Priority: ${updatePriority || 'none'}`);
287
- if (updateCategory !== undefined)
288
- updates.push(`Category: ${updateCategory || 'none'}`);
289
- this.log(styles.success(`\n✅ Updated ticket ${styles.emphasis(ticketId)}`));
290
- this.log(styles.muted(` ${updates.join(', ')}`));
291
- }
292
- async executeBulk(allTickets, flags) {
293
- const jsonMode = shouldOutputJson(flags);
294
- const jsonModeConfig = jsonMode ? { flags: flags, commandName: 'ticket update' } : null;
295
- this.log(styles.emphasis('✏️ Update Multiple Tickets\n'));
296
- // Select tickets to update
297
- const { selectedTickets } = await this.prompt([{
298
- type: 'checkbox',
299
- name: 'selectedTickets',
300
- message: 'Select tickets to update:',
301
- choices: allTickets.map(t => ({
302
- name: `${t.id} - ${t.title} [P:${t.priority || 'none'} C:${t.category || 'none'}]`,
303
- value: t.id,
304
- })),
305
- }], jsonModeConfig);
306
- if (selectedTickets.length === 0) {
307
- this.log(styles.muted('No tickets selected.'));
308
- return;
309
- }
310
- // Determine what to update
311
- let updatePriority = flags.priority;
312
- let updateCategory = flags.category;
313
- if (!updatePriority && !updateCategory) {
314
- // Ask what to update
315
- const { updateType } = await this.prompt([{
316
- type: 'list',
317
- name: 'updateType',
318
- message: 'What would you like to update?',
319
- choices: [
320
- { name: 'Priority', value: 'priority', command: 'prlt ticket update --bulk --priority <P0|P1|P2|P3> --json' },
321
- { name: 'Category', value: 'category', command: 'prlt ticket update --bulk --category <category> --json' },
322
- { name: 'Both', value: 'both', command: 'prlt ticket update --bulk --priority <P0|P1|P2|P3> --category <category> --json' },
323
- ],
324
- }], jsonModeConfig);
325
- if (updateType === 'priority' || updateType === 'both') {
326
- const db = this.storage.getDatabase();
327
- const bulkWorkspacePriorities = getWorkspacePriorities(db);
328
- const { priority } = await this.prompt([{
329
- type: 'list',
330
- name: 'priority',
331
- message: 'Set priority to:',
332
- choices: [
333
- { name: '(Keep existing)', value: null, command: '' },
334
- ...bulkWorkspacePriorities.map(p => ({ name: p, value: p, command: `prlt ticket update --bulk --priority ${p} --json` })),
335
- { name: 'None (clear priority)', value: '', command: 'prlt ticket update --bulk --priority none --json' },
336
- ],
337
- }], jsonModeConfig);
338
- if (priority !== null) {
339
- updatePriority = priority;
340
- }
341
- }
342
- if (updateType === 'category' || updateType === 'both') {
343
- const { categoryChoice } = await this.prompt([{
344
- type: 'list',
345
- name: 'categoryChoice',
346
- message: 'Set category to:',
347
- choices: [
348
- { name: '(Keep existing)', value: null, command: '' },
349
- { name: 'feature', value: 'feature', command: 'prlt ticket update --bulk --category feature --json' },
350
- { name: 'bug', value: 'bug', command: 'prlt ticket update --bulk --category bug --json' },
351
- { name: 'refactor', value: 'refactor', command: 'prlt ticket update --bulk --category refactor --json' },
352
- { name: 'docs', value: 'docs', command: 'prlt ticket update --bulk --category docs --json' },
353
- { name: 'test', value: 'test', command: 'prlt ticket update --bulk --category test --json' },
354
- { name: 'chore', value: 'chore', command: 'prlt ticket update --bulk --category chore --json' },
355
- { name: 'None (clear category)', value: '', command: 'prlt ticket update --bulk --category none --json' },
356
- { name: 'Custom...', value: '__custom__', command: 'prlt ticket update --bulk --category <category> --json' },
357
- ],
358
- }], jsonModeConfig);
359
- if (categoryChoice === '__custom__') {
360
- const { customCategory } = await this.prompt([{
361
- type: 'input',
362
- name: 'customCategory',
363
- message: 'Enter custom category:',
364
- validate: (input) => input.length > 0 || 'Category is required',
365
- }], jsonModeConfig);
366
- updateCategory = customCategory;
367
- }
368
- else if (categoryChoice !== null) {
369
- updateCategory = categoryChoice;
370
- }
371
- }
372
- }
373
- // Check if anything to update
374
- if (updatePriority === undefined && updateCategory === undefined) {
375
- this.log(styles.muted('Nothing to update.'));
376
- return;
377
- }
378
- // Confirmation
379
- if (!flags.force) {
380
- this.log(styles.primary('\nWill update:'));
381
- if (updatePriority !== undefined) {
382
- this.log(styles.primary(` Priority → ${updatePriority || '(clear)'}`));
383
- }
384
- if (updateCategory !== undefined) {
385
- this.log(styles.primary(` Category → ${updateCategory || '(clear)'}`));
386
- }
387
- this.log(styles.primary('\nTickets:'));
388
- for (const ticketId of selectedTickets) {
389
- const ticket = allTickets.find(t => t.id === ticketId);
390
- this.log(styles.primary(` • ${ticketId}: ${ticket?.title}`));
391
- }
392
- this.log('');
393
- const { confirm } = await this.prompt([{
394
- type: 'list',
395
- name: 'confirm',
396
- message: 'Continue?',
397
- choices: [
398
- { name: 'No, cancel', value: false, command: '' },
399
- { name: 'Yes, update tickets', value: true, command: 'prlt ticket update --bulk --force --json' }
400
- ],
401
- default: 0
402
- }], jsonModeConfig);
403
- if (!confirm) {
404
- this.log(styles.muted('Operation cancelled.'));
405
- return;
406
- }
407
- }
408
- this.log('');
409
- // Update each ticket
410
- let successCount = 0;
411
- let failCount = 0;
412
- // Process sequentially for clear success/failure logging
413
- for (const ticketId of selectedTickets) {
414
- try {
415
- const changes = {};
416
- if (updatePriority !== undefined) {
417
- changes.priority = updatePriority || undefined;
418
- }
419
- if (updateCategory !== undefined) {
420
- changes.category = updateCategory || undefined;
421
- }
422
- const ticket = allTickets.find(t => t.id === ticketId);
423
- // eslint-disable-next-line no-await-in-loop
424
- const provider = await this.resolveTicketProvider(ticketId, ticket?.projectId || '');
425
- // eslint-disable-next-line no-await-in-loop
426
- const result = await provider.updateTicket(ticketId, changes);
427
- if (result.success) {
428
- const updates = [];
429
- if (updatePriority !== undefined)
430
- updates.push(`P:${updatePriority || 'none'}`);
431
- if (updateCategory !== undefined)
432
- updates.push(`C:${updateCategory || 'none'}`);
433
- this.log(styles.success(`${ticketId}: ${updates.join(', ')}`));
434
- successCount++;
435
- }
436
- else {
437
- this.log(styles.error(`Failed to update ${ticketId}: ${result.error}`));
438
- failCount++;
439
- }
440
- }
441
- catch (error) {
442
- this.log(styles.error(`Failed to update ${ticketId}: ${error instanceof Error ? error.message : String(error)}`));
443
- failCount++;
444
- }
445
- }
446
- // Auto-export to kanban.md
447
- await autoExportToBoard(this.pmoPath, this.storage, (msg) => this.log(styles.muted(msg)));
448
- // Summary
449
- this.log('');
450
- if (successCount > 0) {
451
- this.log(styles.success(`Updated ${successCount} ticket(s)`));
452
- }
453
- if (failCount > 0) {
454
- this.log(styles.error(`Failed to update ${failCount} ticket(s)`));
455
- }
456
- }
457
- }
458
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/ticket/update.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * MCP Action Tools
3
- */
4
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import type { McpToolContext } from '../types.js';
6
- export declare function registerActionTools(server: McpServer, ctx: McpToolContext): void;
@@ -1,123 +0,0 @@
1
- /**
2
- * MCP Action Tools
3
- */
4
- import { z } from 'zod';
5
- import { errorResponse, strictTool } from '../helpers.js';
6
- import { getReviewGateSetting, setReviewGateSetting } from '../../work-lifecycle/settings.js';
7
- export function registerActionTools(server, ctx) {
8
- strictTool(server, 'action_list', 'List work actions', { include_builtin: z.boolean().optional() }, async (params) => {
9
- try {
10
- const actions = await ctx.storage.listActions({
11
- isBuiltin: params.include_builtin ? undefined : false,
12
- });
13
- return {
14
- content: [{
15
- type: 'text',
16
- text: JSON.stringify({
17
- success: true,
18
- actions: actions.map((a) => ({
19
- id: a.id,
20
- name: a.name,
21
- description: a.description,
22
- reviewGate: a.reviewGate,
23
- modifiesCode: a.modifiesCode,
24
- isBuiltin: a.isBuiltin,
25
- })),
26
- }, null, 2),
27
- }],
28
- };
29
- }
30
- catch (error) {
31
- return errorResponse(error);
32
- }
33
- });
34
- strictTool(server, 'action_show', 'Get action details', { id: z.string().describe('Action ID') }, async (params) => {
35
- try {
36
- const action = await ctx.storage.getAction(params.id);
37
- if (!action)
38
- throw new Error(`Action not found: ${params.id}`);
39
- return {
40
- content: [{
41
- type: 'text',
42
- text: JSON.stringify({ success: true, action }, null, 2),
43
- }],
44
- };
45
- }
46
- catch (error) {
47
- return errorResponse(error);
48
- }
49
- });
50
- strictTool(server, 'action_create', 'Create a work action', {
51
- name: z.string().describe('Action name'),
52
- prompt: z.string().describe('Start prompt'),
53
- description: z.string().optional(),
54
- end_prompt: z.string().optional(),
55
- review_gate: z.enum(['required', 'auto', 'post']).optional().describe('Review gate mode override (default: use workspace setting)'),
56
- modifies_code: z.boolean().optional(),
57
- }, async (params) => {
58
- try {
59
- const action = await ctx.storage.createAction({
60
- name: params.name,
61
- prompt: params.prompt,
62
- description: params.description,
63
- endPrompt: params.end_prompt,
64
- reviewGate: params.review_gate,
65
- modifiesCode: params.modifies_code ?? true,
66
- });
67
- return {
68
- content: [{
69
- type: 'text',
70
- text: JSON.stringify({ success: true, action: { id: action.id, name: action.name } }, null, 2),
71
- }],
72
- };
73
- }
74
- catch (error) {
75
- return errorResponse(error);
76
- }
77
- });
78
- strictTool(server, 'action_delete', 'Delete an action', { id: z.string().describe('Action ID') }, async (params) => {
79
- try {
80
- await ctx.storage.deleteAction(params.id);
81
- return {
82
- content: [{
83
- type: 'text',
84
- text: JSON.stringify({ success: true, message: 'Action deleted' }, null, 2),
85
- }],
86
- };
87
- }
88
- catch (error) {
89
- return errorResponse(error);
90
- }
91
- });
92
- strictTool(server, 'review_gate_get', 'Get workspace review gate setting (required | auto | post)', {}, async () => {
93
- try {
94
- const db = ctx.storage.getDatabase();
95
- const mode = getReviewGateSetting(db);
96
- return {
97
- content: [{
98
- type: 'text',
99
- text: JSON.stringify({ success: true, review_gate: mode }, null, 2),
100
- }],
101
- };
102
- }
103
- catch (error) {
104
- return errorResponse(error);
105
- }
106
- });
107
- strictTool(server, 'review_gate_set', 'Set workspace review gate default (required | auto | post)', { mode: z.enum(['required', 'auto', 'post']).describe('Review gate mode') }, async (params) => {
108
- try {
109
- const db = ctx.storage.getDatabase();
110
- setReviewGateSetting(db, params.mode);
111
- return {
112
- content: [{
113
- type: 'text',
114
- text: JSON.stringify({ success: true, review_gate: params.mode, message: `Workspace review gate set to: ${params.mode}` }, null, 2),
115
- }],
116
- };
117
- }
118
- catch (error) {
119
- return errorResponse(error);
120
- }
121
- });
122
- }
123
- //# sourceMappingURL=action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/action.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * MCP Ticket Tools
3
- */
4
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import type { McpToolContext } from '../types.js';
6
- export declare function registerTicketTools(server: McpServer, ctx: McpToolContext): void;