<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vscode on Михаил Ледин</title>
    <link>https://blog.ledin.pro/ru/tags/vscode/</link>
    <description>Recent content in Vscode on Михаил Ледин</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru-RU</language>
    <managingEditor>m@ledin.pro (Михаил Ледин)</managingEditor>
    <webMaster>m@ledin.pro (Михаил Ледин)</webMaster>
    <lastBuildDate>Wed, 15 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.ledin.pro/ru/tags/vscode/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Как AI-расширения для VS Code работают с кодовой базой</title>
      <link>https://blog.ledin.pro/ru/posts/codebase-indexing-in-vscode-extensions/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      <author>m@ledin.pro (Михаил Ледин)</author>
      <guid>https://blog.ledin.pro/ru/posts/codebase-indexing-in-vscode-extensions/</guid>
      <description>&lt;p&gt;На одном из воркшопов на конференции GoCloud мы использовали расширение &lt;a href=&#34;https://github.com/RooCodeInc/Roo-Code&#34;&gt;&lt;code&gt;Roo Code&lt;/code&gt;&lt;/a&gt; для VS Code. И из всего, что там было, меня сильнее всего зацепила одна штука: индексация кодовой базы - то есть заранее подготовленная карта проекта для поиска и навигации.&lt;/p&gt;</description>
      <content>&lt;p&gt;На одном из воркшопов на конференции GoCloud мы использовали расширение &lt;a href=&#34;https://github.com/RooCodeInc/Roo-Code&#34;&gt;&lt;code&gt;Roo Code&lt;/code&gt;&lt;/a&gt; для VS Code. И из всего, что там было, меня сильнее всего зацепила одна штука: индексация кодовой базы - то есть заранее подготовленная карта проекта для поиска и навигации.&lt;/p&gt;
&lt;p&gt;До этого я уже использовал &lt;a href=&#34;https://github.com/cline/cline&#34;&gt;&lt;code&gt;Cline&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/continuedev/continue&#34;&gt;&lt;code&gt;Continue&lt;/code&gt;&lt;/a&gt; и &lt;a href=&#34;https://github.com/Kilo-Org/kilocode&#34;&gt;&lt;code&gt;KiloCode&lt;/code&gt;&lt;/a&gt;. Но именно в &lt;code&gt;Roo Code&lt;/code&gt; индексация выглядит как отдельный слой - то есть как самостоятельная подсистема, которая живет между запросами, а не собирается заново по ходу каждого ответа.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;три-подхода&#34;&gt;Три подхода&lt;/h2&gt;
&lt;p&gt;Если сравнить &lt;code&gt;Cline&lt;/code&gt;, &lt;code&gt;Continue&lt;/code&gt;, &lt;code&gt;Roo Code&lt;/code&gt; и &lt;code&gt;KiloCode&lt;/code&gt;, видно три разных архитектурных подхода.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Прямой обход репозитория без отдельного индекса. Расширение не держит отдельный долговременный индекс. На каждый запрос оно заново использует файловую структуру, поиск по шаблону или регулярным выражениям, чтение файлов и синтаксический разбор через &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter&#34;&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;&lt;/a&gt; или &lt;code&gt;LSP&lt;/code&gt; - стандартный протокол, через который редактор общается с языковыми серверами и получает данные о символах, определениях и ссылках. По такой схеме работает &lt;code&gt;Cline&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Локальный индекс внутри расширения. Расширение заранее строит и хранит данные о кодовой базе между запросами: фрагменты кода, полнотекстовый индекс, векторные представления - числовые представления смысла кода для семантического поиска, - кэш, отслеживание изменений файлов. Внутри такого стека обычно появляются SQLite FTS5, &lt;a href=&#34;https://github.com/lancedb/lancedb&#34;&gt;&lt;code&gt;LanceDB&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;&lt;code&gt;Qdrant&lt;/code&gt;&lt;/a&gt; и &lt;code&gt;Tree-sitter&lt;/code&gt;. Это архитектура &lt;code&gt;Continue&lt;/code&gt; и &lt;code&gt;Roo Code&lt;/code&gt;. При этом &lt;code&gt;Continue&lt;/code&gt; делает гибридный индекс: полнотекстовый ищет по буквальному совпадению, а семантический - по смысловой близости. &lt;code&gt;Roo Code&lt;/code&gt; использует локальный семантический индекс с &lt;code&gt;Qdrant&lt;/code&gt; как векторным хранилищем.&lt;/li&gt;
&lt;li&gt;Внешняя служба поиска. Расширение само не держит основной индекс, а обращается к внешнему поисковому сервису. В этом случае локально можно видеть только клиентскую часть, а сама индексация и поиск вынесены наружу. Это текущая архитектура &lt;code&gt;KiloCode&lt;/code&gt;, если смотреть на основной репозиторий.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;как-это-устроено-в-конкретных-расширениях&#34;&gt;Как это устроено в конкретных расширениях&lt;/h2&gt;
&lt;p&gt;По &lt;a href=&#34;https://github.com/cline/cline&#34;&gt;&lt;code&gt;Cline&lt;/code&gt;&lt;/a&gt; в &lt;a href=&#34;https://github.com/cline/cline/blob/main/README.md&#34;&gt;документации репозитория&lt;/a&gt; и &lt;a href=&#34;https://github.com/cline/cline/blob/main/walkthrough/step2.md&#34;&gt;в пошаговом руководстве&lt;/a&gt; сказано, что расширение начинает работу с анализа файловой структуры, синтаксических деревьев, регулярного поиска и чтения релевантных файлов. По открытому коду также видно использование веб-версии &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter&#34;&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;&lt;/a&gt; и готовых WASM-грамматик - скомпилированных описаний синтаксиса языков, которые можно загружать и выполнять прямо внутри расширения - для извлечения верхнеуровневых определений.&lt;/p&gt;
&lt;p&gt;Это сильный структурный анализ проекта. Но признаков отдельного долговременного индекса, семантического поиска по векторным представлениям или векторной базы данных вроде &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;&lt;code&gt;Qdrant&lt;/code&gt;&lt;/a&gt; я не нашел.&lt;/p&gt;
&lt;p&gt;У &lt;a href=&#34;https://github.com/continuedev/continue&#34;&gt;&lt;code&gt;Continue&lt;/code&gt;&lt;/a&gt; картина другая. В &lt;a href=&#34;https://github.com/continuedev/continue/blob/main/docs/guides/codebase-documentation-awareness.mdx&#34;&gt;руководстве по работе с кодовой базой&lt;/a&gt; и &lt;a href=&#34;https://github.com/continuedev/continue/blob/main/core/indexing/README.md&#34;&gt;в описании подсистемы индексации&lt;/a&gt; прямо фигурируют поиск по кодовой базе и несколько типов индексов: фрагменты кода на основе &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter&#34;&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;&lt;/a&gt;, полнотекстовый индекс на SQLite FTS5, а также векторный поиск на &lt;a href=&#34;https://github.com/lancedb/lancedb&#34;&gt;&lt;code&gt;LanceDB&lt;/code&gt;&lt;/a&gt; / &lt;code&gt;vectordb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;То есть у &lt;code&gt;Continue&lt;/code&gt; уже гибридная схема: полнотекстовый поиск плюс семантический поиск по векторным представлениям. Отдельный слой индексации там есть, просто он построен не на &lt;code&gt;Qdrant&lt;/code&gt;, а на &lt;code&gt;LanceDB&lt;/code&gt; и SQLite.&lt;/p&gt;
&lt;p&gt;У &lt;a href=&#34;https://github.com/Kilo-Org/kilocode&#34;&gt;&lt;code&gt;KiloCode&lt;/code&gt;&lt;/a&gt; картина уже другая. На &lt;a href=&#34;https://kilo.ai/docs/customize/context/codebase-indexing&#34;&gt;официальном сайте документации Kilo&lt;/a&gt; &lt;code&gt;Codebase Indexing&lt;/code&gt; прямо помечен как &lt;code&gt;Legacy&lt;/code&gt;, а на странице &lt;a href=&#34;https://kilo.ai/docs/code-with-ai/platforms/vscode/whats-new&#34;&gt;What&amp;rsquo;s New in Kilo Code&lt;/a&gt; отдельно сказано: &lt;code&gt;Code indexing is temporarily unavailable in the new extension.&lt;/code&gt; При этом для текущего расширения основной поиск по кодовой базе уже завязан на внешний сервис Morph. Этот случай я отдельно разберу ниже.&lt;/p&gt;
&lt;p&gt;С самим &lt;a href=&#34;https://github.com/RooCodeInc/Roo-Code&#34;&gt;&lt;code&gt;Roo Code&lt;/code&gt;&lt;/a&gt; картина самая простая. В открытом репозитории видно локальный стек: &lt;code&gt;Tree-sitter&lt;/code&gt;, разбиение кода на фрагменты, построение векторных представлений, хранение в &lt;code&gt;Qdrant&lt;/code&gt;, кэш и обновление индекса при изменении файлов.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;подробнее-про-kilocode&#34;&gt;Подробнее про KiloCode&lt;/h2&gt;
&lt;p&gt;С &lt;a href=&#34;https://github.com/Kilo-Org/kilocode&#34;&gt;&lt;code&gt;KiloCode&lt;/code&gt;&lt;/a&gt; важнее всего не запутаться между legacy-схемой и текущей архитектурой. На &lt;a href=&#34;https://kilo.ai/docs/customize/context/codebase-indexing&#34;&gt;официальном сайте документации Kilo&lt;/a&gt; &lt;code&gt;Codebase Indexing&lt;/code&gt; уже помечен как &lt;code&gt;Legacy&lt;/code&gt;, и там же есть плашка: &lt;code&gt;This page applies to the legacy VSCode extension.&lt;/code&gt; А на странице &lt;a href=&#34;https://kilo.ai/docs/code-with-ai/platforms/vscode/whats-new&#34;&gt;What&amp;rsquo;s New in Kilo Code&lt;/a&gt; отдельно сказано: &lt;code&gt;Code indexing is temporarily unavailable in the new extension.&lt;/code&gt; То есть в официальных источниках прямо сказано: в новом расширении от старой локальной схемы ушли.&lt;/p&gt;
&lt;p&gt;При этом в &lt;a href=&#34;https://github.com/Kilo-Org/kilocode/blob/main/packages/kilo-docs/pages/customize/context/codebase-indexing.md&#34;&gt;репозиторной документации по Codebase Indexing&lt;/a&gt; по-прежнему описан локальный стек на &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter&#34;&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;&lt;/a&gt;, векторных представлениях и &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;&lt;code&gt;Qdrant&lt;/code&gt;&lt;/a&gt;. Но &lt;a href=&#34;https://github.com/Kilo-Org/kilocode/blob/main/packages/kilo-vscode/docs/non-agent-features/codebase-indexing-semantic-search.md&#34;&gt;в отдельном документе про Codebase Indexing &amp;amp; Semantic Search&lt;/a&gt; прямо сказано, что основные точки реализации лежат в &lt;a href=&#34;https://github.com/Kilo-Org/kilocode-legacy&#34;&gt;&lt;code&gt;kilocode-legacy&lt;/code&gt;&lt;/a&gt;, а не в текущем расширении.&lt;/p&gt;
&lt;p&gt;В текущем расширении поиск по кодовой базе завязан на внешний сервис Morph. По коду видно использование &lt;a href=&#34;https://www.npmjs.com/package/@morphllm/morphsdk&#34;&gt;&lt;code&gt;@morphllm/morphsdk&lt;/code&gt;&lt;/a&gt; и WarpGrep - внешнего поискового компонента Morph для работы по кодовой базе. При этом &lt;a href=&#34;https://docs.morphllm.com/sdk/components/warp-grep/index&#34;&gt;документация WarpGrep&lt;/a&gt; отдельно подчеркивает, что это не embeddings-индекс и не локальная индексация, а внешний поисковый агент, работающий через API и локальные вызовы &lt;code&gt;ripgrep&lt;/code&gt; - консольного инструмента для быстрого поиска по тексту в файлах.&lt;/p&gt;
&lt;p&gt;С конфигурацией тоже есть расхождение. В новом UI &lt;code&gt;KiloCode&lt;/code&gt; провайдер &lt;code&gt;Morph&lt;/code&gt; существует как обычный provider, но сам &lt;code&gt;codebase_search&lt;/code&gt; включается отдельно через &lt;code&gt;experimental.codebase_search&lt;/code&gt;, а ключ читается напрямую из &lt;code&gt;MORPH_API_KEY&lt;/code&gt;. Если ключа нет, используется прокси Kilo.&lt;/p&gt;
&lt;p&gt;С оплатой и данными прозрачность неполная. По коду видно, что после бесплатного периода нужен ключ Morph, но в пользовательской документации &lt;code&gt;KiloCode&lt;/code&gt; я не нашел внятного объяснения, кто именно оплачивает поиск в промежуточной схеме с прокси Kilo. По &lt;a href=&#34;https://docs.morphllm.com/guides/warp-grep-python&#34;&gt;документации WarpGrep&lt;/a&gt; поиск не выглядит как предварительная выгрузка всей кодовой базы во внешний сервис, но запрос, структура репозитория и найденные кодовые фрагменты передаются во внешний API Morph.&lt;/p&gt;
&lt;p&gt;Явное предупреждение для пользователя тоже вижу только частично: &lt;code&gt;codebase_search&lt;/code&gt; помечен как экспериментальный и контролируется системой разрешений, но явного текста про внешний сервис Morph и его условия хранения данных я не нашел. Это важно, потому что &lt;a href=&#34;https://morphllm.com/privacy&#34;&gt;политика конфиденциальности Morph&lt;/a&gt; и &lt;a href=&#34;https://morphllm.com/privacy/tos&#34;&gt;условия использования Morph&lt;/a&gt; описывают отдельный режим обработки данных: на бесплатном тарифе данные могут храниться до 90 дней, на платном - до 30 дней, а режим &lt;code&gt;zero retention&lt;/code&gt; - без хранения данных после обработки - доступен только для enterprise.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;если-сжать-это-в-одну-таблицу&#34;&gt;Если сжать это в одну таблицу&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Инструмент&lt;/th&gt;
          &lt;th&gt;Тип архитектуры&lt;/th&gt;
          &lt;th&gt;Подтвержденные подходы и библиотеки&lt;/th&gt;
          &lt;th&gt;Архитектурный вывод&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/RooCodeInc/Roo-Code&#34;&gt;&lt;code&gt;Roo Code&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Локальный индекс внутри расширения&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;, разбиение кода на фрагменты, векторные представления, &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;&lt;code&gt;Qdrant&lt;/code&gt;&lt;/a&gt;, кэш, отслеживание изменений файлов&lt;/td&gt;
          &lt;td&gt;Цельный локальный индекс: синтаксический разбор -&amp;gt; фрагменты -&amp;gt; векторные представления -&amp;gt; семантический поиск&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/cline/cline&#34;&gt;&lt;code&gt;Cline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Навигация по живому репозиторию&lt;/td&gt;
          &lt;td&gt;Анализ файловой структуры, регулярный поиск, чтение файлов, &lt;code&gt;Tree-sitter&lt;/code&gt; для извлечения верхнеуровневых определений&lt;/td&gt;
          &lt;td&gt;Сильный структурный анализ проекта без отдельного слоя индексации&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/continuedev/continue&#34;&gt;&lt;code&gt;Continue&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Локальный индекс внутри расширения&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Tree-sitter&lt;/code&gt;, SQLite FTS5, &lt;a href=&#34;https://github.com/lancedb/lancedb&#34;&gt;&lt;code&gt;LanceDB&lt;/code&gt;&lt;/a&gt; / &lt;code&gt;vectordb&lt;/code&gt;, векторные представления, полнотекстовый и семантический поиск&lt;/td&gt;
          &lt;td&gt;Гибридный локальный индекс: полнотекстовый поиск плюс семантический&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/Kilo-Org/kilocode&#34;&gt;&lt;code&gt;KiloCode&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Внешняя служба поиска&lt;/td&gt;
          &lt;td&gt;В документации: &lt;code&gt;Tree-sitter&lt;/code&gt;, векторные представления, &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;&lt;code&gt;Qdrant&lt;/code&gt;&lt;/a&gt;; в текущем расширении: внешний поиск через &lt;a href=&#34;https://docs.morphllm.com/sdk/components/warp-grep/index&#34;&gt;Morph WarpGrep&lt;/a&gt;; в &lt;code&gt;kilocode-legacy&lt;/code&gt;: локальный индекс с &lt;code&gt;Qdrant&lt;/code&gt; и &lt;code&gt;LanceDB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Переходная схема: документация и legacy-репозиторий описывают локальный индекс, текущее расширение опирается на внешний сервис поиска&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;вывод&#34;&gt;Вывод&lt;/h2&gt;
&lt;p&gt;Главный вывод для меня здесь не в том, какое расширение “лучше”.&lt;/p&gt;
&lt;p&gt;Под одинаковой формулировкой “умеет работать с кодовой базой” у разных инструментов могут скрываться принципиально разные ограничения и возможности. Где-то все держится на прямом обходе репозитория, где-то на локальном индексе, а где-то поиск уже вынесен во внешний сервис.&lt;/p&gt;
&lt;p&gt;Это влияет не только на качество ответа агента на вопросы о кодовой базе, но и на настройку, стоимость, приватность и предсказуемость поведения инструмента. Поэтому в таких расширениях меня интересует не только наличие этой функции, а то, как она устроена под капотом.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
