@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,149 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { loadConfig } from '../config/config.js';
6
+ import { TrackerClient } from '../client/tracker-client.js';
7
+ import { resolveKey } from '../utils/key-resolver.js';
8
+ import { handleApiError } from '../utils/error.js';
9
+ import { jsonOutput } from '../formatters/json.js';
10
+ import { formatWorklogs } from '../formatters/table.js';
11
+ import chalk from 'chalk';
12
+ const TIMERS_DIR = join(homedir(), '.tracker-cli');
13
+ const TIMERS_FILE = join(TIMERS_DIR, 'timers.json');
14
+ async function loadTimers() {
15
+ try {
16
+ const content = await readFile(TIMERS_FILE, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ async function saveTimers(timers) {
24
+ if (!existsSync(TIMERS_DIR)) {
25
+ await mkdir(TIMERS_DIR, { recursive: true });
26
+ }
27
+ await writeFile(TIMERS_FILE, JSON.stringify(timers, null, 2));
28
+ }
29
+ function parseDuration(input) {
30
+ const regex = /(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?/;
31
+ const match = input.match(regex);
32
+ if (!match || (!match[1] && !match[2] && !match[3])) {
33
+ throw new Error(`Не удалось разобрать длительность: "${input}". Примеры: 2h30m, 1d, 45m`);
34
+ }
35
+ const days = parseInt(match[1] || '0', 10);
36
+ const hours = parseInt(match[2] || '0', 10) + days * 8;
37
+ const minutes = parseInt(match[3] || '0', 10);
38
+ let iso = 'PT';
39
+ if (hours > 0)
40
+ iso += `${hours}H`;
41
+ if (minutes > 0)
42
+ iso += `${minutes}M`;
43
+ if (iso === 'PT')
44
+ iso += '0M';
45
+ return iso;
46
+ }
47
+ function formatElapsed(ms) {
48
+ const totalMinutes = Math.round(ms / 60000);
49
+ const hours = Math.floor(totalMinutes / 60);
50
+ const minutes = totalMinutes % 60;
51
+ const parts = [];
52
+ if (hours > 0)
53
+ parts.push(`${hours}h`);
54
+ if (minutes > 0 || parts.length === 0)
55
+ parts.push(`${minutes}m`);
56
+ return parts.join('');
57
+ }
58
+ export function registerTimeCommand(program) {
59
+ program
60
+ .command('time <key> <action> [duration]')
61
+ .description('Трекинг времени: start, stop, log <duration>, show')
62
+ .option('-c, --comment <text>', 'Комментарий')
63
+ .option('--json', 'Вывод в JSON')
64
+ .action(async (key, action, duration, opts) => {
65
+ try {
66
+ const config = await loadConfig();
67
+ const client = new TrackerClient(config);
68
+ const resolvedKey = resolveKey(key, config.queue);
69
+ switch (action) {
70
+ case 'start': {
71
+ const timers = await loadTimers();
72
+ if (timers[resolvedKey]) {
73
+ console.log(`${chalk.yellow('⚠')} Таймер для ${resolvedKey} уже запущен.`);
74
+ return;
75
+ }
76
+ timers[resolvedKey] = new Date().toISOString();
77
+ await saveTimers(timers);
78
+ if (opts.json) {
79
+ process.stdout.write(jsonOutput({ key: resolvedKey, action: 'start', startedAt: timers[resolvedKey] }) + '\n');
80
+ }
81
+ else {
82
+ console.log(`${chalk.green('▶')} Таймер запущен для ${resolvedKey}`);
83
+ }
84
+ break;
85
+ }
86
+ case 'stop': {
87
+ const timers = await loadTimers();
88
+ const startTime = timers[resolvedKey];
89
+ if (!startTime) {
90
+ console.error(`Таймер для ${resolvedKey} не запущен.`);
91
+ process.exit(1);
92
+ }
93
+ const elapsed = Date.now() - new Date(startTime).getTime();
94
+ const durationStr = formatElapsed(elapsed);
95
+ const isoDuration = parseDuration(durationStr);
96
+ delete timers[resolvedKey];
97
+ await saveTimers(timers);
98
+ const worklog = await client.addWorklog(resolvedKey, {
99
+ duration: isoDuration,
100
+ start: startTime,
101
+ comment: opts.comment,
102
+ });
103
+ if (opts.json) {
104
+ process.stdout.write(jsonOutput({ key: resolvedKey, action: 'stop', duration: durationStr, worklog }) + '\n');
105
+ }
106
+ else {
107
+ console.log(`${chalk.green('⏹')} Таймер остановлен: ${durationStr} залогировано для ${resolvedKey}`);
108
+ }
109
+ break;
110
+ }
111
+ case 'log': {
112
+ if (!duration) {
113
+ console.error('Укажите длительность. Примеры: 2h30m, 1d, 45m');
114
+ process.exit(1);
115
+ }
116
+ const isoDuration = parseDuration(duration);
117
+ const worklog = await client.addWorklog(resolvedKey, {
118
+ duration: isoDuration,
119
+ comment: opts.comment,
120
+ });
121
+ if (opts.json) {
122
+ process.stdout.write(jsonOutput(worklog) + '\n');
123
+ }
124
+ else {
125
+ console.log(`${chalk.green('✓')} ${duration} залогировано для ${resolvedKey}`);
126
+ }
127
+ break;
128
+ }
129
+ case 'show': {
130
+ const worklogs = await client.getWorklogs(resolvedKey);
131
+ if (opts.json) {
132
+ process.stdout.write(jsonOutput(worklogs) + '\n');
133
+ }
134
+ else {
135
+ console.log(formatWorklogs(worklogs));
136
+ }
137
+ break;
138
+ }
139
+ default:
140
+ console.error(`Неизвестное действие: ${action}. Используйте: start, stop, log, show`);
141
+ process.exit(1);
142
+ }
143
+ }
144
+ catch (error) {
145
+ handleApiError(error);
146
+ }
147
+ });
148
+ }
149
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/commands/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function setToken(token: string, tokenType?: 'oauth' | 'iam'): Promise<void>;
2
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/config/auth.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,GAAG,KAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjG"}
@@ -0,0 +1,9 @@
1
+ import { loadGlobalConfig, saveGlobalConfig } from './config.js';
2
+ export async function setToken(token, tokenType = 'oauth') {
3
+ const existing = await loadGlobalConfig();
4
+ if (!existing) {
5
+ throw new Error('Конфигурация не найдена. Сначала запустите "tracker init".');
6
+ }
7
+ await saveGlobalConfig({ ...existing, token, tokenType });
8
+ }
9
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/config/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,YAA6B,OAAO;IAChF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,gBAAgB,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type GlobalConfig, type ProjectConfig, type ResolvedConfig } from './config.schema.js';
2
+ export declare const GLOBAL_CONFIG_DIR: string;
3
+ export declare const GLOBAL_CONFIG_PATH: string;
4
+ export declare const PROJECT_CONFIG_NAME = ".tracker.json";
5
+ export declare function loadGlobalConfig(): Promise<GlobalConfig | null>;
6
+ export declare function loadProjectConfig(): Promise<ProjectConfig | null>;
7
+ export declare function loadConfig(): Promise<ResolvedConfig>;
8
+ export declare function saveGlobalConfig(config: GlobalConfig): Promise<void>;
9
+ export declare function saveProjectConfig(config: ProjectConfig, dir?: string): Promise<void>;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzI,eAAO,MAAM,iBAAiB,QAAkC,CAAC;AACjE,eAAO,MAAM,kBAAkB,QAAyC,CAAC;AACzE,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAsBnD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAIrE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAMvE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAyB1D;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzG"}
@@ -0,0 +1,79 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join, dirname } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { globalConfigSchema, projectConfigSchema } from './config.schema.js';
6
+ export const GLOBAL_CONFIG_DIR = join(homedir(), '.tracker-cli');
7
+ export const GLOBAL_CONFIG_PATH = join(GLOBAL_CONFIG_DIR, 'config.json');
8
+ export const PROJECT_CONFIG_NAME = '.tracker.json';
9
+ async function readJsonFile(path) {
10
+ try {
11
+ const content = await readFile(path, 'utf-8');
12
+ return JSON.parse(content);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ function findProjectConfig(startDir = process.cwd()) {
19
+ let dir = startDir;
20
+ while (true) {
21
+ const candidate = join(dir, PROJECT_CONFIG_NAME);
22
+ if (existsSync(candidate))
23
+ return candidate;
24
+ const parent = dirname(dir);
25
+ if (parent === dir)
26
+ return null;
27
+ dir = parent;
28
+ }
29
+ }
30
+ export async function loadGlobalConfig() {
31
+ const raw = await readJsonFile(GLOBAL_CONFIG_PATH);
32
+ if (!raw)
33
+ return null;
34
+ return globalConfigSchema.parse(raw);
35
+ }
36
+ export async function loadProjectConfig() {
37
+ const path = findProjectConfig();
38
+ if (!path)
39
+ return null;
40
+ const raw = await readJsonFile(path);
41
+ if (!raw)
42
+ return null;
43
+ return projectConfigSchema.parse(raw);
44
+ }
45
+ export async function loadConfig() {
46
+ const global = await loadGlobalConfig();
47
+ if (!global) {
48
+ throw new Error('Конфигурация не найдена. Запустите "tracker init" для настройки.');
49
+ }
50
+ const project = await loadProjectConfig();
51
+ return {
52
+ token: global.token,
53
+ tokenType: global.tokenType,
54
+ orgId: global.orgId,
55
+ cloudOrgId: global.cloudOrgId,
56
+ apiBaseUrl: global.apiBaseUrl,
57
+ queue: project?.queue ?? global.defaultQueue,
58
+ boardId: project?.boardId,
59
+ branchPrefix: project?.branchPrefix ?? 'feature',
60
+ statusMap: project?.statusMap ?? {
61
+ open: 'open',
62
+ inProgress: 'inProgress',
63
+ review: 'readyForReview',
64
+ testing: 'testing',
65
+ closed: 'closed',
66
+ },
67
+ };
68
+ }
69
+ export async function saveGlobalConfig(config) {
70
+ if (!existsSync(GLOBAL_CONFIG_DIR)) {
71
+ await mkdir(GLOBAL_CONFIG_DIR, { recursive: true });
72
+ }
73
+ await writeFile(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
74
+ }
75
+ export async function saveProjectConfig(config, dir = process.cwd()) {
76
+ const path = join(dir, PROJECT_CONFIG_NAME);
77
+ await writeFile(path, JSON.stringify(config, null, 2), 'utf-8');
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ export declare const globalConfigSchema: z.ZodEffects<z.ZodObject<{
3
+ orgId: z.ZodOptional<z.ZodString>;
4
+ cloudOrgId: z.ZodOptional<z.ZodString>;
5
+ token: z.ZodString;
6
+ tokenType: z.ZodDefault<z.ZodEnum<["oauth", "iam"]>>;
7
+ defaultQueue: z.ZodOptional<z.ZodString>;
8
+ apiBaseUrl: z.ZodDefault<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ token: string;
11
+ tokenType: "oauth" | "iam";
12
+ apiBaseUrl: string;
13
+ orgId?: string | undefined;
14
+ cloudOrgId?: string | undefined;
15
+ defaultQueue?: string | undefined;
16
+ }, {
17
+ token: string;
18
+ orgId?: string | undefined;
19
+ cloudOrgId?: string | undefined;
20
+ tokenType?: "oauth" | "iam" | undefined;
21
+ defaultQueue?: string | undefined;
22
+ apiBaseUrl?: string | undefined;
23
+ }>, {
24
+ token: string;
25
+ tokenType: "oauth" | "iam";
26
+ apiBaseUrl: string;
27
+ orgId?: string | undefined;
28
+ cloudOrgId?: string | undefined;
29
+ defaultQueue?: string | undefined;
30
+ }, {
31
+ token: string;
32
+ orgId?: string | undefined;
33
+ cloudOrgId?: string | undefined;
34
+ tokenType?: "oauth" | "iam" | undefined;
35
+ defaultQueue?: string | undefined;
36
+ apiBaseUrl?: string | undefined;
37
+ }>;
38
+ export declare const projectConfigSchema: z.ZodObject<{
39
+ queue: z.ZodOptional<z.ZodOptional<z.ZodString>>;
40
+ boardId: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
41
+ branchPrefix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
42
+ statusMap: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ queue?: string | undefined;
45
+ boardId?: number | undefined;
46
+ branchPrefix?: string | undefined;
47
+ statusMap?: Record<string, string> | undefined;
48
+ }, {
49
+ queue?: string | undefined;
50
+ boardId?: number | undefined;
51
+ branchPrefix?: string | undefined;
52
+ statusMap?: Record<string, string> | undefined;
53
+ }>;
54
+ export type GlobalConfig = z.infer<typeof globalConfigSchema>;
55
+ export type ProjectConfig = z.infer<typeof projectConfigSchema>;
56
+ export interface ResolvedConfig {
57
+ token: string;
58
+ tokenType: 'oauth' | 'iam';
59
+ orgId?: string;
60
+ cloudOrgId?: string;
61
+ apiBaseUrl: string;
62
+ queue?: string;
63
+ boardId?: number;
64
+ branchPrefix: string;
65
+ statusMap: Record<string, string>;
66
+ }
67
+ //# sourceMappingURL=config.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.schema.d.ts","sourceRoot":"","sources":["../../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAWpB,CAAC;AAEb,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC"}
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+ export const globalConfigSchema = z.object({
3
+ orgId: z.string().optional(),
4
+ cloudOrgId: z.string().optional(),
5
+ token: z.string().min(1, 'Токен обязателен'),
6
+ tokenType: z.enum(['oauth', 'iam']).default('oauth'),
7
+ defaultQueue: z.string().optional(),
8
+ apiBaseUrl: z.string().url().default('https://api.tracker.yandex.net/v2'),
9
+ }).refine(data => data.orgId || data.cloudOrgId, { message: 'Укажите orgId или cloudOrgId' });
10
+ export const projectConfigSchema = z.object({
11
+ queue: z.string().optional(),
12
+ boardId: z.number().optional(),
13
+ branchPrefix: z.string().default('feature'),
14
+ statusMap: z.record(z.string()).default({
15
+ open: 'open',
16
+ inProgress: 'inProgress',
17
+ review: 'readyForReview',
18
+ testing: 'testing',
19
+ closed: 'closed',
20
+ }),
21
+ }).partial();
22
+ //# sourceMappingURL=config.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.schema.js","sourceRoot":"","sources":["../../../src/config/config.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACpD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;CAC1E,CAAC,CAAC,MAAM,CACP,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EACrC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAC5C,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;QACtC,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,QAAQ;KACjB,CAAC;CACH,CAAC,CAAC,OAAO,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function jsonOutput(data: unknown): string;
2
+ export declare function jsonError(code: string, message: string): string;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/formatters/json.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,7 @@
1
+ export function jsonOutput(data) {
2
+ return JSON.stringify({ ok: true, data }, null, 2);
3
+ }
4
+ export function jsonError(code, message) {
5
+ return JSON.stringify({ ok: false, error: { code, message } }, null, 2);
6
+ }
7
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/formatters/json.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Issue, Sprint, Comment, Worklog, ChecklistItem, IssueLink } from '../client/types.js';
2
+ export declare function formatIssueList(issues: Issue[]): string;
3
+ export declare function formatIssueDetail(issue: Issue): string;
4
+ export declare function formatSprint(sprint: Sprint): string;
5
+ export declare function formatComments(comments: Comment[]): string;
6
+ export declare function formatWorklogs(worklogs: Worklog[]): string;
7
+ export declare function formatChecklist(items: ChecklistItem[]): string;
8
+ export declare function formatLinks(links: IssueLink[]): string;
9
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/formatters/table.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA8BpG,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CA0BvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CA2CtD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAO1D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAmB1D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAO9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAMtD"}
@@ -0,0 +1,150 @@
1
+ import Table from 'cli-table3';
2
+ import chalk from 'chalk';
3
+ const statusColors = {
4
+ open: chalk.white,
5
+ inProgress: chalk.yellow,
6
+ readyForReview: chalk.cyan,
7
+ testing: chalk.magenta,
8
+ closed: chalk.green,
9
+ resolved: chalk.green,
10
+ };
11
+ function colorStatus(display, key) {
12
+ const colorFn = statusColors[key ?? ''] ?? chalk.white;
13
+ return colorFn(display);
14
+ }
15
+ const priorityColors = {
16
+ blocker: chalk.red.bold,
17
+ critical: chalk.red,
18
+ major: chalk.yellow,
19
+ normal: chalk.white,
20
+ minor: chalk.gray,
21
+ trivial: chalk.gray,
22
+ };
23
+ function colorPriority(display, key) {
24
+ const colorFn = priorityColors[key ?? ''] ?? chalk.white;
25
+ return colorFn(display);
26
+ }
27
+ export function formatIssueList(issues) {
28
+ if (issues.length === 0)
29
+ return chalk.gray('Задачи не найдены.');
30
+ const table = new Table({
31
+ head: [
32
+ chalk.bold('Ключ'),
33
+ chalk.bold('Статус'),
34
+ chalk.bold('Приоритет'),
35
+ chalk.bold('Исполнитель'),
36
+ chalk.bold('Название'),
37
+ ],
38
+ colWidths: [14, 16, 12, 16, 50],
39
+ wordWrap: true,
40
+ });
41
+ for (const issue of issues) {
42
+ table.push([
43
+ chalk.bold(issue.key),
44
+ colorStatus(issue.status.display, issue.status.key),
45
+ colorPriority(issue.priority.display, issue.priority.key),
46
+ issue.assignee?.display ?? chalk.gray('—'),
47
+ issue.summary,
48
+ ]);
49
+ }
50
+ return table.toString();
51
+ }
52
+ export function formatIssueDetail(issue) {
53
+ const lines = [
54
+ '',
55
+ `${chalk.bold(issue.key)} ${issue.summary}`,
56
+ '',
57
+ ` Статус: ${colorStatus(issue.status.display, issue.status.key)}`,
58
+ ` Приоритет: ${colorPriority(issue.priority.display, issue.priority.key)}`,
59
+ ` Тип: ${issue.type.display}`,
60
+ ` Очередь: ${issue.queue.display}`,
61
+ ` Исполнитель: ${issue.assignee?.display ?? chalk.gray('не назначен')}`,
62
+ ` Автор: ${issue.author.display}`,
63
+ ];
64
+ if (issue.sprint?.length) {
65
+ lines.push(` Спринт: ${issue.sprint.map(s => s.display).join(', ')}`);
66
+ }
67
+ if (issue.deadline) {
68
+ lines.push(` Дедлайн: ${issue.deadline}`);
69
+ }
70
+ if (issue.storyPoints !== undefined) {
71
+ lines.push(` Story Points: ${issue.storyPoints}`);
72
+ }
73
+ if (issue.tags?.length) {
74
+ lines.push(` Теги: ${issue.tags.join(', ')}`);
75
+ }
76
+ if (issue.checklistTotal) {
77
+ lines.push(` Чеклист: ${issue.checklistDone ?? 0}/${issue.checklistTotal}`);
78
+ }
79
+ lines.push(` Создана: ${issue.createdAt}`);
80
+ lines.push(` Обновлена: ${issue.updatedAt}`);
81
+ if (issue.description) {
82
+ lines.push('');
83
+ lines.push(chalk.bold(' Описание:'));
84
+ const desc = issue.description.length > 500
85
+ ? issue.description.slice(0, 500) + '...'
86
+ : issue.description;
87
+ lines.push(' ' + desc.split('\n').join('\n '));
88
+ }
89
+ lines.push('');
90
+ return lines.join('\n');
91
+ }
92
+ export function formatSprint(sprint) {
93
+ const statusIcon = sprint.status === 'in_progress' ? chalk.green('●') : chalk.gray('○');
94
+ const lines = [
95
+ '',
96
+ `${statusIcon} ${chalk.bold(sprint.display)}`,
97
+ ` Статус: ${sprint.status}`,
98
+ ];
99
+ if (sprint.startDate)
100
+ lines.push(` Начало: ${sprint.startDate}`);
101
+ if (sprint.endDate)
102
+ lines.push(` Конец: ${sprint.endDate}`);
103
+ lines.push('');
104
+ return lines.join('\n');
105
+ }
106
+ export function formatComments(comments) {
107
+ if (comments.length === 0)
108
+ return chalk.gray('Комментариев нет.');
109
+ return comments.map(c => [
110
+ '',
111
+ `${chalk.bold(c.createdBy.display)} · ${c.createdAt}`,
112
+ ` ${c.text}`,
113
+ ].join('\n')).join('\n');
114
+ }
115
+ export function formatWorklogs(worklogs) {
116
+ if (worklogs.length === 0)
117
+ return chalk.gray('Записей о времени нет.');
118
+ const table = new Table({
119
+ head: [chalk.bold('Автор'), chalk.bold('Время'), chalk.bold('Дата'), chalk.bold('Комментарий')],
120
+ colWidths: [20, 12, 12, 40],
121
+ wordWrap: true,
122
+ });
123
+ for (const w of worklogs) {
124
+ table.push([
125
+ w.createdBy.display,
126
+ w.duration,
127
+ w.start,
128
+ w.comment ?? '',
129
+ ]);
130
+ }
131
+ return table.toString();
132
+ }
133
+ export function formatChecklist(items) {
134
+ if (items.length === 0)
135
+ return chalk.gray('Чеклист пуст.');
136
+ return items.map((item, i) => {
137
+ const icon = item.checked ? chalk.green('✓') : chalk.gray('○');
138
+ const text = item.checked ? chalk.strikethrough(item.text) : item.text;
139
+ return ` ${icon} ${i + 1}. ${text}`;
140
+ }).join('\n');
141
+ }
142
+ export function formatLinks(links) {
143
+ if (links.length === 0)
144
+ return chalk.gray('Связей нет.');
145
+ return links.map(l => {
146
+ const rel = l.direction === 'outward' ? l.type.outward : l.type.inward;
147
+ return ` ${rel}: ${chalk.bold(l.object.key)} ${l.object.display}`;
148
+ }).join('\n');
149
+ }
150
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/formatters/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { TrackerClient, type TrackerClientConfig } from './client/tracker-client.js';
2
+ export type * from './client/types.js';
3
+ export { loadConfig, saveGlobalConfig, saveProjectConfig } from './config/config.js';
4
+ export type { ResolvedConfig, GlobalConfig, ProjectConfig } from './config/config.schema.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACrF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { TrackerClient } from './client/tracker-client.js';
2
+ export { loadConfig, saveGlobalConfig, saveProjectConfig } from './config/config.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,MAAM,4BAA4B,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class TrackerCliError extends Error {
2
+ readonly code: string;
3
+ readonly exitCode: number;
4
+ constructor(message: string, code: string, exitCode?: number);
5
+ }
6
+ export declare function handleApiError(error: unknown): never;
7
+ export declare function formatError(error: unknown, json: boolean): string;
8
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/utils/error.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAU;CAKvC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAgDpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAWjE"}