# ast-structural-edit

`ast-structural-edit` — active canonical plugin для OMP-shaped AST workflow. Он нужен, чтобы пользователь и агент видели одну цельную поверхность: `ast_grep` ищет структурные совпадения, `ast_edit` строит preview будущих правок, а `resolve` применяет или отклоняет pending preview.

Важно: `ast_edit` в этой модели не пишет файлы сразу. Это не историческая случайность, а OMP boundary: edit tool показывает proposed rewrite, а запись на диск происходит через `resolve(action: "apply", ...)` после stale-check. Legacy `ast_apply` сохранен только как временный alias для старых callers.

## Зачем нужен

Старые локальные директории `tools-ast-grep`, `tools-ast-edit` и `tools-ast-apply` создавали ощущение трех независимых extensions. Новый plugin фиксирует правильный product boundary: это один AST Structural Edit plugin с тремя фазами search -> preview -> resolve.

## Как работает

Entrypoint `extensions/ast-structural-edit/index.ts` регистрирует существующие локальные OMP-compatible slices:

- `ast_grep` из `extensions/tools-ast-grep/index.ts`;
- `ast_edit` из `extensions/tools-ast-edit/index.ts`;
- `resolve` и legacy `ast_apply` из `extensions/tools-ast-apply/index.ts`.

Сам plugin входит в `package.json#pi.extensions` как bounded compatibility wrapper. Он уже предоставляет OMP-shaped lifecycle search -> preview -> resolve и проверяет stale файлы перед записью. Полная OMP forced hidden tool-choice queue еще не портирована, поэтому local `resolve` остается explicit tool и берет последний pending AST preview внутри текущего project root.

## User Surface

- Tools: `ast_grep`, `ast_edit`, `resolve`, `ast_apply`.
- Commands: none.
- Hooks: none.
- Default enabled: yes.
- Ownership: `compat-wrapper`, moving toward `OMP-owned-to-import`.

## OMP Source Evidence

- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/ast-grep.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/ast-edit.ts`
- `/tmp/oh-my-pi-review/packages/coding-agent/src/tools/resolve.ts`
- `/tmp/oh-my-pi-review/docs/tools/ast-grep.md`
- `/tmp/oh-my-pi-review/docs/tools/ast-edit.md`
- `/tmp/oh-my-pi-review/docs/tools/resolve.md`

## Current Gaps

`miloc-pi` еще не умеет OMP forced hidden tool-choice queue для `resolve`, поэтому `resolve` берет последний pending AST preview из локального in-memory registry. Это честная промежуточная форма: preview/apply lifecycle уже OMP-shaped и активен по умолчанию, но полная OMP parity не заявляется до порта hidden queue behavior.
