Сценарий 17: Расширенное редактирование файлов

Сценарий 17: Расширенное редактирование файлов

Разработчик, выполняющий точные изменения кода на основе AST с поддержкой предпросмотра и отмены.

Быстрый старт

/select 17

Обзор

Сценарий 17 предоставляет возможности хирургического редактирования кода с использованием парсинга AST (Abstract Syntax Tree). В отличие от простой замены текста, редактирование на основе AST понимает структуру кода, сохраняет форматирование и гарантирует синтаксически корректные изменения.

Варианты использования

Поиск целей для редактирования

Поиск конкретных функций, классов или методов для редактирования:

> Найти функцию heap_insert в src/backend/access/heap/heapam.c

╭─────────────── Найдена цель кода ─────────────────────────╮
│                                                            │
│  Имя: heap_insert                                          │
│  Тип: функция                                              │
│  Файл: src/backend/access/heap/heapam.c                    │
│  Строки: 2156-2298                                         │
│                                                            │
│  ```c                                                      │
│  void heap_insert(Relation relation,                       │
│                   HeapTuple tup,                           │
│                   CommandId cid,                           │
│                   int options,                             │
│                   BulkInsertState bistate)                 │
│  {                                                         │
│      ...                                                   │
│  }                                                         │
│  ```                                                       │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Предпросмотр изменений с Diff

Генерация унифицированного diff-предпросмотра перед применением изменений:

> Редактировать функцию validate_input для добавления проверки границ

╭─────────────── Предпросмотр редактирования ──────────────╮
                                                            
  Цель: validate_input (функция)                            
  Файл: src/utils/validation.c:45-67                        
                                                            
  Изменения:                                                
  ```diff                                                   
  @@ -45,6 +45,10 @@                                        
   bool validate_input(const char *input, size_t len)       
   {                                                        
  +    /* Проверка границ */                                
  +    if (len > MAX_INPUT_SIZE) {                          
  +        return false;                                    
  +    }                                                    
       if (input == NULL) {                                 
           return false;                                    
       }                                                    
  ```                                                       
                                                            
  Используйте `/edit apply` для применения изменений.       
                                                            
╰────────────────────────────────────────────────────────────╯

Применение редактирования с резервным копированием

Применение изменений с автоматическим созданием резервной копии:

> Применить редактирование

╭─────────────── Редактирование применено ─────────────────╮
│                                                            │
│  Статус: УСПЕШНО                                           │
│  Файл: src/utils/validation.c                              │
│  Резервная копия: src/utils/validation.c.bak.20241209_143521│
│                                                            │
│  Применённые изменения:                                    │
│    - Добавлена проверка границ (4 строки)                  │
│                                                            │
│  Используйте `/edit undo` для отмены изменений.            │
│                                                            │
╰────────────────────────────────────────────────────────────╯

Редактирование на основе AST

Поддерживаемые типы целей

Тип Описание Пример
function Автономные функции heap_insert, main
method Методы класса MyClass.process
class Определения классов TransactionManager
struct Определения структур HeapTupleData

Режимы редактирования

Режим Описание Вариант использования
replace Заменить всю цель Переписать логику функции
insert_before Вставить код перед целью Добавить импорты, объявления
insert_after Вставить код после цели Добавить новые методы
delete Удалить цель Удалить устаревший код
rename Переименовать идентификатор Рефакторинг именования

Операция переименования

> Переименовать класс OldManager в NewManager

╭─────────────── Предпросмотр переименования ──────────────╮
                                                            
  Переименование: OldManager -> NewManager                  
                                                            
  Затронутые файлы (3):                                     
    src/core/manager.py:15,23,45,67                         
    src/api/handlers.py:12,34                               
    tests/test_manager.py:8,19,31                           
                                                            
  Всего замен: 9                                            
                                                            
  Используйте `/edit apply` для применения переименования.  
                                                            
╰────────────────────────────────────────────────────────────╯

Команды CLI

Поиск целей

# Найти функцию по имени
codegraph edit find --target heap_insert --file src/heap.c

# Найти все функции по шаблону
codegraph edit find --pattern "validate_*" --type function

# Найти определение класса
codegraph edit find --target MyClass --type class

Применение редактирования

# Применить редактирование с предпросмотром
codegraph edit apply --file src/file.c --target func_name --preview

# Применить редактирование немедленно
codegraph edit apply --file src/file.c --target func_name --new-code @patch.txt

# Переименовать идентификатор во всех файлах
codegraph edit rename --old OldName --new NewName --scope src/

Операции отмены

# Показать историю редактирований
codegraph edit history

# Отменить последнее редактирование
codegraph edit undo

# Отменить конкретное редактирование по ID
codegraph edit undo --id edit_abc123

Команды TUI

Команда Описание
/edit find <цель> Найти цель кода
/edit preview Показать ожидающие изменения
/edit apply Применить ожидающие изменения
/edit undo Отменить последнее редактирование
/edit history Показать историю редактирований

Примеры вопросов

  • “Найти функцию heap_insert в src/heap.c”
  • “Редактировать функцию validate_input для добавления проверки null”
  • “Переименовать класс TransactionHandler в TxHandler”
  • “Удалить неиспользуемую функцию old_helper”
  • “Вставить логирование перед функцией process_request”
  • “Показать текущий предпросмотр редактирования”

Интеграция с другими сценариями

Сценарий 17 интегрируется с:

  • S18 (Оптимизация кода): Применение предложений по оптимизации
  • S19 (Проверка стандартов): Исправление нарушений стандартов
  • S05 (Рефакторинг): Выполнение планов рефакторинга
> /select 18
> Оптимизировать src/core/

# После просмотра предложений...
> Применить предложение opt_001

# Это вызывает S17 для фактического редактирования

Пример рабочего процесса

# 1. Найти цель
> Найти функцию process_data в src/processor.py

# 2. Просмотреть код
> Показать полную реализацию

# 3. Запросить редактирование
> Добавить обработку ошибок для пустого ввода

# 4. Предпросмотр изменений
> /edit preview

# 5. Применить изменения
> /edit apply

# 6. Проверить
> Показать обновлённую функцию

Связанные сценарии