🌱 Twig

🌱 TWIG AS MCP · v0.20.1

AI-агент видит
репозиторий
так же, как вы.

🌱 Twig отвечает AI-агентам через Model Context Protocol. Claude Code, Codex, Cursor и любой MCP-клиент получают не простыню вывода git, а короткий ответ: что изменено — сразу с диффами, коммит целиком одним вызовом, поиск по коду в истории, blame и то, что вы выделили в окне.

Claude Code · Codex · Cursor · любой MCP-клиент

Агент в терминалеПРИМЕР · ДЕМО-ПЕСОЧНИЦА

ВЫПосмотри мои изменения и предложи, как разбить их на коммиты.

  1. get_workspace_contextmain · впереди origin на 1 · 1 изменён, 1 новый444 Б
  2. list_changes · diffsREADME.md +1 −0 · notes.todo +2 −0, с патчами386 Б

АГЕНТДва коммита: правка README.md отдельно, а notes.todo похож на личные заметки — его лучше не коммитить. Застейджить и закоммитить можно в 🌱 Twig.

Размеры ответов измерены на демо-песочнице 🌱 Twig. Текст агента — иллюстрация.

Читает сам, коммит — только по вашей кнопкеЛокальный сокет, без сетевого портаВыключен, пока вы не включитеМодель безопасности

В САМОМ ПРИЛОЖЕНИИ

Кнопка MCP рядом с BugHunter.

Включение, что получит агент и готовые
команды подключения — в одном окне.

Окно AI agents (MCP) поверх демо-песочницы: MCP server — On, статус Listening, заметка Read-only, четыре карточки What your agent gets, три шага подключения и команда для Claude Code с кнопкой Copy.
🌱 Twig 0.20.1 · окно MCP · тёмная темаПути в командах — как у установленного приложения на macOS

ПОЧЕМУ ЭТО КРУТО

Не обёртка над git,
а смысловой API к репозиторию.

Агент может запустить git diff и сам. Поэтому инструмент здесь есть, только если он экономит агенту токены или вызовы — или даёт то, чего у git нет: что вы выделили в окне и ваше подтверждение коммита. Остальное агент спрашивает у git.

01 / ФОРМА GIT, БЕЗ ШУМА

Ответ в форме, которую модель уже знает

Файл — одна строка, как в git status --short, с числом строк; дифф — обычные ханки без заголовков diff --git и index. Ничего не экранируется в JSON, поэтому ответ не больше вывода git, а сводка — в 2–3 раза меньше (замер). Ветка, upstream и идущий merge или rebase — в короткой сводке.

02 / ОДИН ВЫЗОВ

Всё нужное — сразу

Все изменения с диффами — одним вызовом, коммит с сообщением и патчами — тоже. Lock-файлы и огромные файлы приходят одной строкой с причиной и командой git, которая их прочитает, а всё, что не влезло в ответ, дочитывается ещё одной командой. Поиск по истории возвращает только строки вокруг совпадения — в 3–63 раза меньше, чем git log -S … -p (замер).

03 / ЧТО ВЫДЕЛЕНО У ВАС

«Объясни этот коммит» — без хэша

Агент видит, какой коммит, диапазон сравнения или файл открыт в 🌱 Twig. Выделили строку в графе — спросили агента. Копировать хэш и путь больше не нужно.

04 / ТОЛЬКО ЧТЕНИЕ

Агент предлагает, решаете вы

Нет инструментов commit, stage, checkout, reset, push и нет запуска команд. План коммитов агент предлагает, а выполняете его вы — в 🌱 Twig, где staging построчный и почти каждое действие можно отменить.

05 / ВСЁ НА ВИДУ

Каждая команда агента — в журнале

Любая команда Git, которую вызвал агент, попадает в консоль 🌱 Twig с плашкой MCP: argv, каталог, вывод, код. Ваши действия во вкладке «My» не смешиваются с чтениями агента.

06 / ЛЮБОЙ КЛИЕНТ

Стандартный MCP, без облака

Обычный Model Context Protocol поверх stdio: никаких SDK провайдеров, аккаунтов и серверов. Мост запускается на исполняемом файле самого 🌱 Twig — отдельный Node.js не нужен.

СВОДКА → ВСЁ СРАЗУ → КОММИТ

Все изменения одним вызовом.
Коммит целиком — тоже.

Настоящие ответы 🌱 Twig на демо-песочнице, сокращённые для читаемости. Справа от названия — размер полного ответа. Для сравнения: git status --short + git diff --numstat + git diff там же — 354 Б, и нового файла в них нет.

  1. get_workspace_context≈440 Б

    Ветка, upstream, расхождение, идущая операция, счётчики файлов и другие подключённые репозитории. Без диффов.

    {"branch": {
      "name": "main",
      "upstream": "origin/main",
      "ahead": 1, "behind": 0 },
     "operation": null,
     "workingTree": {
      "clean": false,
      "staged": 0, "unstaged": 1,
      "untracked": 1 }}
  2. list_changes85 Б

    Каждый файл одной строкой, как в git status --short, с числом строк. Постранично.

    on main: 1 unstaged, 1 untracked
    unstaged:
    M +1 -0 README.md
    untracked:
    ? notes.todo
  3. list_changes diffs: true386 Б

    То же самое, но под каждым файлом — его ханки. Новый файл — как добавление. Всё одним вызовом.

    unstaged:
    ## M +1 -0 README.md
    @@ -6,3 +6,4 @@ …
     Keep the details close…
    +One unstaged edit.
    untracked:
    ## ? +2 -0 notes.todo
    @@ -0,0 +1,2 @@
    +- try the reverse blame view
    +- run the demo automation
  4. get_commit459 Б

    Коммит одним вызовом: сообщение, автор, родители и патч каждого файла. git show того же коммита — 528 Б.

    992e33cc9ae1… Refine the workspace layout
    author: Maya Chen <maya@twig.example> …
    parents: f8b8d92289f1
    1 file, +2 -0:
    ## M +2 -0 README.md
    @@ -4,3 +4,5 @@ …
     Reset it any time from…
    +
    +Keep the details close to the history.

Большой дифф не съедает контекст

Lock-файлы, минифицированные сборки и файлы больше 400 изменённых строк приходят одной строкой со счётчиками и причиной — 12 МБ сгенерированного JSON стоят одну строку. Каждая такая строка называет команду, которая прочитает файл. Мелкие файлы ложатся в бюджет ответа первыми; то, что не влезло, ответ в конце перечисляет одной командой git diff или git show. Файл никогда не обрывается посередине.

ЗАМЕР · CLAUDE OPUS 5.5

Сколько это стоит в токенах.
Без приукрашивания.

Один и тот же вопрос агенту — через git в терминале и через 🌱 Twig. Изменения настоящие, из истории наших проектов, возвращённые в рабочее дерево. Токены посчитал сам Claude.

в 2–3 раза

меньше на вопросе «что изменено?»: 102–555 токенов против 295–1 112.

−2…−10 %

на чтении всех диффов и на разборе коммита. Код 🌱 Twig не сжимает: дифф стоит почти столько же, сколько у git.

2–5 вызовов

вместо 5–9, чтобы агент прочитал всё нужное для сообщения коммита; коммит целиком — за 1–2.

Токены на входе модели: команды агента и всё, что он получил в ответ. Полоски — git и 🌱 Twig в одной строке.
Изменениеgit🌱 TwigРазница
Что изменено?git status + git diff --stat против list_changes
Исправление4 файла, +80 −22952 вызова1021 вызов−65 %
Небольшая функция7 файлов, +154 −74012 вызова1691 вызов−58 %
Крупная функция28 файлов, +1048 −441 1122 вызова5551 вызов−50 %
Функция с новой зависимостью14 файлов, +726 −41, с package-lock.json6162 вызова3091 вызов−50 %
Прочитать всё для сообщения коммитаgit status, diff --stat, diff, log --oneline -10, cat новых файлов против list_changes diffs: true + git log --oneline -10 и дочитывание
Исправление4 файла, +80 −23 9035 вызовов3 5222 вызова−10 %
Небольшая функция7 файлов, +154 −710 2406 вызовов9 7122 вызова−5 %
Крупная функция28 файлов, +1048 −4443 8259 вызовов41 9165 вызовов−4 %
Функция с новой зависимостью14 файлов, +726 −41, с package-lock.json48 0639 вызовов43 8733 вызова−9 %
Разобрать коммит целикомgit show против get_commit и дочитывание того, что не влезло
Исправление4 файла, +80 −23 9651 вызов3 7801 вызов−5 %
Небольшая функция7 файлов, +154 −710 3561 вызов9 9441 вызов−4 %
Крупная функция28 файлов, +1048 −4444 2781 вызов43 2472 вызова−2 %
Функция с новой зависимостью14 файлов, +726 −41, с package-lock.json48 6891 вызов44 3852 вызова−9 %

Что ещё стоит токенов

  • Описания шести инструментов чтения — 2 563 токена, один раз за сессию. Было одиннадцать и 3 947: инструменты, которые пересказывали git без выгоды (дифф одного файла, ханк по id, список коммитов, патч коммита отдельно от коммита), убраны. Claude Code с поиском инструментов загружает только те, что вызваны. На маленьком изменении описания всё равно дороже всей экономии.
  • Крупный коммит не влезает в 60 КБ одного ответа: конец ответа называет одну команду git show для всего, что не влезло, — это второй вызов, а не восемнадцать, как раньше.
  • Lock-файл 🌱 Twig не показывает — только строку с причиной. В изменении с новой зависимостью это 131 строка из 767, отсюда −9 %.

Как мерили

  • Каждый текст отправлен Claude Opus 5.5 через claude -p; его размер — разница входных токенов с ним и без него.
  • Новые файлы агент с git читает через cat — самый дешёвый способ. Всё, что 🌱 Twig пометил «не поместилось», дочитано той командой git, которую назвал ответ, — знания у обоих одинаковые. Список коммитов на стороне 🌱 Twig — тоже git log --oneline: короче его не сделать.
  • Git 2.54, 🌱 Twig 0.20.1, 9 октября 2026. Повторить: node scripts/mcp-tokens.mjs --count — тексты всех ответов остаются в artifacts/mcp-tokens/.

ПОИСК И BLAME · ТОТ ЖЕ ЗАМЕР

Здесь 🌱 Twig не перепаковывает,
а отбрасывает лишнее.

git log -S находит коммит, но отдаёт все ханки каждого найденного файла. search_history отдаёт несколько строк вокруг каждого совпадения. git blame — строка на строку, а get_blame — кусок на коммит и тему коммита один раз.

в 3–63 раза

меньше на вопросе «когда появился или исчез этот код?»: 893–9 202 токена против 3 969–189 272 у git log -S … -p.

−16…−37 %

даже против того же вывода через grep -C3 — конвейера, который ещё надо написать и который теряет тему коммита, дату и номера строк.

1 вызов вместо 3–9

на «кто и зачем менял эти строки»: −92…−95 %, 414–1 017 токенов против 5 120–19 922 у git blame и git log -1 на каждый коммит.

Токены на входе модели: команды агента и всё, что он получил в ответ. Чистая копия на закреплённом коммите: 🌱 Twig — 74 коммита, Ghost Garden — 107.
Вопросgit🌱 TwigРазница
Когда этот код появился или исчез?git log -S'…' -p против search_history; «с grep» — тот же вывод через grep -E -C3 '^(commit |diff --git )|…'
plainFs1 коммит · 🌱 Twig3 969с grep: 1 8161 3961 вызов−65 %к grep −23 %
readPreviousTag1 коммит · 🌱 Twig10 572с grep: 1 3078931 вызов−92 %к grep −32 %
validateRevision2 коммита · 🌱 Twig38 448с grep: 4 0453 4131 вызов−91 %к grep −16 %
undo.perform7 коммитов · 🌱 Twig107 882с grep: 12 2869 2021 вызов−91 %к grep −25 %
requestAnimationFrame9 коммитов · Ghost Garden189 272с grep: 4 7452 9921 вызов−98 %к grep −37 %
Кто и зачем менял эти строки?git blame + git log -1 на каждый найденный коммит против get_blame
main/mcp/tools/history.jsстроки 90–144 · 2 коммита5 1203 вызова4141 вызов−92 %
HistoryWorkspace.jsxстроки 400–460 · 4 коммита6 9415 вызовов4341 вызов−94 %
main/git/history.jsвесь файл, 219 строк · 8 коммитов19 9229 вызовов1 0171 вызов−95 %

Что учесть

  • Описания двух новых инструментов — 1 007 токенов за сессию. Один вызов экономит от 2,5 до 186 тысяч.
  • Против аккуратного grep выигрыш скромнее: в обоих случаях агент читает примерно одни и те же строки кода, а 🌱 Twig вдобавок даёт тему коммита, дату и номера строк.
  • На файл — до 5 мест; остальные посчитаны, и ответ называет git show, который прочитает файл целиком.
  • get_blame не возвращает код: агент обычно уже прочитал файл. С code: true код приходит, этот вариант не мерили.

Как мерили

  • Так, как пишет агент: git log -S'запрос' -p; для blame — git blame -L и git log -1 на каждый коммит, который он назвал.
  • Сравнение с grep — для честности: такой конвейер агенты пишут редко.
  • Claude Opus 5.5, git 2.54, 8 октября 2026. Повторить: node scripts/mcp-tokens.mjs --only=search --count.

9 ИНСТРУМЕНТОВ · 6 ЧИТАЮТ, 3 ПРЕДЛАГАЮТ КОММИТ

Только те,
что лучше git.

Обёрток над тем, что git и так отвечает коротко — git log --oneline, git diff -- файл, — нет: это агент запускает сам. Каждый инструмент принимает необязательный repository — имя, корень или любой путь внутри. Без него читается репозиторий рабочей папки агента, если он подключён, иначе открытый в 🌱 Twig — и тогда ответ первым делом называет его.

get_workspace_context

Сводка: ветка, upstream, операция, счётчики файлов, выделенное в окне и остальные подключённые репозитории.

list_changes

Изменённые файлы строками, как в git status, с +/− строк. С diffs: true — сразу с патчами, lock-файлы — строкой с командой git diff. Постранично.

get_commit

Коммит одним вызовом: сообщение, автор, родители и патч каждого файла. Lock-файлы и огромные файлы — строкой с командой git show.

search_history

Когда код появился или исчез (-S, -G), по сообщению или автору. Возвращает только строки вокруг совпадения, а не дифф коммита.

get_blame

Кто и зачем менял строки: куски строк по коммитам и тема каждого коммита один раз. Номера строк — как в редакторе.

get_ui_context

Что открыто в окне: вид, коммит, диапазон, файл. Чего 🌱 Twig не хранит — null.

propose_commit

Предлагает коммит всех изменений с сообщением агента. Окно показывает файлы и сообщение, а переключатели — поднять ли версию и поставить ли тег; Commit, Commit & Push или Cancel — ваш выбор. Выключен, пока вы не разрешите.

new_version

Предлагает выпуск: коммит с поднятой версией (patch, minor или major) и тегом по образцу прошлого — v1.2.3 → v1.2.4. Версию и тег вы меняете переключателями; Commit & Push отправляет коммит и тег.

await_commit

Ждёт вашего ответа дальше, если вы думаете дольше ~45 секунд, и отвечает тем же: хэш коммита, пуш или отмена.

СЦЕНАРИИ

Что спросить
у агента.

Под каждой просьбой — инструменты, которые агенту хватит вызвать.

01 / КОММИТЫ

«Разбей мои изменения на коммиты»

Агент одним вызовом читает все изменения с диффами и предлагает группы с сообщениями. Застейджить можно построчно в 🌱 Twig.

workspace → list_changes diffs

02 / РЕВЬЮ

«Проверь, что я застейджил»

Индекс отдельно от рабочего дерева — то, что действительно уйдёт в коммит, с патчами.

list_changes diffs → staged:

03 / ОБЪЯСНЕНИЕ

«Объясни коммит, который я выделил»

Агент узнаёт выделенный коммит из окна и читает его сообщение и патчи одним вызовом.

get_ui_context → get_commit

04 / ИСТОРИЯ

«Что происходило в main за 20 коммитов?»

Список коммитов агент берёт у git — короче не бывает, — затем подробности только по интересным.

git log --oneline → get_commit

05 / ПОИСК

«Когда мы убрали localStorage из клиента?»

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

search_history → get_commit

06 / АРХЕОЛОГИЯ

«Зачем здесь эта проверка?»

Кто последним менял строки 40–60 и тема каждого коммита — одним вызовом. Дальше — тот самый коммит.

get_blame → get_commit

ПОДКЛЮЧЕНИЕ · МИНУТА

Три шага,
одна команда.

Точная команда для вашей установки — в самом 🌱 Twig: кнопка MCP рядом с BugHunter, затем Copy.

  1. Включите сервер

    Кнопка MCP в панели инструментов → MCP server: On. Выбор переживает перезапуск.

  2. Добавьте его агенту

    Скопируйте строку для Claude Code, таблицу для Codex или JSON для Cursor — пути уже подставлены.

  3. Спросите

    Перезапустите агента и спросите о репозитории. Если 🌱 Twig закрыт, агент получит понятный ответ, а не тишину.

Claude Codeодин раз в терминале
claude mcp add --scope user twig \
  --env ELECTRON_RUN_AS_NODE=1 -- \
  '/Applications/🌱 Twig.app/Contents/MacOS/🌱 Twig' \
  '/Users/you/Library/Application Support/twig/mcp/twig-mcp.mjs'
Codex~/.codex/config.toml
[mcp_servers.twig]
command = "/Applications/🌱 Twig.app/…/🌱 Twig"
args = ["…/twig/mcp/twig-mcp.mjs"]
env = { ELECTRON_RUN_AS_NODE = "1" }
Cursor и другиеmcpServers
{ "mcpServers": { "twig": {
  "command": "/Applications/🌱 Twig.app/…/🌱 Twig",
  "args": ["…/twig/mcp/twig-mcp.mjs"],
  "env": { "ELECTRON_RUN_AS_NODE": "1" } } } }

Пути — пример для macOS. В Windows и Linux 🌱 Twig подставит свои; они показаны в окне MCP.

МОДЕЛЬ БЕЗОПАСНОСТИ

Контекст для агента,
а не ключи от репозитория.

01 / ВЫКЛЮЧЕН

Пока вы не включите

До выбора в 🌱 Twig нет ни сокета, ни слушателя. Выключили — сокет исчезает.

02 / ЛОКАЛЬНО

Без сетевого порта

Unix-сокет в папке, которую открывает только ваша учётная запись (0700, сокет 0600); в Windows — named pipe. TCP нет.

03 / ТОЛЬКО ЧТЕНИЕ

Без команд и записи

Нет run_command, shell и инструментов записи. Чтения рабочего дерева не трогают индекс: GIT_OPTIONAL_LOCKS=0.

04 / ГРАНИЦЫ

Только ваши репозитории

Агент не может указать произвольную папку: только подключённые в 🌱 Twig, пути проверяются на выход из репозитория.

Проверено, что ничего не меняется

Проверка 🌱 Twig вызывает каждый инструмент на настоящих репозиториях — с конфликтом merge, staged и unstaged правками, большими диффами — и сверяет папку .git и рабочее дерево побайтно до и после. Выделение в окне хранится только в памяти и никуда не записывается.

ЧЕСТНО

Чего пока нет
и что будет дальше.

Сейчас

  • Сам агент только читает. Коммит всех изменений он может лишь предложить: 🌱 Twig показывает файлы и сообщение, а коммит и пуш случаются по вашей кнопке. Включается отдельно в Settings; частичного коммита и staging по ханкам нет.
  • Только локальный stdio-мост; HTTP-транспорта нет.
  • Выделение внутри экрана staging агенту не передаётся; выбора ветки и ханка в 🌱 Twig нет — эти поля всегда null.
  • Живьём проверено на macOS; Windows и Linux используют тот же код, но ещё не прогонялись.

Дальше

  • Другие инструменты записи — stage_hunk, create_branch — с тем же подтверждением в окне и тем же Undo, что у propose_commit.

MACOS / WINDOWS / LINUX

Скачайте 🌱 Twig
и включите MCP

MCP-сервер встроен в приложение: отдельная установка не нужна.

Версия 0.20.1Предварительная версия