@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.
- package/README.md +140 -0
- package/dist/bin/tracker.d.ts +3 -0
- package/dist/bin/tracker.d.ts.map +1 -0
- package/dist/bin/tracker.js +45 -0
- package/dist/bin/tracker.js.map +1 -0
- package/dist/src/client/pagination.d.ts +7 -0
- package/dist/src/client/pagination.d.ts.map +1 -0
- package/dist/src/client/pagination.js +31 -0
- package/dist/src/client/pagination.js.map +1 -0
- package/dist/src/client/tracker-client.d.ts +31 -0
- package/dist/src/client/tracker-client.d.ts.map +1 -0
- package/dist/src/client/tracker-client.js +148 -0
- package/dist/src/client/tracker-client.js.map +1 -0
- package/dist/src/client/types.d.ts +143 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/client/types.js +2 -0
- package/dist/src/client/types.js.map +1 -0
- package/dist/src/commands/checklist.d.ts +3 -0
- package/dist/src/commands/checklist.d.ts.map +1 -0
- package/dist/src/commands/checklist.js +72 -0
- package/dist/src/commands/checklist.js.map +1 -0
- package/dist/src/commands/comment.d.ts +3 -0
- package/dist/src/commands/comment.d.ts.map +1 -0
- package/dist/src/commands/comment.js +52 -0
- package/dist/src/commands/comment.js.map +1 -0
- package/dist/src/commands/create.d.ts +3 -0
- package/dist/src/commands/create.d.ts.map +1 -0
- package/dist/src/commands/create.js +50 -0
- package/dist/src/commands/create.js.map +1 -0
- package/dist/src/commands/init.d.ts +3 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +59 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/link.d.ts +3 -0
- package/dist/src/commands/link.d.ts.map +1 -0
- package/dist/src/commands/link.js +43 -0
- package/dist/src/commands/link.js.map +1 -0
- package/dist/src/commands/sprint.d.ts +3 -0
- package/dist/src/commands/sprint.d.ts.map +1 -0
- package/dist/src/commands/sprint.js +54 -0
- package/dist/src/commands/sprint.js.map +1 -0
- package/dist/src/commands/status.d.ts +3 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +40 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/tasks.d.ts +4 -0
- package/dist/src/commands/tasks.d.ts.map +1 -0
- package/dist/src/commands/tasks.js +63 -0
- package/dist/src/commands/tasks.js.map +1 -0
- package/dist/src/commands/time.d.ts +3 -0
- package/dist/src/commands/time.d.ts.map +1 -0
- package/dist/src/commands/time.js +149 -0
- package/dist/src/commands/time.js.map +1 -0
- package/dist/src/config/auth.d.ts +2 -0
- package/dist/src/config/auth.d.ts.map +1 -0
- package/dist/src/config/auth.js +9 -0
- package/dist/src/config/auth.js.map +1 -0
- package/dist/src/config/config.d.ts +10 -0
- package/dist/src/config/config.d.ts.map +1 -0
- package/dist/src/config/config.js +79 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/config.schema.d.ts +67 -0
- package/dist/src/config/config.schema.d.ts.map +1 -0
- package/dist/src/config/config.schema.js +22 -0
- package/dist/src/config/config.schema.js.map +1 -0
- package/dist/src/formatters/json.d.ts +3 -0
- package/dist/src/formatters/json.d.ts.map +1 -0
- package/dist/src/formatters/json.js +7 -0
- package/dist/src/formatters/json.js.map +1 -0
- package/dist/src/formatters/table.d.ts +9 -0
- package/dist/src/formatters/table.d.ts.map +1 -0
- package/dist/src/formatters/table.js +150 -0
- package/dist/src/formatters/table.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils/error.d.ts +8 -0
- package/dist/src/utils/error.d.ts.map +1 -0
- package/dist/src/utils/error.js +52 -0
- package/dist/src/utils/error.js.map +1 -0
- package/dist/src/utils/key-resolver.d.ts +2 -0
- package/dist/src/utils/key-resolver.d.ts.map +1 -0
- package/dist/src/utils/key-resolver.js +10 -0
- package/dist/src/utils/key-resolver.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|