solver-sdk 3.1.2 → 3.1.3

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.
@@ -1,759 +0,0 @@
1
- # 📊 Руководство по индексации проектов
2
-
3
- ## 🚀 Быстрый старт
4
-
5
- ```javascript
6
- import { CodeSolverSDK } from 'solver-sdk';
7
-
8
- const sdk = await CodeSolverSDK.create({
9
- baseURL: 'http://localhost:3000'
10
- });
11
-
12
- // 1. Создать/найти проект → 2. Запустить индексацию → 3. Мониторить прогресс
13
- const project = await sdk.projects.findOrCreateProject('/path/to/project', 'Project Name');
14
- await sdk.projects.startIndexing(project.id);
15
-
16
- // Ожидание завершения
17
- while (true) {
18
- const status = await sdk.projects.getProjectStatus(project.id);
19
- if (status.status === 'ready') break;
20
- await new Promise(resolve => setTimeout(resolve, 2000));
21
- }
22
- ```
23
-
24
- ## 📋 Основные методы индексации
25
-
26
- ### 1. Поиск/создание проекта
27
-
28
- ```typescript
29
- // Найти существующий или создать новый проект
30
- const project = await sdk.projects.findOrCreateProject(
31
- projectPath: string,
32
- projectName?: string
33
- ): Promise<Project>
34
-
35
- // Примеры:
36
- const project1 = await sdk.projects.findOrCreateProject('/path/to/my-project');
37
- const project2 = await sdk.projects.findOrCreateProject('/path/to/my-project', 'My Project');
38
- ```
39
-
40
- **Результат:**
41
- ```typescript
42
- interface Project {
43
- id: string; // "12345678-1234-1234-1234-123456789012"
44
- name: string; // "My Project"
45
- path: string; // "/path/to/my-project"
46
- status: 'idle' | 'indexing' | 'ready' | 'error';
47
- createdAt: string; // "2024-01-01T12:00:00Z"
48
- updatedAt: string; // "2024-01-01T12:00:00Z"
49
- }
50
- ```
51
-
52
- ### 2. Запуск индексации
53
-
54
- ```typescript
55
- // Запустить индексацию проекта
56
- await sdk.projects.startIndexing(
57
- projectId: string,
58
- options?: IndexingOptions
59
- ): Promise<IndexingResponse>
60
-
61
- // Примеры:
62
- await sdk.projects.startIndexing(project.id);
63
-
64
- await sdk.projects.startIndexing(project.id, {
65
- forceFull: true, // Полная переиндексация
66
- excludePatterns: ['node_modules/**', '*.log']
67
- });
68
- ```
69
-
70
- **Опции индексации:**
71
- ```typescript
72
- interface IndexingOptions {
73
- forceFull?: boolean; // Полная переиндексация (по умолчанию: false)
74
- excludePatterns?: string[]; // Паттерны исключения
75
- includePatterns?: string[]; // Паттерны включения
76
- maxFileSize?: number; // Максимальный размер файла (байты)
77
- }
78
- ```
79
-
80
- ### 3. Мониторинг статуса
81
-
82
- ```typescript
83
- // Получить текущий статус проекта
84
- const status = await sdk.projects.getProjectStatus(
85
- projectId: string
86
- ): Promise<ProjectStatus>
87
- ```
88
-
89
- **Статус индексации:**
90
- ```typescript
91
- interface ProjectStatus {
92
- status: 'idle' | 'indexing' | 'ready' | 'error';
93
- progress?: number; // 0-100
94
- totalFiles?: number; // Общее количество файлов
95
- processedFiles?: number; // Обработано файлов
96
- currentFile?: string; // Текущий обрабатываемый файл
97
- error?: string; // Текст ошибки (если status === 'error')
98
- startTime?: string; // Время начала индексации
99
- estimatedTime?: number; // Примерное время завершения (секунды)
100
- }
101
- ```
102
-
103
- ### 4. Управление индексацией
104
-
105
- ```typescript
106
- // Отменить индексацию
107
- await sdk.projects.cancelIndexing(projectId: string): Promise<boolean>
108
-
109
- // Очистить ошибку индексации
110
- await sdk.projects.clearIndexingError(projectId: string): Promise<boolean>
111
-
112
- // Удалить проект
113
- await sdk.projects.deleteProject(projectId: string): Promise<void>
114
- ```
115
-
116
- ### 5. Получение списка проектов
117
-
118
- ```typescript
119
- // Все проекты
120
- const allProjects = await sdk.projects.getAllProjects(): Promise<Project[]>
121
-
122
- // Только готовые к работе проекты (проиндексированные)
123
- const readyProjects = await sdk.projects.getReadyProjects(): Promise<Project[]>
124
-
125
- // Конкретный проект
126
- const project = await sdk.projects.getProject(projectId: string): Promise<Project>
127
- ```
128
-
129
- ## 🔄 Workflow индексации
130
-
131
- ### Простой workflow
132
-
133
- ```javascript
134
- async function simpleIndexing(projectPath, projectName) {
135
- const sdk = await CodeSolverSDK.create({
136
- baseURL: 'http://localhost:3000'
137
- });
138
-
139
- try {
140
- // 1. Создать/найти проект
141
- console.log('📁 Создание проекта...');
142
- const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
143
- console.log(`✅ Проект создан: ${project.id}`);
144
-
145
- // 2. Запустить индексацию
146
- console.log('🚀 Запуск индексации...');
147
- await sdk.projects.startIndexing(project.id);
148
-
149
- // 3. Ожидание завершения
150
- console.log('⏳ Ожидание завершения...');
151
- while (true) {
152
- const status = await sdk.projects.getProjectStatus(project.id);
153
-
154
- if (status.status === 'ready') {
155
- console.log('✅ Индексация завершена!');
156
- break;
157
- } else if (status.status === 'error') {
158
- throw new Error(`Ошибка индексации: ${status.error}`);
159
- }
160
-
161
- // Показать прогресс
162
- if (status.progress) {
163
- console.log(`📊 Прогресс: ${status.progress}%`);
164
- }
165
-
166
- await new Promise(resolve => setTimeout(resolve, 2000));
167
- }
168
-
169
- return project;
170
-
171
- } catch (error) {
172
- console.error('❌ Ошибка:', error.message);
173
- throw error;
174
- }
175
- }
176
-
177
- // Использование
178
- const project = await simpleIndexing('/path/to/my-project', 'My Project');
179
- ```
180
-
181
- ### Продвинутый workflow с обработкой ошибок
182
-
183
- ```javascript
184
- async function advancedIndexing(projectPath, options = {}) {
185
- const sdk = await CodeSolverSDK.create({
186
- baseURL: 'http://localhost:3000'
187
- });
188
-
189
- const {
190
- projectName = 'Auto Project',
191
- timeout = 300000, // 5 минут
192
- retryAttempts = 3,
193
- excludePatterns = ['node_modules/**', '*.log', '.git/**']
194
- } = options;
195
-
196
- let project;
197
- let attempt = 0;
198
-
199
- while (attempt < retryAttempts) {
200
- try {
201
- attempt++;
202
- console.log(`🔄 Попытка ${attempt}/${retryAttempts}`);
203
-
204
- // 1. Создать/найти проект
205
- project = await sdk.projects.findOrCreateProject(projectPath, projectName);
206
- console.log(`📁 Проект: ${project.name} (${project.id})`);
207
-
208
- // 2. Проверить текущий статус
209
- let status = await sdk.projects.getProjectStatus(project.id);
210
-
211
- // Если уже готов - возвращаем
212
- if (status.status === 'ready') {
213
- console.log('✅ Проект уже проиндексирован');
214
- return project;
215
- }
216
-
217
- // Если есть ошибка - очищаем
218
- if (status.status === 'error') {
219
- console.log('🧹 Очистка предыдущей ошибки...');
220
- await sdk.projects.clearIndexingError(project.id);
221
- }
222
-
223
- // Если идет индексация - отменяем
224
- if (status.status === 'indexing') {
225
- console.log('⏹️ Отмена текущей индексации...');
226
- await sdk.projects.cancelIndexing(project.id);
227
- await new Promise(resolve => setTimeout(resolve, 2000));
228
- }
229
-
230
- // 3. Запустить новую индексацию
231
- console.log('🚀 Запуск индексации...');
232
- await sdk.projects.startIndexing(project.id, {
233
- forceFull: attempt > 1, // При повторной попытке - полная индексация
234
- excludePatterns
235
- });
236
-
237
- // 4. Мониторинг с таймаутом
238
- const startTime = Date.now();
239
- let lastProgress = 0;
240
-
241
- while (Date.now() - startTime < timeout) {
242
- status = await sdk.projects.getProjectStatus(project.id);
243
-
244
- if (status.status === 'ready') {
245
- console.log('✅ Индексация завершена успешно!');
246
-
247
- // Получить статистику
248
- try {
249
- const stats = await sdk.search.getFunctionStats(project.id);
250
- console.log(`📈 Статистика: ${stats.stats.totalFunctions} функций найдено`);
251
- } catch (error) {
252
- console.log('⚠️ Не удалось получить статистику функций');
253
- }
254
-
255
- return project;
256
- }
257
-
258
- if (status.status === 'error') {
259
- throw new Error(`Ошибка индексации: ${status.error}`);
260
- }
261
-
262
- // Показать прогресс только если изменился
263
- if (status.progress && status.progress !== lastProgress) {
264
- lastProgress = status.progress;
265
- const processedInfo = status.processedFiles && status.totalFiles
266
- ? ` (${status.processedFiles}/${status.totalFiles} файлов)`
267
- : '';
268
- console.log(`📊 Прогресс: ${status.progress}%${processedInfo}`);
269
-
270
- if (status.currentFile) {
271
- console.log(`📄 Обрабатывается: ${status.currentFile}`);
272
- }
273
- }
274
-
275
- await new Promise(resolve => setTimeout(resolve, 3000));
276
- }
277
-
278
- // Таймаут - отменяем индексацию
279
- console.log('⏰ Таймаут индексации, отмена...');
280
- await sdk.projects.cancelIndexing(project.id);
281
- throw new Error('Превышен таймаут индексации');
282
-
283
- } catch (error) {
284
- console.error(`❌ Ошибка на попытке ${attempt}:`, error.message);
285
-
286
- if (attempt >= retryAttempts) {
287
- throw new Error(`Не удалось проиндексировать проект после ${retryAttempts} попыток: ${error.message}`);
288
- }
289
-
290
- // Ждем перед повторной попыткой
291
- await new Promise(resolve => setTimeout(resolve, 5000));
292
- }
293
- }
294
- }
295
-
296
- // Использование
297
- const project = await advancedIndexing('/path/to/my-project', {
298
- projectName: 'My React App',
299
- timeout: 600000, // 10 минут
300
- retryAttempts: 2,
301
- excludePatterns: ['node_modules/**', 'dist/**', '*.log']
302
- });
303
- ```
304
-
305
- ## 🎯 Интеграция с VS Code Extension
306
-
307
- ### Базовая интеграция
308
-
309
- ```javascript
310
- import * as vscode from 'vscode';
311
- import { CodeSolverSDK } from 'solver-sdk';
312
-
313
- class ProjectIndexer {
314
- constructor() {
315
- this.sdk = null;
316
- this.currentProject = null;
317
- }
318
-
319
- async initialize() {
320
- this.sdk = await CodeSolverSDK.create({
321
- baseURL: 'http://localhost:3000'
322
- });
323
- }
324
-
325
- async indexCurrentWorkspace() {
326
- if (!vscode.workspace.workspaceFolders) {
327
- vscode.window.showErrorMessage('Нет открытой рабочей области');
328
- return;
329
- }
330
-
331
- const workspaceFolder = vscode.workspace.workspaceFolders[0];
332
- const projectPath = workspaceFolder.uri.fsPath;
333
- const projectName = workspaceFolder.name;
334
-
335
- return vscode.window.withProgress({
336
- location: vscode.ProgressLocation.Notification,
337
- title: 'Индексация проекта',
338
- cancellable: true
339
- }, async (progress, token) => {
340
- try {
341
- // Создать проект
342
- progress.report({ message: 'Создание проекта...' });
343
- const project = await this.sdk.projects.findOrCreateProject(projectPath, projectName);
344
- this.currentProject = project;
345
-
346
- // Запустить индексацию
347
- progress.report({ message: 'Запуск индексации...' });
348
- await this.sdk.projects.startIndexing(project.id);
349
-
350
- // Мониторинг прогресса
351
- while (!token.isCancellationRequested) {
352
- const status = await this.sdk.projects.getProjectStatus(project.id);
353
-
354
- if (status.status === 'ready') {
355
- vscode.window.showInformationMessage('✅ Индексация завершена!');
356
- break;
357
- } else if (status.status === 'error') {
358
- throw new Error(status.error);
359
- }
360
-
361
- const progressPercentage = status.progress || 0;
362
- const message = status.currentFile
363
- ? `${progressPercentage}% - ${status.currentFile}`
364
- : `${progressPercentage}%`;
365
-
366
- progress.report({
367
- increment: progressPercentage,
368
- message
369
- });
370
-
371
- await new Promise(resolve => setTimeout(resolve, 2000));
372
- }
373
-
374
- // Отмена по запросу пользователя
375
- if (token.isCancellationRequested) {
376
- await this.sdk.projects.cancelIndexing(project.id);
377
- vscode.window.showWarningMessage('Индексация отменена');
378
- }
379
-
380
- } catch (error) {
381
- vscode.window.showErrorMessage(`Ошибка индексации: ${error.message}`);
382
- }
383
- });
384
- }
385
-
386
- async getReadyProjects() {
387
- return await this.sdk.projects.getReadyProjects();
388
- }
389
- }
390
-
391
- // Регистрация команд в extension.ts
392
- export function activate(context: vscode.ExtensionContext) {
393
- const indexer = new ProjectIndexer();
394
-
395
- // Инициализация при активации
396
- indexer.initialize();
397
-
398
- // Команда индексации
399
- const indexCommand = vscode.commands.registerCommand(
400
- 'myExtension.indexProject',
401
- () => indexer.indexCurrentWorkspace()
402
- );
403
-
404
- // Команда просмотра проектов
405
- const projectsCommand = vscode.commands.registerCommand(
406
- 'myExtension.showProjects',
407
- async () => {
408
- const projects = await indexer.getReadyProjects();
409
- const items = projects.map(p => ({
410
- label: p.name,
411
- description: p.path,
412
- project: p
413
- }));
414
-
415
- const selected = await vscode.window.showQuickPick(items);
416
- if (selected) {
417
- vscode.window.showInformationMessage(`Выбран проект: ${selected.project.name}`);
418
- }
419
- }
420
- );
421
-
422
- context.subscriptions.push(indexCommand, projectsCommand);
423
- }
424
- ```
425
-
426
- ### Автоматическая индексация при изменениях
427
-
428
- ```javascript
429
- class AutoIndexer {
430
- constructor(sdk) {
431
- this.sdk = sdk;
432
- this.indexingQueue = new Set();
433
- this.debounceTimers = new Map();
434
- }
435
-
436
- startWatching() {
437
- // Отслеживание изменений файлов
438
- vscode.workspace.onDidSaveTextDocument(async (document) => {
439
- await this.onFileChanged(document.uri.fsPath);
440
- });
441
-
442
- // Отслеживание создания файлов
443
- vscode.workspace.onDidCreateFiles(async (event) => {
444
- for (const file of event.files) {
445
- await this.onFileChanged(file.fsPath);
446
- }
447
- });
448
-
449
- // Отслеживание удаления файлов
450
- vscode.workspace.onDidDeleteFiles(async (event) => {
451
- for (const file of event.files) {
452
- await this.onFileDeleted(file.fsPath);
453
- }
454
- });
455
- }
456
-
457
- async onFileChanged(filePath) {
458
- const workspaceFolder = vscode.workspace.getWorkspaceFolder(vscode.Uri.file(filePath));
459
- if (!workspaceFolder) return;
460
-
461
- const projectPath = workspaceFolder.uri.fsPath;
462
-
463
- // Debounce - не чаще раза в 5 секунд для одного проекта
464
- if (this.debounceTimers.has(projectPath)) {
465
- clearTimeout(this.debounceTimers.get(projectPath));
466
- }
467
-
468
- this.debounceTimers.set(projectPath, setTimeout(async () => {
469
- await this.reindexFile(projectPath, filePath);
470
- this.debounceTimers.delete(projectPath);
471
- }, 5000));
472
- }
473
-
474
- async reindexFile(projectPath, filePath) {
475
- try {
476
- // Найти проект
477
- const project = await this.sdk.projects.findOrCreateProject(projectPath);
478
-
479
- // Переиндексировать конкретный файл (если поддерживается)
480
- const relativePath = path.relative(projectPath, filePath);
481
-
482
- // Пока используем полную переиндексацию
483
- if (!this.indexingQueue.has(project.id)) {
484
- this.indexingQueue.add(project.id);
485
-
486
- await this.sdk.projects.startIndexing(project.id, {
487
- forceFull: false // Инкрементальная индексация
488
- });
489
-
490
- // Ждем завершения
491
- while (true) {
492
- const status = await this.sdk.projects.getProjectStatus(project.id);
493
- if (status.status !== 'indexing') break;
494
- await new Promise(resolve => setTimeout(resolve, 1000));
495
- }
496
-
497
- this.indexingQueue.delete(project.id);
498
- }
499
-
500
- } catch (error) {
501
- console.error('Ошибка автоиндексации:', error.message);
502
- }
503
- }
504
- }
505
- ```
506
-
507
- ## 📊 Статистика и мониторинг
508
-
509
- ### Получение детальной статистики
510
-
511
- ```javascript
512
- async function getProjectStatistics(projectId) {
513
- const sdk = await CodeSolverSDK.create({
514
- baseURL: 'http://localhost:3000'
515
- });
516
-
517
- try {
518
- // Общая информация о проекте
519
- const project = await sdk.projects.getProject(projectId);
520
- console.log('📁 Проект:', project);
521
-
522
- // Статистика функций
523
- const functionStats = await sdk.search.getFunctionStats(projectId);
524
- console.log('📊 Статистика функций:', functionStats.stats);
525
-
526
- // Тест поиска для проверки качества индексации
527
- const searchTest = await sdk.search.searchCode(projectId, {
528
- query: 'function',
529
- limit: 5
530
- });
531
- console.log('🔍 Тестовый поиск:', searchTest.length, 'результатов');
532
-
533
- const functionSearch = await sdk.search.searchFunctions(projectId, {
534
- query: 'main',
535
- limit: 3
536
- });
537
- console.log('🎯 Поиск функций:', functionSearch.resultsCount, 'найдено');
538
-
539
- return {
540
- project,
541
- functionStats: functionStats.stats,
542
- searchQuality: {
543
- basicSearch: searchTest.length,
544
- functionSearch: functionSearch.resultsCount
545
- }
546
- };
547
-
548
- } catch (error) {
549
- console.error('Ошибка получения статистики:', error.message);
550
- return null;
551
- }
552
- }
553
-
554
- // Использование
555
- const stats = await getProjectStatistics('12345678-1234-1234-1234-123456789012');
556
- if (stats) {
557
- console.log(`
558
- 📈 Отчет по проекту ${stats.project.name}:
559
- • Всего функций: ${stats.functionStats.totalFunctions}
560
- • Функции: ${stats.functionStats.functions}
561
- • Методы: ${stats.functionStats.methods}
562
- • Классы: ${stats.functionStats.classes}
563
- • Интерфейсы: ${stats.functionStats.interfaces}
564
- • Поиск работает: ${stats.searchQuality.basicSearch > 0 ? '✅' : '❌'}
565
- • Поиск функций работает: ${stats.searchQuality.functionSearch > 0 ? '✅' : '❌'}
566
- `);
567
- }
568
- ```
569
-
570
- ## 🚨 Обработка ошибок
571
-
572
- ### Типичные ошибки и решения
573
-
574
- ```javascript
575
- async function robustIndexing(projectPath, projectName) {
576
- const sdk = await CodeSolverSDK.create({
577
- baseURL: 'http://localhost:3000'
578
- });
579
-
580
- try {
581
- const project = await sdk.projects.findOrCreateProject(projectPath, projectName);
582
- await sdk.projects.startIndexing(project.id);
583
-
584
- // Мониторинг с обработкой ошибок
585
- while (true) {
586
- try {
587
- const status = await sdk.projects.getProjectStatus(project.id);
588
-
589
- if (status.status === 'ready') {
590
- console.log('✅ Успешно завершено');
591
- return project;
592
- }
593
-
594
- if (status.status === 'error') {
595
- // Обработка различных типов ошибок
596
- if (status.error?.includes('timeout')) {
597
- console.log('⏰ Ошибка таймаута, повторная попытка...');
598
- await sdk.projects.clearIndexingError(project.id);
599
- await sdk.projects.startIndexing(project.id, { forceFull: true });
600
- continue;
601
- }
602
-
603
- if (status.error?.includes('disk space')) {
604
- throw new Error('❌ Недостаточно места на диске');
605
- }
606
-
607
- if (status.error?.includes('permission')) {
608
- throw new Error('❌ Нет прав доступа к файлам проекта');
609
- }
610
-
611
- throw new Error(`❌ Ошибка индексации: ${status.error}`);
612
- }
613
-
614
- await new Promise(resolve => setTimeout(resolve, 2000));
615
-
616
- } catch (networkError) {
617
- // Обработка сетевых ошибок
618
- if (networkError.code === 'ECONNREFUSED') {
619
- throw new Error('❌ Сервер недоступен. Проверьте что бэкенд запущен на http://localhost:3000');
620
- }
621
-
622
- if (networkError.response?.status === 404) {
623
- throw new Error('❌ API endpoint не найден. Проверьте версию SDK и бэкенда');
624
- }
625
-
626
- if (networkError.response?.status === 500) {
627
- console.log('⚠️ Временная ошибка сервера, повторная попытка через 10 секунд...');
628
- await new Promise(resolve => setTimeout(resolve, 10000));
629
- continue;
630
- }
631
-
632
- throw networkError;
633
- }
634
- }
635
-
636
- } catch (error) {
637
- console.error('💥 Критическая ошибка:', error.message);
638
-
639
- // Попытка очистки
640
- try {
641
- if (project?.id) {
642
- await sdk.projects.cancelIndexing(project.id);
643
- }
644
- } catch (cleanupError) {
645
- console.error('Ошибка очистки:', cleanupError.message);
646
- }
647
-
648
- throw error;
649
- }
650
- }
651
- ```
652
-
653
- ## 📝 Лучшие практики
654
-
655
- ### 1. Оптимизация производительности
656
-
657
- ```javascript
658
- // ✅ Правильно - исключить ненужные файлы
659
- const excludePatterns = [
660
- 'node_modules/**',
661
- '.git/**',
662
- 'dist/**',
663
- 'build/**',
664
- '*.log',
665
- '*.tmp',
666
- '.cache/**',
667
- 'coverage/**'
668
- ];
669
-
670
- await sdk.projects.startIndexing(project.id, { excludePatterns });
671
- ```
672
-
673
- ### 2. Управление ресурсами
674
-
675
- ```javascript
676
- // ✅ Правильно - одно подключение на приложение
677
- class IndexingManager {
678
- constructor() {
679
- this.sdk = null;
680
- this.activeIndexing = new Map();
681
- }
682
-
683
- async initialize() {
684
- if (!this.sdk) {
685
- this.sdk = await CodeSolverSDK.create({
686
- baseURL: 'http://localhost:3000'
687
- });
688
- }
689
- }
690
-
691
- async indexProject(projectPath) {
692
- // Предотвращение параллельной индексации одного проекта
693
- if (this.activeIndexing.has(projectPath)) {
694
- throw new Error('Проект уже индексируется');
695
- }
696
-
697
- this.activeIndexing.set(projectPath, true);
698
-
699
- try {
700
- // ... логика индексации
701
- } finally {
702
- this.activeIndexing.delete(projectPath);
703
- }
704
- }
705
- }
706
- ```
707
-
708
- ### 3. Пользовательский интерфейс
709
-
710
- ```javascript
711
- // ✅ Правильно - информативная обратная связь
712
- async function indexWithUI(projectPath) {
713
- const statusDiv = document.getElementById('indexing-status');
714
- const progressBar = document.getElementById('progress-bar');
715
-
716
- try {
717
- statusDiv.textContent = '🚀 Запуск индексации...';
718
-
719
- const project = await sdk.projects.findOrCreateProject(projectPath);
720
- await sdk.projects.startIndexing(project.id);
721
-
722
- while (true) {
723
- const status = await sdk.projects.getProjectStatus(project.id);
724
-
725
- if (status.status === 'ready') {
726
- statusDiv.textContent = '✅ Индексация завершена!';
727
- progressBar.style.width = '100%';
728
- break;
729
- }
730
-
731
- if (status.progress) {
732
- progressBar.style.width = `${status.progress}%`;
733
- statusDiv.textContent = `📊 ${status.progress}% - ${status.currentFile || 'Обработка...'}`;
734
- }
735
-
736
- await new Promise(resolve => setTimeout(resolve, 1000));
737
- }
738
-
739
- } catch (error) {
740
- statusDiv.textContent = `❌ Ошибка: ${error.message}`;
741
- progressBar.style.backgroundColor = 'red';
742
- }
743
- }
744
- ```
745
-
746
- ## 🎯 Заключение
747
-
748
- Индексация - ключевая функция для работы с поиском и AI анализом кода. Основные шаги:
749
-
750
- 1. **Создание проекта** - `findOrCreateProject()`
751
- 2. **Запуск индексации** - `startIndexing()`
752
- 3. **Мониторинг прогресса** - `getProjectStatus()`
753
- 4. **Использование результатов** - поиск функций и кода
754
-
755
- **Помните:**
756
- - Всегда обрабатывайте ошибки
757
- - Показывайте прогресс пользователю
758
- - Исключайте ненужные файлы
759
- - Тестируйте результаты индексации