От GitNexus к Gortex: история создания движка анализа кода на Go
AI-агенты тратят много токенов на чтение файлов. Просишь отрефакторить функцию — агент читает файл, потом импорты, потом зависимости, потом файлы, которые те импортируют. К тому моменту как доходит до вопроса, контекстное окно уже наполовину занято тем, что должно было занять пару секунд.
Именно это привело меня к GitNexus. И в итоге — к написанию Gortex.
GitNexus #
GitNexus, инструмент Абхигьяна Патвари, заранее индексирует репозиторий в граф знаний. Агент запрашивает граф вместо того, чтобы ходить по файловой системе. Поставляется с CLI, MCP-сервером, браузерным проводником графа на gitnexus.vercel.app и 16 MCP-инструментами — гибридный поиск (BM25 + семантический), анализ радиуса взрыва изменений, поддержка Cypher-запросов.
Я пользовался им несколько недель. Подход с графом работает: «какие сервисы вызывают эту функцию?» — один MCP-вызов вместо рекурсивного обхода файлов. Браузерный проводник удобный — граф с силовым расположением узлов, можно перетаскивать и смотреть.
Что не подошло #
Языки. GitNexus поддерживает восемь: JavaScript, TypeScript, Python, Java, Go, Rust, C++, C#. Мои проекты — Go-сервисы, Ruby-инструменты, Bash-скрипты, Protobuf, Dockerfile, HCL. Граф ничего не знал обо всём этом.
Мало инструментов. Шестнадцати хватает для базовых сценариев, но я регулярно хотел того, чего не было: поиск мёртвого кода, проверка архитектурных ограничений, трассировка потоков выполнения, поиск реализаций интерфейсов. Каждый раз приходилось возвращаться к чтению файлов.
Граф устаревает. Персистентное хранилище на LadybugDB переживает перезапуски — это полезно. Но граф может тихо выйти из актуальности, и не было нормального способа понять, когда это случилось.
TypeScript и время запуска. Не претензия к языку — TypeScript нормальный. Но я запускал это как фоновый процесс-наблюдатель и переключался между разными репозиториями весь день. Go-бинарник стартует быстрее и потребляет меньше памяти.
Прототип на Go #
Начал прототип в выходные с одной целью: воспроизвести ядро графовых запросов и посмотреть, лучше ли ощущается архитектура. В Go уже есть биндинги tree-sitter, cobra для CLI, fsnotify для наблюдения за файлами. За день заработало достаточно хорошо, чтобы продолжить.
После нескольких вечеров и выходных получился Gortex — движок анализа кода, который строит граф знаний из репозиториев и раздаёт его через CLI, MCP-сервер и веб-интерфейс.
Чем Gortex отличается #
33 языка #
Код: Go, TypeScript, JavaScript, Python, Rust, Java, C#, Kotlin, Swift, Scala, PHP, Ruby, Elixir, C, C++, Dart, OCaml, Lua, Zig, Haskell, Clojure, Erlang, R, Bash/Zsh. Конфиги и данные: SQL, Protobuf, Markdown, HTML, CSS, YAML, TOML, HCL/Terraform, Dockerfile.
Функциональные языки (OCaml, Haskell, Clojure, Zig) здесь важны — именно их обычно упускают.
48 MCP-инструментов #
48 инструментов делятся на девять групп: навигация, обход графа, рабочий процесс кодирования, оптимизированные для агентов вызовы, анализ, безопасность, качество, генерация кода, управление мультирепо.
Главный инструмент — smart_context. Один вызов возвращает определение символа, вызывающий код, вызываемый код, типовые связи и принадлежность к сообществу. Это заменяет 5–10 чтений файлов. Gortex теперь измеряет это на каждый вызов — каждый инструмент чтения исходников возвращает поле tokens_saved, а graph_stats накапливает итоги за сессию: токены отправленные, токены сэкономленные, коэффициент эффективности. На моих кодовых базах это обычно 20–25x.
Вывод реализаций интерфейсов #
Gortex строит рёбра IMPLEMENTS для Go, TypeScript, Java, Rust, C#, Scala, Swift и Protobuf. Найти все реализации интерфейса — один вызов, без обхода каждого файла.
Семантический поиск #
BM25 + векторный поиск через Reciprocal Rank Fusion (RRF). Встроенные GloVe-векторы работают офлайн без настройки. Нужно лучше — указываете --embeddings-url на локальный Ollama или OpenAI-совместимый endpoint. Офлайн-трансформеры доступны через build tags (ONNX, GoMLX, Hugot).
Персистентность на диске, быстрый перезапуск #
Ранние версии переиндексировали всё при каждом запуске. На больших репозиториях медленно. Теперь Gortex сохраняет граф на диск при завершении и восстанавливает при запуске, потом переиндексирует только изменившиеся файлы. Холодный старт на среднем Go-проекте: ~200ms вместо 3–5 секунд. Кэш привязан к пути репозитория и хешу git-коммита, автоматически инвалидируется при обновлении бинарника.
Режим наблюдения #
Граф обновляется по мере изменения файлов. fsnotify с дебаунсингом, патчи на уровне файлов, без полной перестройки. Агент всегда работает с актуальным графом.
Guard-правила #
В .gortex.yaml определяете, какие паттерны зависимостей разрешены, какие — нет. Gortex проверяет каждое предложенное изменение по ним и сообщает о нарушениях до того, как код попадёт на ревью. Удобно когда агент пытается импортировать инфраструктурный код в доменный пакет.
Редактирование и переименование по ID символа #
edit_symbol принимает ID символа и новое тело, патчит файл и переиндексирует символ. rename_symbol обновляет все вхождения во всей кодовой базе. Агенту не нужно сначала читать файл — граф знает где символ находится. Цикл «прочитать файл — найти место — записать всё обратно» превращается в один MCP-вызов.
Обнаружение контрактов между репозиториями #
get_contracts находит HTTP-маршруты (из аннотаций фреймворков — gin, Express, FastAPI, Spring и других), gRPC-определения сервисов, GraphQL-схемы, топики сообщений (Kafka, NATS, RabbitMQ), WebSocket-события и переменные окружения. check_contracts находит провайдеров без потребителей и потребителей без совпадающего провайдера. Контракты нормализуются к ID вида http::GET::/api/users/{id}, поэтому Go-сервер и TypeScript-клиент сопоставляются корректно даже из разных репозиториев. Именно такие рассогласования обычно находишь только в рантайме.
MCP-промпты #
Три промпта для типичных сценариев:
orientation— статистика графа, кластеры сообществ, потоки выполнения и ключевые символы для незнакомой кодовой базыpre_commit— затронутые символы, радиус взрыва, уровень риска и тесты перед коммитомsafe_to_change— радиус взрыва, план правок, затронутые тесты и оценка риска для конкретного символа
Скиллы по сообществам #
gortex skills разбивает кодовую базу на функциональные сообщества и пишет SKILL.md для каждого. Claude Code подхватывает их автоматически. Каждый файл содержит ключевые файлы, точки входа, связи с другими частями кодовой базы и готовые MCP-вызовы.
Девять IDE-интеграций #
gortex init определяет, какие редакторы установлены, и настраивает каждый:
- Claude Code —
.mcp.json, слэш-команды, глобальные скиллы, хукPreToolUse,CLAUDE.md - Kiro — MCP-конфиг, steering-файлы, три хука агента (сборка smart-контекста, радиус взрыва после правки, обогащение перед чтением)
- Cursor —
.cursor/mcp.json(можно закоммитить, и вся команда получит интеграцию автоматически) - VS Code / GitHub Copilot —
.vscode/mcp.jsonдля agent mode Copilot Chat - Windsurf — глобальный
mcp_config.json, вливается без затирания существующих серверов - Continue.dev —
.continue/mcpServers/gortex.json - Cline — пишет в globalStorage расширения со списком
alwaysAllow - OpenCode —
.opencode/config.json - Antigravity — knowledge item, который учит его использовать CLI-запросы Gortex вместо grep
Один запуск — и все редакторы команды подключены к одним и тем же 48 инструментам.
Мультирепозиторный режим #
Gortex может индексировать несколько репозиториев в один граф. Именованные проекты определяются в ~/.config/gortex/config.yaml — каждый проект это список путей к репозиториям. Настройки уровня репозитория — в .gortex.yaml.
# Отслеживать несколько репозиториев в одном графе
gortex track /code/api /code/frontend /code/protos
# Именованный проект (определяется в ~/.config/gortex/config.yaml)
gortex daemon start --project my-saas
# Что сейчас проиндексировано
gortex status
ID символов в мультирепо-режиме становятся <repo_prefix>/<path>::<Symbol>. CrossRepoResolver связывает вызовы между репозиториями. Анализ радиуса взрыва следует по этим рёбрам и группирует результаты по репозиториям — «что сломается при изменении этого интерфейса?» возвращает ответ по всем отслеживаемым репозиториям за один вызов.
Репозитории, общие для нескольких проектов, индексируются один раз.
GitNexus vs Gortex #
GitNexus — нормальный проект. Абхигьян сделал основную концептуальную работу по тому, как должен выглядеть этот класс инструментов. Gortex появился потому что у меня были потребности, которые GitNexus не закрывал, — не потому что он плохой.
| GitNexus | Gortex | |
|---|---|---|
| Язык | TypeScript | Go |
| Поддерживаемых языков | 8 | 33 |
| MCP-инструментов | 16 | 48 |
| MCP-ресурсов | — | 7 |
| MCP-промптов | — | 3 |
| Хранилище | Персистентное (LadybugDB) | In-memory + снимок на диске |
| Watch mode | — | Есть |
| Мультирепо | — | Есть |
| Семантический поиск | BM25 + semantic | BM25 + vector + RRF |
| Учёт экономии токенов | — | На вызов + за сессию |
| Встроенное редактирование | — | edit_symbol, rename_symbol |
| Обнаружение контрактов | — | HTTP, gRPC, GraphQL, pub/sub, env |
| Вывод интерфейсов | — | Есть (8 языков) |
| Guard-правила | — | Есть |
| Скиллы по сообществам | — | gortex skills |
| IDE-интеграции | — | 9 (gortex init) |
| Внешние сервисы | Нет | Нет |
Преимущество GitNexus: хостируемый проводник на gitnexus.vercel.app — можно поделиться графом с тем, у кого ничего не установлено. Если работаете на восьми поддерживаемых языках и хотите managed-вариант — стоит смотреть туда.
Преимущество Gortex: 33 языка включая функциональные, 48 инструментов со встроенным редактированием и обнаружением контрактов, быстрый перезапуск, измеримая экономия токенов, девять IDE-интеграций из одной команды. Если у вас полиглотный стек или несколько репозиториев — Gortex покрывает больше.
Попробовать #
# Установить (macOS/Linux, одной командой)
curl -fsSL https://get.gortex.dev | sh
# Или через Homebrew
brew install zzet/tap/gortex
# Один раз на машину — устанавливает completions, хуки, заготовки для редакторов
gortex install
# Запустить daemon (переживает перезапуски редактора; автозапуск при входе — опционально)
gortex daemon start --detach
gortex daemon install-service # опционально: автозапуск при входе в систему
# Добавить репозитории
gortex track ~/projects/myapp
gortex track ~/projects/frontend ~/projects/protos # несколько репо в одном графе
# Настройка репозитория (опционально, но рекомендуется)
cd /your/repo
gortex init # пишет .mcp.json, CLAUDE.md, конфиги редакторов, guard-правила
gortex init --skills # также генерирует SKILL.md для каждого сообщества
# MCP-сервер (автономный режим, автоматически находит запущенный daemon)
gortex mcp --index /path/to/repo --watch
# Проверить состояние
gortex status
После gortex init Claude Code и Cursor запускают MCP-сервер автоматически через .mcp.json — вручную запускать gortex mcp не нужно. Веб-интерфейс раздаётся отдельно командой gortex server (порт 4747) и находится в репозитории gortexhq/web.
Код: github.com/zzet/gortex. Issues и PR приветствуются.
Частые вопросы — Gortex-версия #
Если вы попали сюда в поисках ответов по GitNexus — вот эквиваленты для Gortex.
Установка / как использовать. curl -fsSL https://get.gortex.dev | sh (или brew install zzet/tap/gortex), затем gortex install один раз на машину, gortex daemon start --detach для запуска daemon’а, и gortex init один раз на репозиторий. MCP-конфиг, интеграции с редакторами и guard-правила настраиваются автоматически.
MCP-сервер / MCP-команды. gortex mcp --index /path/to/repo --watch. После gortex init Claude Code и Cursor запускают его автоматически через .mcp.json — вручную запускать не нужно. Daemon (gortex daemon start) держит граф живым между сессиями; gortex mcp автоматически его обнаруживает.
CLI. gortex --help выводит всё. Основные команды: gortex mcp, gortex init, gortex daemon, gortex track, gortex status, gortex savings, gortex eval, gortex enrich.
Скиллы. gortex init --skills разбивает кодовую базу на функциональные сообщества и пишет SKILL.md для каждого. Claude Code подхватывает их автоматически — дополнительная конфигурация не нужна.
OpenCode. gortex init определяет OpenCode и автоматически пишет .opencode/config.json. Одна команда — и интеграция готова.
Antigravity. gortex init добавляет knowledge item, который указывает Antigravity использовать CLI-запросы Gortex вместо grep. Та же однокомандная настройка, что и для остальных редакторов.
“cannot get /”. Если вы получали эту ошибку в веб-интерфейсе GitNexus — у Gortex веб-интерфейс находится в отдельном приложении gortexhq/web. Запустите API-сервер командой gortex server --index /path/to/repo --watch (порт 4747), затем откройте веб-интерфейс, направив его на http://localhost:4747.