/
dayekb
/
vibecoding_perplexity_idea3
Обзор
Документация
Войти
/
dayekb
/
vibecoding_perplexity_idea3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/services/gitService.ts
111 строк
4 KB
Your Name
feat: Полная реализация коллаборативного генератора контента с AI и Git интеграцией
20 авг 2025, 22:44
20 авг 2025, 22:44
8b74219
Код
Авторство
О чём код?
import { exec } from 'child_process'; import { promisify } from 'util'; import { Draft } from '@/types'; const execAsync = promisify(exec); export class GitService { static async commitDraft(draft: Draft, action: 'ai-generated' | 'ai-edited' | 'manual-edit'): Promise<string> { try { // Создаем файл черновика const filename = `drafts/${draft.id}.md`; const content = `# ${draft.title} ${draft.content} --- ID: ${draft.id} Created: ${draft.createdAt.toISOString()} Updated: ${draft.updatedAt.toISOString()} Status: ${draft.status} AI Generated: ${draft.aiGenerated} `; // Создаем папку drafts если её нет const { promises: fs } = await import('fs'); const path = await import('path'); try { await fs.mkdir('drafts', { recursive: true }); } catch (error) { // Папка уже существует } // Записываем файл await fs.writeFile(filename, content, 'utf-8'); // Добавляем файл в Git await execAsync(`git add ${filename}`); // Создаем коммит const commitMessage = `${action}: ${draft.title}`; const { stdout } = await execAsync(`git commit -m "${commitMessage}"`); // Получаем хеш коммита const hashMatch = stdout.match(/\[([a-f0-9]{7,})\]/); const commitHash = hashMatch ? hashMatch[1] : 'unknown'; console.log(`Коммит создан: ${commitHash} - ${commitMessage}`); return commitHash; } catch (error) { console.error('Ошибка при создании коммита:', error); throw new Error('Не удалось создать коммит'); } } static async getCommitHistory(draftId: string): Promise<string[]> { try { const { stdout } = await execAsync(`git log --oneline --follow drafts/${draftId}.md`); return stdout.split('\n').filter(line => line.trim()).map(line => { const [hash, ...message] = line.split(' '); return `${hash} ${message.join(' ')}`; }); } catch (error) { console.error('Ошибка при получении истории коммитов:', error); return []; } } static async createBranch(branchName: string): Promise<void> { try { await execAsync(`git checkout -b ${branchName}`); console.log(`Создана ветка: ${branchName}`); } catch (error) { console.error('Ошибка при создании ветки:', error); throw new Error('Не удалось создать ветку'); } } static async switchBranch(branchName: string): Promise<void> { try { await execAsync(`git checkout ${branchName}`); console.log(`Переключились на ветку: ${branchName}`); } catch (error) { console.error('Ошибка при переключении ветки:', error); throw new Error('Не удалось переключиться на ветку'); } } static async getCurrentBranch(): Promise<string> { try { const { stdout } = await execAsync('git branch --show-current'); return stdout.trim(); } catch (error) { console.error('Ошибка при получении текущей ветки:', error); return 'main'; } } static async getBranches(): Promise<string[]> { try { const { stdout } = await execAsync('git branch -a'); return stdout.split('\n') .map(line => line.trim()) .filter(line => line && !line.startsWith('*')) .map(line => line.replace('remotes/origin/', '')); } catch (error) { console.error('Ошибка при получении списка веток:', error); return ['main']; } } }