Исследуйте кодовую базу в виде интерактивного графа знаний с помощью GitNexus

Индексируйте любую кодовую базу в граф знаний и предоставляйте интерактивный веб-интерфейс для просмотра символов, цепочек вызовов, кластеров и потоков выполнения; доступ через Cloudflare обеспечивает удалённый доступ.

Hermes Скопировали: 0
1 ресурс

Что понадобится

  • Для работы 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 между ветками двух агентов в качестве беспристрастной третьей стороны: нейтральный арбитр, который принимает обе версии изменений и указанные намерения, после чего формирует итоговый результат слияния, не перезаписывая ни одну из сторон.

Hermes Средний
Автоматизация Разработка

Автономное управление проектами с помощью подагентов

Координация проектов автономно: главный агент делегирует работу подагентам-менеджерам проектов, которые отслеживают задачи в общем файле STATE.yaml, обновляют его по мере выполнения, параллельно берутся за неблокируемые задачи и сохраняют всё состояние задач в файлах с контролем версий.

OpenClaw Средний
Автоматизация Общение

Специализированная команда из нескольких агентов (режим одиночного основателя)

Настроить несколько агентов OpenClaw в виде скоординированной команды, каждый из которых специализируется на своей области, обменивается данными через общую память и управляется через Telegram.

OpenClaw Продвинутый