mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
feat: add source aware resolver, update reset, update generator
This commit is contained in:
+4
-4
@@ -51,17 +51,17 @@
|
||||
только если темы нет в существующем документе; иначе обновляется источник
|
||||
истины.
|
||||
|
||||
## Текущий baseline Q4
|
||||
## Текущий baseline Q5
|
||||
|
||||
На момент фиксации Q4:
|
||||
На момент фиксации Q5:
|
||||
|
||||
- production registry содержит 122 инструмента;
|
||||
- `pnpm --dir web check` проходит без ошибок и предупреждений;
|
||||
- `pnpm --dir web test` — 39 test files / 425 tests;
|
||||
- `pnpm --dir web test` — 39 test files / 431 tests;
|
||||
- `pnpm --dir web test:rules` — 4 test files / 74 tests;
|
||||
- `pnpm --dir web lint:all` — 0 errors и 0 i18n warnings; остаются 4 unused
|
||||
design tokens от token audit;
|
||||
- `pnpm verify` проходит; production E2E — 105 passed, 4 skipped.
|
||||
- `pnpm verify` проходит; production E2E — 109 passed, 0 skipped.
|
||||
|
||||
Baseline и следующий шаг поддерживаются в `docs/plan-codebase-quality.md`.
|
||||
|
||||
|
||||
+9
-29
@@ -105,37 +105,17 @@
|
||||
- [ ] API: спайк серверного ядра (нативный Rust vs edge-wasm), ключи, free tier
|
||||
(после wasm-фаз 5–7)
|
||||
|
||||
## Баги preview
|
||||
## Качество production UI
|
||||
|
||||
Зарегистрированы при написании e2e (`web/e2e/`, `pnpm --dir web test:e2e`) и
|
||||
ручного чек-листа — см. `docs/checklist-manual-testing.md` (раздел G). Каждый
|
||||
пункт связан с соответствующим `test.fixme` или отдельным тестовым долгом. После
|
||||
фикса: убрать `test.fixme` и отметить пункт G в чек-листе как пройденный.
|
||||
Q5 закрывает известные preview-проблемы; активных `test.fixme` в e2e больше нет.
|
||||
|
||||
1. **Генераторы без автоматического результата** — все 21 инструмент категории
|
||||
GENERATE открываются, но в UI нет полей схемы и результата; доступны только
|
||||
RU/EN/Reset. В `SchemaToolView.svelte` уже есть auto-run через debounce,
|
||||
поэтому отдельная кнопка Generate не требуется. Ожидание: поля схемы,
|
||||
автоматический запуск по дефолтам и результат-картинка. Fixme:
|
||||
`web/e2e/generators.spec.ts`. Кнопка Generate не добавляется без отдельного
|
||||
UX-решения.
|
||||
2. **resize-png с дефолтами падает** — схема по умолчанию `size: 0×0` +
|
||||
`keepAspect: true` → при загрузке ЛЮБОГО PNG сразу `errors.resizeSize`
|
||||
(alert), результата нет. `web/src/lib/registry/geometry.ts`. Ожидание:
|
||||
осмысленный дефолт-размер (например, исходный) либо отдельный режим ввода, а
|
||||
не авто-ошибка.
|
||||
3. **crop-png с дефолтами падает** — аналогично: `width: 0, height: 0` → сразу
|
||||
`errors.cropSize`. `web/src/lib/registry/geometry.ts`. Ожидание: базовый кроп
|
||||
по умолчанию либо внятное предзаполнение.
|
||||
4. **Сырые ключи ошибок в UI** — alert на tool-странице показывает сырой ключ
|
||||
i18n (`errors.resizeSize`), а не сообщение из `en.ts` / `ru.ts` (там
|
||||
`resizeSize: "Width and/or height must be positive"`). Проверяется на
|
||||
resize-png / crop-png. Ожидание: человекочитаемое сообщение на текущем языке.
|
||||
Fixme: `web/e2e/known-issues.spec.ts` (тест «error message localized»).
|
||||
5. **Reset и auto-run требуют решения** — `pipeline.spec.ts:55-63` ожидает
|
||||
очистку результата, но текущий `SchemaToolView.svelte:162-173` может сразу
|
||||
перезапустить обработку. Нужно определить семантику Reset, затем исправить
|
||||
тест и снять `test.fixme`.
|
||||
- [x] Генераторы auto-run без кнопки Generate — `web/e2e/generators.spec.ts`.
|
||||
- [x] `resize-png` и `crop-png` используют размеры текущего source через общий
|
||||
source-aware schema resolver — `web/e2e/pipeline.spec.ts`.
|
||||
- [x] Reset сохраняет source/text, восстанавливает defaults и запускает deferred
|
||||
auto-run — `web/e2e/pipeline.spec.ts`.
|
||||
- [x] Ошибки хранят i18n key/vars и переводятся при выводе; изменение языка
|
||||
обновляет alert — `web/e2e/i18n.spec.ts`.
|
||||
|
||||
## Идеи
|
||||
|
||||
|
||||
@@ -95,24 +95,19 @@
|
||||
корректный (не «кракозябры»).
|
||||
- [ ] remove-background на сложной полупрозрачности — края не «звенят».
|
||||
|
||||
## G. Известные баги preview
|
||||
## G. Закрытые Q5-проблемы
|
||||
|
||||
> Список синхронизирован с `docs/backlog.md`. Каждый пункт связан с
|
||||
> зарегистрированной проблемой или соответствующим `test.fixme`; после
|
||||
> исправления отметить его здесь и убрать `test.fixme` в том же изменении.
|
||||
> Q5-проблемы закрыты автоматическими тестами; для ручной проверки остаются
|
||||
> субъективные сценарии разделов A–F.
|
||||
|
||||
- [ ] **Генераторы:** открыть инструмент категории GENERATE, проверить поля
|
||||
схемы, автоматический запуск по дефолтам и появление результата; кнопка
|
||||
Generate не требуется. `docs/backlog.md`, `web/e2e/generators.spec.ts`.
|
||||
- [ ] **resize-png:** загрузить изображение и получить результат без alert.
|
||||
`docs/backlog.md`, `web/e2e/known-issues.spec.ts`.
|
||||
- [ ] **crop-png:** загрузить изображение и получить осмысленный результат без
|
||||
alert. `docs/backlog.md`, `web/e2e/known-issues.spec.ts`.
|
||||
- [ ] **Локализация ошибок:** получить человекочитаемое сообщение на текущем
|
||||
языке вместо сырого i18n-ключа. `docs/backlog.md`, `web/e2e/i18n.spec.ts`.
|
||||
- [ ] **Reset/auto-run:** проверить выбранную семантику Reset и автоматический
|
||||
перезапуск после изменения параметров. `docs/backlog.md`,
|
||||
`web/e2e/pipeline.spec.ts`.
|
||||
- [x] **Генераторы:** auto-run по дефолтам, результат и изменение параметра без
|
||||
кнопки Generate. `web/e2e/generators.spec.ts`.
|
||||
- [x] **resize-png/crop-png:** размеры текущего source используются по
|
||||
умолчанию, alert не появляется. `web/e2e/pipeline.spec.ts`.
|
||||
- [x] **Reset:** defaults восстанавливаются, source сохраняется, deferred
|
||||
auto-run завершается результатом. `web/e2e/pipeline.spec.ts`.
|
||||
- [x] **Локализация ошибок:** alert хранит key/vars, переводится при выводе и
|
||||
обновляется при смене языка. `web/e2e/i18n.spec.ts`.
|
||||
|
||||
## Как долго
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# План: линтеры, тесты и качество кодовой базы
|
||||
|
||||
> Статус: **draft — Q0–Q4 готовы к ревью; Q5 — следующий этап**.
|
||||
> Статус: **draft — Q0–Q5 готовы к ревью; Q6 — следующий этап**.
|
||||
>
|
||||
> Источник: `docs/backlog.md`, аудит конфигурации `web/`, e2e-тестов и
|
||||
> инфраструктурных скриптов. Q0–Q4 выполнены; Q5–Q8 выполняются отдельными
|
||||
> инфраструктурных скриптов. Q0–Q5 выполнены; Q6–Q8 выполняются отдельными
|
||||
> атомарными шагами.
|
||||
>
|
||||
> Цель: сделать качество кодовой базы воспроизводимым, убрать ложную «зелёность»
|
||||
@@ -45,14 +45,10 @@
|
||||
docs и production build; deploy выполняет его перед сборкой.
|
||||
- `i18n/dict-consistency` даёт 0 warnings на текущем baseline; отдельный debt —
|
||||
4 unused design tokens от token audit.
|
||||
- В e2e остаются фиксированные числа, точные тексты, CSS-классы и
|
||||
`alt`-селекторы: `web/e2e/catalog.spec.ts:4-55`,
|
||||
`web/e2e/text-and-verdicts.spec.ts:52-101`.
|
||||
- Backlog и реализация расходятся по генераторам: продуктовая заметка требует
|
||||
автоматический запуск без `Generate`-кнопки (`docs/backlog.md:115-122`), а
|
||||
тест ожидает кнопку (`web/e2e/generators.spec.ts:8-16`).
|
||||
- `resize-png` и `crop-png` начинают с нулевых размеров и требуют отдельного
|
||||
продуктового решения (`web/src/lib/registry/geometry.ts:191-297`).
|
||||
- E2E-контракт использует semantic locators и общий source-aware schema
|
||||
resolver; активных known-issue `test.fixme` нет.
|
||||
- `ToolError` хранится как key/vars и переводится только при выводе; смена
|
||||
локали обновляет уже видимый alert.
|
||||
|
||||
## 3. Этапы выполнения
|
||||
|
||||
@@ -175,27 +171,29 @@ pnpm --dir web test:e2e
|
||||
|
||||
**Результат:** изменение формулировки, класса или порядка элементов не ломает
|
||||
поведенческий тест без изменения пользовательского контракта; следующий этап —
|
||||
Q5.
|
||||
Q6.
|
||||
|
||||
### Q5. Закрыть известные preview-баги
|
||||
|
||||
**Оценка:** M. **Зависимости:** Q4.
|
||||
**Статус:** выполнен. **Проверено:** unit, Q5 E2E smoke и полный `pnpm verify`
|
||||
проходят; активных known-issue `test.fixme` нет. **Оценка:** M–L.
|
||||
**Зависимости:** Q4.
|
||||
|
||||
1. Выбрать поведение `resize-png` и `crop-png` при загрузке изображения:
|
||||
source-aware defaults, осмысленные статические defaults или отдельный
|
||||
автоматический repair.
|
||||
2. Исправить registry/schema и только после этого снять соответствующие
|
||||
`test.fixme`.
|
||||
3. Зафиксировать auto-run для генераторов и переписать e2e под фактическое
|
||||
автоматическое поведение; кнопку Generate не добавлять без отдельного UX
|
||||
решения.
|
||||
4. Определить семантику Reset: очистка результата, немедленный повторный run или
|
||||
временное отключение auto-run.
|
||||
5. Перенести проверку локализованной ошибки на независимый детерминированный
|
||||
invalid-input сценарий.
|
||||
- Добавлен общий opt-in `defaultFromSource` resolver в `registry-schema`: он
|
||||
принимает source dimensions, обновляет только source-aware поля при upload и
|
||||
используется в UI, executor и worker. `resize-png` и `crop-png` получают
|
||||
размеры текущего source; static/generator/text schemas не затронуты.
|
||||
- Reset сохраняет source/text, восстанавливает source-aware defaults и запускает
|
||||
deferred auto-run через debounce.
|
||||
- Генераторы проверены в auto-run без кнопки Generate; кнопка не добавляется.
|
||||
- `ToolError` хранится как key/vars, переводится derived-значением при выводе и
|
||||
обновляется при смене локали. E2E использует независимый invalid pixel-count
|
||||
сценарий.
|
||||
- Resize/crop, generator, Reset и localization fixme сняты; Q6 начинает
|
||||
расширение покрытия, а не исправление этих контрактов.
|
||||
|
||||
**Готово, когда:** каждый known issue либо исправлен и покрыт зелёным тестом,
|
||||
либо явно перенесён в отдельную продуктовую задачу с владельцем и критерием.
|
||||
**Результат:** Q5 known issues закрыты и отражены в `docs/backlog.md` и
|
||||
`docs/checklist-manual-testing.md`; следующий этап — Q6.
|
||||
|
||||
### Q6. Расширение unit и browser-покрытия
|
||||
|
||||
@@ -373,9 +371,9 @@ refactor, новые i18n-правила и исправление продук
|
||||
|
||||
## 7. Решения, которые нужно принять на ревью
|
||||
|
||||
- Какой default выбрать для `resize-png` и `crop-png` при загрузке?
|
||||
- Подтверждаем ли auto-run генераторов без кнопки Generate?
|
||||
- Что именно должен делать Reset при включённом auto-run?
|
||||
- Какой независимый invalid-input сценарий заменит resize-dependent error test?
|
||||
- Какие executor/worker/fallback сценарии войдут в первый Q6 coverage PR?
|
||||
- Какие special PNG fixtures обязательны для baseline?
|
||||
- Нужны ли browser/mobile matrix и visual snapshots до coverage thresholds?
|
||||
- Какие unused design tokens можно удалить, а какие должны остаться?
|
||||
- Какие browser/e2e проверки должны быть обязательными для PR, а какие —
|
||||
отдельным ночным прогоном?
|
||||
|
||||
@@ -181,11 +181,12 @@ buttons: <V extends string>(s: Omit<ButtonsSpec<V>, "kind">): Field<V> => ({
|
||||
|
||||
## 3. Волна C — обязательные фиксы (баги + дефолты)
|
||||
|
||||
### C1. resize-png: дефолт 0×0 → осмысленный
|
||||
### C1. Source-aware defaults для dimension-полей
|
||||
|
||||
`geometry.ts`: `width: 0, height: 0` → `width: 512, height: 512` (или
|
||||
`width: imgWidth, height: imgHeight` — но дефолт в схеме не может знать размер
|
||||
изображения). **Решение:** дефолт `512×512`.
|
||||
Q5 добавил общий `defaultFromSource` resolver в `registry-schema`. Для
|
||||
`resize-png` и `crop-png` дефолт после загрузки равен размерам текущего source;
|
||||
до загрузки используется положительный fallback `1×1`. Один-sided `0` у resize
|
||||
сохраняет режим auto.
|
||||
|
||||
### C2. symmetric-copy-png: "keep side" не работает
|
||||
|
||||
@@ -198,19 +199,17 @@ buttons: <V extends string>(s: Omit<ButtonsSpec<V>, "kind">): Field<V> => ({
|
||||
значение. Пока достаточно в `run()`: если `axis === "vertical"` и `keepSide` ∈
|
||||
{top, bottom} → заменить на `left`.
|
||||
|
||||
### C3. Механизм проброса размеров картинки в схему
|
||||
### C3. Source-aware bounds (отдельный следующий шаг)
|
||||
|
||||
**Проблема.** Поля, значения которых зависят от размеров исходника (crop x/y,
|
||||
resize, offsets), объявлены в статической схеме (`-100000…100000`), а реальная
|
||||
картинка обычно 800–4000px. Диапазон надо считать от фактического размера
|
||||
изображения, а не от потолков.
|
||||
Q5 реализовал только defaults dimension-полей через `SchemaContext` и
|
||||
`defaultFromSource`. Динамические min/max для crop x/y, shift и resize остаются
|
||||
отдельной задачей: bounds не следует смешивать с default resolver.
|
||||
|
||||
**Что нужно спроектировать и завести:**
|
||||
|
||||
1. **Где берём размер.** `SchemaToolView` уже знает размер после `decodeFile()`
|
||||
→ `PixelImage` (width/height). Сейчас он никуда не пробрасывается — надо
|
||||
прокинуть в `SchemaFields` и дальше в контролы, например через context или
|
||||
проп `sourceSize`.
|
||||
→ `PixelImage` (width/height); для bounds понадобится передать этот context в
|
||||
`SchemaFields` и контролы.
|
||||
|
||||
2. **Как схеме описать зависимость.** В спеках добавить ссылку на размер
|
||||
источника вместо жёстких чисел. Кандидат:
|
||||
@@ -228,15 +227,13 @@ resize, offsets), объявлены в статической схеме (`-100
|
||||
|
||||
3. **Что делает RangeControl.** При `bound` вычисляет min/max из текущего
|
||||
размера источника; при смене картинки диапазон пересчитывается, текущее
|
||||
значение пере-клампится. Дефолт и `sanitize` остаются на статической основе
|
||||
(или тоже учат bound) — решить при проектировании.
|
||||
значение пере-клампится.
|
||||
|
||||
4. **Первые потребители:** crop (x/y → ±sourceWidth/sourceHeight), shift
|
||||
(offsetX/offsetY), resize (max → maxSide).
|
||||
|
||||
Это отдельный шаг плана: **завести механизм**, спроектировать на ревью интерфейс
|
||||
спека (`bound` vs `range: (size) => [min, max]`), затем применить к crop и
|
||||
остальным полям размерности. Пока механизма нет — поля crop остаются как есть.
|
||||
Это отдельный refactor после Q6/Q7; source-aware defaults из Q5 не заменяют
|
||||
bounds.
|
||||
|
||||
### C4. verify-is-png: неверное название
|
||||
|
||||
|
||||
@@ -65,8 +65,8 @@ CSS-классы и конкретный формат временного URL
|
||||
helpers, а не повторять raw-селекторы.
|
||||
|
||||
`test.fixme` допускается только для зарегистрированной проблемы в backlog или
|
||||
checklist. В комментарии указывается ссылка на неё; Q4 не исправляет продуктовое
|
||||
поведение. После исправления тест и ссылка обновляются вместе.
|
||||
checklist. В комментарии указывается ссылка на неё. После исправления тест и
|
||||
ссылка обновляются вместе; в текущем Q5 baseline активных fixme нет.
|
||||
|
||||
## 6. Проверки
|
||||
|
||||
|
||||
+3
-2
@@ -87,8 +87,9 @@
|
||||
|
||||
### Геометрия
|
||||
|
||||
- resize-png — width (0=авто), height (0=авто), keepAspect
|
||||
- crop-png — x, y, width, height
|
||||
- resize-png — width/height (размеры source по умолчанию; 0=авто для одной
|
||||
стороны), keepAspect
|
||||
- crop-png — x, y, width/height (полная область source по умолчанию)
|
||||
- rotate-png — angle (90/180/270)
|
||||
- flip-png — axis (h/v)
|
||||
- skew-png — degX, degY
|
||||
|
||||
Reference in New Issue
Block a user