# devext-doctor

## Назначение

`devext-doctor` показывает короткий health/status report по текущему reduced default package. Он нужен, чтобы быстро проверить, что установленная сборка видит активные по умолчанию extensions и что OMP-port backlog не перепутан с product-ready surface.

## Почему он есть в проекте

После установки или smoke-запуска разработчику нужен один простой operator command, который показывает active defaults, active compatibility wrappers, disabled compatibility wrappers, OMP-owned ports, redesign-later surfaces, split-required bundles, fixtures и deleted legacy surfaces. `devext-doctor` не пытается заменить тесты, но дает быстрый ответ на вопрос: загружен ли честный reduced surface, а не старый набор локальных дублей.

## Пользовательская поверхность

- Пользователь вызывает команду `/devext doctor`. Extension выводит widget `devext-doctor` с кратким статусом.
- Другие формы команды `/devext ...` сейчас игнорируются. Основная и единственная поддержанная поверхность — doctor report.

## Как работает по коду

Entrypoint `extensions/devext-doctor/index.ts` регистрирует команду `devext`. Handler читает command text через `_shared/pi-api.getCommandText`; если аргумент пустой, он трактуется как `doctor`, а любой другой аргумент не выполняет действий.

Функция `report()` строит строки из общего inventory в `extensions/_shared/extension-inventory.ts`. Этот inventory фиксирует product-visible `currentStatus` и ownership bucket для retained и deleted extensions. Doctor выводит active defaults, active compatibility wrappers, disabled compatibility wrappers, OMP-owned-to-import surfaces, redesign-later surfaces, split-required bundles, fixture-only extensions, deleted legacy surfaces, количество audit events через `_shared/permissions.getAuditEvents` и количество developer events через `_shared/event-bus.getDevEvents`.

`ask-user-question` показывается как active compatibility wrapper, потому что он включен по умолчанию. Disabled compatibility wrappers показываются отдельно, потому что они сохранены для совместимости, но не являются default product surface. `live-terminal` и `loop` не смешиваются с OMP-owned backlog, потому что для них сначала нужен redesign. Результат выводится через widget `devext-doctor`.

- Entrypoint: `./extensions/devext-doctor/index.ts`
- Manifest: `extensions/devext-doctor/manifest.json`
- Commands: `devext`
- Tools: none
- Hooks: none
- Permissions: fs.read=none, fs.write=none, subprocess=none, network=none, browser=false, models=false, ui=`setWidget`
- State: extension читает shared extension inventory и event rings, но ничего не сохраняет.
- Review: status=reviewed, source=write-from-scratch, reviewedBy=miloc-pi, reviewedAt=2026-05-31, risk=low

## Ограничения и риски

`devext-doctor` — это status summary, а не глубокая self-test диагностика. Он не проверяет filesystem, commands, hooks, UI permissions или реальную способность disabled extension выполнить свои сценарии. Если report выглядит нормально, это означает только то, что текущий process видит shared inventory, active default list и event rings.

## Решение

Решение: `keep`. Extension полезен как operator surface после установки и во время smoke-проверок. Его можно расширять отдельными проверками, но текущая форма должна оставаться короткой и безопасной.
