@notehub.md/cli 0.1.8 → 0.1.10
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/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +1 -3
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +13 -1
- package/dist/commands/create.js.map +1 -1
- package/package.json +2 -2
- package/templates/docs/en/01-getting-started.md +207 -0
- package/templates/docs/en/02-architecture.md +228 -0
- package/templates/docs/en/03-api-reference.md +747 -0
- package/templates/docs/en/04-widgets.md +322 -0
- package/templates/docs/en/05-settings.md +303 -0
- package/templates/docs/en/06-context-menu.md +283 -0
- package/templates/docs/en/07-examples.md +547 -0
- package/templates/docs/en/README.md +125 -0
- package/templates/docs/ru/01-getting-started.md +207 -0
- package/templates/docs/ru/02-architecture.md +228 -0
- package/templates/docs/ru/03-api-reference.md +747 -0
- package/templates/docs/ru/04-widgets.md +293 -0
- package/templates/docs/ru/05-settings.md +303 -0
- package/templates/docs/ru/06-context-menu.md +283 -0
- package/templates/docs/ru/07-examples.md +547 -0
- package/templates/docs/ru/README.md +125 -0
- package/templates/docs.html +6 -4
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
# Справочник API
|
|
2
|
+
|
|
3
|
+
Полный справочник всех методов API Notehub.md, доступных для плагинов.
|
|
4
|
+
|
|
5
|
+
Используйте `ctx.invokeApi(имяМетода, ...аргументы)` для вызова любого из этих методов.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Logger API
|
|
10
|
+
|
|
11
|
+
Структурированное логирование для отладки и мониторинга.
|
|
12
|
+
|
|
13
|
+
### `logger:log`
|
|
14
|
+
|
|
15
|
+
Логирование сообщения с указанным уровнем.
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
await ctx.invokeApi('logger:log', level: string, source: string, message: string): void;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
| Параметр | Тип | Описание |
|
|
22
|
+
|----------|-----|----------|
|
|
23
|
+
| `level` | `string` | Уровень: 'info', 'warn', 'error' |
|
|
24
|
+
| `source` | `string` | Идентификатор источника (обычно имя плагина) |
|
|
25
|
+
| `message` | `string` | Сообщение для логирования |
|
|
26
|
+
|
|
27
|
+
### `logger:info`
|
|
28
|
+
|
|
29
|
+
Логирование сообщения уровня INFO.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
await ctx.invokeApi('logger:info', 'MyPlugin', 'Операция завершена');
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### `logger:warn`
|
|
36
|
+
|
|
37
|
+
Логирование сообщения уровня WARN.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
await ctx.invokeApi('logger:warn', 'MyPlugin', 'Конфиг не найден, используются значения по умолчанию');
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### `logger:error`
|
|
44
|
+
|
|
45
|
+
Логирование сообщения уровня ERROR.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
await ctx.invokeApi('logger:error', 'MyPlugin', 'Не удалось загрузить данные');
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Config API
|
|
54
|
+
|
|
55
|
+
Персистентная конфигурация, сохраняемая на диск.
|
|
56
|
+
|
|
57
|
+
### `config:get`
|
|
58
|
+
|
|
59
|
+
Получение значения конфигурации по ключу.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const value = await ctx.invokeApi<T>('config:get', key: string, defaultValue?: T): T | undefined;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Пример:**
|
|
66
|
+
```typescript
|
|
67
|
+
const fontSize = await ctx.invokeApi<number>('config:get', 'editor.font-size', 14);
|
|
68
|
+
const theme = await ctx.invokeApi<string>('config:get', 'theme.current', 'dark');
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### `config:set`
|
|
72
|
+
|
|
73
|
+
Установка значения конфигурации (автоматически сохраняется на диск).
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
await ctx.invokeApi('config:set', 'my-plugin.option', true);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `config:delete`
|
|
80
|
+
|
|
81
|
+
Удаление значения конфигурации.
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
await ctx.invokeApi('config:delete', 'my-plugin.option');
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### `config:reload`
|
|
88
|
+
|
|
89
|
+
Перезагрузка конфигурации с диска.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
await ctx.invokeApi('config:reload');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## State API
|
|
98
|
+
|
|
99
|
+
Состояние времени выполнения (не сохраняется — теряется при перезапуске).
|
|
100
|
+
|
|
101
|
+
### `state:set`
|
|
102
|
+
|
|
103
|
+
Сохранение значения в состояние.
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
await ctx.invokeApi('state:set', 'my-plugin.cache', { data: [...] });
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### `state:get`
|
|
110
|
+
|
|
111
|
+
Получение значения из состояния.
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
const cache = await ctx.invokeApi<MyData>('state:get', 'my-plugin.cache');
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### `state:delete`
|
|
118
|
+
|
|
119
|
+
Удаление значения из состояния.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
await ctx.invokeApi('state:delete', 'my-plugin.cache');
|
|
123
|
+
// Возвращает: boolean (true если удалено)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### `state:has`
|
|
127
|
+
|
|
128
|
+
Проверка существования ключа.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
const exists = await ctx.invokeApi<boolean>('state:has', 'my-plugin.cache');
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `state:keys`
|
|
135
|
+
|
|
136
|
+
Получение всех ключей в состоянии.
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
const keys = await ctx.invokeApi<string[]>('state:keys');
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### `state:clear`
|
|
143
|
+
|
|
144
|
+
Очистка всего состояния.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
await ctx.invokeApi('state:clear');
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### `state:dump`
|
|
151
|
+
|
|
152
|
+
Экспорт всего состояния как объекта.
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const snapshot = await ctx.invokeApi<Record<string, unknown>>('state:dump');
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### `state:restore`
|
|
159
|
+
|
|
160
|
+
Восстановление состояния из дампа.
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
await ctx.invokeApi('state:restore', snapshot);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Filesystem API
|
|
169
|
+
|
|
170
|
+
Доступ к файлам в хранилище.
|
|
171
|
+
|
|
172
|
+
### `fs:read-text-file`
|
|
173
|
+
|
|
174
|
+
Чтение файла как UTF-8 текста.
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const content = await ctx.invokeApi<string>('fs:read-text-file', '/path/to/file.md');
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### `fs:read-file`
|
|
181
|
+
|
|
182
|
+
Чтение файла как бинарных данных.
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
const data = await ctx.invokeApi<Uint8Array>('fs:read-file', '/path/to/image.png');
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### `fs:write-text-file`
|
|
189
|
+
|
|
190
|
+
Запись текста в файл.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
await ctx.invokeApi('fs:write-text-file', '/path/to/file.md', '# Привет мир');
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### `fs:write-file`
|
|
197
|
+
|
|
198
|
+
Запись бинарных данных в файл.
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
await ctx.invokeApi('fs:write-file', '/path/to/file.bin', new Uint8Array([...]));
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### `fs:exists`
|
|
205
|
+
|
|
206
|
+
Проверка существования пути.
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
const exists = await ctx.invokeApi<boolean>('fs:exists', '/path/to/file.md');
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### `fs:read-dir`
|
|
213
|
+
|
|
214
|
+
Чтение содержимого директории.
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
interface DirEntry {
|
|
218
|
+
name: string;
|
|
219
|
+
isDirectory: boolean;
|
|
220
|
+
isFile: boolean;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const entries = await ctx.invokeApi<DirEntry[]>('fs:read-dir', '/path/to/folder');
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### `fs:create-dir`
|
|
227
|
+
|
|
228
|
+
Создание директории.
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
await ctx.invokeApi('fs:create-dir', '/path/to/new-folder', { recursive: true });
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### `fs:remove-file`
|
|
235
|
+
|
|
236
|
+
Удаление файла.
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
await ctx.invokeApi('fs:remove-file', '/path/to/file.md');
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### `fs:remove-dir`
|
|
243
|
+
|
|
244
|
+
Удаление директории.
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
await ctx.invokeApi('fs:remove-dir', '/path/to/folder', { recursive: true });
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### `fs:rename`
|
|
251
|
+
|
|
252
|
+
Переименование или перемещение файла/директории.
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
await ctx.invokeApi('fs:rename', '/old/path.md', '/new/path.md');
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### `fs:watch`
|
|
259
|
+
|
|
260
|
+
Наблюдение за изменениями в пути.
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
interface FsEvent {
|
|
264
|
+
path: string;
|
|
265
|
+
type: 'create' | 'modify' | 'remove' | 'any';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const unwatch = await ctx.invokeApi<() => void>(
|
|
269
|
+
'fs:watch',
|
|
270
|
+
'/path/to/folder',
|
|
271
|
+
(event: FsEvent) => {
|
|
272
|
+
console.log('Обнаружено изменение:', event);
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
// Позже: прекратить наблюдение
|
|
277
|
+
unwatch();
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### `fs:pick-directory`
|
|
281
|
+
|
|
282
|
+
Открытие нативного диалога выбора директории.
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
const path = await ctx.invokeApi<string | null>('fs:pick-directory');
|
|
286
|
+
if (path) {
|
|
287
|
+
console.log('Пользователь выбрал:', path);
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Dialog API
|
|
294
|
+
|
|
295
|
+
Показ модальных диалогов пользователю.
|
|
296
|
+
|
|
297
|
+
### `dialog:alert`
|
|
298
|
+
|
|
299
|
+
Показ информационного сообщения.
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
await ctx.invokeApi('dialog:alert', 'Внимание', 'Файл был удален');
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### `dialog:confirm`
|
|
306
|
+
|
|
307
|
+
Показ диалога подтверждения.
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
const confirmed = await ctx.invokeApi<boolean>(
|
|
311
|
+
'dialog:confirm',
|
|
312
|
+
'Удаление файла',
|
|
313
|
+
'Вы уверены, что хотите удалить этот файл?'
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
if (confirmed) {
|
|
317
|
+
// Пользователь нажал OK
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### `dialog:prompt`
|
|
322
|
+
|
|
323
|
+
Показ диалога для ввода пользователя.
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
const name = await ctx.invokeApi<string | null>(
|
|
327
|
+
'dialog:prompt',
|
|
328
|
+
'Переименование файла',
|
|
329
|
+
'Введите новое имя файла:',
|
|
330
|
+
'untitled.md' // значение по умолчанию
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
if (name !== null) {
|
|
334
|
+
// Пользователь ввел значение
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Theme API
|
|
341
|
+
|
|
342
|
+
Управление темами и цветами.
|
|
343
|
+
|
|
344
|
+
### `theme:register`
|
|
345
|
+
|
|
346
|
+
Регистрация кастомной темы.
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
const myPalette = {
|
|
350
|
+
'bg-main': '#1a1a2e',
|
|
351
|
+
'bg-sidebar': '#16213e',
|
|
352
|
+
'bg-surface': '#0f3460',
|
|
353
|
+
'text-primary': '#e6e6e6',
|
|
354
|
+
'accent-primary': '#e94560',
|
|
355
|
+
// ... больше цветов
|
|
356
|
+
'font-family': 'Inter, sans-serif'
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
await ctx.invokeApi('theme:register', 'my-dark-theme', myPalette);
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### `theme:set`
|
|
363
|
+
|
|
364
|
+
Применение темы.
|
|
365
|
+
|
|
366
|
+
```typescript
|
|
367
|
+
const success = await ctx.invokeApi<boolean>('theme:set', 'my-dark-theme');
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### `theme:get-current`
|
|
371
|
+
|
|
372
|
+
Получение имени текущей темы.
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
const themeName = await ctx.invokeApi<string>('theme:get-current');
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### `theme:list`
|
|
379
|
+
|
|
380
|
+
Список всех зарегистрированных тем.
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
const themes = await ctx.invokeApi<string[]>('theme:list');
|
|
384
|
+
// ['deep-space', 'light', 'my-dark-theme']
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### `theme:get`
|
|
388
|
+
|
|
389
|
+
Получение палитры темы по имени.
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
const palette = await ctx.invokeApi<ThemePalette | undefined>('theme:get', 'deep-space');
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Layout API
|
|
398
|
+
|
|
399
|
+
Управление лэйаутами приложения и зонами.
|
|
400
|
+
|
|
401
|
+
### `layout:register-component`
|
|
402
|
+
|
|
403
|
+
Регистрация компонента лэйаута.
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
const MyLayout: React.FC = () => <div>Мой кастомный лэйаут</div>;
|
|
407
|
+
await ctx.invokeApi('layout:register-component', 'my-layout', MyLayout);
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### `layout:set`
|
|
411
|
+
|
|
412
|
+
Установка активного лэйаута.
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
await ctx.invokeApi('layout:set', 'editor-layout', { showSidebar: true });
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### `layout:get-active`
|
|
419
|
+
|
|
420
|
+
Получение информации о текущем лэйауте.
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
interface ActiveLayout {
|
|
424
|
+
name: string;
|
|
425
|
+
props: Record<string, unknown>;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const layout = await ctx.invokeApi<ActiveLayout | null>('layout:get-active');
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### `layout:list`
|
|
432
|
+
|
|
433
|
+
Список зарегистрированных лэйаутов.
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
const layouts = await ctx.invokeApi<string[]>('layout:list');
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### `zone:register`
|
|
440
|
+
|
|
441
|
+
Регистрация компонента в зоне лэйаута.
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
await ctx.invokeApi('zone:register', 'sidebar-top', {
|
|
445
|
+
component: 'my-sidebar-widget',
|
|
446
|
+
priority: 100 // Выше = рендерится первым
|
|
447
|
+
});
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### `zone:get`
|
|
451
|
+
|
|
452
|
+
Получение всех элементов в зоне.
|
|
453
|
+
|
|
454
|
+
```typescript
|
|
455
|
+
const items = await ctx.invokeApi<ZoneItem[]>('zone:get', 'sidebar-top');
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### `zone:clear`
|
|
459
|
+
|
|
460
|
+
Очистка всех элементов в зоне.
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
await ctx.invokeApi('zone:clear', 'sidebar-top');
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## Controller API
|
|
469
|
+
|
|
470
|
+
Регистрация React-компонентов как именованных контроллеров.
|
|
471
|
+
|
|
472
|
+
### `controller:register`
|
|
473
|
+
|
|
474
|
+
Регистрация компонента-контроллера.
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
const MyComponent: React.FC = () => <div>Привет!</div>;
|
|
478
|
+
await ctx.invokeApi('controller:register', 'my-component', MyComponent);
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### `controller:unregister`
|
|
482
|
+
|
|
483
|
+
Отмена регистрации контроллера.
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
await ctx.invokeApi('controller:unregister', 'my-component');
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### `controller:get`
|
|
490
|
+
|
|
491
|
+
Получение контроллера по имени.
|
|
492
|
+
|
|
493
|
+
```typescript
|
|
494
|
+
const Component = await ctx.invokeApi<React.FC>('controller:get', 'my-component');
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Icon API
|
|
500
|
+
|
|
501
|
+
Регистрация и получение иконок.
|
|
502
|
+
|
|
503
|
+
### `icon:register`
|
|
504
|
+
|
|
505
|
+
Регистрация кастомной иконки.
|
|
506
|
+
|
|
507
|
+
```typescript
|
|
508
|
+
import { MyCustomIcon } from './icons';
|
|
509
|
+
await ctx.invokeApi('icon:register', 'my-icon', MyCustomIcon);
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### `icon:get`
|
|
513
|
+
|
|
514
|
+
Получение компонента иконки.
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
const IconComponent = await ctx.invokeApi<React.ElementType>('icon:get', 'my-icon');
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## Editor API
|
|
523
|
+
|
|
524
|
+
Регистрация кастомных виджетов редактора (Порталов).
|
|
525
|
+
|
|
526
|
+
### `editor:register-widget`
|
|
527
|
+
|
|
528
|
+
Регистрация инлайн-виджета, рендерящегося для regex-совпадений.
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
532
|
+
const progress = parseInt(match[1], 10);
|
|
533
|
+
return <div style={{ width: `${progress}%` }} />;
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
await ctx.invokeApi(
|
|
537
|
+
'editor:register-widget',
|
|
538
|
+
'my-plugin:progress-bar',
|
|
539
|
+
/\[progress:(\d+)\]/g,
|
|
540
|
+
ProgressBar
|
|
541
|
+
);
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### `editor:unregister-widget`
|
|
545
|
+
|
|
546
|
+
Отмена регистрации виджета (автоматически очищается при выгрузке).
|
|
547
|
+
|
|
548
|
+
```typescript
|
|
549
|
+
await ctx.invokeApi('editor:unregister-widget', 'my-plugin:progress-bar');
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
Смотрите **[Виджеты (Порталы)](04-widgets.md)** для подробной документации.
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## Settings API
|
|
557
|
+
|
|
558
|
+
Добавление UI конфигурации в модальное окно настроек.
|
|
559
|
+
|
|
560
|
+
### `settings:register-tab`
|
|
561
|
+
|
|
562
|
+
Регистрация вкладки настроек.
|
|
563
|
+
|
|
564
|
+
```typescript
|
|
565
|
+
await ctx.invokeApi('settings:register-tab', {
|
|
566
|
+
id: 'my-plugin-settings',
|
|
567
|
+
label: 'Мой плагин',
|
|
568
|
+
icon: 'puzzle',
|
|
569
|
+
order: 100
|
|
570
|
+
});
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### `settings:register-group`
|
|
574
|
+
|
|
575
|
+
Регистрация группы настроек внутри вкладки.
|
|
576
|
+
|
|
577
|
+
```typescript
|
|
578
|
+
await ctx.invokeApi('settings:register-group', {
|
|
579
|
+
id: 'my-plugin-general',
|
|
580
|
+
tabId: 'my-plugin-settings',
|
|
581
|
+
label: 'Основные настройки',
|
|
582
|
+
order: 0
|
|
583
|
+
});
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
### `settings:register-item`
|
|
587
|
+
|
|
588
|
+
Регистрация элемента настроек внутри группы.
|
|
589
|
+
|
|
590
|
+
```typescript
|
|
591
|
+
await ctx.invokeApi('settings:register-item', {
|
|
592
|
+
key: 'my-plugin.enabled',
|
|
593
|
+
type: 'toggle',
|
|
594
|
+
label: 'Включить плагин',
|
|
595
|
+
description: 'Включение или выключение плагина',
|
|
596
|
+
groupId: 'my-plugin-general',
|
|
597
|
+
order: 0,
|
|
598
|
+
defaultValue: true
|
|
599
|
+
});
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Смотрите **[Интеграция настроек](05-settings.md)** для подробной документации.
|
|
603
|
+
|
|
604
|
+
### `settings:open` / `settings:close` / `settings:toggle`
|
|
605
|
+
|
|
606
|
+
Управление модальным окном настроек.
|
|
607
|
+
|
|
608
|
+
```typescript
|
|
609
|
+
await ctx.invokeApi('settings:open');
|
|
610
|
+
await ctx.invokeApi('settings:close');
|
|
611
|
+
await ctx.invokeApi('settings:toggle');
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## Context Menu API
|
|
617
|
+
|
|
618
|
+
Добавление элементов в контекстные меню.
|
|
619
|
+
|
|
620
|
+
### `context-menu:register`
|
|
621
|
+
|
|
622
|
+
Регистрация провайдера меню для контекста.
|
|
623
|
+
|
|
624
|
+
```typescript
|
|
625
|
+
const unsubscribe = await ctx.invokeApi<() => void>(
|
|
626
|
+
'context-menu:register',
|
|
627
|
+
'explorer-item', // ID контекста
|
|
628
|
+
(payload: { path: string }) => [
|
|
629
|
+
{
|
|
630
|
+
type: 'action',
|
|
631
|
+
id: 'my-action',
|
|
632
|
+
label: 'Моё кастомное действие',
|
|
633
|
+
icon: 'star',
|
|
634
|
+
onClick: () => {
|
|
635
|
+
console.log('Клик на:', payload.path);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
]
|
|
639
|
+
);
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
Смотрите **[Контекстные меню](06-context-menu.md)** для подробной документации.
|
|
643
|
+
|
|
644
|
+
---
|
|
645
|
+
|
|
646
|
+
## Explorer API
|
|
647
|
+
|
|
648
|
+
Управление файловым проводником.
|
|
649
|
+
|
|
650
|
+
### `explorer:open`
|
|
651
|
+
|
|
652
|
+
Открытие папки в проводнике.
|
|
653
|
+
|
|
654
|
+
```typescript
|
|
655
|
+
await ctx.invokeApi('explorer:open', '/path/to/folder');
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
### `explorer:set-root`
|
|
659
|
+
|
|
660
|
+
Установка корневого пути для проводника.
|
|
661
|
+
|
|
662
|
+
```typescript
|
|
663
|
+
await ctx.invokeApi('explorer:set-root', '/new/vault/path');
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
## Synapse API
|
|
669
|
+
|
|
670
|
+
Программное управление внешними плагинами.
|
|
671
|
+
|
|
672
|
+
### `synapse:load-plugin`
|
|
673
|
+
|
|
674
|
+
Загрузка внешнего плагина по пути.
|
|
675
|
+
|
|
676
|
+
```typescript
|
|
677
|
+
interface SynapseLoadResult {
|
|
678
|
+
success: boolean;
|
|
679
|
+
pluginId?: string;
|
|
680
|
+
error?: string;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
const result = await ctx.invokeApi<SynapseLoadResult>(
|
|
684
|
+
'synapse:load-plugin',
|
|
685
|
+
'/path/to/plugin-folder'
|
|
686
|
+
);
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### `synapse:unload-plugin`
|
|
690
|
+
|
|
691
|
+
Выгрузка внешнего плагина.
|
|
692
|
+
|
|
693
|
+
```typescript
|
|
694
|
+
const success = await ctx.invokeApi<boolean>('synapse:unload-plugin', 'plugin-id');
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
### `synapse:list-plugins`
|
|
698
|
+
|
|
699
|
+
Список загруженных ID плагинов.
|
|
700
|
+
|
|
701
|
+
```typescript
|
|
702
|
+
const pluginIds = await ctx.invokeApi<string[]>('synapse:list-plugins');
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
### `synapse:get-details`
|
|
706
|
+
|
|
707
|
+
Получение детальных метаданных всех плагинов.
|
|
708
|
+
|
|
709
|
+
```typescript
|
|
710
|
+
const details = await ctx.invokeApi<unknown[]>('synapse:get-details');
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
---
|
|
714
|
+
|
|
715
|
+
## Shell API
|
|
716
|
+
|
|
717
|
+
Открытие внешних ресурсов.
|
|
718
|
+
|
|
719
|
+
### `shell:open`
|
|
720
|
+
|
|
721
|
+
Открытие URL в браузере по умолчанию.
|
|
722
|
+
|
|
723
|
+
```typescript
|
|
724
|
+
await ctx.invokeApi('shell:open', 'https://notehub.md');
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
729
|
+
## Vault API
|
|
730
|
+
|
|
731
|
+
Операции уровня хранилища.
|
|
732
|
+
|
|
733
|
+
### `vault:close`
|
|
734
|
+
|
|
735
|
+
Закрытие текущего хранилища и возврат на экран приветствия.
|
|
736
|
+
|
|
737
|
+
```typescript
|
|
738
|
+
await ctx.invokeApi('vault:close');
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
## Следующие шаги
|
|
744
|
+
|
|
745
|
+
- Изучите создание **[Виджетов (Порталов)](04-widgets.md)**
|
|
746
|
+
- Добавьте **[Настройки](05-settings.md)** в ваш плагин
|
|
747
|
+
- Интегрируйтесь с **[Контекстными меню](06-context-menu.md)**
|