@pachca/cli 2026.3.5 → 2026.3.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.7 (16 марта 2026)
4
+
5
+ - **Добавлено** (upload): Загрузка файла одной командой (получает подпись + загружает автоматически)
6
+ - **Изменено** (common direct-url): Обязательный флаг --direct-url вместо хардкод URL, запрос идёт без Authorization
7
+
8
+ ## 2026.3.6 (15 марта 2026)
9
+
10
+ - **Изменено** (threads): Топик thread переименован в threads (pachca threads add, pachca threads get)
11
+
3
12
  ## 2026.3.5 (7 марта 2026)
4
13
 
5
14
  - **Изменено** (guide): Сценарии переписаны на CLI-примеры с подсказками вместо описаний API-методов
package/README.md CHANGED
@@ -233,6 +233,18 @@ pachca guide # список всех сценариев
233
233
 
234
234
  <!-- AUTO:FLAGS:END -->
235
235
 
236
+ ## Загрузка файлов
237
+
238
+ ```
239
+ # Загрузить файл (получает подпись и загружает автоматически)
240
+ pachca upload photo.jpg
241
+
242
+ # Из stdin
243
+ cat data.csv | pachca upload -
244
+ ```
245
+
246
+ Команда `upload` автоматически получает подпись (`POST /uploads`) и загружает файл на S3. Возвращает `key` — используйте его в `--files` при создании сообщений.
247
+
236
248
  ## Пагинация
237
249
 
238
250
  ```
@@ -71,6 +71,18 @@ pachca guide # список всех сценариев
71
71
  <!-- AUTO:FLAGS -->
72
72
  <!-- AUTO:FLAGS:END -->
73
73
 
74
+ ## Загрузка файлов
75
+
76
+ ```
77
+ # Загрузить файл (получает подпись и загружает автоматически)
78
+ pachca upload photo.jpg
79
+
80
+ # Из stdin
81
+ cat data.csv | pachca upload -
82
+ ```
83
+
84
+ Команда `upload` автоматически получает подпись (`POST /uploads`) и загружает файл на S3. Возвращает `key` — используйте его в `--files` при создании сообщений.
85
+
74
86
  ## Пагинация
75
87
 
76
88
  ```
package/dist/client.js CHANGED
@@ -25,7 +25,10 @@ function getBaseUrl() {
25
25
  const MAX_RETRIES = 3;
26
26
  const DEFAULT_TIMEOUT = 30;
27
27
  function buildUrl(apiPath, query) {
28
- const url = new URL(apiPath.startsWith('/') ? `${getBaseUrl()}${apiPath}` : `${getBaseUrl()}/${apiPath}`);
28
+ const base = apiPath.startsWith('http://') || apiPath.startsWith('https://')
29
+ ? apiPath
30
+ : apiPath.startsWith('/') ? `${getBaseUrl()}${apiPath}` : `${getBaseUrl()}/${apiPath}`;
31
+ const url = new URL(base);
29
32
  if (query) {
30
33
  for (const [key, value] of Object.entries(query)) {
31
34
  if (value !== undefined) {
@@ -71,7 +74,7 @@ export async function request(opts, clientFlags) {
71
74
  const timeoutSeconds = opts.timeout ?? clientFlags?.timeout ?? envTimeout ?? DEFAULT_TIMEOUT;
72
75
  const noRetry = opts.noRetry ?? clientFlags?.['no-retry'] ?? false;
73
76
  const fetchHeaders = {
74
- Authorization: `Bearer ${opts.token}`,
77
+ ...(opts.noAuth ? {} : { Authorization: `Bearer ${opts.token}` }),
75
78
  Accept: 'application/json',
76
79
  ...opts.headers,
77
80
  };
@@ -12,6 +12,10 @@ export default class CommonDirectUrl extends BaseCommand {
12
12
  static args = {};
13
13
  static flags = {
14
14
  ...BaseCommand.baseFlags,
15
+ 'direct-url': Flags.string({
16
+ description: 'URL для отправки запроса (получается из ответа POST /uploads)',
17
+ required: true,
18
+ }),
15
19
  'content-disposition': Flags.string({
16
20
  description: "Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)",
17
21
  }),
@@ -109,8 +113,9 @@ export default class CommonDirectUrl extends BaseCommand {
109
113
  }
110
114
  const { data } = await this.apiRequest({
111
115
  method: 'POST',
112
- path: '/direct_url',
116
+ path: flags['direct-url'],
113
117
  formData,
118
+ noAuth: true,
114
119
  });
115
120
  const responseBody = data;
116
121
  const result = responseBody.data ?? responseBody;
@@ -2,7 +2,6 @@ import { BaseCommand } from '../../base-command.js';
2
2
  export default class CommonUploads extends BaseCommand {
3
3
  static description = "Получение подписи, ключа и других параметров";
4
4
  static examples = [
5
- "Отправить сообщение с файлами:\n $ pachca common uploads",
6
5
  "Изменить вложения сообщения:\n $ pachca common uploads"
7
6
  ];
8
7
  static scope = "uploads:write";
@@ -0,0 +1,71 @@
1
+ import { Args } from '@oclif/core';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { BaseCommand } from '../base-command.js';
5
+ export default class Upload extends BaseCommand {
6
+ static description = 'Загрузить файл (получает подпись и загружает автоматически)';
7
+ static examples = [
8
+ '<%= config.bin %> upload photo.jpg',
9
+ 'cat data.csv | <%= config.bin %> upload -',
10
+ ];
11
+ static scope = 'uploads:write';
12
+ static args = {
13
+ file: Args.string({
14
+ description: 'Путь к файлу или - для stdin',
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ ...BaseCommand.baseFlags,
20
+ };
21
+ async run() {
22
+ const { args, flags } = await this.parse(Upload);
23
+ this.parsedFlags = flags;
24
+ this.checkScope('uploads:write');
25
+ // Step 1: Get upload params
26
+ const { data: uploadData } = await this.apiRequest({
27
+ method: 'POST',
28
+ path: '/uploads',
29
+ });
30
+ const params = uploadData;
31
+ // Step 2: Read file
32
+ let fileBlob;
33
+ let fileName;
34
+ if (args.file === '-') {
35
+ const chunks = [];
36
+ for await (const chunk of process.stdin)
37
+ chunks.push(chunk);
38
+ fileBlob = new Blob([Buffer.concat(chunks)]);
39
+ fileName = 'stdin';
40
+ }
41
+ else {
42
+ if (!fs.existsSync(args.file)) {
43
+ this.validationError([{ message: `Файл не найден: ${args.file}` }], { type: 'PACHCA_USAGE_ERROR' });
44
+ }
45
+ fileBlob = new Blob([fs.readFileSync(args.file)]);
46
+ fileName = path.basename(args.file);
47
+ }
48
+ // Step 3: Replace ${filename} in key
49
+ const key = params.key.replace('${filename}', fileName);
50
+ // Step 4: Build FormData
51
+ const formData = new FormData();
52
+ formData.append('Content-Disposition', params['Content-Disposition']);
53
+ formData.append('acl', params.acl);
54
+ formData.append('policy', params.policy);
55
+ formData.append('x-amz-credential', params['x-amz-credential']);
56
+ formData.append('x-amz-algorithm', params['x-amz-algorithm']);
57
+ formData.append('x-amz-date', params['x-amz-date']);
58
+ formData.append('x-amz-signature', params['x-amz-signature']);
59
+ formData.append('key', key);
60
+ formData.append('file', fileBlob, fileName);
61
+ // Step 5: Upload to external URL (no auth)
62
+ await this.apiRequest({
63
+ method: 'POST',
64
+ path: params.direct_url,
65
+ formData,
66
+ noAuth: true,
67
+ });
68
+ // Output the key for use in messages
69
+ this.output({ key });
70
+ }
71
+ }
@@ -1,4 +1,31 @@
1
1
  [
2
+ {
3
+ "version": "2026.3.7",
4
+ "date": "16 марта 2026",
5
+ "changes": [
6
+ {
7
+ "type": "+",
8
+ "command": "upload",
9
+ "description": "Загрузка файла одной командой (получает подпись + загружает автоматически)"
10
+ },
11
+ {
12
+ "type": "~",
13
+ "command": "common direct-url",
14
+ "description": "Обязательный флаг --direct-url вместо хардкод URL, запрос идёт без Authorization"
15
+ }
16
+ ]
17
+ },
18
+ {
19
+ "version": "2026.3.6",
20
+ "date": "15 марта 2026",
21
+ "changes": [
22
+ {
23
+ "type": "~",
24
+ "command": "threads",
25
+ "description": "Топик thread переименован в threads (pachca threads add, pachca threads get)"
26
+ }
27
+ ]
28
+ },
2
29
  {
3
30
  "version": "2026.3.5",
4
31
  "date": "7 марта 2026",
@@ -79,13 +79,13 @@
79
79
  "skill": "pachca-messages",
80
80
  "steps": [
81
81
  {
82
- "description": "Для каждого файла: получи параметры загрузки",
83
- "command": "pachca common uploads",
84
- "notes": "Получишь `key` (с `${filename}`), `direct_url`, `policy`, подпись"
82
+ "description": "Загрузи каждый файл — команда вернёт `key`",
83
+ "command": "pachca upload report.pdf",
84
+ "notes": "Команда автоматически получает подпись и загружает файл на S3"
85
85
  },
86
86
  {
87
87
  "description": "Отправь сообщение со всеми файлами",
88
- "command": "pachca messages create --entity-id=<chat_id> --content=\"Смотри файл\" --files='[{\"key\":\"...\",\"name\":\"report.pdf\",\"file_type\":\"file\",\"size\":12345}]'"
88
+ "command": "pachca messages create --entity-id=<chat_id> --content=\"Смотри файл\" --files='[{\"key\":\"attaches/files/.../report.pdf\",\"name\":\"report.pdf\",\"file_type\":\"file\",\"size\":12345}]'"
89
89
  }
90
90
  ]
91
91
  },
@@ -826,6 +826,139 @@
826
826
  "introspect.js"
827
827
  ]
828
828
  },
829
+ "upload": {
830
+ "aliases": [],
831
+ "args": {
832
+ "file": {
833
+ "description": "Путь к файлу или - для stdin",
834
+ "name": "file",
835
+ "required": true
836
+ }
837
+ },
838
+ "description": "Загрузить файл (получает подпись и загружает автоматически)",
839
+ "examples": [
840
+ "<%= config.bin %> upload photo.jpg",
841
+ "cat data.csv | <%= config.bin %> upload -"
842
+ ],
843
+ "flags": {
844
+ "output": {
845
+ "char": "o",
846
+ "description": "Output format: table, json, yaml, csv",
847
+ "name": "output",
848
+ "hasDynamicHelp": false,
849
+ "multiple": false,
850
+ "options": [
851
+ "table",
852
+ "json",
853
+ "yaml",
854
+ "csv"
855
+ ],
856
+ "type": "option"
857
+ },
858
+ "columns": {
859
+ "char": "c",
860
+ "description": "Columns to display (comma-separated)",
861
+ "name": "columns",
862
+ "hasDynamicHelp": false,
863
+ "multiple": false,
864
+ "type": "option"
865
+ },
866
+ "no-header": {
867
+ "description": "Hide table header",
868
+ "name": "no-header",
869
+ "allowNo": false,
870
+ "type": "boolean"
871
+ },
872
+ "no-truncate": {
873
+ "description": "Do not truncate values in table",
874
+ "name": "no-truncate",
875
+ "allowNo": false,
876
+ "type": "boolean"
877
+ },
878
+ "profile": {
879
+ "char": "p",
880
+ "description": "Profile to use for this command",
881
+ "name": "profile",
882
+ "hasDynamicHelp": false,
883
+ "multiple": false,
884
+ "type": "option"
885
+ },
886
+ "token": {
887
+ "description": "Bearer token for this call (not saved)",
888
+ "name": "token",
889
+ "hasDynamicHelp": false,
890
+ "multiple": false,
891
+ "type": "option"
892
+ },
893
+ "quiet": {
894
+ "char": "q",
895
+ "description": "Suppress output except errors",
896
+ "name": "quiet",
897
+ "allowNo": false,
898
+ "type": "boolean"
899
+ },
900
+ "no-color": {
901
+ "description": "Disable color output",
902
+ "name": "no-color",
903
+ "allowNo": false,
904
+ "type": "boolean"
905
+ },
906
+ "verbose": {
907
+ "char": "v",
908
+ "description": "Show HTTP request/response details",
909
+ "name": "verbose",
910
+ "allowNo": false,
911
+ "type": "boolean"
912
+ },
913
+ "no-input": {
914
+ "description": "Disable interactive prompts",
915
+ "name": "no-input",
916
+ "allowNo": false,
917
+ "type": "boolean"
918
+ },
919
+ "dry-run": {
920
+ "description": "Show HTTP request without sending",
921
+ "name": "dry-run",
922
+ "allowNo": false,
923
+ "type": "boolean"
924
+ },
925
+ "timeout": {
926
+ "description": "Request timeout in seconds",
927
+ "name": "timeout",
928
+ "hasDynamicHelp": false,
929
+ "multiple": false,
930
+ "type": "option"
931
+ },
932
+ "no-retry": {
933
+ "description": "Disable auto-retry on 429/503",
934
+ "name": "no-retry",
935
+ "allowNo": false,
936
+ "type": "boolean"
937
+ },
938
+ "json": {
939
+ "description": "Output as JSON (alias for --output json)",
940
+ "hidden": true,
941
+ "name": "json",
942
+ "allowNo": false,
943
+ "type": "boolean"
944
+ }
945
+ },
946
+ "hasDynamicHelp": false,
947
+ "hiddenAliases": [],
948
+ "id": "upload",
949
+ "pluginAlias": "@pachca/cli",
950
+ "pluginName": "@pachca/cli",
951
+ "pluginType": "core",
952
+ "strict": true,
953
+ "enableJsonFlag": false,
954
+ "scope": "uploads:write",
955
+ "isESM": true,
956
+ "relativePath": [
957
+ "dist",
958
+ "commands",
959
+ "upload.js"
960
+ ]
961
+ },
829
962
  "version": {
830
963
  "aliases": [],
831
964
  "args": {},
@@ -3371,6 +3504,14 @@
3371
3504
  "allowNo": false,
3372
3505
  "type": "boolean"
3373
3506
  },
3507
+ "direct-url": {
3508
+ "description": "URL для отправки запроса (получается из ответа POST /uploads)",
3509
+ "name": "direct-url",
3510
+ "required": true,
3511
+ "hasDynamicHelp": false,
3512
+ "multiple": false,
3513
+ "type": "option"
3514
+ },
3374
3515
  "content-disposition": {
3375
3516
  "description": "Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)",
3376
3517
  "name": "content-disposition",
@@ -3780,7 +3921,6 @@
3780
3921
  "args": {},
3781
3922
  "description": "Получение подписи, ключа и других параметров",
3782
3923
  "examples": [
3783
- "Отправить сообщение с файлами:\n $ pachca common uploads",
3784
3924
  "Изменить вложения сообщения:\n $ pachca common uploads"
3785
3925
  ],
3786
3926
  "flags": {
@@ -10599,7 +10739,7 @@
10599
10739
  "update.js"
10600
10740
  ]
10601
10741
  },
10602
- "thread:add": {
10742
+ "threads:add": {
10603
10743
  "aliases": [],
10604
10744
  "args": {
10605
10745
  "id": {
@@ -10718,7 +10858,7 @@
10718
10858
  },
10719
10859
  "hasDynamicHelp": false,
10720
10860
  "hiddenAliases": [],
10721
- "id": "thread:add",
10861
+ "id": "threads:add",
10722
10862
  "pluginAlias": "@pachca/cli",
10723
10863
  "pluginName": "@pachca/cli",
10724
10864
  "pluginType": "core",
@@ -10738,11 +10878,11 @@
10738
10878
  "relativePath": [
10739
10879
  "dist",
10740
10880
  "commands",
10741
- "thread",
10881
+ "threads",
10742
10882
  "add.js"
10743
10883
  ]
10744
10884
  },
10745
- "thread:get": {
10885
+ "threads:get": {
10746
10886
  "aliases": [],
10747
10887
  "args": {
10748
10888
  "id": {
@@ -10857,7 +10997,7 @@
10857
10997
  },
10858
10998
  "hasDynamicHelp": false,
10859
10999
  "hiddenAliases": [],
10860
- "id": "thread:get",
11000
+ "id": "threads:get",
10861
11001
  "pluginAlias": "@pachca/cli",
10862
11002
  "pluginName": "@pachca/cli",
10863
11003
  "pluginType": "core",
@@ -10877,23 +11017,18 @@
10877
11017
  "relativePath": [
10878
11018
  "dist",
10879
11019
  "commands",
10880
- "thread",
11020
+ "threads",
10881
11021
  "get.js"
10882
11022
  ]
10883
11023
  },
10884
- "threads:add": {
11024
+ "views:open": {
10885
11025
  "aliases": [],
10886
- "args": {
10887
- "id": {
10888
- "description": "Идентификатор сообщения",
10889
- "name": "id",
10890
- "required": true
10891
- }
10892
- },
10893
- "description": "Новый тред",
11026
+ "args": {},
11027
+ "description": "Открытие представления",
10894
11028
  "examples": [
10895
- "Ответить в тред (комментарий к сообщению):\n $ pachca thread add",
10896
- "Подписаться на тред сообщения:\n $ pachca thread add"
11029
+ "Показать интерактивную форму пользователю:\n $ pachca views open",
11030
+ "Опрос сотрудников через форму:\n $ pachca views open",
11031
+ "Форма заявки/запроса:\n $ pachca views open"
10897
11032
  ],
10898
11033
  "flags": {
10899
11034
  "output": {
@@ -10996,182 +11131,101 @@
10996
11131
  "name": "json",
10997
11132
  "allowNo": false,
10998
11133
  "type": "boolean"
11134
+ },
11135
+ "title": {
11136
+ "description": "Заголовок представления (макс. 24 символов)",
11137
+ "name": "title",
11138
+ "hasDynamicHelp": false,
11139
+ "multiple": false,
11140
+ "type": "option"
11141
+ },
11142
+ "close-text": {
11143
+ "description": "Текст кнопки закрытия представления (макс. 24 символов)",
11144
+ "name": "close-text",
11145
+ "hasDynamicHelp": false,
11146
+ "multiple": false,
11147
+ "type": "option"
11148
+ },
11149
+ "submit-text": {
11150
+ "description": "Текст кнопки отправки формы (макс. 24 символов)",
11151
+ "name": "submit-text",
11152
+ "hasDynamicHelp": false,
11153
+ "multiple": false,
11154
+ "type": "option"
11155
+ },
11156
+ "blocks": {
11157
+ "description": "Массив блоков представления",
11158
+ "name": "blocks",
11159
+ "hasDynamicHelp": false,
11160
+ "multiple": false,
11161
+ "type": "option"
11162
+ },
11163
+ "type": {
11164
+ "description": "Способ открытия представления",
11165
+ "name": "type",
11166
+ "hasDynamicHelp": false,
11167
+ "multiple": false,
11168
+ "options": [
11169
+ "modal"
11170
+ ],
11171
+ "type": "option"
11172
+ },
11173
+ "trigger-id": {
11174
+ "description": "Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)",
11175
+ "name": "trigger-id",
11176
+ "hasDynamicHelp": false,
11177
+ "multiple": false,
11178
+ "type": "option"
11179
+ },
11180
+ "private-metadata": {
11181
+ "description": "Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)",
11182
+ "name": "private-metadata",
11183
+ "hasDynamicHelp": false,
11184
+ "multiple": false,
11185
+ "type": "option"
11186
+ },
11187
+ "callback-id": {
11188
+ "description": "Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)",
11189
+ "name": "callback-id",
11190
+ "hasDynamicHelp": false,
11191
+ "multiple": false,
11192
+ "type": "option"
10999
11193
  }
11000
11194
  },
11001
11195
  "hasDynamicHelp": false,
11002
11196
  "hiddenAliases": [],
11003
- "id": "threads:add",
11197
+ "id": "views:open",
11004
11198
  "pluginAlias": "@pachca/cli",
11005
11199
  "pluginName": "@pachca/cli",
11006
11200
  "pluginType": "core",
11007
11201
  "strict": true,
11008
11202
  "enableJsonFlag": false,
11009
- "scope": "threads:create",
11203
+ "scope": "views:write",
11010
11204
  "apiMethod": "POST",
11011
- "apiPath": "/messages/{id}/thread",
11012
- "defaultColumns": [
11013
- "id",
11014
- "chat_id",
11015
- "message_id",
11016
- "message_chat_id",
11017
- "updated_at"
11205
+ "apiPath": "/views/open",
11206
+ "requiredFlags": [
11207
+ "title",
11208
+ "blocks",
11209
+ "type",
11210
+ "trigger-id"
11018
11211
  ],
11019
11212
  "isESM": true,
11020
11213
  "relativePath": [
11021
11214
  "dist",
11022
11215
  "commands",
11023
- "threads",
11024
- "add.js"
11216
+ "views",
11217
+ "open.js"
11025
11218
  ]
11026
11219
  },
11027
- "threads:get": {
11220
+ "users:create": {
11028
11221
  "aliases": [],
11029
- "args": {
11030
- "id": {
11031
- "description": "Идентификатор треда",
11032
- "name": "id",
11033
- "required": true
11034
- }
11035
- },
11036
- "description": "Информация о треде",
11037
- "flags": {
11038
- "output": {
11039
- "char": "o",
11040
- "description": "Output format: table, json, yaml, csv",
11041
- "name": "output",
11042
- "hasDynamicHelp": false,
11043
- "multiple": false,
11044
- "options": [
11045
- "table",
11046
- "json",
11047
- "yaml",
11048
- "csv"
11049
- ],
11050
- "type": "option"
11051
- },
11052
- "columns": {
11053
- "char": "c",
11054
- "description": "Columns to display (comma-separated)",
11055
- "name": "columns",
11056
- "hasDynamicHelp": false,
11057
- "multiple": false,
11058
- "type": "option"
11059
- },
11060
- "no-header": {
11061
- "description": "Hide table header",
11062
- "name": "no-header",
11063
- "allowNo": false,
11064
- "type": "boolean"
11065
- },
11066
- "no-truncate": {
11067
- "description": "Do not truncate values in table",
11068
- "name": "no-truncate",
11069
- "allowNo": false,
11070
- "type": "boolean"
11071
- },
11072
- "profile": {
11073
- "char": "p",
11074
- "description": "Profile to use for this command",
11075
- "name": "profile",
11076
- "hasDynamicHelp": false,
11077
- "multiple": false,
11078
- "type": "option"
11079
- },
11080
- "token": {
11081
- "description": "Bearer token for this call (not saved)",
11082
- "name": "token",
11083
- "hasDynamicHelp": false,
11084
- "multiple": false,
11085
- "type": "option"
11086
- },
11087
- "quiet": {
11088
- "char": "q",
11089
- "description": "Suppress output except errors",
11090
- "name": "quiet",
11091
- "allowNo": false,
11092
- "type": "boolean"
11093
- },
11094
- "no-color": {
11095
- "description": "Disable color output",
11096
- "name": "no-color",
11097
- "allowNo": false,
11098
- "type": "boolean"
11099
- },
11100
- "verbose": {
11101
- "char": "v",
11102
- "description": "Show HTTP request/response details",
11103
- "name": "verbose",
11104
- "allowNo": false,
11105
- "type": "boolean"
11106
- },
11107
- "no-input": {
11108
- "description": "Disable interactive prompts",
11109
- "name": "no-input",
11110
- "allowNo": false,
11111
- "type": "boolean"
11112
- },
11113
- "dry-run": {
11114
- "description": "Show HTTP request without sending",
11115
- "name": "dry-run",
11116
- "allowNo": false,
11117
- "type": "boolean"
11118
- },
11119
- "timeout": {
11120
- "description": "Request timeout in seconds",
11121
- "name": "timeout",
11122
- "hasDynamicHelp": false,
11123
- "multiple": false,
11124
- "type": "option"
11125
- },
11126
- "no-retry": {
11127
- "description": "Disable auto-retry on 429/503",
11128
- "name": "no-retry",
11129
- "allowNo": false,
11130
- "type": "boolean"
11131
- },
11132
- "json": {
11133
- "description": "Output as JSON (alias for --output json)",
11134
- "hidden": true,
11135
- "name": "json",
11136
- "allowNo": false,
11137
- "type": "boolean"
11138
- }
11139
- },
11140
- "hasDynamicHelp": false,
11141
- "hiddenAliases": [],
11142
- "id": "threads:get",
11143
- "pluginAlias": "@pachca/cli",
11144
- "pluginName": "@pachca/cli",
11145
- "pluginType": "core",
11146
- "strict": true,
11147
- "enableJsonFlag": false,
11148
- "scope": "threads:read",
11149
- "apiMethod": "GET",
11150
- "apiPath": "/threads/{id}",
11151
- "defaultColumns": [
11152
- "id",
11153
- "chat_id",
11154
- "message_id",
11155
- "message_chat_id",
11156
- "updated_at"
11157
- ],
11158
- "isESM": true,
11159
- "relativePath": [
11160
- "dist",
11161
- "commands",
11162
- "threads",
11163
- "get.js"
11164
- ]
11165
- },
11166
- "users:create": {
11167
- "aliases": [],
11168
- "args": {},
11169
- "description": "Создать сотрудника",
11170
- "examples": [
11171
- "Проверить, кто прочитал сообщение:\n $ pachca users list",
11172
- "Разослать уведомление нескольким пользователям:\n $ pachca users list",
11173
- "Массовое создание сотрудников с тегами:\n $ pachca users create"
11174
- ],
11222
+ "args": {},
11223
+ "description": "Создать сотрудника",
11224
+ "examples": [
11225
+ "Проверить, кто прочитал сообщение:\n $ pachca users list",
11226
+ "Разослать уведомление нескольким пользователям:\n $ pachca users list",
11227
+ "Массовое создание сотрудников с тегами:\n $ pachca users create"
11228
+ ],
11175
11229
  "flags": {
11176
11230
  "output": {
11177
11231
  "char": "o",
@@ -12524,203 +12578,7 @@
12524
12578
  "users",
12525
12579
  "update.js"
12526
12580
  ]
12527
- },
12528
- "views:open": {
12529
- "aliases": [],
12530
- "args": {},
12531
- "description": "Открытие представления",
12532
- "examples": [
12533
- "Показать интерактивную форму пользователю:\n $ pachca views open",
12534
- "Опрос сотрудников через форму:\n $ pachca views open",
12535
- "Форма заявки/запроса:\n $ pachca views open"
12536
- ],
12537
- "flags": {
12538
- "output": {
12539
- "char": "o",
12540
- "description": "Output format: table, json, yaml, csv",
12541
- "name": "output",
12542
- "hasDynamicHelp": false,
12543
- "multiple": false,
12544
- "options": [
12545
- "table",
12546
- "json",
12547
- "yaml",
12548
- "csv"
12549
- ],
12550
- "type": "option"
12551
- },
12552
- "columns": {
12553
- "char": "c",
12554
- "description": "Columns to display (comma-separated)",
12555
- "name": "columns",
12556
- "hasDynamicHelp": false,
12557
- "multiple": false,
12558
- "type": "option"
12559
- },
12560
- "no-header": {
12561
- "description": "Hide table header",
12562
- "name": "no-header",
12563
- "allowNo": false,
12564
- "type": "boolean"
12565
- },
12566
- "no-truncate": {
12567
- "description": "Do not truncate values in table",
12568
- "name": "no-truncate",
12569
- "allowNo": false,
12570
- "type": "boolean"
12571
- },
12572
- "profile": {
12573
- "char": "p",
12574
- "description": "Profile to use for this command",
12575
- "name": "profile",
12576
- "hasDynamicHelp": false,
12577
- "multiple": false,
12578
- "type": "option"
12579
- },
12580
- "token": {
12581
- "description": "Bearer token for this call (not saved)",
12582
- "name": "token",
12583
- "hasDynamicHelp": false,
12584
- "multiple": false,
12585
- "type": "option"
12586
- },
12587
- "quiet": {
12588
- "char": "q",
12589
- "description": "Suppress output except errors",
12590
- "name": "quiet",
12591
- "allowNo": false,
12592
- "type": "boolean"
12593
- },
12594
- "no-color": {
12595
- "description": "Disable color output",
12596
- "name": "no-color",
12597
- "allowNo": false,
12598
- "type": "boolean"
12599
- },
12600
- "verbose": {
12601
- "char": "v",
12602
- "description": "Show HTTP request/response details",
12603
- "name": "verbose",
12604
- "allowNo": false,
12605
- "type": "boolean"
12606
- },
12607
- "no-input": {
12608
- "description": "Disable interactive prompts",
12609
- "name": "no-input",
12610
- "allowNo": false,
12611
- "type": "boolean"
12612
- },
12613
- "dry-run": {
12614
- "description": "Show HTTP request without sending",
12615
- "name": "dry-run",
12616
- "allowNo": false,
12617
- "type": "boolean"
12618
- },
12619
- "timeout": {
12620
- "description": "Request timeout in seconds",
12621
- "name": "timeout",
12622
- "hasDynamicHelp": false,
12623
- "multiple": false,
12624
- "type": "option"
12625
- },
12626
- "no-retry": {
12627
- "description": "Disable auto-retry on 429/503",
12628
- "name": "no-retry",
12629
- "allowNo": false,
12630
- "type": "boolean"
12631
- },
12632
- "json": {
12633
- "description": "Output as JSON (alias for --output json)",
12634
- "hidden": true,
12635
- "name": "json",
12636
- "allowNo": false,
12637
- "type": "boolean"
12638
- },
12639
- "title": {
12640
- "description": "Заголовок представления (макс. 24 символов)",
12641
- "name": "title",
12642
- "hasDynamicHelp": false,
12643
- "multiple": false,
12644
- "type": "option"
12645
- },
12646
- "close-text": {
12647
- "description": "Текст кнопки закрытия представления (макс. 24 символов)",
12648
- "name": "close-text",
12649
- "hasDynamicHelp": false,
12650
- "multiple": false,
12651
- "type": "option"
12652
- },
12653
- "submit-text": {
12654
- "description": "Текст кнопки отправки формы (макс. 24 символов)",
12655
- "name": "submit-text",
12656
- "hasDynamicHelp": false,
12657
- "multiple": false,
12658
- "type": "option"
12659
- },
12660
- "blocks": {
12661
- "description": "Массив блоков представления",
12662
- "name": "blocks",
12663
- "hasDynamicHelp": false,
12664
- "multiple": false,
12665
- "type": "option"
12666
- },
12667
- "type": {
12668
- "description": "Способ открытия представления",
12669
- "name": "type",
12670
- "hasDynamicHelp": false,
12671
- "multiple": false,
12672
- "options": [
12673
- "modal"
12674
- ],
12675
- "type": "option"
12676
- },
12677
- "trigger-id": {
12678
- "description": "Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)",
12679
- "name": "trigger-id",
12680
- "hasDynamicHelp": false,
12681
- "multiple": false,
12682
- "type": "option"
12683
- },
12684
- "private-metadata": {
12685
- "description": "Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)",
12686
- "name": "private-metadata",
12687
- "hasDynamicHelp": false,
12688
- "multiple": false,
12689
- "type": "option"
12690
- },
12691
- "callback-id": {
12692
- "description": "Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)",
12693
- "name": "callback-id",
12694
- "hasDynamicHelp": false,
12695
- "multiple": false,
12696
- "type": "option"
12697
- }
12698
- },
12699
- "hasDynamicHelp": false,
12700
- "hiddenAliases": [],
12701
- "id": "views:open",
12702
- "pluginAlias": "@pachca/cli",
12703
- "pluginName": "@pachca/cli",
12704
- "pluginType": "core",
12705
- "strict": true,
12706
- "enableJsonFlag": false,
12707
- "scope": "views:write",
12708
- "apiMethod": "POST",
12709
- "apiPath": "/views/open",
12710
- "requiredFlags": [
12711
- "title",
12712
- "blocks",
12713
- "type",
12714
- "trigger-id"
12715
- ],
12716
- "isESM": true,
12717
- "relativePath": [
12718
- "dist",
12719
- "commands",
12720
- "views",
12721
- "open.js"
12722
- ]
12723
12581
  }
12724
12582
  },
12725
- "version": "2026.3.5"
12583
+ "version": "2026.3.7"
12726
12584
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pachca/cli",
3
- "version": "2026.3.5",
3
+ "version": "2026.3.7",
4
4
  "description": "CLI для Pachca API",
5
5
  "type": "module",
6
6
  "bin": {
@@ -85,7 +85,7 @@
85
85
  "tasks": {
86
86
  "description": "Напоминания"
87
87
  },
88
- "thread": {
88
+ "threads": {
89
89
  "description": "Треды (обсуждения)"
90
90
  },
91
91
  "users": {
@@ -1,35 +0,0 @@
1
- // Auto-generated from openapi.yaml — DO NOT EDIT
2
- import { Args } from '@oclif/core';
3
- import { BaseCommand } from '../../base-command.js';
4
- export default class ThreadAdd extends BaseCommand {
5
- static description = "Новый тред";
6
- static examples = [
7
- "Ответить в тред (комментарий к сообщению):\n $ pachca thread add",
8
- "Подписаться на тред сообщения:\n $ pachca thread add"
9
- ];
10
- static scope = "threads:create";
11
- static apiMethod = "POST";
12
- static apiPath = "/messages/{id}/thread";
13
- static defaultColumns = ["id", "chat_id", "message_id", "message_chat_id", "updated_at"];
14
- static args = {
15
- id: Args.integer({
16
- description: "Идентификатор сообщения",
17
- required: true,
18
- }),
19
- };
20
- static flags = {
21
- ...BaseCommand.baseFlags,
22
- };
23
- async run() {
24
- const { args, flags } = await this.parse(ThreadAdd);
25
- this.parsedFlags = flags;
26
- this.checkScope("threads:create");
27
- const { data } = await this.apiRequest({
28
- method: 'POST',
29
- path: `/messages/${args.id}/thread`,
30
- });
31
- const responseBody = data;
32
- const result = responseBody.data ?? responseBody;
33
- this.output(result);
34
- }
35
- }
@@ -1,31 +0,0 @@
1
- // Auto-generated from openapi.yaml — DO NOT EDIT
2
- import { Args } from '@oclif/core';
3
- import { BaseCommand } from '../../base-command.js';
4
- export default class ThreadGet extends BaseCommand {
5
- static description = "Информация о треде";
6
- static scope = "threads:read";
7
- static apiMethod = "GET";
8
- static apiPath = "/threads/{id}";
9
- static defaultColumns = ["id", "chat_id", "message_id", "message_chat_id", "updated_at"];
10
- static args = {
11
- id: Args.integer({
12
- description: "Идентификатор треда",
13
- required: true,
14
- }),
15
- };
16
- static flags = {
17
- ...BaseCommand.baseFlags,
18
- };
19
- async run() {
20
- const { args, flags } = await this.parse(ThreadGet);
21
- this.parsedFlags = flags;
22
- this.checkScope("threads:read");
23
- const { data } = await this.apiRequest({
24
- method: 'GET',
25
- path: `/threads/${args.id}`,
26
- });
27
- const responseBody = data;
28
- const result = responseBody.data ?? responseBody;
29
- this.output(result);
30
- }
31
- }