Files
easy-png-tools/docs/plan-migrate-remaining.md
T

172 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План: дожать перевод инструментов в preview и переезд ветки `old/`
> Статус: **переведено всё простое, осталось 23 спец-случая.** Основа —
> `plan-composite-params.md` (Фазы 15). Текущее
> состояние: **101 инструмент из 125 переведены в `registry-new`** (включая
> ранее переведённые 40; из оставшихся 85 перенесены 62 простых), старый UI
> уже живёт на `(old)/`-маршрутах, линтер-изоляция old↔preview на месте
> (плагин `isolation/no-mixed-imports`). Здесь — что сделать, чтобы:
>
> 1. в preview был **весь** каталог инструментов (плюс закрыты известные долги);
> 2. физически перенести старую ветку в папки `old/` (шаг 37 основного плана);
> 3. после переезда провести детальную проверку в реальных условиях и собрать
> отзывы пользователей (правки поверх — отдельными задачами).
>
> Порядок: перевод остатка → починить известные долги → переезд в `old/` →
> пользовательская проверка/фидбек → (позже, отдельным решением) удаление
> старого кода.
## Текущая картина (факты)
- `registry.ts` + `registry/`**125 инструментов**; `registry-new/`**101**;
остаток — **23 спец-случая**. (Ранний подсчёт «104» был занижен: извлечение
суффиксом `-png` теряло каналы `png-to-hsl/…`, текстовые вердикты
`png-info` и т.п. и обратные конвертеры `png-to-base64/…`.)
- Preview (`/preview`) показывает переведённые 101; старый UI работает
на `/`-маршрутах (группа `(old)/`): `+page`, `demo`, `list-tools`,
`tools/[id]`. Все «простые» инструменты переведены (color 18, filters 3,
geometry 13, alpha 13, generate 8, analyze-маски 6, text 1).
- Плагин `isolation/no-mixed-imports` (`web/eslint-plugins/isolation/`)
полностью разделяет ветки: старый `lib/registry.ts|/registry/**`,
`lib/registry-helpers.ts`, `lib/categories.ts`, `lib/tools/**`,
`lib/components/**`(кроме `kit/`) vs новый `routes/preview/**`,
`lib/registry-new/**`, `lib/preview/**`, `lib/registry-schema.ts`,
`lib/components/kit/**`. Общее: `core/`, `i18n/`, `theme`, `assets/`,
корневой `lib`.
- Правило копий (из основного плана): файл, используемый `(old)`, не трогаем —
делаем копию в `lib/preview/` (пример: `lib/preview/tool-icons.ts`).
- Известные долги (предсуществующие, не создавались нами): ошибка
`ToolCard.svelte:19:36` (svelte-check), фейл `palette.test.ts` (ENOENT
`src/app.css` — из-за него `pnpm test` красный при 607 passed), ~335
design-tokens ошибок `lint:all` в старых kit-компонентах, a11y-warning в
`ColorField.svelte`, пустой ruleset в `Toggle.svelte`, неиспользуемые токены
в `preview.css`.
## Скоуп перевода: осталось 23 особых случая
Все инструменты без специальных фич переведены (суммарно 62 простых из 85,
плюс ранее переведённые 40). Остаток — 23 инструмента, требующих достройки
фундамента preview. По категориям:
- **alpha — 1**: `watermark-image-png`.
- **analyze — 6**: text-вердикты `png-info`, `png-is-grayscale`,
`png-file-size`, `png-is-transparent`, `png-orientation`, `verify-is-png`.
- **generate — 2**: `mix-colors-png`, `sort-colors-png` (списки значений).
- **convert — 14**: text-source-конвертеры
`base64/data-uri/hex/bytes/rgb-values-to-png` + обратные
`png-to-base64/…`; output/формат `compress-png`, `reduce-to-size-png`,
`png-to-bmp`; `svg-to-png` (text-source + DOM).
### Особые случаи (требуют достройки фундамента, не просто перевод)
1. **`watermark-image-png`** — нужна overlay-механика: второе изображение-знак
(`getOverlay`/store), которое загружается на странице инструмента и
применяется поверх. В новом preview это единственный непереведённый
инструмент с источником-картинкой помимо основного входа. Учесть связь с
`overlay-store` (упомянут в `plan-redesign.md`).
2. **Text-source / text-вердикты** (вход: `base64/data-uri/hex/bytes/
rgb-values-to-png`, `svg-to-png`; выход-вердикт: `png-to-base64/…`,
аналитические `png-info`, `png-is-grayscale`, `png-file-size`,
`png-is-transparent`, `png-orientation`, `verify-is-png`) — тип `ToolEntry`
уже имеет `toText`/`textToText`/`runFromText`, но executor превью их **не
вызывает** (только `run`/`generate`). Нужно решить, как подаётся текст-вход
(текстовое поле/паста на странице инструмента) и как показывается результат
для вердиктных инструментов (в конверсиях — не картинка, а текст/бейдж), и
протащить эти поля через executor/UI.
3. **Output/формат** (`compress-png`, `reduce-to-size-png`, `png-to-bmp`;
пересекается с `convert-png-to-jpg`/`webp`) — по `backlog.md` №7 формат
переезжает в кнопку Download, а не в отдельный инструмент. Перед переводом
решить: переводим как инструменты с quality-параметром или дожидаемся
достройки download-формата.
4. **`mix-colors` / `sort-colors`** — нужен список значений (цвета/веса или
источник). В схеме нет list-kind: либо новый kind, либо фиксированное
число слотов, либо отложить до отдельной задачи про списки.
## Известные долги перед переездом (завести tasks и закрыть)
По AGENTS.md техдолг «чинится только по заведённым tasks, не игнорируется»:
`lint:all` (~335 design-tokens в kit), неиспользуемые токены preview.css,
a11y `ColorField`, пустой ruleset `Toggle`. Плюс два, мешающих зелёной
проверке до/после переезда: svelte-check error `ToolCard.svelte:19:36` и фейл
`palette.test.ts` (ENOENT `src/app.css`). После их закрытия целевое состояние
проверок перед переездом: `pnpm --dir web exec svelte-check` → 0 errors,
`pnpm --dir web test` → зелёный, `pnpm --dir web lint:all` → только задокумент.
ированный остаток (или 0).
## Шаги перевода остатка (порядок)
1. **Простые пачки** — **выполнено**: color (18) → filters (3) → geometry (13)
→ alpha (13/14, кроме watermark-image) → generate (8/10) → analyze-маски
(6/12) → text `watermark-tile-png`. Каждая пачка после себя гнала гейты
(eslint/svelte-check/тесты/prettier); в тестах только предсуществующий фейл
`palette.test.ts`.
2. **Особые случаи** — отдельным переговоренным решением (overlay для
watermark-image, text-source/вердикты — через `toText`/`runFromText` в
executor, output-формат, списки для mix/sort). Это единственный реальный
объём для дожатия каталога.
3. После категории — `schema.layout` для сгруппированных инструментов
(шаг 32-33 паттерн) и ручная проверка в `/preview`.
## Переезд в `old/` (шаг 37 основного плана)
> Скоп-сдвиг: «Scoped-пути двигаются вместе с папками» — обновляется
> `eslint.config.js` (isolation-паттерны и design-tokens glob), не код правила.
1. **Что переезжает:** `lib/registry.ts`, `lib/registry/**`,
`lib/registry-helpers.ts`, `lib/categories.ts`, `lib/tools/**`,
`lib/components/**` (кроме `kit/`) → папки `old/` (например
`lib/old/registry …`, `lib/old/tools`, `lib/old/components`) — то есть всё
старое в одном поддереве. `routes/(old)/` остаётся как есть (уже отделено).
2. **Обновить конфиг плагина** `isolation/no-mixed-imports`: старые glob-ы
`lib/registry/**…` заменить на `lib/old/**` (+ `lib/old/components/**` и
т.п.), «новое» и «общее» не меняются. Проверить, что правило по-прежнему
разделяет (тест фолс-позитивов: временный импорт old↔new ловится).
3. **Импорты внутри старого кода** — относительные пути остаются рабочими
(папки двигаются целиком); поправить только то, что ссылалось на `$lib/...`
в другом стиле. Старые тесты (`registry.test.ts` и др.) переезжают вместе с
исходниками и продолжают проходить.
4. **Гейты переезда:** `svelte-check` 0 errors, `pnpm --dir web test` зелёный,
`prettier --check .` чистый, `lint:all` = задокументированный остаток,
обе ветки открываются (старая `/`, новая `/preview`).
## Проверка и сбор отзывов после переезда
1. **Регресс-чеклист по каталогу** — пройти все инструменты в `/preview`:
дефолты совпадают со старыми, валидация/клампы поведения не меняют,
результат эквивалентен старому UI (сверить на одинаковых входах).
2. **Тяжёлые кейсы руками:** генераторы, маски, font-style/plate/gradient на
всем наборе, watermark-image (после overlay), text-source, output-формат.
3. **Сбор фидбека** — отдельные задачи на каждый найденный фикс; чеклист
зафиксировать в этом документе по мере находок (или ссылкой на tasks).
4. Сверка каталога с `tools-map.md` (покрытие/дедупликация
`convert-png-to-jpg`/`webp`), при необходимости — обновить cards/мета.
5. **Решение об удалении старого** — после завершения ревью и фидбека,
отдельным шагом: тогда чистятся `lib/old/**`, `routes/(old)/**`,
`old.css`, `exports`, изоляционный плагин (glob-ы больше не нужны) и
открываются «правило копий»-дубли.
## Как ревьюить каждый шаг (гайды)
- Диф на **один инструмент** (или фундамент без инструментов) < ~500 строк.
- Старый `params`/`run`/`defaultParams`/`sanitizeParams` не изменены;
в `registry-new` копия логики + `schema` (дефолты равны старым).
- Старый UI и старые тесты продолжают работать: `pnpm --dir web test`,
`pnpm --dir web exec svelte-check`.
- Новый инструмент проверяется **руками в `/preview`** end-to-end (применение +
сброс дефолтов + смена значений).
- После переезда каждый move-шаг гоняет 4 гейта (см. выше).
## Оценка трудозатрат
| Часть | Сложность | Оценка |
| ---------------------------------------------------------------- | --------------- | --------------------- |
| Простые инструменты (color/filters/geometry/alpha/generate/маски/text) | Низкая-Средняя | **выполнено** (62 шт) |
| Особые случаи (overlay/text-source/format/списки) | Средняя-Высокая | ~4-6ч + ревью решения |
| Долги (ToolCard, palette.test.ts, lint:all остаток) | Средняя | ~2-4ч |
| Переезд в `old/` + конфиг плагина + гейты | Средняя-Низкая | ~2-4ч |
| Проверка/фидбек + правки | Зависит | ~3-6ч |
| **Итого** | | **~11-20ч** по фазам |
> Оценки ориентировочные; особые случаи — с ревью решения, объём финальных
> правок по фидбеку не предсказуем.