@nathapp/koda-cli 0.0.1

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 (65) hide show
  1. package/dist/client.d.ts +9 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +23 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/agent.d.ts +3 -0
  6. package/dist/commands/agent.d.ts.map +1 -0
  7. package/dist/commands/agent.js +91 -0
  8. package/dist/commands/agent.js.map +1 -0
  9. package/dist/commands/comment.d.ts +3 -0
  10. package/dist/commands/comment.d.ts.map +1 -0
  11. package/dist/commands/comment.js +57 -0
  12. package/dist/commands/comment.js.map +1 -0
  13. package/dist/commands/config.d.ts +14 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +20 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/kb.d.ts +3 -0
  18. package/dist/commands/kb.d.ts.map +1 -0
  19. package/dist/commands/kb.js +137 -0
  20. package/dist/commands/kb.js.map +1 -0
  21. package/dist/commands/label.d.ts +3 -0
  22. package/dist/commands/label.d.ts.map +1 -0
  23. package/dist/commands/label.js +105 -0
  24. package/dist/commands/label.js.map +1 -0
  25. package/dist/commands/login.d.ts +6 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +26 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/project.d.ts +3 -0
  30. package/dist/commands/project.d.ts.map +1 -0
  31. package/dist/commands/project.js +148 -0
  32. package/dist/commands/project.js.map +1 -0
  33. package/dist/commands/ticket.d.ts +3 -0
  34. package/dist/commands/ticket.d.ts.map +1 -0
  35. package/dist/commands/ticket.js +538 -0
  36. package/dist/commands/ticket.js.map +1 -0
  37. package/dist/config.d.ts +9 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +68 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/generated.d.ts +185 -0
  42. package/dist/generated.d.ts.map +1 -0
  43. package/dist/generated.js +119 -0
  44. package/dist/generated.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +135 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/utils/api.d.ts +10 -0
  50. package/dist/utils/api.d.ts.map +1 -0
  51. package/dist/utils/api.js +32 -0
  52. package/dist/utils/api.js.map +1 -0
  53. package/dist/utils/auth.d.ts +9 -0
  54. package/dist/utils/auth.d.ts.map +1 -0
  55. package/dist/utils/auth.js +14 -0
  56. package/dist/utils/auth.js.map +1 -0
  57. package/dist/utils/error.d.ts +14 -0
  58. package/dist/utils/error.d.ts.map +1 -0
  59. package/dist/utils/error.js +42 -0
  60. package/dist/utils/error.js.map +1 -0
  61. package/dist/utils/output.d.ts +28 -0
  62. package/dist/utils/output.d.ts.map +1 -0
  63. package/dist/utils/output.js +80 -0
  64. package/dist/utils/output.js.map +1 -0
  65. package/package.json +38 -0
@@ -0,0 +1,538 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ticketCommand = ticketCommand;
4
+ const auth_1 = require("../utils/auth");
5
+ const client_1 = require("../client");
6
+ const generated_1 = require("../generated");
7
+ const output_1 = require("../utils/output");
8
+ const api_1 = require("../utils/api");
9
+ const error_1 = require("../utils/error");
10
+ function ticketCommand(program) {
11
+ const ticket = program.command('ticket');
12
+ ticket.description('Manage tickets');
13
+ ticket
14
+ .command('create')
15
+ .description('Create a new ticket')
16
+ .option('--project <slug>', 'Project slug')
17
+ .option('--type <type>', 'Ticket type (BUG|ENHANCEMENT|TASK|QUESTION)')
18
+ .option('--title <title>', 'Ticket title')
19
+ .option('--desc <description>', 'Ticket description')
20
+ .option('--priority <priority>', 'Priority (LOW|MEDIUM|HIGH|CRITICAL)')
21
+ .option('--json', 'Output as JSON')
22
+ .action(async (options) => {
23
+ try {
24
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
25
+ // Validate required options
26
+ if (!projectSlug || !options.type || !options.title) {
27
+ (0, output_1.error)('Missing required options: --project, --type, and --title are required');
28
+ process.exit(3);
29
+ }
30
+ const validTypes = ['BUG', 'ENHANCEMENT', 'TASK', 'QUESTION'];
31
+ if (!validTypes.includes(options.type)) {
32
+ (0, output_1.error)(`Invalid type ${options.type}. Valid values: ${validTypes.join(', ')}`);
33
+ process.exit(3);
34
+ return;
35
+ }
36
+ const validPriorities = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
37
+ if (options.priority && !validPriorities.includes(options.priority)) {
38
+ (0, output_1.error)(`Invalid priority ${options.priority}. Valid values: ${validPriorities.join(', ')}`);
39
+ process.exit(3);
40
+ return;
41
+ }
42
+ const auth = (0, auth_1.resolveAuth)({});
43
+ if (!auth.apiKey || !auth.apiUrl) {
44
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
45
+ process.exit(2);
46
+ return;
47
+ }
48
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
49
+ const response = await generated_1.TicketsService.create(client, projectSlug, {
50
+ type: options.type,
51
+ title: options.title,
52
+ description: options.desc,
53
+ priority: options.priority,
54
+ });
55
+ const ticketData = (0, api_1.unwrap)(response);
56
+ if (options.json) {
57
+ console.log(JSON.stringify(ticketData, null, 2));
58
+ process.exit(0);
59
+ }
60
+ else {
61
+ console.log(`✓ Ticket created successfully: ${ticketData.ref || `KODA-${ticketData.number}`}`);
62
+ process.exit(0);
63
+ }
64
+ }
65
+ catch (err) {
66
+ (0, error_1.handleApiError)(err);
67
+ }
68
+ });
69
+ ticket
70
+ .command('list')
71
+ .description('List tickets')
72
+ .option('--project <slug>', 'Project slug')
73
+ .option('--status <status>', 'Filter by status')
74
+ .option('--type <type>', 'Filter by type')
75
+ .option('--priority <priority>', 'Filter by priority')
76
+ .option('--assigned-to <slug>', 'Filter by assignee')
77
+ .option('--unassigned', 'Show only unassigned tickets')
78
+ .option('--limit <number>', 'Items per page', '20')
79
+ .option('--page <number>', 'Page number', '1')
80
+ .option('--json', 'Output as JSON')
81
+ .action(async (options) => {
82
+ try {
83
+ const auth = (0, auth_1.resolveAuth)({});
84
+ if (!auth.apiKey || !auth.apiUrl) {
85
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
86
+ process.exit(2);
87
+ return;
88
+ }
89
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
90
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
91
+ const response = await generated_1.TicketsService.list(client, {
92
+ projectSlug,
93
+ status: options.status,
94
+ type: options.type,
95
+ priority: options.priority,
96
+ assignedTo: options.assignedTo,
97
+ unassigned: options.unassigned ? true : undefined,
98
+ limit: parseInt(options.limit, 10),
99
+ page: parseInt(options.page, 10),
100
+ });
101
+ const data = (0, api_1.unwrap)(response);
102
+ const items = Array.isArray(data) ? data : data.items || [];
103
+ if (options.json) {
104
+ console.log(JSON.stringify(items, null, 2));
105
+ }
106
+ else {
107
+ const rows = items.map((t) => [
108
+ `KODA-${t.number}`,
109
+ String(t.type),
110
+ String(t.priority || ''),
111
+ String(t.status),
112
+ String(t.assignee?.name || '—'),
113
+ String(t.title),
114
+ ]);
115
+ (0, output_1.table)(['#', 'Type', 'Priority', 'Status', 'Assignee', 'Title'], rows);
116
+ }
117
+ process.exit(0);
118
+ }
119
+ catch (err) {
120
+ (0, error_1.handleApiError)(err);
121
+ }
122
+ });
123
+ ticket
124
+ .command('mine')
125
+ .description('List tickets assigned to me')
126
+ .option('--project <slug>', 'Filter by project')
127
+ .option('--status <status>', 'Filter by status')
128
+ .option('--json', 'Output as JSON')
129
+ .action(async (options) => {
130
+ try {
131
+ const auth = (0, auth_1.resolveAuth)({});
132
+ if (!auth.apiKey || !auth.apiUrl) {
133
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
134
+ process.exit(2);
135
+ return;
136
+ }
137
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
138
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
139
+ const response = await generated_1.TicketsService.list(client, {
140
+ projectSlug,
141
+ status: options.status,
142
+ assignedTo: 'self',
143
+ });
144
+ const data = (0, api_1.unwrap)(response);
145
+ const items = Array.isArray(data) ? data : data.items || [];
146
+ if (options.json) {
147
+ console.log(JSON.stringify(items, null, 2));
148
+ }
149
+ else {
150
+ const rows = items.map((t) => [
151
+ `KODA-${t.number}`,
152
+ String(t.type),
153
+ String(t.priority || ''),
154
+ String(t.status),
155
+ String(t.assignee?.name || '—'),
156
+ String(t.title),
157
+ ]);
158
+ (0, output_1.table)(['#', 'Type', 'Priority', 'Status', 'Assignee', 'Title'], rows);
159
+ }
160
+ process.exit(0);
161
+ }
162
+ catch (err) {
163
+ (0, error_1.handleApiError)(err);
164
+ }
165
+ });
166
+ ticket
167
+ .command('show <ref>')
168
+ .description('Show ticket details')
169
+ .option('--project <slug>', 'Project slug')
170
+ .option('--json', 'Output as JSON')
171
+ .action(async (ref, options) => {
172
+ try {
173
+ const auth = (0, auth_1.resolveAuth)({});
174
+ if (!auth.apiKey || !auth.apiUrl) {
175
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
176
+ process.exit(2);
177
+ return;
178
+ }
179
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
180
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
181
+ const response = await generated_1.TicketsService.show(client, projectSlug, ref);
182
+ const ticketData = (0, api_1.unwrap)(response);
183
+ if (options.json) {
184
+ console.log(JSON.stringify(ticketData, null, 2));
185
+ }
186
+ else {
187
+ console.log(`\n${'Ticket Details'}:`);
188
+ console.log(`ID: ${ticketData.id}`);
189
+ console.log(`Reference: ${ticketData.ref ?? `KODA-${ticketData.number}`}`);
190
+ console.log(`Type: ${ticketData.type}`);
191
+ console.log(`Title: ${ticketData.title}`);
192
+ if (ticketData.description) {
193
+ console.log(`Description: ${ticketData.description}`);
194
+ }
195
+ console.log(`Status: ${ticketData.status}`);
196
+ console.log(`Priority: ${ticketData.priority || 'N/A'}`);
197
+ console.log(`Assignee: ${ticketData.assignee?.name || 'Unassigned'}`);
198
+ console.log(`Created: ${ticketData.createdAt}`);
199
+ console.log(`Updated: ${ticketData.updatedAt}`);
200
+ if (ticketData.comments && ticketData.comments.length > 0) {
201
+ console.log(`\nComments:`);
202
+ for (const comment of ticketData.comments) {
203
+ const author = comment.author?.name || 'Unknown';
204
+ console.log(` - ${author} (${comment.type}): ${comment.body}`);
205
+ }
206
+ }
207
+ }
208
+ process.exit(0);
209
+ }
210
+ catch (err) {
211
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
212
+ }
213
+ });
214
+ ticket
215
+ .command('verify <ref>')
216
+ .description('Verify a ticket (CREATED → VERIFIED)')
217
+ .option('--project <slug>', 'Project slug')
218
+ .option('--comment <text>', 'Verification comment')
219
+ .action(async (ref, options) => {
220
+ try {
221
+ if (!options.comment) {
222
+ (0, output_1.error)('Comment is required');
223
+ process.exit(3);
224
+ return;
225
+ }
226
+ const auth = (0, auth_1.resolveAuth)({});
227
+ if (!auth.apiKey || !auth.apiUrl) {
228
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
229
+ process.exit(2);
230
+ return;
231
+ }
232
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
233
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
234
+ await generated_1.TicketsService.verify(client, projectSlug, ref, {
235
+ body: options.comment,
236
+ type: 'VERIFICATION',
237
+ });
238
+ console.log(`✓ Ticket verified successfully`);
239
+ process.exit(0);
240
+ }
241
+ catch (err) {
242
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
243
+ }
244
+ });
245
+ ticket
246
+ .command('assign <ref>')
247
+ .description('Assign a ticket')
248
+ .option('--project <slug>', 'Project slug')
249
+ .option('--agent <agent-slug>', 'Agent to assign to')
250
+ .option('--to <agent-slug>', 'Agent to assign to (omit for self-assign)')
251
+ .option('--json', 'Output as JSON')
252
+ .action(async (ref, options) => {
253
+ try {
254
+ const auth = (0, auth_1.resolveAuth)({});
255
+ if (!auth.apiKey || !auth.apiUrl) {
256
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
257
+ process.exit(2);
258
+ return;
259
+ }
260
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
261
+ const agentSlug = options.agent ?? options.to ?? 'self';
262
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
263
+ const response = await generated_1.TicketsService.assign(client, projectSlug, ref, { agentSlug });
264
+ const ticketData = (0, api_1.unwrap)(response);
265
+ if (options.json) {
266
+ console.log(JSON.stringify(ticketData, null, 2));
267
+ }
268
+ else {
269
+ console.log(`✓ Ticket assigned successfully`);
270
+ }
271
+ process.exit(0);
272
+ }
273
+ catch (err) {
274
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Agent or ticket not found` });
275
+ }
276
+ });
277
+ ticket
278
+ .command('start <ref>')
279
+ .description('Start a ticket (CREATED or VERIFIED → IN_PROGRESS)')
280
+ .option('--project <slug>', 'Project slug')
281
+ .action(async (ref, options) => {
282
+ try {
283
+ const auth = (0, auth_1.resolveAuth)({});
284
+ if (!auth.apiKey || !auth.apiUrl) {
285
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
286
+ process.exit(2);
287
+ return;
288
+ }
289
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
290
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
291
+ await generated_1.TicketsService.start(client, projectSlug, ref);
292
+ console.log(`✓ Ticket started successfully`);
293
+ process.exit(0);
294
+ }
295
+ catch (err) {
296
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
297
+ }
298
+ });
299
+ ticket
300
+ .command('fix <ref>')
301
+ .description('Submit a fix for a ticket (IN_PROGRESS → VERIFY_FIX)')
302
+ .option('--project <slug>', 'Project slug')
303
+ .option('--comment <text>', 'Fix report comment')
304
+ .option('--git-ref <ref>', 'Git reference (e.g. branch or commit)')
305
+ .action(async (ref, options) => {
306
+ try {
307
+ if (!options.comment) {
308
+ (0, output_1.error)('Comment is required');
309
+ process.exit(3);
310
+ return;
311
+ }
312
+ const auth = (0, auth_1.resolveAuth)({});
313
+ if (!auth.apiKey || !auth.apiUrl) {
314
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
315
+ process.exit(2);
316
+ return;
317
+ }
318
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
319
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
320
+ const payload = {
321
+ body: options.comment,
322
+ type: 'FIX_REPORT',
323
+ };
324
+ if (options.gitRef) {
325
+ payload.gitRef = options.gitRef;
326
+ }
327
+ await generated_1.TicketsService.fix(client, projectSlug, ref, payload);
328
+ console.log(`✓ Fix submitted successfully`);
329
+ process.exit(0);
330
+ }
331
+ catch (err) {
332
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
333
+ }
334
+ });
335
+ ticket
336
+ .command('verify-fix <ref>')
337
+ .description('Verify a fix (VERIFY_FIX → CLOSED or → IN_PROGRESS)')
338
+ .option('--project <slug>', 'Project slug')
339
+ .option('--comment <text>', 'Review comment')
340
+ .option('--pass', 'Mark fix as passing (closes ticket)')
341
+ .option('--fail', 'Mark fix as failing (returns to IN_PROGRESS)')
342
+ .action(async (ref, options) => {
343
+ try {
344
+ if (!options.comment) {
345
+ (0, output_1.error)('Comment is required');
346
+ process.exit(3);
347
+ return;
348
+ }
349
+ const auth = (0, auth_1.resolveAuth)({});
350
+ if (!auth.apiKey || !auth.apiUrl) {
351
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
352
+ process.exit(2);
353
+ return;
354
+ }
355
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
356
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
357
+ const status = options.pass ? 'closed' : 'in_progress';
358
+ await generated_1.TicketsService.verifyFix(client, projectSlug, ref, {
359
+ body: options.comment,
360
+ type: 'REVIEW',
361
+ status,
362
+ });
363
+ console.log(`✓ Fix verification submitted successfully`);
364
+ process.exit(0);
365
+ }
366
+ catch (err) {
367
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
368
+ }
369
+ });
370
+ ticket
371
+ .command('close <ref>')
372
+ .description('Close a ticket')
373
+ .option('--project <slug>', 'Project slug')
374
+ .action(async (ref, options) => {
375
+ try {
376
+ const auth = (0, auth_1.resolveAuth)({});
377
+ if (!auth.apiKey || !auth.apiUrl) {
378
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
379
+ process.exit(2);
380
+ return;
381
+ }
382
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
383
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
384
+ await generated_1.TicketsService.close(client, projectSlug, ref);
385
+ console.log(`✓ Ticket closed successfully`);
386
+ process.exit(0);
387
+ }
388
+ catch (err) {
389
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
390
+ }
391
+ });
392
+ ticket
393
+ .command('reject <ref>')
394
+ .description('Reject a ticket')
395
+ .option('--project <slug>', 'Project slug')
396
+ .option('--comment <text>', 'Rejection reason')
397
+ .action(async (ref, options) => {
398
+ try {
399
+ if (!options.comment) {
400
+ (0, output_1.error)('Comment is required');
401
+ process.exit(3);
402
+ return;
403
+ }
404
+ const auth = (0, auth_1.resolveAuth)({});
405
+ if (!auth.apiKey || !auth.apiUrl) {
406
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
407
+ process.exit(2);
408
+ return;
409
+ }
410
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
411
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
412
+ await generated_1.TicketsService.reject(client, projectSlug, ref, {
413
+ body: options.comment,
414
+ type: 'GENERAL',
415
+ });
416
+ console.log(`✓ Ticket rejected successfully`);
417
+ process.exit(0);
418
+ }
419
+ catch (err) {
420
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
421
+ }
422
+ });
423
+ ticket
424
+ .command('update <ref>')
425
+ .description('Update a ticket')
426
+ .option('--project <slug>', 'Project slug')
427
+ .option('--title <title>', 'New title')
428
+ .option('--desc <description>', 'New description')
429
+ .option('--priority <priority>', 'New priority (LOW|MEDIUM|HIGH|CRITICAL)')
430
+ .option('--json', 'Output as JSON')
431
+ .action(async (ref, options) => {
432
+ try {
433
+ const auth = (0, auth_1.resolveAuth)({});
434
+ if (!auth.apiKey || !auth.apiUrl) {
435
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
436
+ process.exit(2);
437
+ return;
438
+ }
439
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
440
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
441
+ const payload = {};
442
+ if (options.title)
443
+ payload.title = options.title;
444
+ if (options.desc)
445
+ payload.description = options.desc;
446
+ if (options.priority)
447
+ payload.priority = options.priority;
448
+ const response = await generated_1.TicketsService.update(client, projectSlug, ref, payload);
449
+ const ticketData = (0, api_1.unwrap)(response);
450
+ if (options.json) {
451
+ console.log(JSON.stringify(ticketData, null, 2));
452
+ }
453
+ else {
454
+ console.log(`✓ Ticket updated successfully`);
455
+ }
456
+ process.exit(0);
457
+ }
458
+ catch (err) {
459
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
460
+ }
461
+ });
462
+ ticket
463
+ .command('delete <ref>')
464
+ .description('Delete a ticket')
465
+ .option('--project <slug>', 'Project slug')
466
+ .option('--force', 'Confirm deletion')
467
+ .action(async (ref, options) => {
468
+ try {
469
+ if (!options.force) {
470
+ (0, output_1.error)(`Deletion requires --force flag.`);
471
+ process.exit(1);
472
+ }
473
+ const auth = (0, auth_1.resolveAuth)({});
474
+ if (!auth.apiKey || !auth.apiUrl) {
475
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
476
+ process.exit(2);
477
+ return;
478
+ }
479
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
480
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
481
+ await generated_1.TicketsService.delete(client, projectSlug, ref);
482
+ console.log(`✓ Ticket deleted successfully`);
483
+ process.exit(0);
484
+ }
485
+ catch (err) {
486
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
487
+ }
488
+ });
489
+ const ticketLabel = ticket.command('label').description('Manage labels on a ticket');
490
+ ticketLabel
491
+ .command('add <ref>')
492
+ .description('Attach a label to a ticket')
493
+ .option('--project <slug>', 'Project slug')
494
+ .requiredOption('--label <id>', 'Label ID')
495
+ .action(async (ref, options) => {
496
+ try {
497
+ const auth = (0, auth_1.resolveAuth)({});
498
+ if (!auth.apiKey || !auth.apiUrl) {
499
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
500
+ process.exit(2);
501
+ return;
502
+ }
503
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
504
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
505
+ await generated_1.LabelsService.addToTicket(client, projectSlug, ref, options.label);
506
+ console.log(`✓ Label attached to ticket ${ref}`);
507
+ process.exit(0);
508
+ }
509
+ catch (err) {
510
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket or label not found` });
511
+ }
512
+ });
513
+ ticketLabel
514
+ .command('remove <ref>')
515
+ .description('Detach a label from a ticket')
516
+ .option('--project <slug>', 'Project slug')
517
+ .requiredOption('--label <id>', 'Label ID')
518
+ .option('--json', 'Output as JSON')
519
+ .action(async (ref, options) => {
520
+ try {
521
+ const auth = (0, auth_1.resolveAuth)({});
522
+ if (!auth.apiKey || !auth.apiUrl) {
523
+ (0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
524
+ process.exit(2);
525
+ return;
526
+ }
527
+ const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
528
+ const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
529
+ await generated_1.LabelsService.removeFromTicket(client, projectSlug, ref, options.label);
530
+ console.log(`✓ Label detached from ticket ${ref}`);
531
+ process.exit(0);
532
+ }
533
+ catch (err) {
534
+ (0, error_1.handleApiError)(err, { notFoundMessage: `Ticket or label not found` });
535
+ }
536
+ });
537
+ }
538
+ //# sourceMappingURL=ticket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../src/commands/ticket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface Config {
2
+ apiKey: string;
3
+ apiUrl: string;
4
+ }
5
+ export declare function validateApiKey(apiKey: string | undefined): boolean;
6
+ export declare function getConfig(): Config;
7
+ export declare function setConfig(partial: Partial<Config>): void;
8
+ export declare function maskApiKey(apiKey: string): string;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMlE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAWxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBjD"}
package/dist/config.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateApiKey = validateApiKey;
7
+ exports.getConfig = getConfig;
8
+ exports.setConfig = setConfig;
9
+ exports.maskApiKey = maskApiKey;
10
+ const conf_1 = __importDefault(require("conf"));
11
+ const os_1 = require("os");
12
+ const path_1 = require("path");
13
+ const schema = {
14
+ apiKey: {
15
+ type: 'string',
16
+ default: '',
17
+ },
18
+ apiUrl: {
19
+ type: 'string',
20
+ default: '',
21
+ },
22
+ };
23
+ const store = new conf_1.default({
24
+ cwd: (0, path_1.join)((0, os_1.homedir)(), '.koda'),
25
+ configName: 'config',
26
+ schema,
27
+ });
28
+ function validateApiKey(apiKey) {
29
+ if (!apiKey || typeof apiKey !== 'string') {
30
+ return false;
31
+ }
32
+ // API key must be at least 10 characters
33
+ return apiKey.length >= 10;
34
+ }
35
+ function getConfig() {
36
+ return {
37
+ apiKey: store.get('apiKey') || '',
38
+ apiUrl: store.get('apiUrl') || '',
39
+ };
40
+ }
41
+ function setConfig(partial) {
42
+ if (partial.apiKey !== undefined) {
43
+ if (!validateApiKey(partial.apiKey)) {
44
+ throw new Error('Invalid API key: must be at least 10 characters');
45
+ }
46
+ store.set('apiKey', partial.apiKey);
47
+ }
48
+ if (partial.apiUrl !== undefined) {
49
+ store.set('apiUrl', partial.apiUrl);
50
+ }
51
+ }
52
+ function maskApiKey(apiKey) {
53
+ if (!apiKey || apiKey.length < 4) {
54
+ return '****';
55
+ }
56
+ // If key starts with 'sk-proj-', preserve that prefix and mask the rest
57
+ if (apiKey.startsWith('sk-proj-')) {
58
+ const prefix = 'sk-proj-';
59
+ const rest = apiKey.slice(prefix.length);
60
+ // Mask all characters in the rest with asterisks
61
+ const masked = '*'.repeat(Math.max(4, rest.length));
62
+ return `${prefix}${masked}`;
63
+ }
64
+ // For other keys, show last 6 characters with *** prefix
65
+ const visible = apiKey.slice(-6);
66
+ return `***${visible}`;
67
+ }
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AA0BA,wCAMC;AAED,8BAKC;AAED,8BAWC;AAED,gCAiBC;AAvED,gDAAwB;AACxB,2BAA6B;AAC7B,+BAA4B;AAE5B,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;KACZ;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;KACZ;CACF,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,cAAI,CAAC;IACrB,GAAG,EAAE,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,QAAQ;IACpB,MAAM;CACP,CAAC,CAAC;AAOH,SAAgB,cAAc,CAAC,MAA0B;IACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,yCAAyC;IACzC,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO;QACL,MAAM,EAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAY,IAAI,EAAE;QAC7C,MAAM,EAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAY,IAAI,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAC,OAAwB;IAChD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wEAAwE;IACxE,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,iDAAiD;QACjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,yDAAyD;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,MAAM,OAAO,EAAE,CAAC;AACzB,CAAC"}