Как AI-расширения для VS Code работают с кодовой базой
Содержание
На одном из воркшопов на конференции GoCloud мы использовали расширение Roo Code для VS Code. И из всего, что там было, меня сильнее всего зацепила одна штука: индексация кодовой базы - то есть заранее подготовленная карта проекта для поиска и навигации.
До этого я уже использовал Cline, Continue и KiloCode. Но именно в Roo Code индексация выглядит как отдельный слой - то есть как самостоятельная подсистема, которая живет между запросами, а не собирается заново по ходу каждого ответа.
Три подхода⌗
Если сравнить Cline, Continue, Roo Code и KiloCode, видно три разных архитектурных подхода.
- Прямой обход репозитория без отдельного индекса. Расширение не держит отдельный долговременный индекс. На каждый запрос оно заново использует файловую структуру, поиск по шаблону или регулярным выражениям, чтение файлов и синтаксический разбор через
Tree-sitterилиLSP- стандартный протокол, через который редактор общается с языковыми серверами и получает данные о символах, определениях и ссылках. По такой схеме работаетCline. - Локальный индекс внутри расширения. Расширение заранее строит и хранит данные о кодовой базе между запросами: фрагменты кода, полнотекстовый индекс, векторные представления - числовые представления смысла кода для семантического поиска, - кэш, отслеживание изменений файлов. Внутри такого стека обычно появляются SQLite FTS5,
LanceDB,QdrantиTree-sitter. Это архитектураContinueиRoo Code. При этомContinueделает гибридный индекс: полнотекстовый ищет по буквальному совпадению, а семантический - по смысловой близости.Roo Codeиспользует локальный семантический индекс сQdrantкак векторным хранилищем. - Внешняя служба поиска. Расширение само не держит основной индекс, а обращается к внешнему поисковому сервису. В этом случае локально можно видеть только клиентскую часть, а сама индексация и поиск вынесены наружу. Это текущая архитектура
KiloCode, если смотреть на основной репозиторий.
Как это устроено в конкретных расширениях⌗
По Cline в документации репозитория и в пошаговом руководстве сказано, что расширение начинает работу с анализа файловой структуры, синтаксических деревьев, регулярного поиска и чтения релевантных файлов. По открытому коду также видно использование веб-версии Tree-sitter и готовых WASM-грамматик - скомпилированных описаний синтаксиса языков, которые можно загружать и выполнять прямо внутри расширения - для извлечения верхнеуровневых определений.
Это сильный структурный анализ проекта. Но признаков отдельного долговременного индекса, семантического поиска по векторным представлениям или векторной базы данных вроде Qdrant я не нашел.
У Continue картина другая. В руководстве по работе с кодовой базой и в описании подсистемы индексации прямо фигурируют поиск по кодовой базе и несколько типов индексов: фрагменты кода на основе Tree-sitter, полнотекстовый индекс на SQLite FTS5, а также векторный поиск на LanceDB / vectordb.
То есть у Continue уже гибридная схема: полнотекстовый поиск плюс семантический поиск по векторным представлениям. Отдельный слой индексации там есть, просто он построен не на Qdrant, а на LanceDB и SQLite.
У KiloCode картина уже другая. На официальном сайте документации Kilo Codebase Indexing прямо помечен как Legacy, а на странице What’s New in Kilo Code отдельно сказано: Code indexing is temporarily unavailable in the new extension. При этом для текущего расширения основной поиск по кодовой базе уже завязан на внешний сервис Morph. Этот случай я отдельно разберу ниже.
С самим Roo Code картина самая простая. В открытом репозитории видно локальный стек: Tree-sitter, разбиение кода на фрагменты, построение векторных представлений, хранение в Qdrant, кэш и обновление индекса при изменении файлов.
Подробнее про KiloCode⌗
С KiloCode важнее всего не запутаться между legacy-схемой и текущей архитектурой. На официальном сайте документации Kilo Codebase Indexing уже помечен как Legacy, и там же есть плашка: This page applies to the legacy VSCode extension. А на странице What’s New in Kilo Code отдельно сказано: Code indexing is temporarily unavailable in the new extension. То есть в официальных источниках прямо сказано: в новом расширении от старой локальной схемы ушли.
При этом в репозиторной документации по Codebase Indexing по-прежнему описан локальный стек на Tree-sitter, векторных представлениях и Qdrant. Но в отдельном документе про Codebase Indexing & Semantic Search прямо сказано, что основные точки реализации лежат в kilocode-legacy, а не в текущем расширении.
В текущем расширении поиск по кодовой базе завязан на внешний сервис Morph. По коду видно использование @morphllm/morphsdk и WarpGrep - внешнего поискового компонента Morph для работы по кодовой базе. При этом документация WarpGrep отдельно подчеркивает, что это не embeddings-индекс и не локальная индексация, а внешний поисковый агент, работающий через API и локальные вызовы ripgrep - консольного инструмента для быстрого поиска по тексту в файлах.
С конфигурацией тоже есть расхождение. В новом UI KiloCode провайдер Morph существует как обычный provider, но сам codebase_search включается отдельно через experimental.codebase_search, а ключ читается напрямую из MORPH_API_KEY. Если ключа нет, используется прокси Kilo.
С оплатой и данными прозрачность неполная. По коду видно, что после бесплатного периода нужен ключ Morph, но в пользовательской документации KiloCode я не нашел внятного объяснения, кто именно оплачивает поиск в промежуточной схеме с прокси Kilo. По документации WarpGrep поиск не выглядит как предварительная выгрузка всей кодовой базы во внешний сервис, но запрос, структура репозитория и найденные кодовые фрагменты передаются во внешний API Morph.
Явное предупреждение для пользователя тоже вижу только частично: codebase_search помечен как экспериментальный и контролируется системой разрешений, но явного текста про внешний сервис Morph и его условия хранения данных я не нашел. Это важно, потому что политика конфиденциальности Morph и условия использования Morph описывают отдельный режим обработки данных: на бесплатном тарифе данные могут храниться до 90 дней, на платном - до 30 дней, а режим zero retention - без хранения данных после обработки - доступен только для enterprise.
Если сжать это в одну таблицу⌗
| Инструмент | Тип архитектуры | Подтвержденные подходы и библиотеки | Архитектурный вывод |
|---|---|---|---|
Roo Code |
Локальный индекс внутри расширения | Tree-sitter, разбиение кода на фрагменты, векторные представления, Qdrant, кэш, отслеживание изменений файлов |
Цельный локальный индекс: синтаксический разбор -> фрагменты -> векторные представления -> семантический поиск |
Cline |
Навигация по живому репозиторию | Анализ файловой структуры, регулярный поиск, чтение файлов, Tree-sitter для извлечения верхнеуровневых определений |
Сильный структурный анализ проекта без отдельного слоя индексации |
Continue |
Локальный индекс внутри расширения | Tree-sitter, SQLite FTS5, LanceDB / vectordb, векторные представления, полнотекстовый и семантический поиск |
Гибридный локальный индекс: полнотекстовый поиск плюс семантический |
KiloCode |
Внешняя служба поиска | В документации: Tree-sitter, векторные представления, Qdrant; в текущем расширении: внешний поиск через Morph WarpGrep; в kilocode-legacy: локальный индекс с Qdrant и LanceDB |
Переходная схема: документация и legacy-репозиторий описывают локальный индекс, текущее расширение опирается на внешний сервис поиска |
Вывод⌗
Главный вывод для меня здесь не в том, какое расширение “лучше”.
Под одинаковой формулировкой “умеет работать с кодовой базой” у разных инструментов могут скрываться принципиально разные ограничения и возможности. Где-то все держится на прямом обходе репозитория, где-то на локальном индексе, а где-то поиск уже вынесен во внешний сервис.
Это влияет не только на качество ответа агента на вопросы о кодовой базе, но и на настройку, стоимость, приватность и предсказуемость поведения инструмента. Поэтому в таких расширениях меня интересует не только наличие этой функции, а то, как она устроена под капотом.