↓Перейти к содержанию
  1. Gortex/

От GitNexus к Gortex: история создания движка анализа кода на Go

··8 минут·

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 не закрывал, — не потому что он плохой.

GitNexusGortex
ЯзыкTypeScriptGo
Поддерживаемых языков833
MCP-инструментов1648
MCP-ресурсов—7
MCP-промптов—3
ХранилищеПерсистентное (LadybugDB)In-memory + снимок на диске
Watch mode—Есть
Мультирепо—Есть
Семантический поискBM25 + semanticBM25 + 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.