shuzhi.zone

dowse: локальная альтернатива Sourcegraph и GitHub Code Search

dowse ищет код одновременно по множеству Git-репозиториев — как через настольное приложение, так и прямо из командной строки. Он делает для локальных клонов на вашем диске то же, что GitHub code search и grep.app делают для GitHub: одна строка поиска, все ваши репозитории и результат за считаные миллисекунды. dowse использует привычный синтаксис запросов GitHub code search, работает на базе открытого поискового движка tgrep от Microsoft с триграммным индексированием, хранит по отдельному индексу на каждый репозиторий на манер Zoekt и абсолютно не требует никакого сервера.

dowse ищет по 12 открытым репозиториям прямо во время ввода запроса: миллисекундный отклик, фильтрация по языку Rust через фасеты и табличный вывод

dowse работает под Windows, macOS и Linux. Он полностью бесплатен и распространяется под лицензией MIT.

Скачать последнюю версию

Нужный код редко лежит в одном репозитории

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

  • GitHub code search работает быстро и поддерживает отличный синтаксис, но ищет исключительно то, что загружено на GitHub, ограничен веткой по умолчанию каждого репозитория и отдает не более 100 результатов за запрос. Ветка с новой функциональностью, над которой вы трудитесь прямо сейчас, локальные незапушенные правки и репозитории на других хостингах туда попросту не попадают.
  • grep.app индексирует исключительно публичные репозитории на GitHub. Закрытый код вашей компании там не появится, да и не должен.
  • Sourcegraph — наиболее функциональная платформа для поиска по кодовой базе, поддерживающая семантическую навигацию и пакетные изменения (batch changes). Однако это тяжелое серверное решение: его необходимо развертывать, интегрировать с системами контроля версий и постоянно сопровождать. Для инженерного департамента крупной компании это оправданные затраты, но для отдельного разработчика с рабочим ноутбуком это неоправданно сложная инфраструктура ради поиска по локальным папкам.
  • Zoekt — триграммный движок, на котором построен поиск Sourcegraph. Он открыт и невероятно быстр, но тоже представляет собой комплекс из индексаторов и сервисов, которые нужно запускать, настраивать и снабжать данными.
  • Entrian Source Search добавляет полнотекстовый индекс в Visual Studio, однако жестко привязан к среде разработки и требует платной лицензии на каждого разработчика.
  • ripgrep и git grep не требуют никакой подготовки, но при каждом поиске заново считывают с диска каждый файл и работают только в пределах одного дерева каталогов. Когда репозиториев становится больше пятидесяти, мгновенный отклик исчезает.

Мне хотелось получить то, что дает поиск на github.com, но прямо на собственном жестком диске: по всем зеркалам на ветке main, по рабочим каталогам активной разработки и с учетом всех незакоммиченных изменений. Именно для этого и создан dowse.

Возможности dowse

Синтаксис GitHub code search по собственным локальным клонам

Запросы разбираются мгновенно прямо в процессе набора по правилам GitHub code search. Логика объединения условий работает на уровне файла, а не отдельной строки: например, запрос parse config найдет файлы, где оба этих слова встречаются в любом месте документа, и отобразит строки с совпадением любого из них.

parse config файлы, содержащие оба слова
parse OR config файлы, содержащие хотя бы одно из слов
parse NOT test содержат parse, но не содержат test
"fn main()" точное совпадение фразы
/fn \w+_test/ строка, подходящая под регулярное выражение
path:src/*.rs language:rust поиск по glob-путям и языку программирования
repo:api branch:main ограничение по репозиториям и веткам
-path:tests -lang:md исключение из результатов поиска

Если составить запрос только из квалификаторов (например, path:*.proto), dowse выведет список подходящих файлов мгновенно, даже не открывая их содержимое. Учет регистра, поиск целых слов и поддержка регулярных выражений переключаются горячими клавишами (Alt+C, Alt+W, Alt+R).

Результаты поиска в dowse по запросу trigram index -path:test по репозиториям tgrep, Zoekt, Google codesearch, Hound, Django и Go с фасетами по репозиториям, веткам, владельцам и языкам

Результаты выводятся в виде сниппетов с подсветкой синтаксиса через tree-sitter. Клик по строке открывает предпросмотр всего файла прямо рядом со списком найденного; клавиша F4 переключает совпадения по очереди, а по Ctrl+Click нужная строка сразу открывается в VS Code, Cursor, Zed или Sublime Text.

Панель предпросмотра dowse: файл cindex.go из Google codesearch рядом со списком результатов с подсветкой каждого совпадения

Теги задают область поиска, фасеты детализируют результаты

Рабочая область (workspace) объединяет набор репозиториев (по аналогии с рабочими областями в VS Code) и сохраняется в файле .dowse-workspace. Репозиториям можно назначать произвольные теги: простые вроде mirror или dev, либо пары «ключ-значение» вроде owner:alice или project:billing. Кроме того, каждому репозиторию автоматически присваивается тег текущей активной ветки branch:<имя>, который обновляется при ее переключении.

Панель области поиска позволяет выбирать теги для фильтрации. Теги внутри одной группы работают по правилу ИЛИ (owner:alice или owner:bob), а разные группы объединяются по правилу И (dev и owner:alice). После вывода результатов интерфейс, как и grep.app, строит фасетную статистику с подсчетом совпадений по репозиториям, веткам, тегам, языкам программирования и корневым каталогам — с пересчетом под все активные фильтры.

Табличный вид: именованные группы захвата regex как колонки таблицы

Табличный режим (Alt+T) отображает каждое найденное вхождение как отдельную строку таблицы: репозиторий, ветка, путь к файлу, строка, колонка, язык, совпавший фрагмент и вся строка целиком. Если в регулярном выражении запроса используются именованные группы захвата (named capture groups), каждая такая группа становится отдельной колонкой с соответствующим заголовком. Например, следующий запрос мгновенно формирует сводную таблицу всех версий крейтов во всех ваших проектах:

/^version = "(?<version>[^"]+)"/ path:Cargo.toml

Табличный вид в dowse: по строке на каждую версию в Cargo.toml для ripgrep, regex, tokio, serde и tgrep, с отдельной колонкой version из именованной группы захвата

В то время как GitHub code search ограничен первой сотней результатов, таблица dowse вмещает до 20 000 строк. Любую колонку можно отсортировать, а всю таблицу экспортировать в CSV, TSV, Markdown, JSON или скопировать прямо в электронную таблицу. Вопросы вроде «какие сервисы все еще обращаются к старому API?» или «какие уровни логирования где выставлены?» решаются просмотром одной структурированной таблицы вместо бесконечного скроллинга выдачи.

Клонирование организаций GitHub целиком и автоматическая синхронизация

Вкладка репозиториев получает список проектов пользователя или организации через официальный GitHub CLI, поэтому dowse вообще не взаимодействует с вашими учетными данными: достаточно один раз выполнить gh auth login в терминале. Запрос страниц идет параллельно, так что список даже из 2 000 репозиториев формируется за считаные секунды. Выберите несколько или сразу все найденные проекты, и dowse в фоновом режиме склонирует их по пути <папка>/<owner>/<name>, присвоит тег owner:<owner> и тут же проиндексирует.

По умолчанию клонирование выполняется в режиме без blob-объектов (blobless clones): скачивается вся история коммитов, но содержимое файлов загружается только для текущей рабочей ревизии. Благодаря этому даже огромные репозитории клонируются очень быстро, а история Git остается полностью функциональной.

Страница репозиториев dowse: двенадцать склонированных репозиториев GitHub с тегами веток, владельцев и зеркал, а также количеством проиндексированных файлов

Задайте репозиторию интервал обновления (15m, 1h, 3d), и dowse будет автоматически подтягивать изменения по расписанию. Операция pull выполняет fetch из origin и делает fast-forward только при соблюдении всех условий безопасности: активна ветка по умолчанию, отслеживаемые файлы не имеют локальных правок и нет невыгруженных локальных коммитов. Если хотя бы одно условие не выполнено, dowse ограничивается операцией fetch и сообщает понятную причину (on feature/x, not main, uncommitted changes). Приложение никогда не производит автоматических merge, rebase или stash, поэтому в него абсолютно безопасно добавлять не только зеркала, но и рабочие каталоги вашей повседневной разработки.

Движок tgrep: триграммный поиск от Microsoft

Сердцем dowse является tgrep — высокопроизводительный поисковый инструмент на основе триграммных индексов, который Microsoft открыла в этом году и который обеспечивает поиск кода в GitHub Copilot CLI. Триграммный индекс фиксирует, в каких файлах встречается каждая трехсимвольная последовательность. При поступлении запроса tgrep разбивает его на триграммы, берет пересечение их инвертированных списков и считывает с диска только те файлы, которые гарантированно могут содержать совпадение, после чего проверяет их полноценным regex-движком. По этому же принципу работают Zoekt и легендарный Google Code Search. В собственных бенчмарках Microsoft tgrep опередил ripgrep в 17 из 18 тестовых конфигураций (разные репозитории и платформы), показав ускорение вплоть до 51,9 раза.

Для иллюстраций к этой статье dowse проиндексировал 12 открытых проектов, склонированных с GitHub: tgrep, ripgrep, Zoekt, Google codesearch, Hound, tokio, serde, regex, VS Code, Django, FastAPI и Go — всего 45 629 файлов. Запрос trigram index -path:test нашел 72 файла в шести репозиториях; для этого dowse потребовалось прочитать с диска всего 73 файла, а общее время составило 10 мс. Таблица версий из Cargo.toml сформировалась за 3,2 мс. На еще более крупной кодовой базе из 42 000 файлов (1,3 ГБ исходного кода на Rust) построение индекса занимает около 6 секунд, а типичный поиск отрабатывает за 20–60 мс.

Сам по себе tgrep рассчитан на индексацию одного дерева каталогов и поиск по нему через консоль или локальный сервер. dowse объединяет множество независимых репозиториев за единым интерфейсом и добавляет все, что требуется для масштабной работы: поддержку синтаксиса GitHub, сквозные теги и фасеты, табличный вид, предпросмотр кода, а также клонирование и обновление с GitHub. Индексы полностью совместимы с форматом tgrep и лежат в каталоге .tgrep каждого репозитория — ровно там же, где их создают tgrep index и tgrep serve, благодаря чему dowse и CLI-утилита tgrep могут использовать общий индекс.

Актуальный индекс без длительных перестроений

Индекс полезен только тогда, когда он строго соответствует файлам на диске. Поэтому dowse не требует долгого полного перестроения:

  • Фоновый процесс отслеживания файлов (file watcher) для каждого репозитория фиксирует изменения с момента последней сборки индекса, и поисковые запросы сразу обращаются к измененным файлам. Любой git pull в зеркале или правка, сохраненная секунду назад в редакторе, мгновенно учитываются при следующем поиске.
  • При открытии репозитория dowse автоматически сканирует файлы, изменившиеся, удаленные или переименованные за время, пока приложение было закрыто.
  • Обновление индекса обрабатывает только модифицированные файлы и потоково вносит правки в копию индекса. В репозитории на 245 000 файлов с индексом объемом 1,7 ГБ такое обновление занимает порядка 10 секунд (вместо 9 минут на полную пересборку). При этом поиск продолжает работать без пауз прямо во время обновления.

Интерфейс приложения полностью нативный: он написан на GPUI — графическом фреймворке с аппаратным GPU-рендерингом, на котором построен редактор Zed. Никаких веб-оболочек или Electron здесь нет.

Командная строка для разработчиков и ИИ-агентов

Команды dowse search, dowse repos и другие обращаются напрямую к работающему настольному приложению, переиспользуя его горячие индексы в оперативной памяти и активные службы наблюдения за файлами. Если приложение еще не запущено, первая же консольная команда незаметно поднимет его в фоновом режиме без открытия окон.

Terminal window
dowse search 'parse_config lang:rust' # поиск по всем подключенным репозиториям
dowse search --here 'parse_config' # поиск только в текущем репозитории
dowse search -t owner:my-org -l 'LegacyClient' # только пути файлов, репозитории организации
dowse repos clone --from my-org --pull-every 1h

Формат консольного вывода оптимизирован как для людей, так и для ИИ-агентов написания кода (Claude Code, Codex, Cursor). Когда агент выполняет обычный grep по крупному проекту, он теряет время на дисковые операции и быстро забивает контекстное окно бесконечными простынями текста. tgrep решает первую проблему в GitHub Copilot CLI на уровне одного проекта; dowse предоставляет любому агенту такой же сверхбыстрый индекс сразу по всем локальным репозиториям с четким контролем объема вывода:

  • Результаты направляются в stdout; статистика, время выполнения и подсказки — в stderr. Код возврата равен 0 при наличии совпадений и 1, если ничего не найдено.

  • По умолчанию вывод ограничен 100 строками совпадений и не более 20 строк на один файл с итоговой сводкой внизу. При обрезке вывода в футере появляются конкретные предложения квалификаторов для сужения поиска с указанием количества файлов:

    narrow with: repo:api (120) language:Rust (80) path:src/** (64)
  • Флаг --json выводит объект по каждому найденному файлу и общую сводку; флаг --table csv печатает строки табличного представления в формате CSV.

  • Команда dowse guide выводит краткую инструкцию для агентов. Добавьте ее в свой AGENTS.md или CLAUDE.md, и ваш агент сможет искать по всем локальным репозиториям, а не только по той папке, где он был запущен.

КритерийdowsetgrepGitHub code searchSourcegraphZoektEntrian Source Search
Где работаетНа вашей машинеНа вашей машинеНа github.comНа вашем сервереНа вашем сервереВнутри Visual Studio
Область поискаМножество локальных клонов, любые ветки, незакоммиченные файлыОдно дерево каталоговРепозитории GitHub, только ветка по умолчаниюПодключенные Git-хостингиПроиндексированные репозиторииФайлы текущего решения (Solution)
СинтаксисGitHub code searchRegex, стиль grepGitHub code searchSourcegraphZoektEntrian
ИндексТриграммы (tgrep), постоянное автообновлениеТриграммыПроприетарный GitHubZoektТриграммыПолнотекстовый
ИнтерфейсДесктоп-приложение и CLICLI и локальный серверВебВебВеб и APIПанель в IDE
Цена и лицензияБесплатно, MITБесплатно, MITВходит в GitHubКоммерческий продуктБесплатно, Apache-2.0Платная лицензия на разработчика

Короткий вывод: если вам нужен максимально быстрый grep по одному репозиторию в консоли — выбирайте tgrep. Если команде требуется централизованный поиск по кодовой базе в браузере — разворачивайте Sourcegraph или Zoekt. Если весь код находится на GitHub и достаточно основной ветки — используйте GitHub code search. А если вам нужен мгновенный поиск по десяткам локальных репозиториев на вашей машине на любых ветках, с незакоммиченными правками, без поднятия серверов, с удобным десктопным интерфейсом и из терминала вашего ИИ-агента — для этого создан dowse.

Загрузка dowse

На странице релизов всегда доступны свежие готовые сборки с контрольными суммами в SHA256SUMS. Имена архивов строятся по схеме: dowse, номер версии и платформа:

ПлатформаАрхив
Windows (x64)…-windows-x86_64.zip
macOS 11+ (Apple silicon и Intel)…-macos-universal.zip
Linux (x64)…-linux-x86_64.tar.gz
Linux (arm64)…-linux-aarch64.tar.gz

После распаковки архива укажите пути к каталогам с вашими проектами:

Terminal window
dowse ~/src ~/mirrors

Если папка содержит несколько Git-репозиториев, dowse подключит их все автоматически. В Windows через страницу управления репозиториями можно также добавить пункт «Add to dowse» в контекстное меню папок Проводника.

Поскольку сборки открытого проекта не подписаны платным коммерческим сертификатом, при первом запуске Windows SmartScreen или macOS Gatekeeper могут показать предупреждение; в README подробно описано, как разрешить запуск. Для сборки из исходников запустите cargo run --release в среде со стабильным свежим компилятором Rust.

Часто задаваемые вопросы (FAQ)

Является ли dowse заменой Sourcegraph?

Для индивидуального разработчика, которому нужно искать по собственным локальным клонам — да. dowse полностью закрывает ключевой сценарий Sourcegraph: сверхбыстрый поиск по регулярным выражениям и точным строкам по десяткам репозиториев без поднятия сервера. При этом он не заменяет сложный анализ типов (code intelligence), пакетные правки кодовой базы (batch changes) или коллективный веб-интерфейс для крупных команд.

Является ли dowse просто графической оболочкой для tgrep?

Лишь отчасти. dowse использует формат индексов tgrep и работает с теми же каталогами .tgrep, выступая удобным графическим клиентом. Но сверх этого dowse умеет искать сразу по множеству репозиториев в одном запросе, понимает синтаксис GitHub code search, предоставляет систему тегов и фасетов, табличный вид, быстрый предпросмотр кода, а также автоматическое клонирование и фоновую синхронизацию с GitHub — всего этого в самом tgrep нет.

Чем dowse отличается от Zoekt?

Оба решения используют триграммный индекс. Zoekt задуман как долгоживущий серверный сервис, который необходимо непрерывно поддерживать и снабжать индексами из внешних процессов. dowse — это локальное приложение, которое само индексирует ваши репозитории на диске, поддерживает индекс в актуальном состоянии через file watcher и инкрементальные обновления, предлагая удобный графический интерфейс и продуманный CLI.

Да. dowse поддерживает основные конструкции GitHub code search: логические операторы AND, OR, NOT, фразы в кавычках, регулярные выражения /regex/, а также квалификаторы path:, language:, repo: и branch:, включая исключение через префикс -.

Ищет ли dowse по незакоммиченным правкам и другим веткам?

Да. Поиск идет непосредственно по файлам на диске, поэтому активная ветка и любые еще не сохраненные в Git изменения гарантированно попадают в результаты. Каждый репозиторий помечается тегом текущей ветки, поэтому запрос branch:main легко отфильтрует только основные ветки.

Есть ли альтернатива Entrian Source Search, работающая вне Visual Studio?

dowse — это не плагин к конкретной IDE, а самостоятельное приложение и консольная утилита. Найденные строки можно в один клик открыть в любимом редакторе — VS Code, Cursor, Zed или Sublime Text. Он ищет сразу по многим репозиториям, а не в рамках одного solution, и является полностью бесплатным и открытым.

Отправляет ли dowse мой код куда-либо по сети?

Нет. Индексы находятся исключительно в локальной папке .tgrep каждого репозитория, а все вычисления производятся только на вашем компьютере. Единственные сетевые запросы происходят исключительно тогда, когда вы сами запускаете операции Git или GitHub CLI (получение списка репозиториев организации, их первичное клонирование или плановый pull).


Проект dowse опубликован на GitHub. Если он помогает вам экономить время, звездочка в репозитории поможет другим разработчикам узнать о проекте. Если вы столкнулись с ошибкой или хотите предложить улучшение — создайте issue.