@polza-ai/yandex-tracker-cli 0.1.0

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 (86) hide show
  1. package/README.md +140 -0
  2. package/dist/bin/tracker.d.ts +3 -0
  3. package/dist/bin/tracker.d.ts.map +1 -0
  4. package/dist/bin/tracker.js +45 -0
  5. package/dist/bin/tracker.js.map +1 -0
  6. package/dist/src/client/pagination.d.ts +7 -0
  7. package/dist/src/client/pagination.d.ts.map +1 -0
  8. package/dist/src/client/pagination.js +31 -0
  9. package/dist/src/client/pagination.js.map +1 -0
  10. package/dist/src/client/tracker-client.d.ts +31 -0
  11. package/dist/src/client/tracker-client.d.ts.map +1 -0
  12. package/dist/src/client/tracker-client.js +148 -0
  13. package/dist/src/client/tracker-client.js.map +1 -0
  14. package/dist/src/client/types.d.ts +143 -0
  15. package/dist/src/client/types.d.ts.map +1 -0
  16. package/dist/src/client/types.js +2 -0
  17. package/dist/src/client/types.js.map +1 -0
  18. package/dist/src/commands/checklist.d.ts +3 -0
  19. package/dist/src/commands/checklist.d.ts.map +1 -0
  20. package/dist/src/commands/checklist.js +72 -0
  21. package/dist/src/commands/checklist.js.map +1 -0
  22. package/dist/src/commands/comment.d.ts +3 -0
  23. package/dist/src/commands/comment.d.ts.map +1 -0
  24. package/dist/src/commands/comment.js +52 -0
  25. package/dist/src/commands/comment.js.map +1 -0
  26. package/dist/src/commands/create.d.ts +3 -0
  27. package/dist/src/commands/create.d.ts.map +1 -0
  28. package/dist/src/commands/create.js +50 -0
  29. package/dist/src/commands/create.js.map +1 -0
  30. package/dist/src/commands/init.d.ts +3 -0
  31. package/dist/src/commands/init.d.ts.map +1 -0
  32. package/dist/src/commands/init.js +59 -0
  33. package/dist/src/commands/init.js.map +1 -0
  34. package/dist/src/commands/link.d.ts +3 -0
  35. package/dist/src/commands/link.d.ts.map +1 -0
  36. package/dist/src/commands/link.js +43 -0
  37. package/dist/src/commands/link.js.map +1 -0
  38. package/dist/src/commands/sprint.d.ts +3 -0
  39. package/dist/src/commands/sprint.d.ts.map +1 -0
  40. package/dist/src/commands/sprint.js +54 -0
  41. package/dist/src/commands/sprint.js.map +1 -0
  42. package/dist/src/commands/status.d.ts +3 -0
  43. package/dist/src/commands/status.d.ts.map +1 -0
  44. package/dist/src/commands/status.js +40 -0
  45. package/dist/src/commands/status.js.map +1 -0
  46. package/dist/src/commands/tasks.d.ts +4 -0
  47. package/dist/src/commands/tasks.d.ts.map +1 -0
  48. package/dist/src/commands/tasks.js +63 -0
  49. package/dist/src/commands/tasks.js.map +1 -0
  50. package/dist/src/commands/time.d.ts +3 -0
  51. package/dist/src/commands/time.d.ts.map +1 -0
  52. package/dist/src/commands/time.js +149 -0
  53. package/dist/src/commands/time.js.map +1 -0
  54. package/dist/src/config/auth.d.ts +2 -0
  55. package/dist/src/config/auth.d.ts.map +1 -0
  56. package/dist/src/config/auth.js +9 -0
  57. package/dist/src/config/auth.js.map +1 -0
  58. package/dist/src/config/config.d.ts +10 -0
  59. package/dist/src/config/config.d.ts.map +1 -0
  60. package/dist/src/config/config.js +79 -0
  61. package/dist/src/config/config.js.map +1 -0
  62. package/dist/src/config/config.schema.d.ts +67 -0
  63. package/dist/src/config/config.schema.d.ts.map +1 -0
  64. package/dist/src/config/config.schema.js +22 -0
  65. package/dist/src/config/config.schema.js.map +1 -0
  66. package/dist/src/formatters/json.d.ts +3 -0
  67. package/dist/src/formatters/json.d.ts.map +1 -0
  68. package/dist/src/formatters/json.js +7 -0
  69. package/dist/src/formatters/json.js.map +1 -0
  70. package/dist/src/formatters/table.d.ts +9 -0
  71. package/dist/src/formatters/table.d.ts.map +1 -0
  72. package/dist/src/formatters/table.js +150 -0
  73. package/dist/src/formatters/table.js.map +1 -0
  74. package/dist/src/index.d.ts +5 -0
  75. package/dist/src/index.d.ts.map +1 -0
  76. package/dist/src/index.js +3 -0
  77. package/dist/src/index.js.map +1 -0
  78. package/dist/src/utils/error.d.ts +8 -0
  79. package/dist/src/utils/error.d.ts.map +1 -0
  80. package/dist/src/utils/error.js +52 -0
  81. package/dist/src/utils/error.js.map +1 -0
  82. package/dist/src/utils/key-resolver.d.ts +2 -0
  83. package/dist/src/utils/key-resolver.d.ts.map +1 -0
  84. package/dist/src/utils/key-resolver.js +10 -0
  85. package/dist/src/utils/key-resolver.js.map +1 -0
  86. package/package.json +45 -0
@@ -0,0 +1,72 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { resolveKey } from '../utils/key-resolver.js';
4
+ import { handleApiError } from '../utils/error.js';
5
+ import { jsonOutput } from '../formatters/json.js';
6
+ import { formatChecklist } from '../formatters/table.js';
7
+ import chalk from 'chalk';
8
+ export function registerChecklistCommand(program) {
9
+ program
10
+ .command('checklist <key> [action] [text]')
11
+ .description('Чеклист задачи: (без аргументов — показать), add <text>, check <номер>')
12
+ .option('--json', 'Вывод в JSON')
13
+ .action(async (key, action, text, opts) => {
14
+ try {
15
+ const config = await loadConfig();
16
+ const client = new TrackerClient(config);
17
+ const resolvedKey = resolveKey(key, config.queue);
18
+ if (!action) {
19
+ const items = await client.getChecklist(resolvedKey);
20
+ if (opts.json) {
21
+ process.stdout.write(jsonOutput(items) + '\n');
22
+ }
23
+ else {
24
+ console.log(formatChecklist(items));
25
+ }
26
+ return;
27
+ }
28
+ if (action === 'add') {
29
+ if (!text) {
30
+ console.error('Укажите текст пункта чеклиста.');
31
+ process.exit(1);
32
+ }
33
+ const item = await client.addChecklistItem(resolvedKey, text);
34
+ if (opts.json) {
35
+ process.stdout.write(jsonOutput(item) + '\n');
36
+ }
37
+ else {
38
+ console.log(`${chalk.green('✓')} Пункт добавлен в чеклист ${resolvedKey}`);
39
+ }
40
+ return;
41
+ }
42
+ if (action === 'check') {
43
+ if (!text) {
44
+ console.error('Укажите номер пункта.');
45
+ process.exit(1);
46
+ }
47
+ const items = await client.getChecklist(resolvedKey);
48
+ const index = parseInt(text, 10) - 1;
49
+ if (index < 0 || index >= items.length) {
50
+ console.error(`Пункт ${text} не найден. Всего пунктов: ${items.length}`);
51
+ process.exit(1);
52
+ }
53
+ const item = items[index];
54
+ await client.toggleChecklistItem(resolvedKey, item.id, !item.checked);
55
+ const icon = !item.checked ? chalk.green('✓') : chalk.gray('○');
56
+ if (opts.json) {
57
+ process.stdout.write(jsonOutput({ ...item, checked: !item.checked }) + '\n');
58
+ }
59
+ else {
60
+ console.log(`${icon} Пункт "${item.text}" — ${!item.checked ? 'выполнен' : 'не выполнен'}`);
61
+ }
62
+ return;
63
+ }
64
+ console.error(`Неизвестное действие: ${action}. Используйте: add, check`);
65
+ process.exit(1);
66
+ }
67
+ catch (error) {
68
+ handleApiError(error);
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../src/commands/checklist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,iCAAiC,CAAC;SAC1C,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,MAA0B,EAAE,IAAwB,EAAE,IAAI,EAAE,EAAE;QACxF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBACrD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC9D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACvC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,8BAA8B,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC/E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;gBAC9F,CAAC;gBACD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,2BAA2B,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCommentCommand(program: Command): void;
3
+ //# sourceMappingURL=comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../../src/commands/comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C7D"}
@@ -0,0 +1,52 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { loadConfig } from '../config/config.js';
3
+ import { TrackerClient } from '../client/tracker-client.js';
4
+ import { resolveKey } from '../utils/key-resolver.js';
5
+ import { handleApiError } from '../utils/error.js';
6
+ import { jsonOutput } from '../formatters/json.js';
7
+ import { formatComments } from '../formatters/table.js';
8
+ import chalk from 'chalk';
9
+ export function registerCommentCommand(program) {
10
+ program
11
+ .command('comment <key> [text]')
12
+ .description('Добавить или показать комментарии')
13
+ .option('-f, --file <path>', 'Текст комментария из файла')
14
+ .option('-l, --list', 'Показать все комментарии')
15
+ .option('--json', 'Вывод в JSON')
16
+ .action(async (key, text, opts) => {
17
+ try {
18
+ const config = await loadConfig();
19
+ const client = new TrackerClient(config);
20
+ const resolvedKey = resolveKey(key, config.queue);
21
+ if (opts.list || (!text && !opts.file)) {
22
+ const comments = await client.getComments(resolvedKey);
23
+ if (opts.json) {
24
+ process.stdout.write(jsonOutput(comments) + '\n');
25
+ }
26
+ else {
27
+ console.log(formatComments(comments));
28
+ }
29
+ return;
30
+ }
31
+ let commentText = text;
32
+ if (opts.file) {
33
+ commentText = await readFile(opts.file, 'utf-8');
34
+ }
35
+ if (!commentText) {
36
+ console.error('Укажите текст комментария или используйте --file.');
37
+ process.exit(1);
38
+ }
39
+ const comment = await client.addComment(resolvedKey, commentText);
40
+ if (opts.json) {
41
+ process.stdout.write(jsonOutput(comment) + '\n');
42
+ }
43
+ else {
44
+ console.log(`${chalk.green('✓')} Комментарий добавлен к ${resolvedKey}`);
45
+ }
46
+ }
47
+ catch (error) {
48
+ handleApiError(error);
49
+ }
50
+ });
51
+ }
52
+ //# sourceMappingURL=comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.js","sourceRoot":"","sources":["../../../src/commands/comment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAAwB,EAAE,IAAI,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBACvD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAElE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCreateCommand(program: Command): void;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C5D"}
@@ -0,0 +1,50 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { handleApiError } from '../utils/error.js';
4
+ import { jsonOutput } from '../formatters/json.js';
5
+ import { formatIssueDetail } from '../formatters/table.js';
6
+ export function registerCreateCommand(program) {
7
+ program
8
+ .command('create')
9
+ .description('Создать задачу')
10
+ .requiredOption('-s, --summary <text>', 'Название задачи')
11
+ .option('-d, --description <text>', 'Описание')
12
+ .option('-q, --queue <queue>', 'Очередь')
13
+ .option('-t, --type <type>', 'Тип (task, bug, story...)', 'task')
14
+ .option('-p, --priority <priority>', 'Приоритет (blocker, critical, major, normal, minor)')
15
+ .option('-a, --assignee <login>', 'Исполнитель')
16
+ .option('--parent <key>', 'Родительская задача')
17
+ .option('--tag <tags...>', 'Теги')
18
+ .option('--json', 'Вывод в JSON')
19
+ .action(async (opts) => {
20
+ try {
21
+ const config = await loadConfig();
22
+ const queue = opts.queue ?? config.queue;
23
+ if (!queue) {
24
+ console.error('Очередь не указана. Используйте --queue или добавьте queue в конфиг.');
25
+ process.exit(1);
26
+ }
27
+ const client = new TrackerClient(config);
28
+ const issue = await client.createIssue({
29
+ queue,
30
+ summary: opts.summary,
31
+ description: opts.description,
32
+ type: opts.type,
33
+ priority: opts.priority,
34
+ assignee: opts.assignee,
35
+ parent: opts.parent,
36
+ tags: opts.tag,
37
+ });
38
+ if (opts.json) {
39
+ process.stdout.write(jsonOutput(issue) + '\n');
40
+ }
41
+ else {
42
+ console.log(formatIssueDetail(issue));
43
+ }
44
+ }
45
+ catch (error) {
46
+ handleApiError(error);
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,cAAc,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;SACzD,MAAM,CAAC,0BAA0B,EAAE,UAAU,CAAC;SAC9C,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC;SACxC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAChE,MAAM,CAAC,2BAA2B,EAAE,qDAAqD,CAAC;SAC1F,MAAM,CAAC,wBAAwB,EAAE,aAAa,CAAC;SAC/C,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;SACjC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;gBACrC,KAAK;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,GAAG;aACf,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0D1D"}
@@ -0,0 +1,59 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ import { saveGlobalConfig, saveProjectConfig, GLOBAL_CONFIG_PATH } from '../config/config.js';
4
+ async function prompt(rl, question, defaultValue) {
5
+ const suffix = defaultValue ? ` [${defaultValue}]` : '';
6
+ const answer = await rl.question(`${question}${suffix}: `);
7
+ return answer.trim() || defaultValue || '';
8
+ }
9
+ export function registerInitCommand(program) {
10
+ program
11
+ .command('init')
12
+ .description('Настроить подключение к Yandex Tracker')
13
+ .option('--project', 'Создать также конфиг проекта (.tracker.json)')
14
+ .action(async (opts) => {
15
+ const rl = createInterface({ input: stdin, output: stdout });
16
+ try {
17
+ console.log('\n🔧 Настройка Yandex Tracker CLI\n');
18
+ const tokenType = await prompt(rl, 'Тип токена (oauth/iam)', 'oauth');
19
+ const token = await prompt(rl, `${tokenType === 'iam' ? 'IAM' : 'OAuth'} токен`);
20
+ if (!token) {
21
+ console.error('Токен обязателен.');
22
+ process.exit(1);
23
+ }
24
+ const orgType = await prompt(rl, 'Тип организации (yandex360/cloud)', 'yandex360');
25
+ const orgId = orgType === 'cloud'
26
+ ? undefined
27
+ : await prompt(rl, 'ID организации (X-Org-ID)');
28
+ const cloudOrgId = orgType === 'cloud'
29
+ ? await prompt(rl, 'Cloud Org ID (X-Cloud-Org-ID)')
30
+ : undefined;
31
+ const defaultQueue = await prompt(rl, 'Очередь по умолчанию (например BACKEND)', '');
32
+ const config = {
33
+ token,
34
+ tokenType,
35
+ ...(orgId && { orgId }),
36
+ ...(cloudOrgId && { cloudOrgId }),
37
+ ...(defaultQueue && { defaultQueue }),
38
+ apiBaseUrl: 'https://api.tracker.yandex.net/v2',
39
+ };
40
+ await saveGlobalConfig(config);
41
+ console.log(`\n✅ Конфигурация сохранена в ${GLOBAL_CONFIG_PATH}`);
42
+ if (opts.project) {
43
+ const queue = await prompt(rl, 'Очередь проекта', defaultQueue);
44
+ const boardIdStr = await prompt(rl, 'ID доски (для спринтов, Enter — пропустить)', '');
45
+ const boardId = boardIdStr ? parseInt(boardIdStr, 10) : undefined;
46
+ await saveProjectConfig({
47
+ ...(queue && { queue }),
48
+ ...(boardId && { boardId }),
49
+ });
50
+ console.log('✅ Конфиг проекта сохранён в .tracker.json');
51
+ }
52
+ console.log('\nГотово! Попробуйте: tracker tasks\n');
53
+ }
54
+ finally {
55
+ rl.close();
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLinkCommand(program: Command): void;
3
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/commands/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC1D"}
@@ -0,0 +1,43 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { resolveKey } from '../utils/key-resolver.js';
4
+ import { handleApiError } from '../utils/error.js';
5
+ import { jsonOutput } from '../formatters/json.js';
6
+ import { formatLinks } from '../formatters/table.js';
7
+ import chalk from 'chalk';
8
+ export function registerLinkCommand(program) {
9
+ program
10
+ .command('link <key> [target]')
11
+ .description('Связать задачи или показать связи')
12
+ .option('-t, --type <type>', 'Тип связи (relates, blocks, depends, duplicates)', 'relates')
13
+ .option('--json', 'Вывод в JSON')
14
+ .action(async (key, target, opts) => {
15
+ try {
16
+ const config = await loadConfig();
17
+ const client = new TrackerClient(config);
18
+ const resolvedKey = resolveKey(key, config.queue);
19
+ if (!target) {
20
+ const links = await client.getLinks(resolvedKey);
21
+ if (opts.json) {
22
+ process.stdout.write(jsonOutput(links) + '\n');
23
+ }
24
+ else {
25
+ console.log(formatLinks(links));
26
+ }
27
+ return;
28
+ }
29
+ const resolvedTarget = resolveKey(target, config.queue);
30
+ const link = await client.createLink(resolvedKey, resolvedTarget, opts.type);
31
+ if (opts.json) {
32
+ process.stdout.write(jsonOutput(link) + '\n');
33
+ }
34
+ else {
35
+ console.log(`${chalk.green('✓')} ${resolvedKey} → ${resolvedTarget} (${opts.type})`);
36
+ }
37
+ }
38
+ catch (error) {
39
+ handleApiError(error);
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/commands/link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,EAAE,SAAS,CAAC;SAC1F,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,MAA0B,EAAE,IAAI,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,MAAM,cAAc,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSprintCommand(program: Command): void;
3
+ //# sourceMappingURL=sprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgD5D"}
@@ -0,0 +1,54 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { handleApiError } from '../utils/error.js';
4
+ import { jsonOutput } from '../formatters/json.js';
5
+ import { formatSprint, formatIssueList } from '../formatters/table.js';
6
+ export function registerSprintCommand(program) {
7
+ program
8
+ .command('sprint')
9
+ .description('Текущий спринт')
10
+ .option('-b, --board <id>', 'ID доски')
11
+ .option('--tasks', 'Показать задачи спринта')
12
+ .option('--json', 'Вывод в JSON')
13
+ .action(async (opts) => {
14
+ try {
15
+ const config = await loadConfig();
16
+ const boardId = opts.board ? parseInt(opts.board, 10) : config.boardId;
17
+ if (!boardId) {
18
+ console.error('ID доски не указан. Используйте --board <id> или добавьте boardId в .tracker.json');
19
+ process.exit(1);
20
+ }
21
+ const client = new TrackerClient(config);
22
+ const sprint = await client.getCurrentSprint(boardId);
23
+ if (!sprint) {
24
+ console.log('Активный спринт не найден.');
25
+ return;
26
+ }
27
+ if (opts.tasks) {
28
+ const issues = await client.searchIssues({
29
+ queue: config.queue,
30
+ sprint: sprint.display,
31
+ });
32
+ if (opts.json) {
33
+ process.stdout.write(jsonOutput({ sprint, issues }) + '\n');
34
+ }
35
+ else {
36
+ console.log(formatSprint(sprint));
37
+ console.log(formatIssueList(issues));
38
+ }
39
+ }
40
+ else {
41
+ if (opts.json) {
42
+ process.stdout.write(jsonOutput(sprint) + '\n');
43
+ }
44
+ else {
45
+ console.log(formatSprint(sprint));
46
+ }
47
+ }
48
+ }
49
+ catch (error) {
50
+ handleApiError(error);
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=sprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint.js","sourceRoot":"","sources":["../../../src/commands/sprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;SACtC,MAAM,CAAC,SAAS,EAAE,yBAAyB,CAAC;SAC5C,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;gBACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,OAAO;iBACvB,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC5D"}
@@ -0,0 +1,40 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { resolveKey } from '../utils/key-resolver.js';
4
+ import { handleApiError, TrackerCliError } from '../utils/error.js';
5
+ import { jsonOutput } from '../formatters/json.js';
6
+ import chalk from 'chalk';
7
+ export function registerStatusCommand(program) {
8
+ program
9
+ .command('status <key> <status>')
10
+ .description('Изменить статус задачи (open, inProgress, review, testing, closed)')
11
+ .option('-c, --comment <text>', 'Комментарий к переходу')
12
+ .option('--json', 'Вывод в JSON')
13
+ .action(async (key, targetStatus, opts) => {
14
+ try {
15
+ const config = await loadConfig();
16
+ const client = new TrackerClient(config);
17
+ const resolvedKey = resolveKey(key, config.queue);
18
+ const mappedStatus = config.statusMap[targetStatus] ?? targetStatus;
19
+ const transitions = await client.getTransitions(resolvedKey);
20
+ const transition = transitions.find(t => t.to.key === mappedStatus ||
21
+ t.to.display.toLowerCase() === mappedStatus.toLowerCase() ||
22
+ t.id === mappedStatus);
23
+ if (!transition) {
24
+ const available = transitions.map(t => ` ${t.to.key} (${t.to.display})`).join('\n');
25
+ throw new TrackerCliError(`Переход в "${targetStatus}" невозможен из текущего статуса.\n\nДоступные переходы:\n${available}`, 'INVALID_TRANSITION', 4);
26
+ }
27
+ await client.executeTransition(resolvedKey, transition.id, opts.comment);
28
+ if (opts.json) {
29
+ process.stdout.write(jsonOutput({ key: resolvedKey, status: transition.to }) + '\n');
30
+ }
31
+ else {
32
+ console.log(`${chalk.green('✓')} ${resolvedKey}: статус изменён на ${chalk.bold(transition.to.display)}`);
33
+ }
34
+ }
35
+ catch (error) {
36
+ handleApiError(error);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,YAAoB,EAAE,IAAI,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC;YAEpE,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,YAAY;gBACzB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE;gBACzD,CAAC,CAAC,EAAE,KAAK,YAAY,CAC3B,CAAC;YAEF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,IAAI,eAAe,CACvB,cAAc,YAAY,6DAA6D,SAAS,EAAE,EAClG,oBAAoB,EACpB,CAAC,CACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,uBAAuB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTaskCommand(program: Command): void;
3
+ export declare function registerTasksCommand(program: Command): void;
4
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB1D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC3D"}
@@ -0,0 +1,63 @@
1
+ import { loadConfig } from '../config/config.js';
2
+ import { TrackerClient } from '../client/tracker-client.js';
3
+ import { resolveKey } from '../utils/key-resolver.js';
4
+ import { handleApiError } from '../utils/error.js';
5
+ import { jsonOutput } from '../formatters/json.js';
6
+ import { formatIssueList, formatIssueDetail } from '../formatters/table.js';
7
+ export function registerTaskCommand(program) {
8
+ program
9
+ .command('task <key>')
10
+ .description('Показать детали задачи')
11
+ .option('--json', 'Вывод в JSON')
12
+ .action(async (key, opts) => {
13
+ try {
14
+ const config = await loadConfig();
15
+ const client = new TrackerClient(config);
16
+ const resolvedKey = resolveKey(key, config.queue);
17
+ const issue = await client.getIssue(resolvedKey);
18
+ if (opts.json) {
19
+ process.stdout.write(jsonOutput(issue) + '\n');
20
+ }
21
+ else {
22
+ console.log(formatIssueDetail(issue));
23
+ }
24
+ }
25
+ catch (error) {
26
+ handleApiError(error);
27
+ }
28
+ });
29
+ }
30
+ export function registerTasksCommand(program) {
31
+ program
32
+ .command('tasks')
33
+ .description('Поиск и список задач')
34
+ .option('-q, --queue <queue>', 'Очередь')
35
+ .option('-a, --assignee <login>', 'Исполнитель (me — текущий пользователь)')
36
+ .option('-s, --status <status>', 'Статус')
37
+ .option('--sprint <sprint>', 'Спринт')
38
+ .option('--query <tql>', 'Произвольный TQL-запрос')
39
+ .option('--json', 'Вывод в JSON')
40
+ .action(async (opts) => {
41
+ try {
42
+ const config = await loadConfig();
43
+ const client = new TrackerClient(config);
44
+ const issues = await client.searchIssues({
45
+ queue: opts.queue ?? config.queue,
46
+ assignee: opts.assignee,
47
+ status: opts.status,
48
+ sprint: opts.sprint,
49
+ query: opts.query,
50
+ });
51
+ if (opts.json) {
52
+ process.stdout.write(jsonOutput(issues) + '\n');
53
+ }
54
+ else {
55
+ console.log(formatIssueList(issues));
56
+ }
57
+ }
58
+ catch (error) {
59
+ handleApiError(error);
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTimeCommand(program: Command): void;
3
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/commands/time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiEpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiG1D"}