@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.
@@ -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)**