@pachca/cli 2026.6.3 → 2026.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +3 -0
  3. package/dist/commands/bots/create.js +26 -3
  4. package/dist/commands/bots/delete.js +45 -0
  5. package/dist/commands/bots/get.js +0 -3
  6. package/dist/commands/bots/list.js +97 -0
  7. package/dist/commands/bots/update.js +21 -3
  8. package/dist/commands/chats/create.js +9 -3
  9. package/dist/commands/chats/get.js +0 -3
  10. package/dist/commands/chats/list.js +3 -3
  11. package/dist/commands/chats/update.js +8 -1
  12. package/dist/commands/group-tags/create.js +9 -3
  13. package/dist/commands/group-tags/list.js +0 -1
  14. package/dist/commands/group-tags/update.js +8 -1
  15. package/dist/commands/members/add.js +2 -2
  16. package/dist/commands/members/list.js +1 -3
  17. package/dist/commands/members/remove.js +0 -1
  18. package/dist/commands/members/update.js +1 -2
  19. package/dist/commands/messages/delete.js +1 -3
  20. package/dist/commands/messages/get.js +2 -2
  21. package/dist/commands/messages/list.js +1 -3
  22. package/dist/commands/messages/pin.js +1 -2
  23. package/dist/commands/messages/unpin.js +0 -1
  24. package/dist/commands/messages/update.js +2 -2
  25. package/dist/commands/profile/delete-avatar.js +0 -1
  26. package/dist/commands/profile/delete-status.js +0 -1
  27. package/dist/commands/profile/get-status.js +0 -4
  28. package/dist/commands/profile/update-avatar.js +1 -2
  29. package/dist/commands/profile/update-status.js +5 -3
  30. package/dist/commands/reactions/add.js +1 -2
  31. package/dist/commands/reactions/list.js +0 -4
  32. package/dist/commands/reactions/remove.js +0 -1
  33. package/dist/commands/search/list-users.js +1 -1
  34. package/dist/commands/security/list.js +1 -1
  35. package/dist/commands/tasks/create.js +1 -1
  36. package/dist/commands/tasks/delete.js +1 -3
  37. package/dist/commands/tasks/get.js +1 -3
  38. package/dist/commands/tasks/list.js +0 -2
  39. package/dist/commands/tasks/update.js +0 -1
  40. package/dist/commands/threads/create.js +23 -0
  41. package/dist/commands/users/create.js +31 -9
  42. package/dist/commands/users/delete.js +1 -3
  43. package/dist/commands/users/get-status.js +1 -3
  44. package/dist/commands/users/get.js +1 -3
  45. package/dist/commands/users/list.js +1 -1
  46. package/dist/commands/users/remove-avatar.js +0 -1
  47. package/dist/commands/users/remove-status.js +0 -2
  48. package/dist/commands/users/update-avatar.js +1 -2
  49. package/dist/commands/users/update-status.js +5 -4
  50. package/dist/commands/users/update.js +28 -7
  51. package/dist/data/alternatives.json +3 -0
  52. package/dist/data/changelog.json +47 -0
  53. package/dist/data/endpoints.json +1 -1
  54. package/dist/data/workflows.json +14 -0
  55. package/oclif.manifest.json +1 -1
  56. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.7.1 (24 июля 2026)
4
+
5
+ - **Добавлено** (threads create): Новая команда — создание самостоятельного треда без привязки к сообщению
6
+ - **Удалено**: Примеры в `--help` больше не смешиваются между командами с общим путём (например, create и list одного ресурса показывали примеры друг друга)
7
+
8
+ ## 2026.7.0 (7 июля 2026)
9
+
10
+ - **Добавлено** (bots list): Новая команда — список ботов с поиском по имени (`--query`)
11
+ - **Добавлено** (bots delete): Новая команда — удаление бота по его `id`
12
+ - **Добавлено** (bots create): Права доступа бота — параметры `who-can-add` (кто может добавлять бота в чаты), `can-edit` (роли, редактирующие настройки) и `single-chat` (только один чат)
13
+ - **Добавлено** (bots update): Права доступа бота — параметры `who-can-add` (кто может добавлять бота в чаты) и `can-edit` (роли, редактирующие настройки)
14
+ - **Добавлено** (search users): Значение сортировки `--sort creation` — по дате создания
15
+
3
16
  ## 2026.6.3 (24 июня 2026)
4
17
 
5
18
  - **Изменено** (files, custom-properties, oauth): Команды реорганизованы по разделам: `common uploads`→`files uploads`, `common direct-url`→`files direct-url`, `common custom-properties`→`custom-properties list`, `common request-export`→`chats request-export`, `common get-exports`→`chats download-export`, `profile get-info`→`oauth token-info`, `link-previews add`→`messages unfurl`. Старые имена продолжают работать (скрытые алиасы)
package/README.md CHANGED
@@ -80,9 +80,11 @@ pachca guide # список всех сценариев
80
80
  |---------|---------|
81
81
  | `pachca bots recreate-token-self` | Ротация собственного токена бота |
82
82
  | `pachca bots update-webhook` | Саморегистрация вебхука бота |
83
+ | `pachca bots list` | Список ботов |
83
84
  | `pachca bots create` | Новый бот |
84
85
  | `pachca bots get` | Информация о боте |
85
86
  | `pachca bots update` | Редактирование бота |
87
+ | `pachca bots delete` | Удаление бота |
86
88
  | `pachca bots recreate-token` | Ротация токена бота |
87
89
  | `pachca bots list-events` | История событий |
88
90
  | `pachca bots remove-event` | Удаление события |
@@ -168,6 +170,7 @@ pachca guide # список всех сценариев
168
170
  | Команда | Описание |
169
171
  |---------|---------|
170
172
  | `pachca threads add` | Новый тред |
173
+ | `pachca threads create` | Новый самостоятельный тред |
171
174
  | `pachca threads list` | Список тредов |
172
175
  | `pachca threads get` | Информация о треде |
173
176
 
@@ -17,10 +17,10 @@ export default class BotsCreate extends BaseCommand {
17
17
  static flags = {
18
18
  ...BaseCommand.baseFlags,
19
19
  'name': Flags.string({
20
- description: "Имя бота",
20
+ description: "Имя бота (макс. 255 символов)",
21
21
  }),
22
22
  'nickname': Flags.string({
23
- description: "Никнейм бота. Должен заканчиваться на `_bot`.",
23
+ description: "Никнейм бота. Должен заканчиваться на `_bot`. (макс. 255 символов)",
24
24
  }),
25
25
  'outgoing-url': Flags.string({
26
26
  description: "URL исходящего вебхука",
@@ -32,7 +32,7 @@ export default class BotsCreate extends BaseCommand {
32
32
  description: "Условие срабатывания исходящего вебхука",
33
33
  }),
34
34
  'commands': Flags.string({
35
- description: "Команды бота (триггер-слова), на которые он реагирует при trigger_on = commands",
35
+ description: "Команды бота (триггер-слова), на которые он реагирует при trigger_on = commands. Суммарная длина команд, объединённых через запятую, не должна превышать 255 символов.",
36
36
  }),
37
37
  'scopes': Flags.string({
38
38
  description: "Скоупы (права доступа) токена бота. Если не указано, бот получает набор по умолчанию.",
@@ -58,6 +58,16 @@ export default class BotsCreate extends BaseCommand {
58
58
  description: "Сохранять историю событий бота для последующего получения через метод истории событий",
59
59
  allowNo: true,
60
60
  }),
61
+ 'who-can-add': Flags.string({
62
+ description: "Кто может добавлять бота в чаты",
63
+ }),
64
+ 'can-edit': Flags.string({
65
+ description: "Роли, которым, помимо создателя, разрешено редактировать настройки бота. Создатель может редактировать всегда. Пустой массив — редактировать может только создатель.",
66
+ }),
67
+ 'single-chat': Flags.boolean({
68
+ description: "Ограничивает бота одной беседой или каналом: `true` — бота можно добавить только в один такой чат, `false` — в несколько. Личные чаты и треды в ограничение не входят. Задаётся только при создании, при редактировании не меняется.",
69
+ allowNo: true,
70
+ }),
61
71
  };
62
72
  async run() {
63
73
  const { args, flags } = await this.parse(BotsCreate);
@@ -88,6 +98,16 @@ export default class BotsCreate extends BaseCommand {
88
98
  this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --name <string>. pachca introspect bots create" });
89
99
  }
90
100
  }
101
+ const validationErrors = [];
102
+ if (flags['name'] && String(flags['name']).length > 255) {
103
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
104
+ }
105
+ if (flags['nickname'] && String(flags['nickname']).length > 255) {
106
+ validationErrors.push({ message: `--nickname: максимум 255 символов (передано: ${String(flags['nickname']).length})`, flag: 'nickname' });
107
+ }
108
+ if (validationErrors.length > 0) {
109
+ this.validationError(validationErrors);
110
+ }
91
111
  const body = { webhook: {
92
112
  name: flags['name'],
93
113
  nickname: flags['nickname'],
@@ -102,6 +122,9 @@ export default class BotsCreate extends BaseCommand {
102
122
  link_preview_enabled: flags['link-preview-enabled'],
103
123
  ignore_self_messages: flags['ignore-self-messages'],
104
124
  events_history_enabled: flags['events-history-enabled'],
125
+ who_can_add: flags['who-can-add'],
126
+ can_edit: flags['can-edit'] ? this.parseJSON(flags['can-edit'], 'can-edit') : undefined,
127
+ single_chat: flags['single-chat'],
105
128
  } };
106
129
  // Clean undefined fields
107
130
  const inner = body['webhook'];
@@ -0,0 +1,45 @@
1
+ // Auto-generated from openapi.yaml — DO NOT EDIT
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ import * as clack from '@clack/prompts';
5
+ export default class BotsDelete extends BaseCommand {
6
+ static description = "Удаление бота";
7
+ static examples = [
8
+ "Найти и удалить бота:\n $ pachca bots delete"
9
+ ];
10
+ static scope = "bots:write";
11
+ static apiMethod = "DELETE";
12
+ static apiPath = "/bots/{id}";
13
+ static args = {
14
+ id: Args.integer({
15
+ description: "Идентификатор бота (pachca bots list)",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...BaseCommand.baseFlags,
21
+ force: Flags.boolean({
22
+ description: 'Пропустить подтверждение',
23
+ default: false,
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(BotsDelete);
28
+ this.parsedFlags = flags;
29
+ if (!flags.force) {
30
+ if (!this.isInteractive()) {
31
+ this.validationError([{ message: 'Деструктивная операция требует флага --force', flag: 'force' }], { type: 'PACHCA_DESTRUCTIVE_OP_ERROR', hint: "pachca bots delete <id> --force" });
32
+ }
33
+ const confirm = await clack.confirm({ message: 'Вы уверены?' });
34
+ if (clack.isCancel(confirm) || !confirm) {
35
+ process.stderr.write('Отменено.\n');
36
+ this.exit(0);
37
+ }
38
+ }
39
+ const { data } = await this.apiRequest({
40
+ method: 'DELETE',
41
+ path: `/bots/${args.id}`,
42
+ });
43
+ this.success('Удалено');
44
+ }
45
+ }
@@ -3,9 +3,6 @@ import { Args } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  export default class BotsGet extends BaseCommand {
5
5
  static description = "Информация о боте";
6
- static examples = [
7
- "Обновить Webhook URL бота:\n $ pachca bots update"
8
- ];
9
6
  static scope = "bots:read";
10
7
  static apiMethod = "GET";
11
8
  static apiPath = "/bots/{id}";
@@ -0,0 +1,97 @@
1
+ // Auto-generated from openapi.yaml — DO NOT EDIT
2
+ import { Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ export default class BotsList extends BaseCommand {
5
+ static description = "Список ботов";
6
+ static examples = [
7
+ "Найти и удалить бота:\n $ pachca bots list"
8
+ ];
9
+ static scope = "bots:read";
10
+ static apiMethod = "GET";
11
+ static apiPath = "/bots";
12
+ static defaultColumns = ["id", "webhook"];
13
+ static args = {};
14
+ static flags = {
15
+ ...BaseCommand.baseFlags,
16
+ 'query': Flags.string({
17
+ description: "Поисковая фраза для фильтрации ботов по имени",
18
+ }),
19
+ limit: Flags.integer({
20
+ description: 'Количество результатов на страницу',
21
+ }),
22
+ cursor: Flags.string({
23
+ description: 'Курсор для следующей страницы',
24
+ }),
25
+ all: Flags.boolean({
26
+ description: 'Загрузить все страницы автоматически',
27
+ default: false,
28
+ }),
29
+ };
30
+ async run() {
31
+ const { args, flags } = await this.parse(BotsList);
32
+ this.parsedFlags = flags;
33
+ if (flags.all) {
34
+ // Auto-pagination
35
+ const allData = [];
36
+ let nextCursor = undefined;
37
+ let pages = 0;
38
+ const seenCursors = new Set();
39
+ while (pages < 500) {
40
+ const query = {
41
+ query: flags['query'],
42
+ limit: flags.limit,
43
+ cursor: nextCursor,
44
+ };
45
+ const response = await this.apiRequest({ method: 'GET', path: '/bots', query });
46
+ const body = response.data;
47
+ const items = body.data;
48
+ if (items)
49
+ allData.push(...items);
50
+ const meta = body.meta;
51
+ const paginate = meta?.paginate;
52
+ nextCursor = paginate?.next_page;
53
+ pages++;
54
+ // Условие конца: списочные методы — has_next === false; методы поиска и /users?query= (без has_next) — пустой data
55
+ const hasNext = paginate?.has_next;
56
+ if (typeof hasNext === 'boolean') {
57
+ if (!hasNext)
58
+ break;
59
+ }
60
+ else if (!items || items.length === 0) {
61
+ break;
62
+ }
63
+ if (process.stderr.isTTY) {
64
+ const total = paginate?.total;
65
+ const progress = total ? `${allData.length} / ${total}` : String(allData.length);
66
+ process.stderr.write(`\r Загружено: ${progress}...`);
67
+ }
68
+ if (!nextCursor)
69
+ break;
70
+ if (seenCursors.has(nextCursor)) {
71
+ process.stderr.write('\n⚠ Обнаружен цикл пагинации, остановка.\n');
72
+ break;
73
+ }
74
+ seenCursors.add(nextCursor);
75
+ }
76
+ if (pages >= 500) {
77
+ process.stderr.write('\n⚠ Достигнут лимит 500 страниц.\n');
78
+ }
79
+ if (process.stderr.isTTY)
80
+ process.stderr.write('\n');
81
+ this.output(allData);
82
+ return;
83
+ }
84
+ const { data } = await this.apiRequest({
85
+ method: 'GET',
86
+ path: '/bots',
87
+ query: {
88
+ query: flags['query'],
89
+ limit: flags.limit,
90
+ cursor: flags.cursor,
91
+ },
92
+ });
93
+ const responseBody = data;
94
+ const items = responseBody.data ?? responseBody;
95
+ this.output(items);
96
+ }
97
+ }
@@ -19,10 +19,10 @@ export default class BotsUpdate extends BaseCommand {
19
19
  static flags = {
20
20
  ...BaseCommand.baseFlags,
21
21
  'name': Flags.string({
22
- description: "Имя бота",
22
+ description: "Имя бота (макс. 255 символов)",
23
23
  }),
24
24
  'nickname': Flags.string({
25
- description: "Никнейм бота. Должен заканчиваться на `_bot`.",
25
+ description: "Никнейм бота. Должен заканчиваться на `_bot`. (макс. 255 символов)",
26
26
  }),
27
27
  'outgoing-url': Flags.string({
28
28
  description: "URL исходящего вебхука",
@@ -34,7 +34,7 @@ export default class BotsUpdate extends BaseCommand {
34
34
  description: "Условие срабатывания исходящего вебхука",
35
35
  }),
36
36
  'commands': Flags.string({
37
- description: "Команды бота (триггер-слова), на которые он реагирует при trigger_on = commands",
37
+ description: "Команды бота (триггер-слова), на которые он реагирует при trigger_on = commands. Суммарная длина команд, объединённых через запятую, не должна превышать 255 символов.",
38
38
  }),
39
39
  'scopes': Flags.string({
40
40
  description: "Скоупы (права доступа) токена бота. Если не указано, бот получает набор по умолчанию.",
@@ -60,10 +60,26 @@ export default class BotsUpdate extends BaseCommand {
60
60
  description: "Сохранять историю событий бота для последующего получения через метод истории событий",
61
61
  allowNo: true,
62
62
  }),
63
+ 'who-can-add': Flags.string({
64
+ description: "Кто может добавлять бота в чаты",
65
+ }),
66
+ 'can-edit': Flags.string({
67
+ description: "Роли, которым, помимо создателя, разрешено редактировать настройки бота. Создатель может редактировать всегда. Пустой массив — редактировать может только создатель.",
68
+ }),
63
69
  };
64
70
  async run() {
65
71
  const { args, flags } = await this.parse(BotsUpdate);
66
72
  this.parsedFlags = flags;
73
+ const validationErrors = [];
74
+ if (flags['name'] && String(flags['name']).length > 255) {
75
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
76
+ }
77
+ if (flags['nickname'] && String(flags['nickname']).length > 255) {
78
+ validationErrors.push({ message: `--nickname: максимум 255 символов (передано: ${String(flags['nickname']).length})`, flag: 'nickname' });
79
+ }
80
+ if (validationErrors.length > 0) {
81
+ this.validationError(validationErrors);
82
+ }
67
83
  const body = { webhook: {
68
84
  name: flags['name'],
69
85
  nickname: flags['nickname'],
@@ -78,6 +94,8 @@ export default class BotsUpdate extends BaseCommand {
78
94
  link_preview_enabled: flags['link-preview-enabled'],
79
95
  ignore_self_messages: flags['ignore-self-messages'],
80
96
  events_history_enabled: flags['events-history-enabled'],
97
+ who_can_add: flags['who-can-add'],
98
+ can_edit: flags['can-edit'] ? this.parseJSON(flags['can-edit'], 'can-edit') : undefined,
81
99
  } };
82
100
  // Clean undefined fields
83
101
  const inner = body['webhook'];
@@ -6,8 +6,7 @@ export default class ChatsCreate extends BaseCommand {
6
6
  static description = "Новый чат";
7
7
  static examples = [
8
8
  "Создать канал и пригласить участников:\n $ pachca chats create",
9
- "Создать проектную беседу из шаблона:\n $ pachca chats create",
10
- "Найти активные чаты за период:\n $ pachca chats list"
9
+ "Создать проектную беседу из шаблона:\n $ pachca chats create"
11
10
  ];
12
11
  static scope = "chats:create";
13
12
  static apiMethod = "POST";
@@ -18,7 +17,7 @@ export default class ChatsCreate extends BaseCommand {
18
17
  static flags = {
19
18
  ...BaseCommand.baseFlags,
20
19
  'name': Flags.string({
21
- description: "Название",
20
+ description: "Название (макс. 255 символов)",
22
21
  }),
23
22
  'member-ids': Flags.string({
24
23
  description: "Массив идентификаторов пользователей, которые станут участниками",
@@ -64,6 +63,13 @@ export default class ChatsCreate extends BaseCommand {
64
63
  this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --name <string>. pachca introspect chats create" });
65
64
  }
66
65
  }
66
+ const validationErrors = [];
67
+ if (flags['name'] && String(flags['name']).length > 255) {
68
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
69
+ }
70
+ if (validationErrors.length > 0) {
71
+ this.validationError(validationErrors);
72
+ }
67
73
  const body = { chat: {
68
74
  name: flags['name'],
69
75
  member_ids: flags['member-ids'] ? this.parseJSON(flags['member-ids'], 'member-ids') : undefined,
@@ -3,9 +3,6 @@ import { Args } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  export default class ChatsGet extends BaseCommand {
5
5
  static description = "Информация о чате";
6
- static examples = [
7
- "Переименовать или обновить чат:\n $ pachca chats update"
8
- ];
9
6
  static scope = "chats:read";
10
7
  static apiMethod = "GET";
11
8
  static apiPath = "/chats/{id}";
@@ -4,9 +4,9 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class ChatsList extends BaseCommand {
5
5
  static description = "Список чатов";
6
6
  static examples = [
7
- "Создать канал и пригласить участников:\n $ pachca chats create",
8
- "Создать проектную беседу из шаблона:\n $ pachca chats create",
9
- "Найти активные чаты за период:\n $ pachca chats list"
7
+ "Найти активные чаты за период:\n $ pachca chats list",
8
+ "Найти и заархивировать неактивные чаты:\n $ pachca chats list",
9
+ "Создать гостя в чат:\n $ pachca chats list"
10
10
  ];
11
11
  static scope = "chats:read";
12
12
  static apiMethod = "GET";
@@ -19,7 +19,7 @@ export default class ChatsUpdate extends BaseCommand {
19
19
  static flags = {
20
20
  ...BaseCommand.baseFlags,
21
21
  'name': Flags.string({
22
- description: "Название",
22
+ description: "Название (макс. 255 символов)",
23
23
  }),
24
24
  'public': Flags.boolean({
25
25
  description: "Открытый доступ",
@@ -29,6 +29,13 @@ export default class ChatsUpdate extends BaseCommand {
29
29
  async run() {
30
30
  const { args, flags } = await this.parse(ChatsUpdate);
31
31
  this.parsedFlags = flags;
32
+ const validationErrors = [];
33
+ if (flags['name'] && String(flags['name']).length > 255) {
34
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
35
+ }
36
+ if (validationErrors.length > 0) {
37
+ this.validationError(validationErrors);
38
+ }
32
39
  const body = { chat: {
33
40
  name: flags['name'],
34
41
  public: flags['public'],
@@ -5,8 +5,7 @@ import * as clack from '@clack/prompts';
5
5
  export default class GroupTagsCreate extends BaseCommand {
6
6
  static description = "Новый тег";
7
7
  static examples = [
8
- "Массовое создание сотрудников с тегами:\n $ pachca group-tags create",
9
- "Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"
8
+ "Массовое создание сотрудников с тегами:\n $ pachca group-tags create"
10
9
  ];
11
10
  static scope = "group_tags:write";
12
11
  static apiMethod = "POST";
@@ -17,7 +16,7 @@ export default class GroupTagsCreate extends BaseCommand {
17
16
  static flags = {
18
17
  ...BaseCommand.baseFlags,
19
18
  'name': Flags.string({
20
- description: "Название тега",
19
+ description: "Название тега (макс. 255 символов)",
21
20
  }),
22
21
  };
23
22
  async run() {
@@ -49,6 +48,13 @@ export default class GroupTagsCreate extends BaseCommand {
49
48
  this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --name <string>. pachca introspect group-tags create" });
50
49
  }
51
50
  }
51
+ const validationErrors = [];
52
+ if (flags['name'] && String(flags['name']).length > 255) {
53
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
54
+ }
55
+ if (validationErrors.length > 0) {
56
+ this.validationError(validationErrors);
57
+ }
52
58
  const body = { group_tag: {
53
59
  name: flags['name'],
54
60
  } };
@@ -4,7 +4,6 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class GroupTagsList extends BaseCommand {
5
5
  static description = "Список тегов сотрудников";
6
6
  static examples = [
7
- "Массовое создание сотрудников с тегами:\n $ pachca group-tags create",
8
7
  "Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"
9
8
  ];
10
9
  static scope = "group_tags:read";
@@ -18,7 +18,7 @@ export default class GroupTagsUpdate extends BaseCommand {
18
18
  static flags = {
19
19
  ...BaseCommand.baseFlags,
20
20
  'name': Flags.string({
21
- description: "Название тега",
21
+ description: "Название тега (макс. 255 символов)",
22
22
  }),
23
23
  };
24
24
  async run() {
@@ -50,6 +50,13 @@ export default class GroupTagsUpdate extends BaseCommand {
50
50
  this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --name <string>. pachca introspect group-tags update" });
51
51
  }
52
52
  }
53
+ const validationErrors = [];
54
+ if (flags['name'] && String(flags['name']).length > 255) {
55
+ validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
56
+ }
57
+ if (validationErrors.length > 0) {
58
+ this.validationError(validationErrors);
59
+ }
53
60
  const body = { group_tag: {
54
61
  name: flags['name'],
55
62
  } };
@@ -6,8 +6,8 @@ export default class MembersAdd extends BaseCommand {
6
6
  static description = "Добавление пользователей";
7
7
  static examples = [
8
8
  "Подписаться на тред сообщения:\n $ pachca members add",
9
- "Упомянуть пользователя:\n $ pachca members list",
10
- "Создать канал и пригласить участников:\n $ pachca members add"
9
+ "Создать канал и пригласить участников:\n $ pachca members add",
10
+ "Онбординг нового сотрудника:\n $ pachca members add"
11
11
  ];
12
12
  static scope = "chat_members:write";
13
13
  static apiMethod = "POST";
@@ -4,9 +4,7 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class MembersList extends BaseCommand {
5
5
  static description = "Список участников чата";
6
6
  static examples = [
7
- "Подписаться на тред сообщения:\n $ pachca members add",
8
- "Упомянуть пользователя:\n $ pachca members list",
9
- "Создать канал и пригласить участников:\n $ pachca members add"
7
+ "Упомянуть пользователя:\n $ pachca members list"
10
8
  ];
11
9
  static scope = "chat_members:read";
12
10
  static apiMethod = "GET";
@@ -5,7 +5,6 @@ import * as clack from '@clack/prompts';
5
5
  export default class MembersRemove extends BaseCommand {
6
6
  static description = "Исключение пользователя";
7
7
  static examples = [
8
- "Архивация и управление чатом:\n $ pachca members update",
9
8
  "Архивация и управление чатом:\n $ pachca members remove"
10
9
  ];
11
10
  static scope = "chat_members:write";
@@ -5,8 +5,7 @@ import * as clack from '@clack/prompts';
5
5
  export default class MembersUpdate extends BaseCommand {
6
6
  static description = "Редактирование роли";
7
7
  static examples = [
8
- "Архивация и управление чатом:\n $ pachca members update",
9
- "Архивация и управление чатом:\n $ pachca members remove"
8
+ "Архивация и управление чатом:\n $ pachca members update"
10
9
  ];
11
10
  static scope = "chat_members:write";
12
11
  static apiMethod = "PUT";
@@ -5,9 +5,7 @@ import * as clack from '@clack/prompts';
5
5
  export default class MessagesDelete extends BaseCommand {
6
6
  static description = "Удаление сообщения";
7
7
  static examples = [
8
- "Получить вложения из сообщения:\n $ pachca messages get",
9
- "Отредактировать сообщение:\n $ pachca messages update",
10
- "Изменить вложения сообщения:\n $ pachca messages get"
8
+ "Удалить сообщение:\n $ pachca messages delete"
11
9
  ];
12
10
  static scope = "messages:delete";
13
11
  static apiMethod = "DELETE";
@@ -5,8 +5,8 @@ export default class MessagesGet extends BaseCommand {
5
5
  static description = "Информация о сообщении";
6
6
  static examples = [
7
7
  "Получить вложения из сообщения:\n $ pachca messages get",
8
- "Отредактировать сообщение:\n $ pachca messages update",
9
- "Изменить вложения сообщения:\n $ pachca messages get"
8
+ "Изменить вложения сообщения:\n $ pachca messages get",
9
+ "Обработать входящий вебхук-событие:\n $ pachca messages get"
10
10
  ];
11
11
  static scope = "messages:read";
12
12
  static apiMethod = "GET";
@@ -5,9 +5,7 @@ import * as clack from '@clack/prompts';
5
5
  export default class MessagesList extends BaseCommand {
6
6
  static description = "Список сообщений чата";
7
7
  static examples = [
8
- "Найти чат по имени и отправить сообщение:\n $ pachca messages create",
9
- "Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create",
10
- "Отправить личное сообщение пользователю:\n $ pachca messages create"
8
+ "Получить историю сообщений чата:\n $ pachca messages list"
11
9
  ];
12
10
  static scope = "messages:read";
13
11
  static apiMethod = "GET";
@@ -4,8 +4,7 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class MessagesPin extends BaseCommand {
5
5
  static description = "Закрепление сообщения";
6
6
  static examples = [
7
- "Закрепить/открепить сообщение:\n $ pachca messages pin",
8
- "Закрепить/открепить сообщение:\n $ pachca messages unpin"
7
+ "Закрепить/открепить сообщение:\n $ pachca messages pin"
9
8
  ];
10
9
  static scope = "pins:write";
11
10
  static apiMethod = "POST";
@@ -5,7 +5,6 @@ import * as clack from '@clack/prompts';
5
5
  export default class MessagesUnpin extends BaseCommand {
6
6
  static description = "Открепление сообщения";
7
7
  static examples = [
8
- "Закрепить/открепить сообщение:\n $ pachca messages pin",
9
8
  "Закрепить/открепить сообщение:\n $ pachca messages unpin"
10
9
  ];
11
10
  static scope = "pins:write";
@@ -4,9 +4,9 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class MessagesUpdate extends BaseCommand {
5
5
  static description = "Редактирование сообщения";
6
6
  static examples = [
7
- "Получить вложения из сообщения:\n $ pachca messages get",
8
7
  "Отредактировать сообщение:\n $ pachca messages update",
9
- "Изменить вложения сообщения:\n $ pachca messages get"
8
+ "Изменить вложения сообщения:\n $ pachca messages update",
9
+ "Обработать нажатие кнопки (callback):\n $ pachca messages update"
10
10
  ];
11
11
  static scope = "messages:update";
12
12
  static apiMethod = "PUT";
@@ -5,7 +5,6 @@ import * as clack from '@clack/prompts';
5
5
  export default class ProfileDeleteAvatar extends BaseCommand {
6
6
  static description = "Удаление своего аватара";
7
7
  static examples = [
8
- "Загрузить аватар профиля:\n $ pachca profile update-avatar",
9
8
  "Удалить аватар профиля:\n $ pachca profile delete-avatar"
10
9
  ];
11
10
  static scope = "profile_avatar:write";
@@ -5,7 +5,6 @@ import * as clack from '@clack/prompts';
5
5
  export default class ProfileDeleteStatus extends BaseCommand {
6
6
  static description = "Удаление своего статуса";
7
7
  static examples = [
8
- "Установить статус:\n $ pachca profile update-status",
9
8
  "Сбросить статус:\n $ pachca profile delete-status"
10
9
  ];
11
10
  static scope = "profile_status:write";
@@ -1,10 +1,6 @@
1
1
  import { BaseCommand } from '../../base-command.js';
2
2
  export default class ProfileGetStatus extends BaseCommand {
3
3
  static description = "Свой статус";
4
- static examples = [
5
- "Установить статус:\n $ pachca profile update-status",
6
- "Сбросить статус:\n $ pachca profile delete-status"
7
- ];
8
4
  static scope = "profile_status:read";
9
5
  static apiMethod = "GET";
10
6
  static apiPath = "/profile/status";
@@ -6,8 +6,7 @@ import * as path from 'node:path';
6
6
  export default class ProfileUpdateAvatar extends BaseCommand {
7
7
  static description = "Загрузка своего аватара";
8
8
  static examples = [
9
- "Загрузить аватар профиля:\n $ pachca profile update-avatar",
10
- "Удалить аватар профиля:\n $ pachca profile delete-avatar"
9
+ "Загрузить аватар профиля:\n $ pachca profile update-avatar"
11
10
  ];
12
11
  static scope = "profile_avatar:write";
13
12
  static apiMethod = "PUT";