Сценарий 10: Межрепозиторный анализ

Архитектор анализирует зависимости, дубликаты и возможности консолидации между несколькими репозиториями с помощью CPG-агентов и графовых методов.

Содержание

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

# Выберите сценарий межрепозиторного анализа
/select 10

Как это работает

Двухфазная архитектура

S10 использует стандартную двухфазную архитектуру: фаза 1 на основе handler’ов и фаза 2 с LLM fallback:

Запрос -> CrossRepoIntentDetector.detect()
  |
  Фаза 1: integrate_handlers(state)
    -> HandlerRegistry("cross_repo") -> подбор handler'а по intent
    -> handler.handle() -> CrossRepoReportFormatter -> ответ
    |
    handled=True  -> возврат форматированного результата (без LLM)
    handled=False -> Фаза 2
  |
  Фаза 2: cross_repo_workflow() [LLM fallback]
    -> 3 агента (RepositoryIndexer, CrossRepoAnalyzer, DependencyMapper)
    -> CallGraphAnalyzer (графовые инсайты)
    -> PromptRegistry -> LLMInterface.generate() -> ответ

cross_repo_workflow() в cross_repo.py сначала вызывает integrate_handlers(state). Если handler сработал (handled=True), результат возвращается без LLM. Иначе выполняется полный LLM-workflow с 3 агентами и графовым анализом.

Определение намерений

CrossRepoIntentDetector(IntentDetector) в cross_repo_handlers/intent_detector.py определяет 6 intent’ов, отсортированных по приоритету:

Intent Приоритет Ключевые слова (EN + RU)
hook_usage 5 hook, extension hook, callback, хук, точка расширения
spi_dependency 8 spi, server programming interface, серверный интерфейс
code_consolidation 10 consolidate, merge, combine, unified, консолидация, объединить
duplicate_detection 20 duplicate, clone, copy, redundant, дубликат, клон
cross_repo_search 30 across repo, cross repo, all repo, кросс-репозиторий
consistency_check 40 consistency, standard, naming convention, согласованность

Fallback: general_cross_repo (confidence=0.5), когда ни один паттерн не совпал.

Сопоставление ключевых слов через keyword_match_morphological() для поддержки русской морфологии. Доменные ключевые слова хуков загружаются динамически через _get_domain_hook_keywords() из активного доменного плагина.

Фаза handler’ов

3 handler’а

cross_repo_handlers/workflow.py регистрирует 3 handler’а в HandlerRegistry("cross_repo"):

Handler Приоритет Intent Описание
ExtensionDependenciesHandler 5 hook_usage, spi_dependency Анализ зависимостей расширений от API
ConsolidationHandler 10 code_consolidation Обнаружение кандидатов на консолидацию
DuplicateDetectionHandler 20 duplicate_detection Обнаружение дубликатов кода между файлами

Все handler’ы наследуют CrossRepoHandler(BaseHandler).

Базовые методы CrossRepoHandler

CrossRepoHandler в cross_repo_handlers/handlers/base.py предоставляет 4 общих метода CPG-запросов:

Метод Описание
_find_duplicate_code(min_similarity, limit) Поиск дубликатов кода по совпадению сигнатур
_search_across_files(pattern, scope, limit) Поиск методов по паттерну во всех файлах
_check_naming_consistency(pattern_type) Проверка согласованности именования (snake_case, camelCase, PascalCase)
_analyze_consolidation_candidates(threshold) Поиск кандидатов на консолидацию по группировке сигнатур

ExtensionDependenciesHandler дополнительно использует get_extension_dependency_patterns_from_plugin() и build_sql_like_clause() из _plugin_helpers для загрузки доменных паттернов API расширений (доменно-независимый подход).

Форматтеры отчётов

CrossRepoReportFormatter(CrossRepoFormatter) в cross_repo_handlers/formatters/cross_repo_report.py предоставляет 2 форматтера:

Метод Используется
format_consolidation_report(report_data, language) ConsolidationHandler
format_duplicate_report(report_data, language) DuplicateDetectionHandler

CrossRepoFormatter(BaseFormatter) предоставляет вспомогательные методы: format_file_list(), format_consolidation_badge(), format_similarity_badge(). Все форматтеры поддерживают локализацию EN/RU.

Фаза LLM

3 агента

Когда ни один handler не сработал, cross_repo_workflow() выполняет полный LLM-конвейер с 3 агентами из src/cross_repo/cross_repo_agents.py:

Агент Роль Ключевые методы
RepositoryIndexer Обнаружение репозиториев, извлечение метаданных, индексация в CPG discover_repositories(path), index_repository_cpg(repo)
CrossRepoAnalyzer Обнаружение дубликатов кода и возможностей консолидации find_code_duplications(repos, min_similarity, min_lines), find_similar_utilities(repos), identify_consolidation_opportunities(dups)
DependencyMapper Карта зависимостей, обнаружение циклов, генерация отчёта map_dependencies(repos), generate_dependency_graph(deps), detect_circular_dependencies(graph), generate_dependency_report(...)

Конвейер: 1. RepositoryIndexer обнаруживает и индексирует репозитории из workspace_path 2. CrossRepoAnalyzer находит дубликаты и возможности консолидации 3. DependencyMapper картирует зависимости, обнаруживает циклы, генерирует отчёт 4. Список доказательств строится из дубликатов, возможностей и зависимостей высокого риска 5. PromptRegistry.get_agent_prompt("cross_repo_analyzer", ...) формирует промпт 6. LLMInterface().generate() генерирует финальный ответ

Интеграция CallGraphAnalyzer

После завершения 3 агентов CallGraphAnalyzer(cpg) из src/analysis выполняет графовый анализ:

  • Общие методы: Для каждого дубликата анализирует вызывающие/вызываемые/влияние через find_all_callers(), find_all_callees(), analyze_impact(). Вычисляет consolidation_score = (callers + callees) * instances.
  • Межрепозиторные вызовы: Для зависимостей с source_method находит вызываемые методы для обнаружения tight coupling. Помечает зависимости с высокой связанностью для приоритета декаплинга.
  • Паттерны консолидации: Группирует методы по сигнатуре графа вызовов (набор вызываемых). Методы с идентичными паттернами вызовов — кандидаты на консолидацию.

Графовые инсайты

Графовый анализ формирует 3 категории инсайтов в state["metadata"]["graph_insights"]:

Категория Описание
shared_methods Методы с consolidation_benefit (high/medium/low) и consolidation_score
cross_repo_calls Зависимости с высокой связанностью и decoupling_priority
consolidation_patterns Группы методов с одинаковой сигнатурой вызовов — кандидаты на «извлечение в общую библиотеку»

Модели данных

Ключевые dataclass’ы из src/cross_repo/repo_patterns.py:

Модель Ключевые поля
RepositoryInfo repo_id, name, language, method_count, file_count
CodeDuplication pattern_name, similarity_score, severity, instances (List[CodeInstance]), potential_savings
CrossRepoDependency source_repo, target_repo, dependency_type (DependencyType), coupling_score, risk_level (RiskLevel)
ConsolidationOpportunity title, priority, estimated_savings, estimated_effort
ConsolidationReport total_repos, total_methods, risk_summary, estimated_total_savings

Перечисления: DependencyType (import, function_call, type_reference, …), RiskLevel (critical, high, medium, low).

Конфигурация

S10 является доменно-независимым. Все доменные данные загружаются из плагинов:

  • _get_api_keywords() — маппинг API-ключевых слов на функции из domain.get_api_keywords()
  • _get_domain_hook_keywords() — ключевые слова хуков из domain.get_intent_keywords("CROSS_REPO")
  • get_extension_dependency_patterns_from_plugin() — паттерны зависимостей расширений

Конфигурация проектов в config.yamlprojects:

projects:
  registry:
    postgres:
      db_path: data/projects/postgres.duckdb
      language: c
      domain: postgres
    extension1:
      db_path: data/projects/extension1.duckdb
      language: c
      domain: postgres

Использование CLI

# Анализ межрепозиторных зависимостей
python -m src.cli query "Find cross-repository dependencies"

# Обнаружение дубликатов
python -m src.cli query "Find duplicate code across repositories"

# Анализ консолидации
python -m src.cli query "Show consolidation opportunities"

# Анализ зависимостей расширений
python -m src.cli query "Which extensions depend on memory allocation functions?"

# Анализ использования хуков
python -m src.cli query "Find all hook usage patterns"

# Проверка согласованности
python -m src.cli query "Check naming consistency across codebase"

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

  • “Find cross-repository dependencies”
  • “Find duplicate code across repositories”
  • “Show consolidation opportunities”
  • “Which extensions use [function_name]?”
  • “Find all hook usage patterns”
  • “Check naming consistency across the codebase”
  • “What would break if [function] changes?”
  • “Show high-risk dependencies”
  • “Find functions used by extensions”

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

S10 vs S11: S10 (межрепозиторный анализ) фокусируется на мультирепозиторном анализе — дубликаты между репозиториями, межрепозиторные зависимости, возможности консолидации и анализ графа вызовов между репозиториями. S11 (архитектура) фокусируется на внутренней архитектуре одного проекта — анализ слоёв, метрики связности/сцепления, циклические зависимости внутри одной кодовой базы.