Руководитель технической группы планирует и координирует масштабные миграции символов/API в кодовой базе.
Содержание¶
- Быстрый старт
- Как это работает
- Архитектура (S13 и S05)
- Извлечение символов
- Категории миграции
- Приоритетные запросы
- Категоризация по сложности
- Агенты рефакторинга
- TechnicalDebtDetector
- DeadCodeDetector
- ImpactAnalyzer
- RefactoringPlanner
- Доменно-независимая архитектура
- Анализ рисков
- CallGraphAnalyzer и радиус поражения
- Риск по центральности посредничества
- Использование CLI
- Примеры вопросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий массового рефакторинга
/select 13
Как это работает¶
Архитектура (S13 и S05)¶
S13 (mass_refactoring_workflow) — это псевдоним для refactoring_workflow(state, mode="mass_migration"), определённого в src/workflow/scenarios/refactoring/workflow.py. Он разделяет пакет рефакторинга с S05:
| Рабочий процесс | Режим | Назначение |
|---|---|---|
refactoring_workflow (S05) |
code_smells (по умолчанию) |
Обнаружение запахов кода, мёртвый код |
large_scale_refactoring_workflow |
large_scale |
Массовый рефакторинг с анализом ROI |
mass_refactoring_workflow (S13) |
mass_migration |
Миграции символов/API и переименования |
При mode="mass_migration" рабочий процесс передаёт управление напрямую в mass_migration_workflow() из mass_migration.py (921 строка), минуя Phase 1 на основе обработчиков, используемую S05.
S13 использует двухэтапный подход:
Запрос -> Извлечение символов (5 regex-паттернов)
|
Этап 1: Приоритетные CPG-запросы (4 уровня) + Запросы по категориям (9 типов)
| -> Сбор целевых функций из CPG (без LLM)
|
Этап 2: LLM генерирует план рефакторинга на основе найденных символов
| -> Запасной вариант: _build_fallback_answer() при недоступности LLM
Извлечение символов¶
Рабочий процесс извлекает целевые символы из запроса пользователя с помощью 5 regex-паттернов, проверяемых по порядку:
| # | Паттерн | Пример совпадения | Regex |
|---|---|---|---|
| 1 | “rename X to Y” | rename heap_open to table_open |
\brename\s+(\w+)\s+to\s+(\w+) |
| 2 | Имена snake_case | heap_open, table_close |
\b([a-z][a-z0-9]*(?:_[a-z0-9]+)+)\b |
| 3 | Имена CamelCase | ExecProcNode, FunctionCall |
\b([A-Z][a-zA-Z0-9]+)\b |
| 4 | “keyword to X” | references to palloc |
(?:references?\s+to\|usages?\s+of)\s*(\w+) |
| 5 | “X calls” | heap_open calls |
([a-z_]+)\s+(?:calls?\|usages?) |
Общеупотребительные слова (find, all, update, rename и т.д.) исключаются из сопоставления через множество COMMON_WORDS.
Категории миграции¶
После извлечения символов рабочий процесс запрашивает CPG для функций в 9 категориях миграции:
| # | Категория | Ключевые слова | Источник из плагина |
|---|---|---|---|
| 1 | Executor | exec, node, rename | sql_patterns["query_execution"] |
| 2 | Memory | memory, alloc | get_memory_functions_from_plugin() |
| 3 | Table/Heap | table, open | sql_patterns["file_operations"] |
| 4 | Error | error | compliance_patterns["error_functions"] |
| 5 | Lock | lock, tranche | get_lock_functions_from_plugin() |
| 6 | Cache | cache, deprecated | sql_patterns["catalog_cache"] |
| 7 | Assert | assert, macro | compliance_patterns["assert_macros"] |
| 8 | Slot/Tuple | slot, tuple, attr | refactoring_targets["slot"] |
| 9 | FunctionCall | functioncall, call | refactoring_targets["functioncall"] |
Каждая категория формирует SQL-запрос к nodes_method с соединением edges_call для поиска функций, ранжированных по количеству вызывающих.
Приоритетные запросы¶
Перед запросами по категориям выполняются 4 приоритетных запроса, чтобы наиболее релевантные функции оказались в начале результатов:
| Приоритет | Категория | Метод |
|---|---|---|
| 1 | Slot/Tuple | get_tuple_slot_functions_from_plugin(), упорядочивание через CASE |
| 2 | Макросы Assert | m.name LIKE 'Assert%' |
| 3 | FunctionCall | refactoring_targets из плагина |
| 4 | Обновление сигнатур | get_memory_functions_from_plugin(), морфологический матчинг EN+RU |
Приоритет 4 поддерживает русские ключевые слова (сигнатура, параметр) через keyword_match_morphological().
Категоризация по сложности¶
Найденные символы категоризируются по сложности рефакторинга на основе количества вызывающих:
| Категория | Количество вызывающих | Уровень риска |
|---|---|---|
| Простые переименования (simple renames) | <= min_callers |
Низкий |
| Изменения сигнатур (signature modifications) | min_callers < count <= high_complexity |
Средний |
| Сложные рефакторинги (complex refactors) | > high_complexity |
Высокий |
Пороговые значения настраиваются через get_unified_config().thresholds.
Агенты рефакторинга¶
S13 использует четыре агента рефакторинга совместно с S05, расположенных в src/refactoring/agents/:
TechnicalDebtDetector¶
TechnicalDebtDetector(cpg_service=None) — обнаруживает запахи кода через библиотеку паттернов.
detect_all_smells(limit_per_pattern)— запуск всех паттернов, сортировка по серьёзностиcalculate_debt_metrics(findings)— вычисление коэффициента долга и метрик трудозатратdetect_pattern(pattern, limit)— запуск одного паттерна
DeadCodeDetector¶
DeadCodeDetector(cpg_service=None) — специализированный детектор с 13 паттернами мёртвого кода:
DEAD_CODE, DEPRECATED_MARKER, DISABLED_CODE_BLOCK, EMPTY_STUB, ERROR_ONLY_FUNCTION, UNREACHABLE_AFTER_RETURN, ORPHAN_COMPONENT, UNUSED_VARIABLE, DEAD_ASSIGNMENT, INVARIANT_DEAD_CODE, DEAD_CALLBACK, SINGLE_CALLER_FUNCTION, TEST_ONLY_FUNCTION.
detect_all(limit_per_pattern)— запуск всех 13 паттерновdetect_patterns(patterns, limit_per_pattern)— запуск конкретных паттерновget_summary(findings)— сводная статистика
ImpactAnalyzer¶
ImpactAnalyzer(cpg_service=None) — анализирует влияние изменений на зависимости.
analyze_method_impact(method_name, filename)— вызывающие, вызываемые, оценка влиянияanalyze_bulk_impact(findings, limit)— пакетный анализ нескольких находок
RefactoringPlanner¶
RefactoringPlanner() — создаёт приоритизированные планы рефакторинга с оценкой ROI.
create_refactoring_plan(findings, impact_analyses)— задачи с приоритетом 1-10generate_report(findings, impact_analyses, tasks)—RefactoringReport
Ключевые модели данных (src/refactoring/agents/models.py):
- CodeSmellFinding — обнаруженный запах кода (severity, category, method_name, effort_hours)
- DeadCodeFinding — экземпляр мёртвого кода (detection_type, confidence, line_count)
- ImpactAnalysis — анализ влияния (impact_score, risk_level, direct_dependents)
- RefactoringTask — задача рефакторинга (priority 1-10, effort_hours, refactoring_steps)
- RefactoringReport — полный отчёт (total_smells, by_severity, total_effort_hours)
Доменно-независимая архитектура¶
S13 загружает все данные миграции из доменных плагинов, никогда не используя жёстко закодированные символы. Шесть вспомогательных функций из src/workflow/_plugin_helpers.py предоставляют данные:
| Функция | Возвращает |
|---|---|
get_refactoring_patterns_from_plugin() |
Целевые паттерны рефакторинга |
get_sql_query_patterns_from_plugin() |
SQL-паттерны (executor, table, cache) |
get_memory_functions_from_plugin() |
Функции работы с памятью |
get_lock_functions_from_plugin() |
Функции блокировок/синхронизации |
get_compliance_patterns_from_plugin() |
Паттерны ошибок и assert |
get_tuple_slot_functions_from_plugin() |
Функции доступа к slot/tuple |
Дополнительно DomainPluginV3 предоставляет get_migration_keywords() (соответствие категорий и ключевых слов) и get_migration_descriptions() (соответствие категорий и описаний), используемые генератором запасного ответа.
При недоступности LLM функция _build_fallback_answer() генерирует структурированный отчёт, используя описания из плагина, организованные по совпавшим категориям миграции.
Анализ рисков¶
CallGraphAnalyzer и радиус поражения¶
Рабочий процесс рефакторинга (общий для S05/S13) использует CallGraphAnalyzer(cpg) из src/analysis/ для оценки рисков:
find_all_callers(method_name, max_depth)— транзитивная цепочка вызывающихfind_all_callees(method_name, max_depth)— транзитивная цепочка вызываемыхanalyze_impact(method_name)— оценка влияния
Радиус поражения (blast radius) = общее число вызывающих + вызываемых. Методы классифицируются:
- Безопасно для рефакторинга: радиус < порога blast_radius_medium
- Низкий риск: < caller_count_medium
- Средний риск: < caller_count_high
- Высокий риск: >= caller_count_high
Риск по центральности посредничества¶
DependencyAnalyzer(cpg).identify_architectural_chokepoints() вычисляет центральность посредничества (betweenness centrality) для каждого метода. Методы выше порогового значения перцентиля compliance_score_high отмечаются как критические архитектурные узкие места — их рефакторинг требует особой осторожности, так как через них проходит множество путей выполнения кода.
Использование CLI¶
# Массовый рефакторинг символа
python -m src.cli query "Rename all instances of heap_open to table_open"
# Поиск целей миграции
python -m src.cli query "Find all ExecProcNode references for rename"
# Миграция API работы с памятью
python -m src.cli query "Plan mass refactoring of memory allocation functions"
# Изменения сигнатур
python -m src.cli query "Find functions with signature changes needed"
# Стандартизация макросов Assert
python -m src.cli query "Find all Assert macro usages for standardization"
Примеры вопросов¶
- «Переименовать все вхождения [старое_имя] в [новое_имя]»
- «Найти все ссылки на [функцию] для массового рефакторинга»
- «Спланировать массовый рефакторинг функций выделения памяти»
- «Найти функции, требующие изменения сигнатуры»
- «Найти все использования макроса Assert для стандартизации»
- «Показать паттерны доступа к слотам/кортежам для рефакторинга»
- «Найти паттерны FunctionCall для модернизации»
- «Спланировать миграцию функций блокировок»
- «Найти все использования функций кэша для выведения из эксплуатации»
- «Показать функции обработки ошибок для миграции»
Связанные сценарии¶
- Рефакторинг — Обнаружение запахов кода и мёртвого кода (S05)
- Технический долг — Анализ и приоритизация технического долга (S12)
- Архитектура — Анализ зависимостей и связности
- Проверка кода — Проверка массовых изменений
S13 vs S05 vs S12: S13 специализируется на масштабных миграциях символов/API — переименование функций, обновление сигнатур и модернизация API по всей кодовой базе. S05 фокусируется на обнаружении запахов кода, мёртвого кода и дубликатов с формированием задач рефакторинга. S12 фокусируется на измерении и приоритизации технического долга. Все три разделяют инфраструктуру агентов рефакторинга (TechnicalDebtDetector, DeadCodeDetector, ImpactAnalyzer, RefactoringPlanner), но обслуживают разные сценарии использования.