172 lines
14 KiB
Markdown
172 lines
14 KiB
Markdown
# План: дожать перевод инструментов в preview и переезд ветки `old/`
|
||
|
||
> Статус: **переведено всё простое, осталось 23 спец-случая.** Основа —
|
||
> `plan-composite-params.md` (Фазы 1–5). Текущее
|
||
> состояние: **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ч** по фазам |
|
||
|
||
> Оценки ориентировочные; особые случаи — с ревью решения, объём финальных
|
||
> правок по фидбеку не предсказуем.
|