Архитектор анализирует зависимости, дубликаты и возможности консолидации между несколькими репозиториями с помощью CPG-агентов и графовых методов.
Содержание¶
- Быстрый старт
- Как это работает
- Двухфазная архитектура
- Определение намерений
- Фаза handler’ов
- 3 handler’а
- Базовые методы CrossRepoHandler
- Форматтеры отчётов
- Фаза LLM
- 3 агента
- Интеграция CallGraphAnalyzer
- Графовые инсайты
- Модели данных
- Конфигурация
- Использование CLI
- Примеры запросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий межрепозиторного анализа
/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.yaml → projects:
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”
Связанные сценарии¶
- Архитектура — Анализ внутренней архитектуры (S11)
- Рефакторинг — Обнаружение запахов кода и мёртвого кода (S05)
- Массовый рефакторинг — Крупномасштабные изменения (S13)
- Аудит безопасности — Сканирование уязвимостей (S02)
S10 vs S11: S10 (межрепозиторный анализ) фокусируется на мультирепозиторном анализе — дубликаты между репозиториями, межрепозиторные зависимости, возможности консолидации и анализ графа вызовов между репозиториями. S11 (архитектура) фокусируется на внутренней архитектуре одного проекта — анализ слоёв, метрики связности/сцепления, циклические зависимости внутри одной кодовой базы.