tokensave

официальный

Увеличьте мощность вашего агента с помощью семантического анализа кода и сэкономьте 💰 в процессе!

Что можно делать с Tokensave MCP?

  • Семантический поиск кода — Ищите код по смыслу, а не только по тексту: запросите tokensave_search для «аутентификации» и получите login, validateToken и AuthService одним вызовом.
  • Анализ влияния — Проследите tokensave_callers и tokensave_callees, чтобы точно увидеть, что сломается перед изменением любого символа.
  • Построение контекста — Используйте tokensave_context для получения точек входа, связанных символов и фрагментов кода одним вызовом инструмента вместо сканирования файлов.
  • Запросы между ветками — Сравнивайте графы кода между ветками с помощью tokensave_branch_diff или ищите символы в другой ветке через tokensave_branch_search без переключения рабочих копий.
  • Память сессии — Сохраняйте проектные решения с помощью tokensave_record_decision и вспоминайте их позже через tokensave_session_recall, чтобы архитектурные выборы не объяснялись заново.
  • Атомарные правки — Применяйте tokensave_str_replace с уникальными якорями или AST-переписывания без рисков регулярных выражений и проблем с экранированием в оболочке, с автоматической переиндексацией после записи.

Документация

MCP Toplist

TokenSave

Семантический интеллект кода для ИИ-агентов программирования

Меньше токенов • Меньше вызовов инструментов • 100% локально

GitHub stars crates.io License: MIT Rust Built with AI — part of Enzo Lombardi's AI portfolio

macOS Linux Windows Hypercommit Listed in the Lulu MCP marketplace


Зачем нужен tokensave?

ИИ-агенты программирования тратят токены на исследование кодовых баз. Каждый grep, glob и чтение файла стоят денег. При выполнении сложных задач агенты порождают несколько субагентов Explore, которые сканируют сотни файлов только для того, чтобы построить контекст.

tokensave предоставляет агентам предварительно индексированный семантический граф знаний. Вместо сканирования файлов агент запрашивает граф и получает мгновенные структурированные ответы — нужные символы, их связи и исходный код — одним вызовом.

Как это работает

┌──────────────────────────────────────────────────────────────┐
│  AI Coding Agent (Claude Code, Codex, Gemini, Cursor, ...)   │
│                                                              │
│  "Implement user authentication"                             │
│        │                                                     │
│        ▼                                                     │
│  ┌─────────────────┐       ┌─────────────────┐               │
│  │  Sub-agent      │ ───── │  Sub-agent      │               │
│  └────────┬────────┘       └─────────┬───────┘               │
└───────────┼──────────────────────────┼───────────────────────┘
            │                          │
            ▼                          ▼
┌──────────────────────────────────────────────────────────────┐
│  tokensave MCP Server                                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐           │
│  │   Search    │  │   Callers   │  │   Context   │           │
│  │   "auth"    │  │  "login()"  │  │   for task  │           │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘           │
│         └────────────────┼────────────────┘                  │
│                          ▼                                   │
│              ┌───────────────────────┐                       │
│              │   libSQL Graph DB     │                       │
│              │   • Instant lookups   │                       │
│              │   • FTS5 search       │                       │
│              └───────────────────────┘                       │
└──────────────────────────────────────────────────────────────┘

Без tokensave: Агенты используют grep, glob и Read для сканирования файлов — множество вызовов API, высокий расход токенов.

С tokensave: Агенты запрашивают граф через MCP-инструменты — мгновенные результаты, локальная обработка, меньше токенов.


Ключевые возможности

Умное построение контекстаСемантический поискАнализ влияния
Один вызов инструмента возвращает всё, что нужно агенту: точки входа, связанные символы и фрагменты кода.Находите код по смыслу, а не только по тексту. Ищите "authentication" и находите login, validateToken, AuthService.Точно знайте, что сломается до того, как вы это измените. Прослеживайте вызывающие, вызываемые функции и полный радиус влияния любого символа.
80+ MCP-инструментов50+ языков12+ интеграций с агентами
От обхода графа вызовов до обнаружения мёртвого кода, примитивов атомарного редактирования, метрик здоровья кода, сопоставления тестов и анализа сложности.Rust, Go, Java, Python, TypeScript, C, C++, Swift, Svelte, Astro и ещё 43, включая шейдеры WGSL/HLSL/Metal, CUDA/HIP и Markdown. Три уровня (lite/medium/full) управляют размером бинарника.Claude Code, Codex CLI, Gemini CLI, Qwen Code, Kiro, Cursor, OpenCode, Copilot, Cline, Roo Code, Zed, Antigravity, Kilo CLI, Kimi CLI, Mistral Vibe, Grok Build, Factory Droid, OMP, Pi, Plank.
Мультиветочная индексация (по желанию)100% локальноВсегда актуально
Опциональные базы данных для каждой ветки. Кросс-веточный diff и поиск без переключения вашего checkout.Никакие данные не покидают вашу машину. Никаких ключей API. Никаких внешних сервисов. Всё работает на локальной базе данных libSQL.Проверка устаревания по требованию при каждом MCP-вызове (кулдаун 30 секунд) плюс синхронизация catch-up при подключении сервера. Мультиагентная работа предполагает использование git worktrees — каждый агент получает свой checkout, а расхождения индексов объединяются через git, а не через файловый наблюдатель.
Изоляция извлечения в подпроцессахАналитика здоровья кодаПримитивы атомарного редактирования
Нативный сбой в любой tree-sitter грамматике (abort, segfault и т.п.) убивает только воркер; пул перезапускает его, и синхронизация продолжается. Синхронизация никогда не умирает из-за повреждённого файла.Композитный показатель здоровья (0-10000), коэффициент Джини, глубина файлового DAG, матрица структуры дизайна, взвешенные по риску пробелы в тестах и дельты сессий.Редактируйте файлы без опасностей regex или shell-кавычек: уникальный якорь str_replace, атомарная множественная замена, AST-переписывание, вставка с якорем. Автоматическая переиндексация после записи.

Быстрый старт

1. Установка

Homebrew (macOS):

brew install aovestdipaperino/tap/tokensave

Scoop (Windows):

scoop bucket add tokensave https://github.com/aovestdipaperino/scoop-bucket
scoop install tokensave

Cargo / cargo-binstall (любая платформа):

# Fast install prebuilt binary without compiling:
cargo binstall tokensave

# Or compile from source:
cargo install tokensave                          # full (50+ languages, default)
cargo install tokensave --features medium        # medium tier
cargo install tokensave --no-default-features    # lite (smallest binary)

Готовые бинарники (Linux, Windows, macOS):

Скачайте с последнего релиза и поместите бинарник в ваш PATH.

ПлатформаАрхив
macOS (Apple Silicon)tokensave-vX.Y.Z-aarch64-macos.tar.gz
Linux (x86_64)tokensave-vX.Y.Z-x86_64-linux.tar.gz
Linux (ARM64)tokensave-vX.Y.Z-aarch64-linux.tar.gz
Windows (x86_64)tokensave-vX.Y.Z-x86_64-windows.zip

2. Настройте вашего агента

tokensave install                         # auto-detects installed agents
tokensave install --agent antigravity     # Google Antigravity (formerly Windsurf)
tokensave install --agent auggie          # AugmentCode
tokensave install --agent claude          # Claude Code
tokensave install --agent cline           # Cline
tokensave install --agent codex           # OpenAI Codex CLI
tokensave install --agent copilot         # GitHub Copilot
tokensave install --agent cursor          # Cursor
tokensave install --agent droid           # Factory Droid
tokensave install --agent gemini          # Gemini CLI
tokensave install --agent kilo            # Kilo CLI
tokensave install --agent kiro            # AWS Kiro
tokensave install --agent kimi            # Moonshot Kimi CLI
tokensave install --agent omp             # Oh My Pi (OMP)
tokensave install --agent opencode        # OpenCode
tokensave install --agent pi              # Pi (pi.dev)
tokensave install --agent plank           # Plank (macOS only)
tokensave install --agent qwen            # Qwen Code
tokensave install --agent roo-code        # Roo Code
tokensave install --agent vibe            # Mistral Vibe
tokensave install --agent zed             # Zed
tokensave install --agent grok            # Grok Build (xAI)
tokensave install --git-hook yes           # auto-install the global post-commit and post-checkout hooks (no prompt)
tokensave install --git-hook no            # skip the post-commit and post-checkout hooks (no prompt)
tokensave githooks                         # show which global git hooks tokensave owns
tokensave githooks off                     # remove them, leaving any hook content you wrote

Каждый агент получает свой MCP-сервер, зарегистрированный в нативном формате конфигурации. Claude Code дополнительно получает PreToolUse хук (блокирует расточительных Explore-агентов), UserPromptSubmit хук, Stop хук, правила подсказок в CLAUDE.md и автоматически разрешённые права на инструменты. Kiro получает глобальную MCP-конфигурацию, tokensave.md управление, загружаемое как ресурс, и управляемый tokensave агент по умолчанию с разрешительным встроенным/токенсейв-одобрением инструментов, хуками защиты делегирования и пост-записной синхронизацией; управляемые пользователем агенты Kiro сохраняются.

Глобальные установки OMP нацелены на профиль, сообщаемый голым omp config path, записывая <resolved-agent-dir>/mcp.json и <resolved-agent-dir>/rules/tokensave.md. Экспортируйте OMP_PROFILE или совместимый с OMP PI_PROFILE при установке в именованный профиль; резолвер OMP также учитывает PI_CONFIG_DIR и PI_CODING_AGENT_DIR. Tokensave доверяет нативному резолверу, а не дублирует логику профилей OMP. Tokensave устанавливает MCP и рекомендательные правила для OMP; он не устанавливает принудительное применение хуков OMP.

Все изменения идемпотентны — безопасно запускать снова после обновления. После настройки агента вам будет предложено установить глобальные git хуки post-commit и post-checkout. tokensave uninstall удаляет эти хуки вместе с интеграциями агентов; передайте --keep-git-hooks, чтобы оставить их, или управляйте ими отдельно с помощью tokensave githooks.

Установка в рамках проекта

По умолчанию tokensave install регистрирует MCP-сервер в вашей глобальной конфигурации агента (например, ~/.claude.json). Чтобы зарегистрировать tokensave только для текущего проекта, добавьте --local:

tokensave install --local --agent claude
tokensave install --local --agent omp

Это записывает конфигурацию в рамках проекта, которую можно закоммитить и поделиться с командой. Для Claude это ./.mcp.json, ./.claude/settings.json и ./CLAUDE.md; OMP использует ./.omp/mcp.json и ./.omp/rules/tokensave.md без вызова OMP CLI. Поддерживаемые агенты: claude, cursor, droid, gemini, zed, opencode, roo-code, kiro, auggie, omp, plank (каждый пишет свой файл проекта, например, .cursor/mcp.json, .factory/mcp.json, .gemini/settings.json, .zed/settings.json, opencode.json, .roo/mcp.json, .kiro/settings/mcp.json, .augment/settings.json, .omp/mcp.json, .mcp.json для plank). У других агентов нет конфигурации в рамках проекта, и они сообщают об ошибке с --local.

Удалите установку в рамках проекта с помощью tokensave uninstall --local.

3. Индексируйте ваш проект

cd /path/to/your/project
tokensave init

Это создаёт каталог .tokensave/ с базой данных графа знаний. Инициализация и синхронизация — отдельные команды: init — одноразовое согласие для каждого проекта, а sync обновляет только те проекты, которые уже были инициализированы. Это предотвращает создание глобальными git-хуками баз данных в репозиториях, которые вы не собирались индексировать. После init используйте tokensave sync для инкрементального обновления — переиндексируются только изменённые файлы.

Что установка записывает для Claude Code

MCP-сервер

{
  "mcpServers": {
    "tokensave": {
      "command": "/path/to/tokensave",
      "args": ["serve"]
    }
  }
}

PreToolUse хук

Хук запускает tokensave hook-pre-tool-use — нативную Rust-команду (не требует bash или jq). Он перехватывает вызовы инструментов Agent, Grep, Glob и Bash: Explore-агенты блокируются полностью, поиски в форме символов grep/rg/ag (простые идентификаторы, альтернации, имена в \b) перенаправляются на соответствующий MCP-инструмент tokensave, а поиски в форме путей (Glob, find -name, fd --extension) по расширениям кода перенаправляются на tokensave_files. Regex-паттерны, git grep, конвейерные команды, не-кодовые расширения, корни поиска вне индекса и предикаты find, которые меняют поведение команды (-exec, -delete, -mtime), проходят без изменений; установите TOKENSAVE_DISABLE_GREP_HOOK=1, чтобы отказаться для конкретной оболочки.

Фильтры читаются от наиболее специфичного к наименее: явный type является авторитетным, затем явный файловый glob, затем путь поиска. Поиск документации, такой как path: "." с glob: "**/*.md", поэтому проходит, а не обрабатывается как поиск кода по широкому пути, в то время как glob только для кода (**/*.rs) всё равно перенаправляется даже под не-кодовым путём. Смешанные glob (**/*.{rs,md}) проходят, так как они могут возвращать документацию.

Headless / субагентная диспетчеризация (claude -p). Дочерние процессы, запущенные оркестрирующей сессией, наследуют её ~/.claude/settings.json, включая этот хук. Чтобы позволить дочернему процессу выполнять сырые поиски, установите TOKENSAVE_DISABLE_GREP_HOOK=1 в окружении дочернего процесса — нативный бинарник учитывает его и пропускает все пути (Grep, Glob, Bash, Agent), так что нет необходимости в грубом --settings '{"hooks": {}}', который снимает все хуки. Защита не имеет состояния: она никогда не обращается к истории цитирования, поэтому только перенаправляет поиски в форме символов, описанные выше, и направляет нетипизированное исследовательское разветвление; обычные команды не затрагиваются, независимо от того, интерактивна сессия или headless.

Правила CLAUDE.md

Добавляет инструкции в ~/.claude/CLAUDE.md, которые говорят Claude использовать инструменты tokensave перед обращением к Explore-агентам или сырым чтениям файлов.


Устойчивая к сбоям синхронизация

Tree-sitter грамматики — это скомпилированный код на C/C++. Они иногда натыкаются на внутренние утверждения или иным образом завершают процесс путями, которые обработка паники в Rust не может перехватить. Начиная с v4.3.0, каждый файл парсится внутри короткоживущего воркер-подпроцесса: если грамматика вызывает segfault, abort() или переполнение стека, умирает только воркер. Пул перезапускает его, проблемный файл логируется и пропускается, а sync продолжает работу.

Воркер — это скрытая подкоманда extract-worker, аутентифицированная против родителя через 256-битный токен на каждый запуск, требуемый и как переменная окружения TOKENSAVE_WORKER_TOKEN, и как первые 32 байта, полученные на stdin. Прямой вызов пользователями не удастся. По умолчанию available_parallelism() воркеров; откажитесь с помощью TOKENSAVE_DISABLE_SUBPROCESS=1.

Примитивы редактирования (tokensave_str_replace, tokensave_insert_at и т.д.) по-прежнему работают в процессе: они нацелены на один файл за раз, где накладные расходы подпроцесса доминировали бы, и сбой экстрактора там немедленно виден агенту.


Мультиветочная индексация (опционально)

tokensave может опционально поддерживать отдельный граф кода для каждой git-ветки. При включении переключение веток никогда не даёт устаревших результатов и не переиндексирует файлы, которые вы уже парсили на другой ветке. Мультиветочное отслеживание — по желанию: без него tokensave использует одну базу данных для всех веток.

Как это работает

Когда вы отслеживаете ветку, tokensave копирует ближайшую родительскую БД и синхронизирует только файлы, которые отличаются. Это означает, что отслеживание фиче-ветки от main почти мгновенно — парсятся только изменённые вами файлы.

CLI-команды

tokensave branch add              # track the current branch
tokensave branch list             # see tracked branches and DB sizes
tokensave branch remove <name>    # stop tracking a branch
tokensave branch removeall        # remove all tracked branches except default
tokensave branch gc               # clean up branches deleted from git

Кросс-веточные MCP-инструменты

Три MCP-инструмента позволяют выполнять кросс-веточные запросы без переключения вашего checkout:

  • tokensave_branch_search — поиск символов в графе другой ветки
  • tokensave_branch_diff — сравнение графов кода между двумя ветками: добавленные, удалённые и изменённые символы (отличается сигнатура). Поддерживает фильтры по файлам и типам.
  • tokensave_branch_list — список отслеживаемых веток с размерами БД, родительской веткой и временем синхронизации

Откат ветки

Когда MCP-сервер не может найти базу данных для текущей ветки, он обслуживает из БД ближайшей родительской ветки и включает предупреждение в каждый ответ инструмента, предлагая запустить tokensave branch add.

Автоматическое отслеживание веток (v7.3.0)

Как только мультиветочный режим загружен (первый ручной tokensave branch add создал метаданные веток), новые ветки могут отслеживаться автоматически вместо отката к родительской БД. Два независимых механизма покрывают это; проекты в режиме одной БД никогда не затрагиваются, и ни один механизм никогда не касается базы данных ветки по умолчанию. Git-хук (при переключении ветки). Хук post-checkout, который настраивает tokensave install, распознает переключение ветки (в отличие от переключения файла) и запускает tokensave branch add в фоновом режиме. Эта команда ничего не делает, если ветка уже отслеживается или является веткой по умолчанию, поэтому обычное переключение между известными ветками ничего не стоит. Первоначальное извлечение свежего git clone и новой git worktree add также является переключением ветки, и оно может оказаться на ветке, не являющейся веткой по умолчанию (git clone -b feature, git worktree add -b feature); в этом случае хук запускает tokensave init сначала, а tokensave branch add после него, в таком порядке. Хук, написанный более ранней версией, сохраняет тело, с которым он был установлен — установщик никогда не перезаписывает существующий — поэтому на таких установках свежее рабочее дерево все еще требует auto_track ниже или ручного tokensave branch add.

Авто-отслеживание при открытии (по желанию). Когда запускается TokenSave::open — команда CLI или запуск MCP-сервера — и активная ветка не отслеживается, tokensave может отследить ее на месте, скопировав БД ближайшего отслеживаемого предка и записав ее в метаданные ветки. Это управляется полем конфигурации auto_track (по умолчанию false) или переменной окружения TOKENSAVE_AUTO_TRACK, которая переопределяет конфигурацию для каждого запуска (любое значение включает ее, кроме 0, false, no, off или пустого). Копия — это та же почти мгновенная копия БД предка, которую выполняет ручной branch add; никакая синхронизация в этот момент не запускается — хук post-commit поддерживает новую БД ветки свежей по мере коммитов, или запустите tokensave sync для немедленного обновления. Авто-отслеживание строго best-effort: любая ошибка сообщается как предупреждение, и open() продолжает с обычным откатом к предку, так что это никогда не сломает вызов инструмента.

Короче: с установленным хуком переключение на новую фича-ветку — включая ветку, с которой начинается свежий клон или рабочее дерево — прозрачно дает ей собственный граф для ветки; с включенным auto_track даже ветка, созданная вне переключения, подхватывается при первом открытии проекта tokensave на ней.

Полное руководство см. в docs/BRANCHING-USER-GUIDE.md.


Память между сессиями

Три MCP-инструмента сохраняют решения и контекст области кода между сессиями, хранящиеся в per-project .tokensave/tokensave.db.

ИнструментНазначение
tokensave_record_decisionСохранить решение по дизайну/архитектуре с необязательным обоснованием, файлами и тегами
tokensave_record_code_areaОтметить путь, в котором агент работал (счетчик касаний + last_touched_at)
tokensave_session_recallFTS5-запрос по сохраненным решениям; сочетайте с двумя инструментами записи

Используйте их, чтобы агенту не приходилось заново объяснять архитектурные выборы от сессии к сессии.


Реестр экономии

Каждый вызов MCP записывает append-only строку в ~/.tokensave/global.db (таблица savings_ledger). Проверяйте с помощью tokensave gain:

tokensave gain                    # current project, last 30 days
tokensave gain --all              # all projects
tokensave gain --history --range 7d
tokensave gain --json

Долларовые оценки используют существующий модуль ценообразования (цены ввода Sonnet, обновляются ежедневно через LiteLLM).

tokensave gain history output


Воспроизводимый бенчмарк

tokensave bench запускает фиксированный набор запросов через tokensave_context и сообщает экономию при поиске по сравнению с базовым уровнем полного файла (отражает методологию CCE):

tokensave bench                                    # ships with 10 default queries
tokensave bench --queries my-queries.toml --json
tokensave bench --max-nodes 5

tokensave bench output

Измерено на этом репозитории (сам tokensave) с использованием поставляемого общего набора запросов:

#ЗапросБазовый уровеньКонтекстЭкономияФайлыУзлы
1Как загружается конфигурация при запуске?45.3k45499%45
2Где разбираются и отправляются аргументы командной строки?94840258%33
3Как организована основная точка входа?6.1k25196%38
4Как определяются, оборачиваются и распространяются ошибки?3.5k81977%23
5Где выводится логирование или диагностический вывод?8.6k51494%614
6Как организованы тесты и какой тестовый фреймворк используется?3.5k81877%23
7Как данные сохраняются на диск или в базу данных?11.9k33097%36
8Как порождаются асинхронные задачи или фоновая работа?29.4k36499%23
9Как сборка связывает зависимости и инициализирует состояние?10.9k1.4k88%45
10Как предоставляются публичные API-поверхности (HTTP-эндпоинты, экспорт библиотек или команды CLI)?22.5k23599%45

Итого: 88% средняя экономия при поиске (142.8k → 5.5k токенов по 10 запросам).

Набор запросов по умолчанию нацелен на паттерны, присутствующие в большинстве кодовых баз приложений (CLI, демоны, сервисы). Запустите его на своем проекте с помощью tokensave bench, чтобы увидеть свои цифры, или напишите собственный файл запросов (--queries my.toml) для более точного поиска.

Бенчмарк Criterion на больших реальных репозиториях

benches/large_repos.rs — это criterion микро-бенчмарк, который проверяет MCP-инструменты end-to-end на четырех крупных open-source кодовых базах, закрепленных на постоянных рефах. Каждый инструмент управляется как минимум 5 запросами с аргументами (id узлов, полные имена, файловые глобы, …), взятыми из индексированного графа один раз на репозиторий, так что тайминги воспроизводимы между запусками.

Репозитории и закрепленные рефы (определены в benches/repos.rs):

РепозиторийURLРеф
polkadot-sdkhttps://github.com/paritytech/polkadot-sdkpolkadot-stable2412
emacshttps://github.com/emacs-mirror/emacsemacs-30.1
scipyhttps://github.com/scipy/scipyv1.14.1
nodehttps://github.com/nodejs/nodev22.11.0

Каждый репозиторий shallow-клонируется (git init + git fetch --progress --depth 1 origin <ref> + checkout FETCH_HEAD) при первом использовании и кэшируется локально; последующие запуски используют существующий checkout. Вывод Git транслируется в терминал, чтобы многогигабайтная загрузка показывала прогресс в реальном времени.

Покрытые инструменты (5 запросов каждый). Инструменты чтения — search, context, callers, callees, node, by_qualified_name, signature, impact, body, files, complexity, doc_coverage, largest, hotspots, god_class, module_api, derives, dead_code, rank, coupling, circular. Инструменты записи — str_replace, multi_str_replace, insert_at и (если ast-grep включен на PATH) ast_grep_rewrite.

Принудительная синхронизация при каждом запуске. Перед любым бенчмарком харнесс выполняет эквивалент tokensave sync --force на каждом репозитории (index_all() независимо от свежести .tokensave/), чтобы тайминги всегда отражали закрепленный исходник.

Бенчмарки записи и очистка. Инструменты записи изменяют файлы. Чтобы сохранить предусловие «совпадение должно быть уникальным», харнесс использует iter_batched criterion — небольшой временный файл под <repo>/.tokensave-bench-scratch/ перезаписывается известным содержимым перед каждой замеряемой итерацией, затем инструмент редактирования запускается на нем. После завершения всех бенчмарков харнесс запускает git stash --include-untracked && git stash drop внутри каждого подготовленного репозитория, чтобы рабочее дерево вернулось к закрепленному рефу.

Конфигурация Criterion. Бенчмарк переопределяет стандартные настройки criterion на sample_size = 10 и measurement_time = 30s (вместо стандартных 100 / 5s), что дает каждому замеру запроса ~30 секунд измерения — достаточно, чтобы медленные инструменты, такие как tokensave_context на polkadot-sdk, давали стабильные числа.

Запуск:

# Required: a writable cache directory for the cloned repos + their indexes.

<p align="center">
  <a href="https://ai.enzolombardi.net/"><img src="https://img.shields.io/badge/built%20with-AI-D97757?style=flat-square&labelColor=101010&logo=anthropic&logoColor=white" alt="Built with AI — part of Enzo Lombardi's AI portfolio"></a>
</p>

# Expect several GB of disk and a long first run (shallow clone + full index of each repo).
export TOKENSAVE_BENCH_REPOS_DIR=~/tokensave-bench-cache

cargo bench --bench large_repos

Если TOKENSAVE_BENCH_REPOS_DIR не установлен, бенчмарк выводит уведомление и регистрирует ноль бенчмарков (так что cargo bench --all остается дешевым на машинах контрибьюторов).

Конфигурация (все опционально, через окружение):

ПеременнаяЭффект
TOKENSAVE_BENCH_REPOS_DIRОбязательно. Корневой каталог, куда каждый репозиторий клонируется в $DIR/<repo-name>/.
TOKENSAVE_BENCH_REPOSПодмножество имен репозиториев через запятую для бенчмарка, например TOKENSAVE_BENCH_REPOS=emacs,scipy. По умолчанию все четыре.
TOKENSAVE_BENCH_SKIP_CLONEЕсли установлено, бенчмарк быстро завершается с ошибкой для любого репозитория, не находящегося на закрепленном рефе, вместо загрузки. Полезно в CI / офлайн-запусках.

Фильтрация бенчмарков использует стандартный CLI criterion — например, только инструмент search на scipy:

cargo bench --bench large_repos -- 'scipy/tokensave_search'

Отчеты (HTML + сырые выборки) попадают в target/criterion/.

Чтобы изменить закрепленные рефы (например, на более новую версию или конкретный SHA), отредактируйте REPOS в benches/repos.rs и удалите соответствующий маркер $TOKENSAVE_BENCH_REPOS_DIR/<repo>/.bench-ref, чтобы следующий запуск перезагрузил. Если вы пропустите очистку после запуска (например, вы Ctrl-C посреди бенчмарка), запуск git stash --include-untracked && git stash drop внутри каждого каталога репозитория восстановит его вручную.

MCP test-matrix probe (scripts/mcp_probe)

scripts/mcp_probe/ — это Python-харнесс, который управляет tokensave serve через stdio против настраиваемого набора реальных репозиториев и проверяет каждый read-only MCP-инструмент с 5 вариантами запросов на язык, создавая таблицу статусов по инструментам / репозиториям. Тот же харнесс служит двум целям:

  • Регрессионный прогон. Новая поддержка языка, новый инструмент или рефакторинг — перезапустите матрицу, и любая ячейка, которая заново выдает ошибку, таймаут или пустые результаты, выделяется как 🚩.
  • Perf-зонд. Тайминги каждого вызова логируются в TSV; тот же фиксированный корпус репозиториев служит грубым сравнением между версиями. Текущий цикл бага tokensave_inheritance_depth был найден этим харнессом, когда один инструмент на polkadot-sdk превысил таймаут >60 с.

Структураprobe.py — драйвер (id-matched JSON-RPC, чтобы медленный инструмент не отравлял последующие вызовы), isolated.py перезапускает один инструмент с новым сервером на каждый вызов (обходит очередь сервера), build_matrix.py читает TSV и генерирует markdown, tools/<lang>.py модули добавляют наборы запросов на язык (Rust включен; добавьте Python/Go/…, добавив новый модуль), repos.toml перечисляет целевые репозитории (переопределяется через $TOKENSAVE_PROBE_REPOS).

Быстрый запуск:

cargo build --release --bin tokensave
python3 scripts/mcp_probe/probe.py
python3 scripts/mcp_probe/build_matrix.py > matrix.md

Ячейки вывода — ✓ 5/5 (чисто), 🐛 e/N (ошибки), ⏱ N/N (таймауты), ∅ E/N (пусто), 🐢 ok/slow (>10 с вызовы). Любая ячейка с ошибкой или таймаутом получает 🚩 в крайней правой колонке. Детали каждого вызова с первыми 100 символами каждой ошибки попадают в TSV-лог для последующего анализа.

Отличие от бенчмарка criterion выше: criterion измеряет задержку на итерацию для фокусного набора инструментов на закрепленных рефах и создает статистические отчеты в target/criterion/; mcp_probe проверяет каждый инструмент с более широким набором запросов на любых репозиториях, на которые вы его нацеливаете, оптимизируя широту покрытия, а не точность измерения.


80+ MCP-инструментов

Сервер предоставляет более 80 инструментов (на один меньше, когда опциональный бинарник ast-grep отсутствует на PATH); таблицы ниже группируют наиболее часто используемые по категориям. Большинство — read-only, безопасны для параллельного вызова и аннотированы readOnlyHint. Примитивы редактирования ограничены отдельными файлами и переиндексируются на месте; инструменты записи базовой линии сессии и памяти также изменяют локальное состояние .tokensave и аннотированы как не-read-only. Три основных инструмента (tokensave_context, tokensave_search, tokensave_status) помечены anthropic/alwaysLoad, чтобы обходить round-trip поиска инструментов клиента.

Запрос другого инициализированного проекта

Семантические инструменты чтения могут запрашивать явно выбранный локальный граф без перезапуска MCP-сервера:

{
  "query": "screenGate",
  "graph_root": "/absolute/path/to/typewhisper"
}

Выбранные результаты включают каноническое происхождение корня/ветки. ID узлов пространственно именованы для этого графа, и соответствующие селекторы должны повторяться в последующих вызовах. Например, последующий вызов к запросу с выбором ветки включает оба значения:

{
  "node_id": "graph:<fingerprint>:function:<raw-id>",
  "graph_root": "/absolute/path/to/typewhisper",
  "graph_branch": "feature/auth"
}

graph_root должен быть точным абсолютным корнем уже инициализированного проекта. graph_branch опционален и, если указан, должен называть отслеживаемую ветку. Выбранные открытия — read-only: они никогда не инициализируют, не синхронизируют, не мигрируют, не авто-отслеживают и не записывают данные графа/исходников. Они также не вносят вклад в учет экономии. Вызовы без селекторов ведут себя точно так же, как раньше. graph_root полезен только в том случае, если вы знаете, что другой проект существует, поэтому сервер сообщает вам об этом: инициализированные проекты, расположенные непосредственно рядом с обслуживаемым корнем, перечислены в MCP instructions, в tokensave_status и в пустых результатах tokensave_search / tokensave_context — в тот момент, когда сессия в противном случае заключила бы, что символ не существует, а не заглянула бы по соседству (#375). Предлагаются только непосредственные соседи, не более пяти, и ничего не открывается и не индексируется от их имени; запрос к одному из них по-прежнему требует явного graph_root.

Селекторы намеренно недоступны для инструментов, которые записывают данные, выполняют внешние команды или зависят от текущего checkout: примитивы редактирования, инструменты VCS и веток, диагностика и выполнение тестов, интроспекция зависимостей и среды выполнения, инструменты рабочего процесса и памяти сессии, инструмент постоянного кэша (tokensave_redundancy) и администрирование сервера. Эти инструменты отклоняют селектор вместо того, чтобы молча его игнорировать.

Обнаружение

ИнструментНазначение
tokensave_contextПолучить релевантный контекст кода для задачи — точки входа, связанные символы, фрагменты кода
tokensave_searchНайти символы по имени (функции, классы, типы)
tokensave_nodeПолучить детали + исходный код для конкретного символа
tokensave_filesСписок индексированных файлов проекта (исходники и отслеживаемые артефакты) с фильтрацией
tokensave_module_apiПубличный API-интерфейс файла или каталога
tokensave_similarНайти символы с похожими именами
tokensave_annotationsИнтроспекция атрибутов/аннотаций/декораторов — гистограмма всех аннотаций или постраничные списки с фильтрами по целям
tokensave_docСопутствующая документация Markdown для исходного файла — содержимое документа, файлы, которые он покрывает, и сигнал устаревания
tokensave_dependenciesИнтроспекция манифестов пакетов в 17 экосистемах — сводка по рабочей области, поиск по пакету, поверхность лицензий, расхождение версий
tokensave_statusСтатус индекса, статистика, сохраненные токены

Не-кодовые артефакты

tokensave_files охватывает больше, чем исходный код. Файлы, расширение которых указано в artifact_extensions (.feature, .json, .yaml, .yml, .sql, .toml, .proto, .graphql, .md по умолчанию), отслеживаются по пути, так что такие вопросы, как «где находятся файлы .feature для потока входа?», получают ответ в виде графа, а не заблокированный find (#323). Они никогда не парсятся и не вносят символов; kind: "artifact" и kind: "code" фильтруют между двумя категориями, а анализы, означающие «код», исключают их. Расширение, уже обрабатываемое языковым экстрактором, игнорируется в этом списке, поэтому его нельзя использовать для остановки парсинга языка.

Список также определяет, внутрь чего может заглядывать литеральный поиск (#442). Литеральный (literal: true) поиск по tokensave_search читает байты, а не символы, поэтому ему не нужен парсер — но он перебирает индексированные файлы, поэтому может достичь только файла, для которого в индексе есть строка. Отслеживаемый шаблон .html или таблица стилей .css не имеет ни экстрактора, ни записи артефакта по умолчанию, поэтому их совпадения отсутствуют; добавьте расширение сюда и запустите tokensave sync -f, и его строки будут искаться как любые другие, с отчетом через enclosing: null, поскольку нет контекста символа. Литеральный ответ, который не смог достичь каждого отслеживаемого файла, сообщает об этом в блоке unscanned с указанием количества и расширений, так что частичный ответ никогда не выдается за полный.

Граф вызовов и влияние

ИнструментНазначение
tokensave_callersНайти, что вызывает функцию
tokensave_calleesНайти, что вызывает функция
tokensave_impactПосмотреть, на что повлияет изменение символа
tokensave_affectedНайти тестовые файлы, затронутые изменениями исходного кода
tokensave_rename_previewВсе ссылки на символ (предпросмотр влияния переименования)
tokensave_hotspotsНаиболее связанные символы (наибольшее количество вызовов)

Качество кода

ИнструментНазначение
tokensave_complexityРанжировать функции по цикломатической и когнитивной сложности, глубине вложенности, метрикам Холстеда, индексу поддерживаемости, CRAP и метрикам безопасности
tokensave_dead_codeНайти недостижимые символы (нет входящих ребер; символы, названные кандидатами на неоднозначность, исключаются)
tokensave_ambiguous_callsМеста вызовов, которые резолвер не смог привязать к одной цели, со всеми связанными кандидатами
tokensave_god_classНайти классы со слишком большим количеством членов
tokensave_couplingРанжировать файлы по fan-in/fan-out
tokensave_inheritance_depthНайти самые глубокие иерархии наследования
tokensave_circularОбнаружить циклические зависимости файлов
tokensave_importsИмпортные зависимости на уровне модулей, циклы и симуляция разрезания
tokensave_recursionОбнаружить рекурсивные/взаимно-рекурсивные циклы вызовов
tokensave_unused_importsИмпортные операторы, на которые никогда нет ссылок
tokensave_doc_coverageПубличные символы без документации
tokensave_simplify_scanАнализ качества измененных файлов (дублирования, мертвый код, сложность)

Аналитика здоровья кода

Пять инструментов выявляют сигналы структурного качества из существующего графа. Композитный балл использует геометрическое среднее по независимым измерениям, так что ни одно из них нельзя «накрутить».

ИнструментНазначение
tokensave_healthКомпозитный сигнал качества (0-10000) на основе ацикличности, глубины, равенства, избыточности и модульности
tokensave_giniКоэффициент неравенства Джини для любой метрики (сложность, строки, fan-in/out, члены) — находит «божественные файлы» и неравномерное распределение
tokensave_dependency_depthСамые длинные цепочки зависимостей на уровне файлов (левеляция Лакоса) с полной реконструкцией цепочек после разрыва циклов Тарьяна
tokensave_dsmМатрица структуры дизайна в форме stats, clusters или matrix — выявляет нарушения слоев и скрытую связанность
tokensave_test_riskРиск-взвешенный анализ пробелов в тестах, объединяющий сложность, fan-in, покрытие и 90-дневный git churn в единый балл

Сессии

Снимайте метрики здоровья в начале сессии ИИ-кодинга, затем сравнивайте в конце, чтобы увидеть, что улучшилось или ухудшилось.

ИнструментНазначение
tokensave_session_startСохранить текущие метрики здоровья как JSON-базовую линию для последующего сравнения
tokensave_session_endПересчитать и сравнить с базовой линией — дельты по измерениям, пройдено/не пройдено, автоматическая очистка

Примитивы редактирования

Четыре инструмента записи, позволяющие агентам изменять файлы без рисков regex или кавычек в shell. Каждый работает с одним файлом, привязан к якорю и запускает повторную индексацию на месте после записи, так что граф никогда не устаревает.

ИнструментНазначение
tokensave_str_replaceЗаменить уникальный old_str на new_str; завершается ошибкой при 0 или >1 совпадениях (защита от ошибок множественного редактирования)
tokensave_multi_str_replaceПрименить N замен (old, new) атомарно — транзакция «все или ничего»
tokensave_insert_atВставить содержимое до или после уникальной строки-якоря или номера строки
tokensave_ast_grep_rewriteСтруктурное переписывание кода через CLI ast-grep в режиме --rewrite

Git и рабочий процесс

ИнструментНазначение
tokensave_diff_contextСемантический контекст для измененных файлов — измененные символы, зависимости, затронутые тесты
tokensave_commit_contextСемантическая сводка незакоммиченных изменений для составления сообщения коммита
tokensave_pr_contextСемантический diff между git-ссылками для описаний pull request
tokensave_changelogСемантический diff между двумя git-ссылками
tokensave_test_mapСопоставление исходников и тестов на уровне символов с обнаружением непокрытых символов
tokensave_test_coverageСводка покрытия по файлам/символам/тестовым функциям с транзитивным расширением ребер вызовов

Система типов

ИнструментНазначение
tokensave_type_hierarchyРекурсивное дерево иерархии типов для трейтов, интерфейсов и классов
tokensave_rankРанжировать узлы по количеству связей (самый реализуемый интерфейс, самый расширяемый класс)
tokensave_distributionРазбивка видов узлов по файлу или каталогу
tokensave_largestРанжировать узлы по размеру — самые большие классы, самые длинные методы

Перенос

ИнструментНазначение
tokensave_port_statusСравнить символы между исходным/целевым каталогами для отслеживания прогресса переноса
tokensave_port_orderТопологическая сортировка символов для переноса — сначала листья, затем зависимые

Мульти-ветка

ИнструментНазначение
tokensave_branch_searchИскать символы в графе другой ветки
tokensave_branch_diffСравнить символы между ветками (добавлено/удалено/изменено)
tokensave_branch_listСписок отслеживаемых веток с размерами БД и временем синхронизации

MCP-ресурсы

Четыре ресурса доступны через resources/list и resources/read:

  • tokensave://status — статистика графа в формате JSON
  • tokensave://files — индексированное дерево файлов, сгруппированное по каталогам
  • tokensave://overview — сводка проекта с распределением языков и видов символов
  • tokensave://branches — отслеживаемые ветки с размерами БД и информацией о родителях

Отслеживание токенов

tokensave измеряет токены, которые он экономит при каждом вызове инструмента MCP. Каждый ответ инструмента включает строку tokensave_metrics: before=N after=M, показывающую, сколько токенов исходного файла было избегнуто этим конкретным вызовом.

Отключение отчетности. Строка метрик вместе с предложением в MCP instructions просит агента сообщать вам об экономии — что означает, что модель тратит выходные токены на описание экономии, которую tokensave сделал на входных токенах. Выходные токены — более дорогой вид, поэтому если ваш агент упоминает tokensave почти на каждом шаге, это повествование может свести на нет выигрыш (#356). Установите report_savings в false в .tokensave/config.json, или переменную окружения TOKENSAVE_REPORT_SAVINGS, чтобы переопределить для конкретного запуска (любое значение включает ее, кроме 0, false, no, off или пустого). И строка метрик, и инструкция исчезают; tokensave install также перестает записывать правило отчетности в файлы подсказок агента. Измерение не затрагивается в любом случае — каждый вызов по-прежнему попадает в реестр экономии, поэтому tokensave gain, tokensave list, status и monitor продолжают сообщать точно так же, как раньше. По умолчанию остается true.

Наблюдаемость затрат

tokensave cost                     # 7-day cost summary (default)
tokensave cost today               # today only
tokensave cost --by-model          # breakdown by Claude model
tokensave cost --by-task           # breakdown by task category (coding, debugging, exploration, ...)
tokensave cost --export json       # JSON export to stdout
tokensave cost --export csv        # CSV export to stdout

Разбирает транскрипты сессий Claude Code (~/.claude/projects/**/*.jsonl), классифицирует каждый вызов API в одну из 13 категорий задач, вычисляет стоимость в долларах с использованием цен моделей и сохраняет результаты в ~/.tokensave/global.db для быстрых агрегированных запросов. Цены обновляются из LiteLLM каждые 24 часа и при отсутствии сети возвращаются к встроенной таблице.

Заголовок tokensave status включает строку затрат, показывающую сегодняшние расходы, итог за 7 дней и коэффициент эффективности (сохраненные токены / общее количество токенов). TUI tokensave monitor показывает живую панель затрат рядом с лентой экономии. В конце каждой сессии Claude Code обработчик hook_stop выводит однострочную квитанцию в терминал.

Категории классификации задач: Кодинг, Отладка, Разработка функций, Рефакторинг, Тестирование, Исследование, Планирование, Делегирование, Git-операции, Сборка/Развертывание, Мозговой штурм, Разговор, Общее. Классификация детерминирована (сопоставление шаблонов по именам инструментов и командам Bash), не требует вызовов LLM и адаптирована из AgentSeal/codeburn.

Живой монитор

tokensave monitor

Глобальный TUI, показывающий вызовы инструментов MCP из всех проектов в реальном времени через общий кольцевой буфер с отображением в память по адресу ~/.tokensave/monitor.mmap. Каждая запись показывает имя проекта, имя инструмента и дельту токенов. Панель затрат вверху показывает сегодняшние расходы, экономию, эффективность и лучшую модель (обновляется каждые 30 секунд).

tokensave monitor TUI

Диагностика памяти

tokensave memory [--clean]

Отчёт об использовании памяти на уровне всей машины для каждого процесса tokensave (MCP-серверы, синхронизации, запуски индексации) через общую таблицу с отображением в память по адресу ~/.tokensave/memory.mmap. Каждый экземпляр самостоятельно снимает свои показатели RSS по мере возможности при запуске, при каждом вызове инструмента MCP, а также вокруг фаз синхронизации и разрешения зависимостей, поэтому отчёт показывает текущее и пиковое значение RSS с фазой, в которой был достигнут пик — данные, необходимые для атрибуции высокого потребления памяти (см. #253). Строки помечаются как alive, dead (процесс, убитый OOM-killer, оставляет свой пик/фазу как судебно-медицинскую запись) или orphan (всё ещё работает, но переподчинён процессу init). --clean очищает мёртвые слоты.

PEAK PHASE указывает на самый высокий сэмпл, поэтому его точность ограничена частотой сэмплирования. Инкрементальная синхронизация записывает по порядку: sync:extract, sync:resolve:load_nodes, sync:resolve:build_caches, sync:resolve:refs, sync:variants, sync:done. Полная индексация записывает index:extract, index:resolve:build_caches, index:resolve:refs, index:resolve:done, index:insert, index:done.

Каждый сэмпл записывается после работы, которую он называет. Раньше они записывались до неё, поэтому каждый сэмпл сообщал RSS предыдущего шага под ярлыком следующего шага — что приписывало 73 МиБ загрузке узлов, хотя на самом деле это относилось к загрузке неразрешённых ссылок, шагу, для которого вообще не было сэмпла, и направляло расследование памяти не в ту подсистему в течение месяцев (#409). Если вы добавляете фазу, снимайте сэмпл после работы, а не до неё, и добавляйте сэмпл для любого шага, достаточно большого, чтобы удержать пик.

Счётчики сеанса и времени жизни

tokensave current-counter          # show per-project session counter
tokensave reset-counter            # reset the session counter
tokensave status                   # shows project + global lifetime totals + cost

tokensave status отображает статистику индекса проекта, разбивку по языкам, строку стоимости (сегодня / 7 дней / эффективность), а также итоги за всё время по проекту и по всему миру:

tokensave status output

Общемировой счётчик

Все пользователи tokensave вносят вклад в анонимный агрегированный счётчик. tokensave status показывает как итог по вашему проекту, так и общемировой итог. Загрузка отправляет только одно число (например, 4823) без какой-либо идентифицирующей информации. Отключить можно с помощью tokensave disable-upload-counter.


Свежесть индекса

tokensave поддерживает граф в актуальном состоянии без фонового демона или системного наблюдателя за файлами.

Проверка устаревания по требованию. Каждый вызов инструмента MCP проверяет, были ли изменены какие-либо индексированные файлы с момента последней синхронизации. Если найдены устаревшие файлы, они повторно извлекаются до возврата ответа инструмента. Тридцатисекундная задержка предотвращает повторный обход дерева при каждом нажатии клавиши при последовательных вызовах.

Догоняющая синхронизация при подключении. При запуске MCP-сервер немедленно выполняет неблокирующую догоняющую синхронизацию, которая подхватывает любые изменения, сделанные, пока не был подключён агент — git pull, правка в IDE, шаг сборки — так что самый первый вызов инструмента в сеансе видит свежий индекс.

Мультиагентная работа и git worktree. Когда несколько агентов работают над одним проектом одновременно, основное предположение состоит в том, что каждый агент работает в собственном git worktree. Worktree — это независимые файловые копии одного репозитория: у агента A и агента B есть своя копия каждого файла, поэтому они никогда не перезаписывают правки друг друга. tokensave автоматически определяет, когда запрос поступает из worktree, вложенного в основной checkout, и обслуживает результаты из правильного графа веток. Изменения накапливаются независимо и в конечном итоге объединяются через git merge или rebase — тот же процесс, что используется для любой другой параллельной разработки. Такая конструкция избегает сложности и режимов отказа межпроцессных блокировок над общей изменяемой директорией.

Рабочие процессы только через CLI. Если вы запускаете команды tokensave без подключённого агента (без MCP-сервера), проверка устаревания не выполняется между командами. Установите git-хуки, чтобы индекс оставался свежим автоматически после каждого коммита или клонирования:

cp scripts/post-commit scripts/post-checkout .git/hooks/
chmod +x .git/hooks/post-commit .git/hooks/post-checkout

Обновление с версии 5.x

Отдельная команда tokensave daemon и её автозапуск через launchd/systemd/Windows Service были удалены в версии 6.0.0. Встроенный системный наблюдатель за файлами, заменивший демон, сам был удалён в версии 6.1.1 (он вызывал неконтролируемое потребление CPU и памяти на больших монорепозиториях с глубокими деревьями node_modules или target). Модель проверки устаревания по требованию, описанная выше, является текущей конструкцией.

Если у вас всё ещё остался автозапуск демона с версии 5.x, удалите его:

  • macOS: launchctl unload ~/Library/LaunchAgents/com.tokensave.daemon.plist && rm ~/Library/LaunchAgents/com.tokensave.daemon.plist
  • Linux: systemctl --user disable --now tokensave-daemon && rm ~/.config/systemd/user/tokensave-daemon.service
  • Windows: sc.exe delete tokensave-daemon (из терминала с правами администратора)

Если вы не помните точное имя: launchctl list | grep tokensave / systemctl --user list-units | grep tokensave / sc.exe query state= all | findstr -i tokensave.


Самообновление

tokensave upgrade                  # upgrade to latest in current channel
tokensave channel                  # show current channel (stable/beta)
tokensave channel beta             # switch to beta channel
tokensave channel stable           # switch back to stable

tokensave upgrade загружает правильный бинарный файл для вашей платформы из релизов GitHub и заменяет запущенный бинарный файл на месте. Поддерживает каналы stable и beta независимо.


Версионирование и обновления

Номера версий tokensave выглядят как SemVer, но не следуют ей: изменяемый компонент кодирует обслуживание, которое требуется для обновления, и которое tokensave выполняет автоматически при следующем запуске — вам никогда не нужно вручную переустанавливать или переиндексировать.

ИзменениеПримерТребуется обновлениеАвтоматическое действие
Патч (x.y.Z)7.2.0 → 7.2.1НичегоНет — ни переустановки, ни переиндексации
Минорный (x.Y.0)7.2.0 → 7.3.0Переустановка (новые обвязки, новые инструменты, новая конфигурация)Глобальная переустановка каждой установленной интеграции агента (обновляет разрешения, хуки и конфигурацию MCP)
Мажорный (X.0.0)7.2.0 → 8.0.0Переустановка + полная повторная синхронизацияГлобальная переустановка и принудительная переиндексация каждого проекта (эквивалент sync -f)

Глобальная переустановка. При первом запуске новой минорной или мажорной сборки tokensave молча повторно выполняет install для каждого зарегистрированного агента, чтобы конфигурация агента всегда указывала на текущий бинарный файл и предоставляла текущий набор инструментов. Патч-обновления пропускают этот шаг — просто продвигается маркер запущенной версии.

Переустановка действительно молчаливая: вывод настройки для каждого агента, который вы видите при явном tokensave install, здесь подавляется, поэтому он никогда не появляется перед обычным tokensave init или tokensave sync. Если конфигурацию агента не удаётся обновить — приложение не установлено или его конфигурация находится в месте, доступном только для чтения — вы получаете одну строку с именами агентов, которые не удалось обновить:

warning: could not refresh tokensave config for: copilot.
  Run tokensave install to see the error.

Запустите tokensave install, чтобы увидеть основную ошибку. Маркеры версий продвигаются в любом случае, поэтому путь конфигурации, который никогда не может быть записан, сообщается один раз за обновление, а не повторяется при каждой последующей команде.

Принудительная переиндексация проекта (только мажорная). Мажорное изменение означает, что индексы проектов должны быть перестроены. tokensave делает это лениво и для каждого проекта отдельно: при первом вызове инструмента MCP в проекте после мажорного обновления он запускает фоновую полную переиндексацию (эквивалент tokensave sync --force), которая никогда не блокирует ответ инструмента.

Запасной вариант Brew / cargo. Внешние обновления, которые заменяют бинарный файл вне tokensave upgradebrew upgrade tokensave или cargo install tokensave — обнаруживаются тем же способом: если запущенная версия новее последней версии, выполнившей установку, переустановка запускается при следующем запуске так же, как после самообновления.

См. TOKENSAVE-VERSIONING.md о том, почему tokensave расходится с SemVer (кодирование обслуживания в версии — это то, что делает возможными обновления без вмешательства пользователя), о механике маркеров, независимой версии схемы базы данных и правилах для мейнтейнеров при выпуске релизов.


Справочник по CLI

tokensave init [path]              # Initialize a new project (full index)
tokensave sync [path]              # Incremental sync (must be initialized first)
tokensave sync --force [path]      # Force a full re-index
tokensave sync --doctor [path]     # Sync and list added/modified/removed files
tokensave status [path]            # Show statistics + cost summary
tokensave status [path] --json     # Show statistics (JSON output)
tokensave status --details         # Include node-kind breakdown
tokensave cost [range]             # Token cost summary (default: 7d)
tokensave cost --by-model          # Cost grouped by model
tokensave cost --by-task           # Cost grouped by task category
tokensave cost --export json|csv   # Export cost data
tokensave query <search> [path]    # Search symbols
tokensave files [--filter dir] [--pattern glob] [--json]   # List indexed files
tokensave affected <files...> [--stdin] [--depth N]        # Find affected test files
tokensave install [--agent NAME]   # Configure agent integration
tokensave reinstall                # Refresh settings for all installed agents
tokensave uninstall [--agent NAME] # Remove agent integration
tokensave serve [--idle-timeout-secs N]   # Start MCP server (N: exit after N idle seconds)
tokensave servers [--json]         # List running servers and the index each one holds
tokensave monitor                  # Live TUI showing MCP calls across all projects
tokensave memory [--clean]         # Per-instance RSS report for all tokensave processes
tokensave upgrade                  # Self-update to latest version
tokensave channel [stable|beta]    # Show or switch update channel
tokensave doctor [--agent NAME]    # Check installation health
tokensave githooks [on|off] [--local]  # Manage git hooks (--local: this repo only, no core.hooksPath)
tokensave branch add|list|remove|removeall|gc   # Multi-branch management
tokensave current-counter          # Show per-project token counter
tokensave reset-counter            # Reset per-project token counter
tokensave disable-upload-counter   # Opt out of worldwide counter uploads
tokensave enable-upload-counter    # Re-enable worldwide counter uploads

tokensave doctor

Запустите комплексную проверку работоспособности вашей установки tokensave:

tokensave doctor

Проверки: расположение бинарного файла, индекс проекта, глобальная база данных, пользовательская конфигурация, интеграция агента (MCP-сервер, хуки, разрешения, правила промптов) и сетевое подключение. Если после обновления отсутствуют какие-либо разрешения инструментов, он сообщает вам запустить tokensave install. Используйте --agent для проверки только конкретного агента.

Doctor также проверяет, что каждый установленный хук использует правильную подкоманду tokensave, и автоматически исправляет сломанные хуки.


Как это работает с Claude Code

После настройки Claude Code автоматически использует tokensave вместо чтения сырых файлов, когда ему нужно понять вашу кодовую базу. Три уровня усиливают друг друга:

УровеньЧто делаетПочему это важно
MCP-серверПредоставляет Claude более 80 инструментов tokensave_*Claude может напрямую запрашивать граф
Правила CLAUDE.mdГоворят Claude предпочитать tokensave агентам/чтению файловПредотвращает откат модели к дорогостоящим паттернам
Хук PreToolUseНативный Rust-хук блокирует Explore-агентовПерехватывает случаи, когда модель игнорирует правила CLAUDE.md
Хук UserPromptSubmitВыполняется при отправке промптаОтслеживание жизненного цикла для учёта токенов
Хук StopВыполняется при завершении сеансаСбрасывает счётчики токенов

Результат: Claude получает то же понимание кода с гораздо меньшим количеством токенов. Типичный Explore-агент читает 20–50 файлов; tokensave возвращает релевантные символы, связи и фрагменты кода из своего предварительно построенного индекса.


Сетевые вызовы и конфиденциальность

Основная функциональность tokensave (индексация, поиск, графовые запросы, MCP-сервер) на 100% локальна — ваш код никогда не покидает вашу машину.

ВызовОтправляемые данныеКогдаОтключение
Загрузка общемирового счётчикаКоличество токенов (число) + страна (из IP)синхронизация, статус, MCP-сеансыtokensave disable-upload-counter
Чтение общемирового счётчикаНичего (GET-запрос)статусН/Д (только чтение, таймаут 1 с)
Проверка версииНичего (GET-запрос)статус (кэш 5 мин), синхронизация (параллельно)Н/Д (таймаут 1 с, бездействие при сбое)
Обновление цен на моделиНичего (GET-запрос)tokensave cost (кэш 24 ч)Н/Д (таймаут 5 с, откат ко встроенным ценам)

Загрузка общемирового счётчика отправляет один HTTP POST с JSON-телом вида {"amount": 4823}. Никаких cookie, никакого отслеживания, никакого идентификатора пользователя. Cloudflare Worker записывает страну вашего IP-адреса (полученную из заголовков запроса) для агрегированной географической статистики — ваш фактический IP-адрес не хранится.

Обновление цен на модели загружает публичный JSON-файл с GitHub (raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json), чтобы поддерживать цены на модели Claude в актуальном состоянии для tokensave cost. Никакие данные не отправляются — это обычный HTTPS GET. Ответ кэшируется по адресу ~/.tokensave/pricing.json на 24 часа. Если загрузка не удаётся, tokensave использует свою встроенную таблицу цен.


50+ языков

tokensave поддерживает более 50 языков программирования, организованных в три уровня, управляемых флагами функций Cargo. Каждый уровень включает все языки из уровня ниже. Заголовки Markdown извлекаются как узлы Module с иерархическими рёбрами Contains, так что структура документа участвует в графовых запросах наравне с исходным кодом.

Lite — --no-default-features

Всегда компилируется. Самый маленький бинарный файл для самых популярных языков, плюс Svelte и Astro (извлечение блоков скриптов через TypeScript-экстрактор, без дополнительной грамматической зависимости).

ЯзыкРасширения
Rust.rs
Go.go
Java.java
Scala.scala, .sc
TypeScript.ts, .tsx
JavaScript.js, .jsx
Python.py
C.c, .h
C++.cpp, .hpp, .cc, .cxx, .hh
Kotlin.kt, .kts
C#.cs
Swift.swift
Svelte.svelte
Astro.astro

Medium (Lite + ещё 9) — --features medium

ЯзыкРасширенияФлаг функции
Dart.dartlang-dart
Pascal.pas, .pp, .dprlang-pascal
PHP.phplang-php
Ruby.rblang-ruby
Bash.sh, .bashlang-bash
Protobuf.protolang-protobuf
PowerShell.ps1, .psm1lang-powershell
Nix.nixlang-nix
VB.NET.vblang-vbnet

Полный (средний + всё остальное) — по умолчанию

ЯзыкРасширенияФлаг функции
ActionScript.aslang-actionscript
Lua.lualang-lua
Zig.ziglang-zig
Objective-C.m, .mmlang-objc
Perl.pl, .pmlang-perl
Batch/CMD.bat, .cmdlang-batch
Fortran.f90, .f95, .f03, .f08, .f18, .f, .forlang-fortran
COBOL.cob, .cbl, .cpylang-cobol
MS BASIC 2.0.baslang-msbasic2
GW-BASIC.gwlang-gwbasic
QBasic.qblang-qbasic
QuickBASIC 4.5.bi, .bmlang-qbasic
DockerfileDockerfile, .dockerfilelang-dockerfile
GLSL.glsl, .vert, .frag, .complang-glsl
Godot Shader.gdshader, .gdshaderinclang-glsl
Minecraft Function.mcfunctionlang-mcfunction
WGSL.wgsllang-wgsl
HLSL.hlsl, .fxlang-hlsl
Verilog / SystemVerilog.v, .vh, .sv, .svhlang-systemverilog
Metal.metallang-metal
CUDA / HIP.cu, .cuhlang-cuda
Markdown.md, .markdownlang-markdown
R.r, .Rlang-r
SQL.sqllang-sql
Julia.jllang-julia
Haskell.hs, .lhslang-haskell
OCaml.ml, .mlilang-ocaml
Clojure.clj, .cljs, .cljclang-clojure
Erlang.erl, .hrllang-erlang
Elixir.ex, .exslang-elixir
F#.fs, .fsi, .fsxlang-fsharp
F*.fst, .fstilang-fstar
Quint.qntlang-quint
Terraform.tf, .tfvarslang-terraform
TOML.tomllang-toml
Lean.leanlang-lean

Отдельные языки также можно выбирать точечно без полного уровня:

cargo install tokensave --no-default-features --features lang-nix,lang-bash

Все экстракторы используют одинаковую глубину: функции, классы, методы, поля, импорты, графы вызовов, цепочки наследования, docstring-и, метрики сложности, извлечение декораторов/аннотаций и отслеживание зависимостей между файлами.


tokensave против CodeGraph

tokensave — это полностью новая реализация на Rust, переписанная с нуля на основе CodeGraph (Node.js/TypeScript). Оба инструмента строят семантические графы кода для ИИ-агентов программирования, но существенно различаются по охвату и возможностям.

tokensaveCodeGraph
Среда выполненияНативный бинарник (Rust)Node.js 18+
Установкаbrew install, cargo install, scoop installnpx @colbymchenry/codegraph
Языки50+ (3 уровня: lite/medium/full)19+
MCP-инструменты80+9
Интеграции с агентами12+ (Claude, Codex, Gemini, Qwen, OpenCode, Cursor, Cline, Copilot, Roo Code, Zed, Antigravity, Kilo, Kiro, Kimi, Vibe, Grok, OMP, Pi, Plank, Factory Droid)1 (Claude Code)
Актуальность индексаПроверка устаревания по требованию при каждом MCP-вызове; синхронизация при подключении; для многогаентной работы рекомендуется использовать git worktreesНативный файловый наблюдатель на уровне ОС (FSEvents/inotify/ReadDirectoryChangesW, задержка 2 с); синхронизация при подключении
Индексация нескольких ветокДа, по желанию (БД на ветку, межветочный diff/поиск)Нет
Метрики сложностиИзвлекаются из AST (ветвления, циклы, глубина вложенности, цикломатическая и когнитивная сложность, Холстед, индекс поддерживаемости, CRAP)Нет
Инструменты портированияДа (port_status, port_order)Нет
Визуализатор графаУдалён (v4.0.1)Да
Семантический поискРасширение ключевых слов, управляемое агентом (нулевая стоимость)Локальные эмбеддинги (nomic-embed-text-v1.5 через ONNX)
MCP-ресурсы4 (status, files, overview, branches)Нет
MCP-аннотацииДа (readOnlyHint, alwaysLoad)Нет
Обнаружение мёртвого кодаДаНет
Обнаружение циклических зависимостейДаНет
Иерархия типовДаНет
Анализ God class / связанностиДаНет
Контекст коммитов / PRДаНет
Сопоставление тестовДаНет
Предпросмотр переименованияДаНет
Отслеживание токеновМетрики на вызов, живой TUI-монитор, счётчики сессии и за всё времяНет
Аналитика здоровья кодаКомпозитный балл, Gini, глубина зависимостей, DSM, взвешенные по риску пробелы в тестах, дельты сессийНет
Примитивы редактирования4 атомарных писателя (str_replace, multi_str_replace, insert_at, ast_grep_rewrite) с автоматической переиндексациейНет
Устойчивость к сбоямИзвлечение в изолированном подпроцессе; сбои нативных грамматик пропускают файл, синхронизация продолжаетсяНет
Самообновлениеtokensave upgrade с каналами stable/betanpm update
Движок БДlibsql (форк SQLite, WAL, асинхронный)better-sqlite3 / wa-sqlite (WASM)
Скорость индексации~1,2 с для 1 782 файлов~4 с для 1 782 файлов
Размер бинарника~25 МБ (все грамматики включены)~80 МБ (node_modules + WASM)

CodeGraph был пионером этого подхода и остаётся надёжным выбором, если вы предпочитаете инструменты npm и вам нужна интеграция только с Claude Code. tokensave расширяет концепцию более глубоким анализом, большим числом агентов, поддержкой нескольких веток и нативным бинарником без зависимостей на этапе выполнения.

Подробные сравнения с CodeGraph, Dual-Graph (GrapeRoot), code-review-graph и OpenWolf см. в docs/COMPARABLE-TOOLS.md.


Почему tokensave лучше альтернатив

Несколько инструментов снижают расход токенов для ИИ-агентов программирования. Вот почему tokensave выделяется.

Один нативный бинарник, ноль зависимостей

Каждая альтернатива требует среду выполнения: Python, Node.js или обе. tokensave поставляется как один бинарник Rust размером ~25 МБ со всеми 50+ грамматиками tree-sitter. Больше ничего устанавливать не нужно.

Самая глубокая аналитика кода

tokensave работает на уровне символов: функции, структуры, поля, рёбра вызовов, иерархии типов, метрики сложности. Альтернативы, такие как Dual-Graph (GrapeRoot), работают на уровне файлов — они знают, какие файлы существуют, но не могут ответить «кто вызывает эту функцию?» или «что сломается, если я изменю эту структуру?». 80+ специализированных MCP-инструментов tokensave покрывают обход графа вызовов, анализ влияния, обнаружение мёртвого кода, сопоставление тестов, предпросмотр переименования, иерархии типов, обнаружение циклических зависимостей, ранжирование по сложности, аналитику здоровья кода (Gini, DSM, глубина зависимостей, взвешенные по риску пробелы в тестах), атомарные примитивы редактирования и многое другое. Ближайший конкурент (code-review-graph) имеет 22 инструмента; у остальных — 5–9.

Самая широкая поддержка агентов

Более дюжины интеграций с ИИ-агентами программирования с нативными форматами конфигурации для каждого агента. Ни один другой инструмент не покрывает столько агентов с такой глубокой интеграцией. Claude Code получает хуки, правила промптов и автоматически разрешённые разрешения инструментов. Kiro получает глобальную MCP-конфигурацию, tokensave.md управление, загружаемое как ресурс, управляемого агента с разрешительным встроенным/токенсейв-одобрением инструментов, а также хуки для защиты делегирования и пост-записной синхронизации. Другие агенты получают регистрацию MCP-сервера в их нативном формате конфигурации.

Индексация нескольких веток

Единственный инструмент в этой области с опциональными графовыми БД на ветку и межветочным diff и поиском. При включении переключение веток мгновенно — переиндексация не требуется.

Отслеживание токенов на вызов

Единственный инструмент, который сообщает точно, сколько токенов сэкономил каждый отдельный MCP-вызов, плюс живой TUI-монитор по всем проектам и счётчики за всё время.

Полностью открытый исходный код

Rust под лицензией MIT, полностью проверяемый. Основной движок Dual-Graph (graperoot на PyPI) проприетарный — вы не можете увидеть, что он делает с вашим графом кода. OpenWolf распространяется под AGPL-3.0, что требует открытия производных работ.

Производительность

Бенчмарк полной индексации на смешанной кодовой базе Rust/Java/Scala из 1 782 файлов (57 тыс. узлов, 103 тыс. рёбер):

ИнструментВремяУскорение
CodeGraph (TypeScript)31,2 с1x
tokensave (Rust)1,2 с26x

Устранение неполадок

«tokensave not initialized»

Каталог .tokensave/ не существует в вашем проекте.

tokensave init

MCP-сервер не подключается

ИИ-агент не видит инструменты tokensave.

  1. Убедитесь, что конфигурация агента включает MCP-сервер tokensave (запустите tokensave doctor)
  2. Полностью перезапустите агента
  3. Проверьте, что tokensave есть в вашем PATH: which tokensave

Отсутствующие символы в поиске

  • Запустите tokensave sync для обновления индекса
  • Проверьте, поддерживается ли язык (см. таблицу выше)
  • Убедитесь, что файл не исключён через .gitignore

Индексация медленная

Большие проекты требуют больше времени при первой полной индексации.

  • Последующие запуски используют инкрементальную синхронизацию и намного быстрее
  • Используйте tokensave sync (не --force) для повседневных обновлений
  • Устаревание проверяется автоматически при каждом MCP-вызове, пока агент подключён

Отключение tokensave для конкретных проектов

Если проект слишком большой и tokensave использует слишком много оперативной памяти, вы можете отключить MCP-сервер для конкретного проекта, установив TOKENSAVE_DISABLE_SERVER=true в его окружении. Сервер корректно завершает работу без инициализации.

Claude Code — добавьте в .claude/settings.json вашего проекта:

{
  "mcpServers": {
    "tokensave": {
      "command": "tokensave",
      "args": ["serve"],
      "env": {
        "TOKENSAVE_DISABLE_SERVER": "true"
      }
    }
  }
}

Другие агенты — установите переменную окружения в конфигурации, которую ваш агент использует для запуска MCP-серверов.

Вы также можете установить её глобально через оболочку (TOKENSAVE_DISABLE_SERVER=true claude), но это отключит MCP-сервер tokensave для всех проектов в сессии.

DISABLE_TOKENSAVE=true остаётся поддерживаемым устаревшим псевдонимом для конфигураций, созданных до того, как эта переменная была помещена в пространство имён.


Происхождение

Этот проект — порт оригинальной реализации CodeGraph на TypeScript от @colbymchenry на Rust. Порт сохраняет ту же архитектуру и интерфейс MCP-инструментов, используя Rust для производительности и нативных привязок tree-sitter.


Сборка

cargo build --release                          # full (50+ languages, default)
cargo build --release --features medium        # medium tier
cargo build --release --no-default-features    # lite (smallest binary)

cargo test                                     # run all tests (requires full)
cargo check --no-default-features              # verify lite compiles
cargo clippy --all

История звёзд

Star history

Спонсоры

SignPath Бесплатная подпись кода на Windows предоставлена SignPath.io, сертификат от SignPath Foundation

Лицензия

Лицензия MIT — подробности см. в LICENSE.

tokensave.dev