112 lines
4.5 KiB
Python
112 lines
4.5 KiB
Python
|
|
# Инициализация пакета
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
from .core.ai_interface import AIInterface
|
|||
|
|
from .core.project_map import ProjectMap
|
|||
|
|
from .core.file_analyzer import FileAnalyzer
|
|||
|
|
from .core.commands import CommandGenerator
|
|||
|
|
from .utils.logger import log
|
|||
|
|
from .utils.file_utils import read_file, write_file
|
|||
|
|
from .config import REACT_PROJECT_PATH
|
|||
|
|
|
|||
|
|
__all__ = ["AIInterface", "ProjectMap", "FileAnalyzer", "CommandGenerator", "run_workflow"]
|
|||
|
|
|
|||
|
|
|
|||
|
|
def ensure_default_files():
|
|||
|
|
"""
|
|||
|
|
Проверяет наличие необходимых файлов и создает их с базовым содержимым, если они отсутствуют.
|
|||
|
|
"""
|
|||
|
|
default_files = {
|
|||
|
|
"workingon.md": "/path/to/react/project/src/Auth.tsx",
|
|||
|
|
"prompt.md": "Добавить функцию авторизации в файл Auth.tsx",
|
|||
|
|
"instructions.md": "# Инструкции для ИИ\n\n1. Функции должны быть написаны в TypeScript.\n2. Используйте современные практики React (например, хуки).\n3. При создании новых компонентов добавьте комментарии.",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for file_name, content in default_files.items():
|
|||
|
|
if not os.path.exists(file_name):
|
|||
|
|
log(f"File {file_name} not found. Creating it with default content.")
|
|||
|
|
write_file(file_name, content)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def parse_workingon_content(content: str) -> dict:
|
|||
|
|
"""
|
|||
|
|
Парсит содержимое файла workingon.md.
|
|||
|
|
Возвращает словарь с путем к файлу и дополнительным контекстом.
|
|||
|
|
"""
|
|||
|
|
lines = content.strip().split("\n")
|
|||
|
|
result = {"file_path": None, "context": ""}
|
|||
|
|
|
|||
|
|
if lines:
|
|||
|
|
# Первая строка — путь к файлу
|
|||
|
|
result["file_path"] = lines[0].strip()
|
|||
|
|
# Остальные строки — дополнительный контекст
|
|||
|
|
result["context"] = "\n".join(lines[1:]).strip()
|
|||
|
|
|
|||
|
|
return result
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
def run_workflow():
|
|||
|
|
"""
|
|||
|
|
Основной алгоритм работы библиотеки ReactDev.
|
|||
|
|
1. Создает карту структуры проекта.
|
|||
|
|
2. Анализирует файлы на наличие функций.
|
|||
|
|
3. Отправляет запрос к ИИ с контекстом.
|
|||
|
|
4. Генерирует план модификации.
|
|||
|
|
"""
|
|||
|
|
log("Starting ReactDev workflow...")
|
|||
|
|
|
|||
|
|
# Шаг 0: Убедиться, что все необходимые файлы существуют
|
|||
|
|
ensure_default_files()
|
|||
|
|
|
|||
|
|
# Шаг 1: Создание карты структуры проекта
|
|||
|
|
project_map = ProjectMap(REACT_PROJECT_PATH)
|
|||
|
|
project_structure = project_map.generate_map()
|
|||
|
|
project_map.save_map()
|
|||
|
|
|
|||
|
|
log(f"Generated project structure:\n{project_structure}")
|
|||
|
|
|
|||
|
|
# Шаг 2: Чтение и парсинг workingon.md
|
|||
|
|
workingon_content = read_file("workingon.md")
|
|||
|
|
workingon_data = parse_workingon_content(workingon_content)
|
|||
|
|
|
|||
|
|
target_file = workingon_data["file_path"]
|
|||
|
|
additional_context = workingon_data["context"]
|
|||
|
|
|
|||
|
|
if target_file and not os.path.exists(target_file):
|
|||
|
|
log(f"Target file {target_file} does not exist.", level="error")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# Шаг 3: Анализ целевого файла (если указан)
|
|||
|
|
functions_info = {}
|
|||
|
|
if target_file:
|
|||
|
|
file_analyzer = FileAnalyzer()
|
|||
|
|
functions_info = file_analyzer.analyze_file(target_file)
|
|||
|
|
log(f"Analyzed functions in {target_file}: {functions_info}")
|
|||
|
|
|
|||
|
|
# Шаг 4: Отправка запроса к ИИ
|
|||
|
|
ai_interface = AIInterface()
|
|||
|
|
user_prompt = read_file("prompt.md").strip()
|
|||
|
|
|
|||
|
|
# Добавляем дополнительный контекст из workingon.md
|
|||
|
|
full_context = {
|
|||
|
|
"project_structure": project_structure,
|
|||
|
|
"target_file": target_file,
|
|||
|
|
"functions_info": functions_info,
|
|||
|
|
"additional_context": additional_context,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ai_response = ai_interface.analyze_project(user_prompt, full_context)
|
|||
|
|
log(f"AI response: {ai_response}")
|
|||
|
|
|
|||
|
|
# Шаг 5: Генерация плана модификации
|
|||
|
|
command_generator = CommandGenerator()
|
|||
|
|
modifications = ai_response.get("modifications", [])
|
|||
|
|
modification_plan = command_generator.generate_commands(modifications)
|
|||
|
|
|
|||
|
|
with open("modification_plan.md", "w") as f:
|
|||
|
|
f.write(modification_plan)
|
|||
|
|
|
|||
|
|
log(f"Generated modification plan:\n{modification_plan}")
|
|||
|
|
log("ReactDev workflow completed.")
|