# Octocode 0.14.0: Структурный поиск меняет то, как ИИ понимает ваш код

> Сопоставление паттернов на основе AST, понимающее синтаксис кода, а не просто символы. Встроено в Octocode — никаких дополнительных инструментов, никаких конфигурационных файлов, только `octocode grep`.

Вы охотитесь за каждым вызовом `.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`

```bash
# Найти все вызовы 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

Вот где становится интересно. Структурный поиск — это не только для поиска, но и для рефакторинга.

```bash
# Предпросмотр: заменить 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`. Ваш ИИ-ассистент может использовать его напрямую:

```json
{
	"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` теперь поддерживает целевую очистку:

```bash
# Очистить только индекс коммитов
octocode clear --mode commits

# Очистить только данные GraphRAG
octocode clear --mode graphrag
```

---

## Попробуйте сейчас

Обновитесь до 0.14.0:

```bash
# Homebrew
brew upgrade octocode

# Или переустановите через универсальный установщик
curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh
```

Затем попробуйте структурный поиск на своей кодовой базе:

```bash
# Найти паттерны, заслуживающие рефакторинга
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` на своей кодовой базе. Если ещё не используете — [берите здесь](https://github.com/Muvon/octocode). Это открытый исходный код, работает локально, и это то, что мы используем каждый день для разработки [Octomind](https://octomind.run).

---

_Octocode — open source (Apache 2.0), доступен на [github.com/Muvon/octocode](https://github.com/Muvon/octocode). Сделано Muvon._
