Вы охотитесь за каждым вызовом .unwrap() в Rust-кодовой базе, потому что наконец-то переходите на нормальную обработку ошибок. Делаете grep. Получаете 47 результатов.
Двенадцать — в комментариях (// don't unwrap here). Восемь — в строках ("call unwrap() to extract"). Три — имена переменных (let unwrap_result = ...). Настоящие вызовы методов, которые вы искали? Похоронены в шуме.
Текстовый поиск находит символы, а не смысл. Он не может отличить вызов метода от комментария, переменную от строкового литерала, Rust от Ruby. Он просто сопоставляет байты.
Octocode 0.14.0 решает это. Структурный поиск — сопоставление паттернов на основе AST, которое действительно понимает ваш код. Представьте себе grep, который знает, на что смотрит. Никаких дополнительных инструментов для установки. Никаких конфигов, с которыми надо бороться. Просто octocode grep — и вы сопоставляете структуру, а не строки.
Почему текстовый поиск не справляется
Текстовый поиск относится к коду как к любому другому текстовому файлу. Он не понимает, что $VAR.unwrap() должен соответствовать реальному вызову метода на Result или Option — а не подстроке, спрятанной в комментарии документации.
Структурный поиск знает разницу. Он работает с абстрактным синтаксическим деревом — тем же представлением, что использует ваш компилятор — поэтому паттерны сопоставляются с реальными структурами кода, а не с последовательностями символов.
Вы находите то, что искали. Без ложных срабатываний. Без шума. Только тот код, который имеет значение.
Знакомьтесь: octocode grep
# Найти все вызовы unwrap() в Rust
octocode grep '$VAR.unwrap()' --lang rust
# Найти паттерны конструкторов в JavaScript
octocode grep 'new $CLASS($$$ARGS)' --lang javascript
# Найти паттерны обработки ошибок в Go
octocode grep 'if err != nil { $$$ }' --lang go
Синтаксис паттернов прост:
$VAR— любой одиночный узел AST (выражение, идентификатор, что угодно)$$$ARGS— ноль или более узлов (аргументы функции, блоки инструкций)- Литеральный код — точное совпадение структуры
Поддерживается 13 языков: Rust, JavaScript, TypeScript, Python, Go, Java, C/C++, PHP, Ruby, Lua, Bash, CSS, JSON.
Не только поиск — но и rewrite
Вот где становится интересно. Структурный поиск — это не только для поиска, но и для рефакторинга.
# Предпросмотр: заменить unwrap() на expect() по всей кодовой базе
octocode grep '$FUNC.unwrap()' \
--lang rust \
--rewrite '$FUNC.expect("reason")'
# Применить изменения на месте
octocode grep '$FUNC.unwrap()' \
--lang rust \
--rewrite '$FUNC.expect("reason")' \
--update-all
Шаблон --rewrite использует метапеременные из вашего поискового паттерна. $FUNC в переписывании заменяется на то, что совпало с $FUNC в поиске. Хирургический рефакторинг — точный, автоматизированный и безопасный.
Почему это важно для ИИ: Когда Claude или Cursor предлагает «нам стоит заменить все эти вызовы unwrap на нормальную обработку ошибок», теперь он может действительно сделать это — не просто описать изменение, а сгенерировать точную команду, чтобы воплотить его в жизнь.
Создано для ИИ-агентов (без дополнительной настройки)
Структурный поиск доступен как MCP-инструмент structural_search. Ваш ИИ-ассистент может использовать его напрямую:
{
"name": "structural_search",
"description": "AST-based structural code search using ast-grep patterns"
}
Другие инструменты AST-поиска требуют отдельной установки и настройки. Структурный поиск Octocode работает сразу. Никакого CLI sg для установки. Никаких файлов правил. Никакого YAML. Паттерн идёт прямо в запросе.
ИИ-агенты лучше всего работают с меньшим количеством движущихся частей. Каждая внешняя зависимость — точка отказа. Каждый конфигурационный файл — трение. Структурный поиск в Octocode просто... есть. Готов.
Что ещё нового в 0.14.0
Унифицированная архитектура поиска
Мы переписали систему поиска с нуля. Дельта-индексация с учётом веток означает, что поиск по фича-ветвям теперь корректно объединяет результаты с основным индексом — вы видите то, что есть в вашей текущей ветке, плюс релевантный контекст из main. Унифицированная архитектура также приносит покрытие тестами там, где его раньше не было.
Больше моделей эмбеддингов
Добавлена поддержка эмбеддингов MPNet и JinaBERT QK — высокопроизводительных моделей, бьющих выше своей весовой категории. Для команд, следящих за затратами на API, они дают качественные результаты поиска с меньшими и более быстрыми моделями.
Улучшения MCP-сервера
- Улучшенные схемы инструментов — лучшие структурированные выходные данные для потребления ИИ
- Автоматическая индексация репозиториев — MCP-сервер теперь может запускать индексацию автоматически при обнаружении непроиндексированных репозиториев
- Улучшенный транспортный слой — миграция на официальный SDK
rmcpдля лучшей стабильности
Надёжность при масштабировании
- Строгие структурированные выходные данные LLM — режим JSON с валидацией обеспечивает корректный парсинг ответов ИИ
- Автоматические повторы — пакетные операции повторяются при временных сбоях
- Лучшая пакетная обработка — улучшенная эффективность памяти для больших кодовых баз
Команды clear получают больше возможностей
Команда clear теперь поддерживает целевую очистку:
# Очистить только индекс коммитов
octocode clear --mode commits
# Очистить только данные GraphRAG
octocode clear --mode graphrag
Попробуйте сейчас
Обновитесь до 0.14.0:
# Homebrew
brew upgrade octocode
# Или переустановите через универсальный установщик
curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh
Затем попробуйте структурный поиск на своей кодовой базе:
# Найти паттерны, заслуживающие рефакторинга
octocode grep 'console.log($ARG)' --lang javascript
# Проверить пробелы в обработке ошибок
octocode grep '$VAR.unwrap()' --lang rust
# Найти паттерны внедрения через конструктор
octocode grep 'new $CLASS($$$)' --lang typescript
FAQ
Чем структурный поиск отличается от регулярных выражений?
Регулярные выражения сопоставляют символы. Структурный поиск сопоставляет узлы AST. $VAR.unwrap() находит реальные вызовы методов, а не комментарии, содержащие эту строку, не имена переменных, в которых случайно есть «unwrap», не примеры из документации. Он понимает структуру кода, потому что разбирает код тем же способом, что и ваш компилятор.
Нужно ли мне устанавливать что-то ещё?
Нет. Структурный поиск встроен в Octocode 0.14.0. Никаких отдельных CLI-инструментов, никаких конфигурационных файлов, никаких YAML-определений правил. Команда octocode grep работает сразу после обновления.
Можно ли использовать это с Claude, Cursor или другими ИИ-ассистентами?
Да. Структурный поиск доступен как MCP-инструмент. Любой MCP-совместимый ассистент может вызывать его напрямую. Схема инструмента включает язык паттернов, поэтому ИИ-ассистенты понимают, как строить корректные запросы.
Какие языки поддерживаются?
Rust, JavaScript, TypeScript, Python, Go, Java, C/C++, PHP, Ruby, Lua, Bash, CSS и JSON. Лежащий в основе движок использует грамматики Tree-sitter, поэтому добавить новые языки несложно, если вам нужен какой-то, которого нет в списке.
Как работает --rewrite?
Шаблон переписывания использует метапеременные из вашего поискового паттерна. Если ваш поиск — $FUNC.unwrap() и он находит result.unwrap(), то $FUNC захватывает result. Переписывание $FUNC.expect("reason") становится result.expect("reason"). Запустите с --update-all, чтобы применить изменения на месте, или без него, чтобы сначала посмотреть предпросмотр.
Безопасно ли запускать это на продакшен-коде?
Всегда просматривайте изменения перед их применением. Структурный поиск точен, но точность не означает, что трансформация семантически корректна для вашего случая. Просматривайте вывод --rewrite, запускайте тесты, сначала делайте коммит в git. Инструмент хирургический — вы сами отвечаете за понимание того, чего должна достичь операция.
Какая у него производительность?
Быстрая. Парсинг AST выполняется через Tree-sitter, который разработан для отзывчивости редактора. Поиск по кодовой базе в 100 000 строк занимает секунды, а не минуты. Поиск распараллелен по файлам, а инкрементальная индексация означает, что последующие поиски быстрее.
Как это сочетается с другими возможностями Octocode?
Структурный поиск дополняет семантический поиск и GraphRAG. Используйте семантический поиск, когда знаете, что ищете, но не где ("how does authentication work?"). Используйте структурный поиск, когда знаете паттерн ($USER.auth($TOKEN)). Используйте GraphRAG, когда нужно понять отношения между файлами. Вместе они покрывают весь спектр исследования кода.
Что дальше
Мы строим в одном направлении: сделать кодовые базы полностью понятными для ИИ. Структурный поиск — последняя часть, но впереди ещё многое.
Паттерны рефакторинга по нескольким файлам. Отслеживание символов между языками. Более глубокая интеграция MCP, чтобы ИИ-ассистенты могли не только находить код, но и преобразовывать его уверенно.
Если вы используете Octocode — обновляйтесь до 0.14.0 и попробуйте octocode grep на своей кодовой базе. Если ещё не используете — берите здесь. Это открытый исходный код, работает локально, и это то, что мы используем каждый день для разработки Octomind.
Octocode — open source (Apache 2.0), доступен на github.com/Muvon/octocode. Сделано Muvon.



