Исследуйте кодовую базу в виде интерактивного графа знаний с помощью GitNexus
Индексируйте любую кодовую базу в граф знаний и предоставляйте интерактивный веб-интерфейс для просмотра символов, цепочек вызовов, кластеров и потоков выполнения; доступ через Cloudflare обеспечивает удалённый доступ.
Что понадобится
- Для работы GitNexus и прокси-сервера требуется Node.js версии 18 или выше.
- Необходимо наличие Git, а в репозитории должна быть директория
.git. - Для создания туннеля требуется Cloudflared; если его нет, он автоматически устанавливается в ~/.local/bin.
Как применить
Используйте этот инструмент, когда пользователь хочет визуально исследовать архитектуру кодовой базы.
Это также подходит, если пользователь запрашивает граф знаний или граф зависимостей репозитория.
Подходит также, когда пользователь хочет поделиться интерактивным инструментом для просмотра кодовой базы с другими.
Индекс хранится в .gitnexus/ внутри репозитория и автоматически добавляется в .gitignore.
URL-адрес туннеля (например, https://random-words.trycloudflare.com) выводится в stderr; его можно передавать другим — любой, кто имеет ссылку, сможет просмотреть граф.
Веб-интерфейс отображает все узлы в браузере: репозитории с менее чем 5 000 файлов работают хорошо, а крупные репозитории (более 30 000 узлов) могут вызывать замедление или краш вкладки браузера. Инструменты CLI/MCP работают при любом объёме данных — ограничение касается только веб-визуализации.
Клонируйте и соберите GitNexus — это разовая настройка.
GITNEXUS_DIR="${GITNEXUS_DIR:-$HOME/.local/share/gitnexus}"
if [ ! -d "$GITNEXUS_DIR/gitnexus-web/dist" ]; then
git clone https://github.com/abhigyanpatwari/GitNexus.git "$GITNEXUS_DIR"
cd "$GITNEXUS_DIR/gitnexus-shared" && npm install && npm run build
cd "$GITNEXUS_DIR/gitnexus-web" && npm install
fi
Измените веб-интерфейс для обеспечения удалённого доступа: по умолчанию веб-интерфейс использует localhost:4747 для вызовов API.
Измените его так, чтобы использовалась политика same-origin, чтобы он корректно работал через туннель/прокси.
В файле $GITNEXUS_DIR/gitnexus-web/src/config/ui-constants.ts внесите следующие изменения.
export const DEFAULT_BACKEND_URL = 'http://localhost:4747';
Замените значение на выражение same-origin, показанное ниже.
export const DEFAULT_BACKEND_URL = typeof window !== 'undefined' && window.location.hostname !== 'localhost' ? window.location.origin : 'http://localhost:4747';
В файле $GITNEXUS_DIR/gitnexus-web/vite.config.ts добавьте allowedHosts: true внутрь блока server: { } — это необходимо только при запуске в режиме разработки, а не в продакшен-версии.
server: {
allowedHosts: true,
// ... existing config
},
Затем соберите продакшен-бандл.
cd "$GITNEXUS_DIR/gitnexus-web" && npx vite build
Индексируйте целевой репозиторий.
cd /path/to/target-repo
npx gitnexus analyze --skip-agents-md
rm -rf .claude/ # remove Claude Code-specific artifacts
Добавьте --embeddings для семантического поиска — хотя это займёт больше времени: минуты вместо секунд.
Создайте скрипт прокси.
Запишите его в файл (например, $GITNEXUS_DIR/proxy.mjs). Он обслуживает продакшен-версию веб-интерфейса и перенаправляет /api/* на серверную часть GitNexus — всё по одному источнику, без проблем с CORS, без использования sudo и Nginx.
import http from 'node:http';
import fs from 'node:fs';
import path from 'node:path';
const API_PORT = parseInt(process.env.API_PORT || '4747');
const DIST_DIR = process.argv[2] || './dist';
const PORT = parseInt(process.argv[3] || '8888');
const MIME = {
'.html': 'text/html', '.js': 'application/javascript', '.css': 'text/css',
'.json': 'application/json', '.png': 'image/png', '.svg': 'image/svg+xml',
'.ico': 'image/x-icon', '.woff2': 'font/woff2', '.woff': 'font/woff',
'.wasm': 'application/wasm',
};
function proxyToApi(req, res) {
const opts = {
hostname: '127.0.0.1', port: API_PORT,
path: req.url, method: req.method, headers: req.headers,
};
const proxy = http.request(opts, (upstream) => {
res.writeHead(upstream.statusCode, upstream.headers);
upstream.pipe(res, { end: true });
});
proxy.on('error', () => { res.writeHead(502); res.end('Backend unavailable'); });
req.pipe(proxy, { end: true });
}
function serveStatic(req, res) {
let filePath = path.join(DIST_DIR, req.url === '/' ? 'index.html' : req.url.split('?')[0]);
if (!fs.existsSync(filePath)) filePath = path.join(DIST_DIR, 'index.html');
const ext = path.extname(filePath);
const mime = MIME[ext] || 'application/octet-stream';
try {
const data = fs.readFileSync(filePath);
res.writeHead(200, { 'Content-Type': mime, 'Cache-Control': 'public, max-age=3600' });
res.end(data);
} catch { res.writeHead(404); res.end('Not found'); }
}
http.createServer((req, res) => {
if (req.url.startsWith('/api')) proxyToApi(req, res);
else serveStatic(req, res);
}).listen(PORT, () => console.log(`GitNexus proxy on http://localhost:${PORT}`));
Запустите службы: в одном терминале — серверную часть GitNexus, а в другом — прокси (веб-интерфейс + API на одном порту).
# Terminal 1: GitNexus backend API
npx gitnexus serve &
# Terminal 2: Proxy (web UI + API on one port)
node "$GITNEXUS_DIR/proxy.mjs" "$GITNEXUS_DIR/gitnexus-web/dist" 8888 &
Проверьте, что curl -s http://localhost:8888/api/repos возвращает индексированные репозитории.
При желании создайте туннель через Cloudflare для удалённого доступа, установив cloudflared без использования sudo при необходимости.
# Install cloudflared if needed (no sudo)
if ! command -v cloudflared &>/dev/null; then
mkdir -p ~/.local/bin
curl -sL https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-o ~/.local/bin/cloudflared
chmod +x ~/.local/bin/cloudflared
export PATH="$HOME/.local/bin:$PATH"
fi
# Start tunnel (--config /dev/null avoids conflicts with existing named tunnels)
cloudflared tunnel --config /dev/null --url http://localhost:8888 --no-autoupdate --protocol http2
Очистите систему: остановите службы и удалите индекс из целевого репозитория.
# Stop services
pkill -f "gitnexus serve"
pkill -f "proxy.mjs"
pkill -f cloudflared
# Remove index from the target repo
cd /path/to/target-repo
npx gitnexus clean
rm -rf .claude/
--config /dev/null требуется для cloudflared, если у пользователя уже есть конфигурация именованного туннеля в ~/.cloudflared/config.yml.
Без него правило catch-all ingress в конфигурации будет возвращать ошибку 404 для всех запросов по быстрому туннелю.
Для создания туннеля обязательна продакшен-версия сборки.
Сервер разработки Vite по умолчанию блокирует запросы от не-locahost хостов (allowedHosts); продакшен-сборка в сочетании с Node-прокси полностью избегает этой проблемы.
Веб-интерфейс не создает .claude/ или CLAUDE.md; их создает npx gitnexus analyze.
Используйте --skip-agents-md, чтобы отключить файлы Markdown, а затем rm -rf .claude/ для остальных — это интеграции Claude Code, которые не нужны пользователям hermes-agent.
Следите за ограничением памяти браузера: веб-интерфейс загружает весь граф в память браузера.
Репозитории с более чем 5000 файлов могут работать медленно, а репозитории с 30 000 и более файлов, скорее всего, приведут к сбою вкладки.
Эмбеддинги — это необязательный элемент: --embeddings включает семантический поиск, но на больших репозиториях это занимает несколько минут.
Можно пропустить этот шаг для быстрого исследования; добавьте его, если хотите выполнять запросы на естественном языке через панель чата с ИИ.
Источник: nousresearch/hermes-agent и участники проекта. Лицензия: MIT.
Copyright (c) 2025 Nous Research
Перевод и редакционная адаптация: ClawCases.
>Ресурсы
>Похожие юзкейсы
Арбитр разрешения конфликтов слияния агентов
Разрешает конфликт слияния Git между ветками двух агентов в качестве беспристрастной третьей стороны: нейтральный арбитр, который принимает обе версии изменений и указанные намерения, после чего формирует итоговый результат слияния, не перезаписывая ни одну из сторон.
Автономное управление проектами с помощью подагентов
Координация проектов автономно: главный агент делегирует работу подагентам-менеджерам проектов, которые отслеживают задачи в общем файле STATE.yaml, обновляют его по мере выполнения, параллельно берутся за неблокируемые задачи и сохраняют всё состояние задач в файлах с контролем версий.
Специализированная команда из нескольких агентов (режим одиночного основателя)
Настроить несколько агентов OpenClaw в виде скоординированной команды, каждый из которых специализируется на своей области, обменивается данными через общую память и управляется через Telegram.