Ещё один инструмент индексации кодовой базы под AI-агентов — но с интересной реализацией на tree-sitter и SQLite. Чем отличается от SocratiCode и где реальные границы
Если вы работаете с Claude Code на больших проектах, то знаете типичную картину. Задаёшь вопрос «как у нас устроена авторизация» — и агент начинает спавнить Explore-агентов, которые рекурсивно бегают по файлам через grep, glob и Read, читают десятки файлов, заполняют контекстное окно и жгут токены. На монорепе с тысячами файлов один такой запрос может занять полторы-две минуты и сотню вызовов инструментов.
Я уже разбирал на Хабре похожий инструмент — SocratiCode, который решает эту задачу через векторный поиск на Qdrant. Недавно мне попался ещё один проект из той же ниши — CodeGraph от colbymchenry. Подход другой: вместо векторных эмбеддингов он строит граф символов (функции, классы, их связи) через tree-sitter и хранит его в SQLite. Решил разобраться, как это устроено, проверить заявленные бенчмарки и понять, чем оно отличается от альтернатив.
Сразу оговорка про телеграм-маркетинг. Пост, через который я узнал про инструмент, содержит пару неточностей, которые я поправлю по ходу. Например, «для ИИ-агента Hermes построила контекст из 3479 файлов» — никакого «агента Hermes» в проекте нет, это выдумка. Цифры 92%/71% — реальные, из README. Разберём предметно.
Что это и какую проблему решает
CodeGraph — это MCP-сервер (Model Context Protocol) для Claude Code. Он индексирует вашу кодовую базу в граф знаний и предоставляет агенту набор инструментов для запросов к этому графу: найти символ, найти кто вызывает функцию, построить контекст под задачу, проанализировать impact от изменения.
Ключевая идея — дать Explore-агентам Claude Code предварительно проиндексированный граф вместо того, чтобы они сканировали файлы вживую. Агент запрашивает граф мгновенно, вместо того чтобы рекурсивно читать дерево файлов.
Технические характеристики из репозитория:
Node.js 18+, ставится через
npx @colbymchenry/codegraphMIT-лицензия, 552 звезды на GitHub на момент обзора
100% локально — никаких API-ключей, никакого облака, только SQLite-база
Поддержка 19+ языков: TypeScript, JavaScript, Python, Go, Rust, Java, C#, PHP, Ruby, C, C++, Swift, Kotlin, Dart, Svelte, Liquid, Pascal/Delphi
File watcher с автосинхронизацией через нативные OS-события Это та же категория, что SocratiCode, Aider repo-map, Continue codebase indexing. Но реализация заметно отличается, и об этом стоит поговорить подробнее.
Архитектура: tree-sitter → SQLite граф
В отличие от SocratiCode, который строит векторный индекс через эмбеддинги Ollama, CodeGraph идёт по пути статического анализа AST. Никаких нейросетевых эмбеддингов в самом индексе нет — это чистый структурный граф.
Процесс делится на четыре стадии.
Стадия 1: Extraction. tree-sitter парсит исходный код в AST. Дальше языко-специфичные запросы извлекают узлы (функции, классы, методы) и связи (вызовы, импорты, наследование). tree-sitter — это та же библиотека, что использует GitHub для подсветки синтаксиса и навигации по коду, проверенный инструмент.
Стадия 2: Storage. Всё складывается в локальную SQLite-базу .codegraph/codegraph.db с полнотекстовым поиском через FTS5. Выбор SQLite тут разумный — это zero-config встроенная БД, которая не требует поднимать отдельный сервис (в отличие от Qdrant у SocratiCode, который тянет Docker).
Стадия 3: Resolution. После извлечения резолвятся ссылки: вызовы функций сопоставляются с определениями, импорты — с исходными файлами, наследование классов, фреймворк-специфичные паттерны. Это превращает разрозненные узлы в связный граф.
Стадия 4: Auto-Sync. MCP-сервер следит за проектом через нативные OS-события (FSEvents на macOS, inotify на Linux, ReadDirectoryChangesW на Windows). Изменения дебаунсятся (окно 2 секунды), фильтруются только до исходных файлов и инкрементально досинхронизируются. Граф остаётся свежим по мере написания кода без ручного переиндексирования.
Принципиальное отличие от векторного подхода: граф детерминированный. Если функция login() вызывает validateToken() — это факт из AST, а не «семантическая близость с вероятностью 0.87». Для задач трассировки вызовов это надёжнее векторного поиска. Для задач «найди что-то концептуально похожее» — наоборот, граф проигрывает векторам.
Установка
Тут всё просто, что приятно. Интерактивный установщик одной командой:
npx @colbymchenry/codegraph
Установщик сам делает несколько вещей: ставит codegraph глобально (нужно для MCP-сервера), прописывает MCP-сервер в ~/.claude.json, настраивает auto-allow права для инструментов CodeGraph, добавляет глобальные инструкции в ~/.claude/CLAUDE.md.
Дальше в проекте инициализируем граф:
cd your-project codegraph init -i
После этого Claude Code автоматически использует CodeGraph, когда видит директорию .codegraph/ в проекте.
Если не любите автоматику, можно настроить руками. Установщик прописывает в ~/.claude.json примерно такой блок:
{ "mcpServers": { "codegraph": { "type": "stdio", "command": "codegraph", "args": ["serve", "--mcp"] } } }
Обратите внимание — тип stdio, а не url. CodeGraph работает как локальный процесс, общающийся с Claude Code через stdin/stdout, а не как сетевой сервис. Это логично для инструмента, который позиционируется как «100% локально».
Инструменты, которые получает агент
После запуска CodeGraph экспонирует Claude Code набор MCP-инструментов. Вот они с назначением:
codegraph_search— найти символы по имени across всей кодовой базыcodegraph_context— построить релевантный контекст под задачуcodegraph_callers— найти, что вызывает функциюcodegraph_callees— найти, что вызывает сама функцияcodegraph_impact— проанализировать, что затронет изменение символаcodegraph_node— детали по конкретному символу (опционально с исходным кодом)codegraph_files— структура проиндексированных файловcodegraph_status— здоровье индекса и статистика Интересный архитектурный момент: установщик прописывает вCLAUDE.mdинструкции, которые запрещают главной сессии вызывать тяжёлые инструменты напрямую. Цитирую суть из README:
NEVER call
codegraph_exploreorcodegraph_contextdirectly in the main session.
Логика в том, что эти инструменты возвращают большие куски исходного кода, которые забивают контекст главной сессии. Вместо этого CodeGraph настаивает, чтобы для исследовательских вопросов всегда спавнился отдельный Explore-агент. А главная сессия может пользоваться только лёгкими инструментами (codegraph_search, codegraph_callers, codegraph_impact, codegraph_node) для точечных запросов перед редактированием.
Это грамотное проектирование. Авторы понимают проблему «context bloat» и архитектурно её обходят: тяжёлый код едет в субагента, чей контекст потом схлопывается, а главная сессия остаётся чистой.
Бенчмарки: что заявлено и как это читать
Авторы протестировали на 6 реальных кодовых базах, сравнивая Explore-агент Claude Code с CodeGraph и без. Все тесты на Claude Opus 4.6 (контекст 1M), Claude Code v2.1.91. Каждый тест — один Explore-агент с одним и тем же вопросом.
Усреднённый результат: 92% меньше вызовов инструментов, на 71% быстрее. На главной странице README указано даже 94%/77% — видимо, по другому набору, в детальной таблице среднее 92%/71%.
Самые показательные кейсы:
VS Code (TypeScript, 4002 файла): 3 вызова за 17 секунд против 52 вызовов за 1м37с. То есть 94% меньше вызовов, 82% быстрее.
Swift Compiler (Swift/C++, 25 874 файла, 272 898 узлов): самая большая база. CodeGraph проиндексировал её менее чем за 4 минуты, и агент ответил на сложный кросс-каттинг вопрос за 6 вызовов и ноль чтений файлов за 35 секунд. Как эти цифры читать критически.
Во-первых, это бенчмарк автора, не независимая проверка. Чтобы убедиться, что вопросы репрезентативны, нужно воспроизвести самому. Я бенчмарк целиком не гонял, но по описанию методология честная — указаны точные вопросы, версии, кодовые базы. Это лучше, чем «нам показалось, что стало быстрее».
Во-вторых, «92% меньше вызовов» — это про tool calls агента, не про «вызовы кода», как переврал телеграм-пост. Это число обращений Explore-агента к инструментам (grep, read, glob против codegraph-запросов).
В-третьих — и это главное — выигрыш проявляется на больших кодовых базах и архитектурных вопросах. Вопросы в бенчмарке вида «как extension host общается с main process» или «как работает collaborative editing». Это вопросы про структуру, где надо обойти много файлов. На точечной задаче «покажи определение функции parseConfig» grep отработает так же быстро, и выигрыша от графа не будет.
Это, кстати, ровно тот же вывод, к которому я пришёл, разбирая SocratiCode. Инструменты индексации кода выигрывают на «понимании структуры», а не на точечном поиске.
Откуда взялась цифра «3479 файлов за 3 минуты» и про «агента Hermes»
Отдельно разберу телеграм-формулировку «для ИИ-агента Hermes тулза построила контекст из 3479 файлов за три минуты», потому что это смесь правды и выдумки.
Никакого «агента Hermes» в проекте CodeGraph нет. Я прочитал весь README, CLI reference, список MCP-инструментов — слова Hermes там не встречается. Откуда автор поста его взял — загадка, возможно перепутал с другим инструментом.
Цифра «3479 файлов за 3 минуты» близка к реальным данным, но неточна. В бенчмарке самые большие индексации: VS Code — 4002 файла, Swift Compiler — 25 874 файла за «менее 4 минут». Похоже, автор поста взял ballpark «несколько тысяч файлов за несколько минут» и округлил до конкретных, но неверных чисел.
Это типичная история с телеграм-пересказами: основной факт (быстрая индексация больших проектов) — правда, конкретные детали — выдуманы. Поэтому я всегда проверяю первоисточник, прежде чем писать.
Чем отличается от SocratiCode и других
Раз уж я разбирал SocratiCode, проведу прямое сравнение — это самый близкий конкурент.
SocratiCode строит векторный индекс через Qdrant + Ollama, делает гибридный поиск (семантика + BM25 через RRF). Сильная сторона — концептуальный поиск: «найди код про авторизацию», даже если слова auth там нет. Слабая — требует Docker для Qdrant и Ollama, тяжелее по ресурсам.
CodeGraph строит структурный граф через tree-sitter + SQLite. Сильная сторона — детерминированная трассировка вызовов (кто кого вызывает, что на что влияет) и легковесность (только SQLite, без Docker). Слабая — не умеет в семантическую близость, ищет по именам и связям, а не по смыслу.
Грубо говоря: если вам нужно «проследить, как запрос проходит от Session.request() до URLSession» — это к CodeGraph, граф пройдёт цепочку вызовов. Если нужно «найди все места, где мы делаем что-то похожее на rate limiting, как бы оно ни называлось» — это к SocratiCode, вектора поймают синонимы.
Другие альтернативы:
Aider repo-map — встроенная карта репозитория, но без полноценного графа связей и без MCP
Continue — локальная индексация через свой формат, привязана к Continue-расширению
Cody от Sourcegraph — мощный, но в основном через свой клиент, не универсальный MCP CodeGraph выигрывает в нише «легковесный детерминированный граф через стандартный MCP». Поставил npx-командой, работает в любом MCP-совместимом хосте, не тянет Docker.
Где это реально полезно
После изучения проекта и бенчмарков сформулирую, когда инструмент оправдан.
Стоит ставить, если:
У вас большая кодовая база (от нескольких сотен файлов), и вы регулярно работаете с ней через Claude Code
Часто решаете архитектурные задачи — рефакторинг, трассировка вызовов, impact-анализ перед изменением
Хотите легковесное решение без Docker и внешних сервисов
Важна приватность — всё локально, код никуда не уходит Особенно ценный сценарий — impact-анализ перед рефакторингом. Инструмент
codegraph_impactпоказывает, что затронет изменение символа, до того как вы его меняете. Это то, на что вручную через grep уходит куча времени, а тут один запрос к графу.
Не стоит заморачиваться, если:
Проект маленький (десятки файлов) — grep отработает мгновенно, граф не нужен
Вам нужен в основном семантический поиск по смыслу — тогда SocratiCode или векторное решение лучше
Вы не используете Claude Code или другой MCP-совместимый хост — инструмент заточен под MCP
Ограничения, о которых стоит знать
Чтобы не выглядело рекламно, отмечу слабые места.
Только структурный поиск. Граф знает про вызовы и импорты, но не понимает семантику. «Найди код, концептуально похожий на X» — не его задача.
Качество зависит от языка. tree-sitter-парсеры разного качества для разных языков. Для TypeScript, Python, Go — зрелые. Для Pascal/Delphi, Liquid, Svelte (которые в списке 19+) — наверняка менее точные. На экзотических языках граф может быть неполным.
Resolution не идеальна. Сопоставление вызовов с определениями для динамических языков (Python, Ruby, JS) — принципиально сложная задача. Динамическая диспетчеризация, monkey-patching, рефлексия — всё это статический анализ ловит плохо. Граф будет иметь пропуски.
Свежесть индекса с задержкой. File watcher дебаунсит на 2 секунды. Если только что добавил функцию и сразу спрашиваешь про неё — может не успеть попасть в граф. Мелочь, но бывает.
Молодой проект. 552 звезды, 237 коммитов, 10 открытых issue. Это не зрелый продукт уровня Sourcegraph, а активно развивающийся pet-проект одного автора. Для критичных рабочих процессов стоит это учитывать.
Бенчмарки не независимые. Повторю — цифры 92%/71% от автора. Они выглядят честно по методологии, но это не сторонняя проверка.
Что я вынес для себя
Несколько уроков, которые выходят за рамки самого инструмента.
Граф vs вектора — это выбор под задачу, не «что лучше». Структурный граф детерминирован и точен для трассировки. Вектора гибки и ловят смысл. Идеальный инструмент будущего, наверное, совместит оба подхода — граф для структуры, вектора для семантики.
Прогрессивная подача контекста — снова ключ. Как и в SocratiCode, и в DeerFlow, и в book-to-skill — паттерн «не вали всё в контекст, дай инструмент запросить нужное» повторяется. CodeGraph идёт дальше и архитектурно запрещает главной сессии тянуть тяжёлый код, форсируя субагентов. Это становится стандартом проектирования агентных систем.
MCP закрепляется как стандарт интеграции. Ещё год назад каждый инструмент изобретал свой способ интеграции с агентом. Сейчас всё больше проектов — это просто MCP-серверы, работающие с любым совместимым хостом. CodeGraph, SocratiCode, LazyWeb — все на MCP. Это хороший тренд для экосистемы.
SQLite — недооценённый выбор для локальных инструментов. Не нужен Qdrant, не нужен Docker, не нужен отдельный сервис. SQLite + FTS5 закрывает поиск и хранение графа на проектах до десятков тысяч файлов. Для локального инструмента это правильный минимализм.
Резюме
CodeGraph — рабочий легковесный инструмент для тех, кто использует Claude Code на больших кодовых базах и хочет, чтобы агент не жёг токены на рекурсивный grep. Архитектура грамотная: tree-sitter для парсинга, SQLite для хранения, MCP для интеграции, продуманная защита от context bloat через субагентов.
Заявленные 92%/71% — реальные цифры из README, но это бенчмарк автора и выигрыш в основном на больших проектах с архитектурными вопросами. «Агент Hermes» из телеграма — выдумка, такого в проекте нет. «Без ограничений» правда только в смысле «локально и без API-ключей».
Если у вас большой проект и Claude Code — попробуйте, установка занимает минуту, риск нулевой (всё локально, MIT). Если проект маленький или нужен семантический поиск — посмотрите в сторону альтернатив. А вообще полезно поставить и CodeGraph, и что-то векторное вроде SocratiCode, и использовать под разные типы задач: граф для трассировки, вектора для концептуального поиска.
Полезные ссылки:
Репозиторий: github.com/colbymchenry/codegraph
npm-пакет: npmjs.com/package/@colbymchenry/codegraph
tree-sitter: tree-sitter.github.io
Спецификация MCP: modelcontextprotocol.io
Мой прошлый разбор похожего инструмента SocratiCode — для сравнения подходов
Комментарии (13)

faxenoff
23.05.2026 11:40Я делаю похожее приложение, но с нормальной семантикой, полным графом и стат анализом. А так же бесконечное undo любых изменений, линтинг, анализ разного рода, граф по документации в связке с кодом, автодокументирование кода. Первые версии на пользователях протестил, понял что нужна максимальная автоматизация установки и использования (установка докера, запуск конфигуратора - оказывается неподёмная задача для обычного пользователя). Через пару недель доведу до нормального вида и поделюсь.
Так вот, у меня на предварительной версии сейчас такие цифры по swift-репо (на ноутбучной RTX5060):
Парсинг 4 393 файла с кодом в 143 101 сущности с 458 201 связями (в 5 раз больше структурных данных чем в CodeGraph/Socrati) – 2,2 сек
Индексация с предобучением и записью в БД – 2.8 сек
Генерация 170 332 вектора ембеддингов – 38 сек. (4 376 emb/s) С учётом всех доп-процессов (prolly, trigram, etc) на все процессы от старта до завершения = 60 сек (инкрементные изменения 50-100мс).
4 минуты на базовые связи - это очень долго. Если запустить CodeGraph/Socrati на проекты типа postgesql, chromium, dawn, aspnet (3M LOC), то оно мне кажется помрёт в конвульсиях…
Всё гораздо сложнее в разработке таких приложений, чем просто взять доступный парсер и векторную бд.

Andreas_Fogel
23.05.2026 11:40Поддерживаю, если уж делать граф, то до конца. У вас закрытая разработка или будете выкладывать как опенсурс?

faxenoff
23.05.2026 11:40TS-версия открытая. Zig-версия закрытая, рассматриваю её для корп рынка где репо 50M+ LOC

4wards1
23.05.2026 11:40Для IDE семейства IDEA давно существует "pycharm-index" и его близнецы. Решает ту же задачу, но через встроенные инструменты IDE. Найти всех наследников, объявления или использования класса\метода - моментально. Плюс умеет в умное переименование и перемещение, а также забирает результаты диагностики IDE, подхватывая ошибки синтаксиса, дублирование и прочее.

Ra2007
23.05.2026 11:40На монорепо в 200к строк TypeScript пробовали разные подходы, сейчас смотрим в сторону статического анализа как раз. Интересно что у CodeGraph нет эмбеддингов, то есть поиск только структурный, по символам и связям. Это хорошо для "кто вызывает эту функцию", но как оно справляется с семантическим поиском типа "где у нас обрабатывается авторизация", когда сам код называется не auth а permission_check или middleware_guard? Это та граница где vector-подход выигрывает, интересно как авторы видят это ограничение.

faxenoff
23.05.2026 11:40Такие случаи в CodeGraph/Socrati нормально не обрабатываются. Для корректной работы таких запросов нужен и связанный многогранный граф и семантическое соответствие и дополнительные алгоритмы поиска “часто используется рядом с…” с предразбивкой всего составного в коде на токены и потом прогон по новым найденным дополнительным графам в связке с семантикой и второй круг - совмещение всех графов в один с реранкингом. Если делать это “прямолинейно” на 200к строк, то потребует 30Гб RAM и один запрос будет 10 мин колбасить (слишком много прогонов по всему дереву с перебором). Конкретно когда я решал проблему, то было много “шаманства” на каждом этапе (их примерно десяток в этом запросе), но получилось до 50-100мс сократить.

titulusdesiderio
23.05.2026 11:40А что насчёт совмещения подходов? Первый запрос в вектор, а оттуда, найдя конкретные определения/имена - уже расширять контекст через lsp

Vest
23.05.2026 11:40Я иногда бегаю по репе во времени, вы не знаете, как в этом случае будет вести себя Claude? Можно ли этим инструментом иметь несколько графов?

blanergol_n
23.05.2026 11:40С подключением.
Не хочу вас разочаровывать, но строить ast дерево все попробовали ещё в 2024 и бросили, так как это не работает.
Если без шуток, AST был лучше банального grep где то во времена chatgpt4.
Для себя когда-то выделял такие пункты обоснования для НЕ развития AST подхода:
1) AST описывает синтаксис, а агенту нужны смысл и намерение - структура вызовов не объясняет, зачем код существует и что сломается при изменении.
2) Гранулярность не совпадает с задачей: уровень выражений слишком мелкий, уровень функций слишком крупный, а смысловой кусок в дерево не ложится.
3) LLM сами хорошо парсят сырой код. Прогон через AST и обратную сериализацию только теряет сигнал (комментарии, форматирование, идиоматику).
4) Релевантный контекст обычно не лежит в соседних узлах - нужна семантическая близость, а не синтаксическая.
5) Важная часть контекста вообще вне кода: коммиты, тикеты, доки, логи, рантайм-поведение, тесты.
6) AST требует валидного кода, тогда как агенты постоянно работают со сломанным и недописанным состоянием.
7) Полезные вещи (резолв символов, типы, поток данных) - не AST, а семантический анализ поверх, и фактически означают написание language server'а.
8) На практике выигрывает гибрид: эмбеддинги для поиска по смыслу + LSP/индексы для точечных запросов + git/доки как отдельные источники + сырой код напрямую в модель с хитрым RAG и пояснением кода за счёт мульт модальности. Но стоит это слишком дорого.

kasthack_phoenix
Миллениалы придумали MCP для LSP-сервера? В студии такой из коробки есть уже N лет, да и свободные реализации тоже существуют.