mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
docs: large update docs
This commit is contained in:
@@ -8,9 +8,9 @@
|
|||||||
- Менеджер пакетов: **pnpm**. Запускать команды из `web/`, либо через обёртки в
|
- Менеджер пакетов: **pnpm**. Запускать команды из `web/`, либо через обёртки в
|
||||||
корне: `pnpm build`, `pnpm dev` (это `pnpm --dir web ...`). Не использовать
|
корне: `pnpm build`, `pnpm dev` (это `pnpm --dir web ...`). Не использовать
|
||||||
npm.
|
npm.
|
||||||
- Сборка: `pnpm --dir web build`, проверка типов:
|
- Сборка: `pnpm --dir web build`, проверка типов: `pnpm --dir web check`, тесты:
|
||||||
`pnpm --dir web exec svelte-check --tsconfig ./tsconfig.json`, тесты:
|
`pnpm --dir web test` (Vitest), тесты lint-правил:
|
||||||
`pnpm --dir web test` (Vitest), e2e: `pnpm --dir web test:e2e` (Playwright,
|
`pnpm --dir web test:rules`, e2e: `pnpm --dir web test:e2e` (Playwright,
|
||||||
`web/e2e/`, свой webServer на `pnpm build` + `scripts/serve-static.mjs`, порт
|
`web/e2e/`, свой webServer на `pnpm build` + `scripts/serve-static.mjs`, порт
|
||||||
4173).
|
4173).
|
||||||
- Форматирование: `pnpm format` в корне (оба прогона) или
|
- Форматирование: `pnpm format` в корне (оба прогона) или
|
||||||
@@ -18,16 +18,16 @@
|
|||||||
(docs) + `pnpm --dir web exec prettier --check .` (код).
|
(docs) + `pnpm --dir web exec prettier --check .` (код).
|
||||||
- Линтинг: `pnpm --dir web lint` (ESLint). Полный прогон дизайн-проверок:
|
- Линтинг: `pnpm --dir web lint` (ESLint). Полный прогон дизайн-проверок:
|
||||||
`pnpm --dir web lint:all` (ESLint + stylelint + токен-аудит). Каждый шаг
|
`pnpm --dir web lint:all` (ESLint + stylelint + токен-аудит). Каждый шаг
|
||||||
выполняется, даже если предыдущий упал. Текущие «ожидаемые долги» (hardcoded
|
выполняется, даже если предыдущий упал. `app_v1.css` и legacy-ветка исключены
|
||||||
размеры в kit до C19, не-Prefix токены в `app_v1.css`) — техдолг: чинить
|
из новых правил; их долг чинится только по заведённым задачам, а новые
|
||||||
только по заведённым tasks, не игнорировать правилом.
|
изменения не должны добавлять новые предупреждения без записи в baseline.
|
||||||
|
|
||||||
## Правила кода
|
## Правила кода
|
||||||
|
|
||||||
Синтаксические ограничения описывать не нужно — они проверяются линтером
|
Синтаксические ограничения описывать не нужно — они проверяются линтером (весь
|
||||||
(весь список правил и токены-префиксы в `web/eslint-plugins/README.md`,
|
список правил и токены-префиксы в `web/eslint-plugins/README.md`, прогон:
|
||||||
прогон: `pnpm --dir web lint` / `pnpm --dir web lint:all`). Здесь — только то,
|
`pnpm --dir web lint` / `pnpm --dir web lint:all`). Здесь — только то, что
|
||||||
что линтер не умеет.
|
линтер не умеет.
|
||||||
|
|
||||||
### Svelte 5
|
### Svelte 5
|
||||||
|
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
### Сначала искать
|
### Сначала искать
|
||||||
|
|
||||||
Новая константа или тип не заводится, пока не произведён поиск существующего
|
Новая константа или тип не заводится, пока не произведён поиск существующего
|
||||||
определения (по ключу в соседних модулях и по всему `web/src/`). Это правило
|
определения (по ключу в соседних модулях и по всему `web/src/`). Это правило в
|
||||||
в первую очередь для ИИ-агентов: дублирующее определение ухудшает правки в
|
первую очередь для ИИ-агентов: дублирующее определение ухудшает правки в
|
||||||
нескольких местах и запутывает. (Синтаксис самих определений — под линтером:
|
нескольких местах и запутывает. (Синтаксис самих определений — под линтером:
|
||||||
строка `conventions/no-string-union-alias` и т.д.)
|
строка `conventions/no-string-union-alias` и т.д.)
|
||||||
|
|
||||||
@@ -54,7 +54,20 @@
|
|||||||
- Дизайн-токены (цвета, размеры, длительности, z-index) — только из
|
- Дизайн-токены (цвета, размеры, длительности, z-index) — только из
|
||||||
CSS-переменных; детали ограничений — в `web/eslint-plugins/README.md`.
|
CSS-переменных; детали ограничений — в `web/eslint-plugins/README.md`.
|
||||||
|
|
||||||
### Изоляция веток old ↔ new
|
## Документация
|
||||||
|
|
||||||
|
- Здесь держать только обязательные инварианты, команды и ссылки на подробные
|
||||||
|
документы; не превращать `AGENTS.md` в полный справочник.
|
||||||
|
- Индекс активных документов: `docs/README.md`; подробный workflow:
|
||||||
|
`docs/agent-workflow.md`; текущий план качества:
|
||||||
|
`docs/plan-codebase-quality.md`.
|
||||||
|
- Новые подробные правила, процедуры и таблицы хранить в `docs/`, а детали
|
||||||
|
конкретных lint-правил — в `web/eslint-plugins/README.md`.
|
||||||
|
- Завершённые или устаревшие документы переносить в `docs/archive/`, указывать
|
||||||
|
дату архивирования и срок удаления; архив — только справка, не источник
|
||||||
|
требований.
|
||||||
|
|
||||||
|
## Изоляция веток old ↔ new
|
||||||
|
|
||||||
Старый (`v1/`) и новый UI изолированы: `isolation/no-mixed-imports` резолвит
|
Старый (`v1/`) и новый UI изолированы: `isolation/no-mixed-imports` резолвит
|
||||||
каждый импорт до файла и запрещает смешивание.
|
каждый импорт до файла и запрещает смешивание.
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# Документация проекта
|
||||||
|
|
||||||
|
> Статус: **active**. Это индекс документов и карта источников истины для
|
||||||
|
> разработчиков и агентов. Подробные правила находятся в самих документах, а
|
||||||
|
> обязательный краткий контракт — в `AGENTS.md`.
|
||||||
|
|
||||||
|
## Порядок чтения
|
||||||
|
|
||||||
|
1. `AGENTS.md` — команды, обязательные инварианты и границы old/new.
|
||||||
|
2. Этот файл — выбрать актуальный документ по теме.
|
||||||
|
3. `docs/plan-codebase-quality.md` — текущий план приведения качества в порядок
|
||||||
|
и последовательность следующих шагов.
|
||||||
|
4. Соответствующий план или checklist темы.
|
||||||
|
5. Исходники, конфигурация и тесты рядом с изменяемым кодом.
|
||||||
|
|
||||||
|
## Активные документы
|
||||||
|
|
||||||
|
| Документ | Роль | Статус |
|
||||||
|
| ---------------------------------- | ---------------------------------------------------- | ------ |
|
||||||
|
| `AGENTS.md` | Краткий обязательный контракт для агента | active |
|
||||||
|
| `docs/plan-codebase-quality.md` | План quality gates, тестов и lint-правил | draft |
|
||||||
|
| `docs/agent-workflow.md` | Подробный порядок исследования, изменения и проверки | active |
|
||||||
|
| `docs/backlog.md` | Продуктовые, UX- и инфраструктурные задачи | active |
|
||||||
|
| `docs/roadmap.md` | Общие направления развития | active |
|
||||||
|
| `docs/plan-redesign.md` | Новый дизайн и границы `/v1` | active |
|
||||||
|
| `docs/plan-preview-i18n.md` | План i18n нового UI | active |
|
||||||
|
| `docs/plan-seo.md` | SEO/GEO-план | active |
|
||||||
|
| `docs/plan-platform.md` | PWA/API/WASM-план | active |
|
||||||
|
| `docs/checklist-manual-testing.md` | Ручная приёмка preview | active |
|
||||||
|
| `docs/tools-map.md` | Живая карта инструментов | active |
|
||||||
|
| `web/eslint-plugins/README.md` | Детали custom lint rules и token policy | active |
|
||||||
|
| `docs/archive/README.md` | Правила архивирования и удаления старых документов | active |
|
||||||
|
|
||||||
|
`docs/archive/` содержит временную историческую справку и не является текущим
|
||||||
|
источником критериев приёмки. Для старых документов действует срок хранения 30
|
||||||
|
дней; после него их удаляют, а при необходимости достают из git history.
|
||||||
|
|
||||||
|
## Где хранить новую информацию
|
||||||
|
|
||||||
|
- Поведение, которое агент обязан соблюдать сразу, — кратко в `AGENTS.md`.
|
||||||
|
- Точные команды, параметры скриптов и критерии качества — в
|
||||||
|
`docs/quality-gates.md` после Q1 или в README соответствующей подсистемы.
|
||||||
|
- Архитектура, потоки данных и границы модулей — в отдельном architecture-плане
|
||||||
|
или документе, не дублируя существующие планы.
|
||||||
|
- Реализация lint-правил, fixtures и технические детали ESLint — в
|
||||||
|
`web/eslint-plugins/README.md` и исходниках правил.
|
||||||
|
- Продуктовые решения и ручная приёмка — в backlog, плане и checklist.
|
||||||
|
|
||||||
|
Подробные материалы хранятся в `docs/`, а не в корне. Новый файл создаётся
|
||||||
|
только если темы нет в существующем документе; иначе обновляется источник
|
||||||
|
истины.
|
||||||
|
|
||||||
|
## Текущий baseline Q0
|
||||||
|
|
||||||
|
На момент фиксации Q0:
|
||||||
|
|
||||||
|
- registry нового UI содержит 122 инструмента;
|
||||||
|
- `pnpm --dir web check` проходит без ошибок и предупреждений;
|
||||||
|
- `pnpm --dir web lint:all` завершается с 0 errors, но с 188 warnings
|
||||||
|
`i18n/dict-consistency` и 4 unused design tokens;
|
||||||
|
- unit/e2e результаты считать актуальными только после отдельного прогона;
|
||||||
|
исторические числа в `docs/archive/` не являются baseline.
|
||||||
|
|
||||||
|
Baseline и следующий шаг поддерживаются в `docs/plan-codebase-quality.md`.
|
||||||
|
|
||||||
|
## Правила актуальности
|
||||||
|
|
||||||
|
- У активного документа есть статус: `draft`, `active`, `completed` или
|
||||||
|
`archived`.
|
||||||
|
- Ссылки на конкретный файл или команду проверяются при изменении источника
|
||||||
|
истины.
|
||||||
|
- Архивный документ не возвращается в live-критерии без явной сверки.
|
||||||
|
- После каждого шага плана агент останавливается, показывает изменённые файлы,
|
||||||
|
проверки и нерешённые решения, и ждёт ревью.
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# Workflow для агентов
|
||||||
|
|
||||||
|
> Статус: **active**. Подробная процедура работы с репозиторием; краткие
|
||||||
|
> обязательные правила остаются в `AGENTS.md`. Этот документ не заменяет source
|
||||||
|
> of truth конкретной подсистемы.
|
||||||
|
|
||||||
|
## 1. Подготовка к задаче
|
||||||
|
|
||||||
|
1. Прочитать `AGENTS.md` и `docs/README.md`.
|
||||||
|
2. Найти релевантный активный план, backlog или checklist.
|
||||||
|
3. Проверить `git status`: не перезаписывать чужие незакоммиченные изменения.
|
||||||
|
4. Найти существующие типы, константы, helpers и тестовые паттерны до создания
|
||||||
|
нового определения.
|
||||||
|
5. Определить границу изменения:
|
||||||
|
- новый UI — `web/src/routes/**` и `web/src/lib/components/**`;
|
||||||
|
- legacy — `web/src/routes/v1/**` и `web/src/lib/v1/**`;
|
||||||
|
- shared — `web/src/lib/core/**` и `web/src/lib/theme.svelte.ts`.
|
||||||
|
|
||||||
|
Изменение shared-кода требует проверки обеих веток. Смешивание old/new нельзя
|
||||||
|
обходить относительными импортами или исключениями линтера.
|
||||||
|
|
||||||
|
## 2. Порядок изменения
|
||||||
|
|
||||||
|
- Сначала исправляются тесты или контракт, который фиксирует неверное поведение,
|
||||||
|
затем production-код — если это не отдельная продуктовая задача.
|
||||||
|
- Один PR решает одну проблему и не объединяет lint, i18n, UI и архитектурный
|
||||||
|
рефакторинг без необходимости.
|
||||||
|
- Изменения держатся небольшими и атомарными, примерно до 500 строк или меньше.
|
||||||
|
- Не добавлять комментарии, которые пересказывают код. Комментарий объясняет
|
||||||
|
причину решения или фиксирует неочевидный инвариант.
|
||||||
|
- Не коммитить изменения автоматически: коммит делает разработчик после ревью.
|
||||||
|
|
||||||
|
## 3. Проверки
|
||||||
|
|
||||||
|
Команды и их область применения перечислены в `AGENTS.md`; после Q1 их точная
|
||||||
|
матрица будет поддерживаться в `docs/quality-gates.md`.
|
||||||
|
|
||||||
|
| Изменение | Минимальная проверка |
|
||||||
|
| ------------------------------------------------------- | ------------------------------------------------------ |
|
||||||
|
| Только Markdown | `pnpm check:docs` |
|
||||||
|
| TypeScript/Svelte | `pnpm --dir web check`, `pnpm --dir web test` |
|
||||||
|
| Lint-конфиг или custom rule | `pnpm --dir web test:rules`, `pnpm --dir web lint:all` |
|
||||||
|
| Маршрут, загрузка, результат, download, тема или локаль | `pnpm --dir web test:e2e` |
|
||||||
|
| Перед релизом | полный quality gate из плана Q1 |
|
||||||
|
|
||||||
|
`lint:all` может завершиться успешно при warnings. Это не означает чистый
|
||||||
|
baseline: нужно отдельно показать число errors, warnings и token warnings.
|
||||||
|
|
||||||
|
E2E запускается отдельно от быстрых проверок, потому что поднимает build и
|
||||||
|
статический сервер. Для UI-изменений сначала выбирается минимальный
|
||||||
|
пользовательский поток, затем при необходимости расширяется smoke.
|
||||||
|
|
||||||
|
## 4. Работа с тестами
|
||||||
|
|
||||||
|
- Поведенческий тест проверяет пользовательский контракт, а не текущую
|
||||||
|
реализацию.
|
||||||
|
- Сначала предпочитать `role`, `aria-*`, label, stable id или href.
|
||||||
|
- `data-testid` использовать только там, где семантического locator нет.
|
||||||
|
- Не фиксировать абсолютное число инструментов, если проверка не связана с этим
|
||||||
|
инвариантом.
|
||||||
|
- Точные переводы проверять в словарях и i18n helpers; в e2e проверять поведение
|
||||||
|
и отдельный locale smoke.
|
||||||
|
- `test.fixme` допускается только для зарегистрированной проблемы или явного
|
||||||
|
тестового долга, с ссылкой на backlog или checklist. После исправления тест и
|
||||||
|
его issue обновляются вместе.
|
||||||
|
- Новые fixtures должны быть воспроизводимыми и не требовать ручного создания
|
||||||
|
больших бинарных файлов.
|
||||||
|
|
||||||
|
## 5. Документация
|
||||||
|
|
||||||
|
Источник истины выбирается по теме:
|
||||||
|
|
||||||
|
- обязательное поведение агента — `AGENTS.md`;
|
||||||
|
- индекс и карта документов — `docs/README.md`;
|
||||||
|
- качество и точные команды — `docs/quality-gates.md` после Q1;
|
||||||
|
- тестовая архитектура — `docs/testing-strategy.md` после Q3;
|
||||||
|
- lint implementation — `web/eslint-plugins/README.md`;
|
||||||
|
- продуктовые решения — backlog и активные планы.
|
||||||
|
|
||||||
|
Не дублировать длинные объяснения в нескольких файлах. Если правило требует
|
||||||
|
пояснения, в `AGENTS.md` оставить короткую понятную формулировку и ссылку на
|
||||||
|
подробный документ.
|
||||||
|
|
||||||
|
### Архивирование завершённых документов
|
||||||
|
|
||||||
|
- Если план или исследование больше не является рабочим источником, перенести
|
||||||
|
файл в `docs/archive/`.
|
||||||
|
- В начало файла добавить `Статус`, `Архивирован`, `Удалить после` и причину.
|
||||||
|
- Архив хранить 30 дней для быстрой справки; после срока удалить после проверки
|
||||||
|
ссылок. Если решение понадобится снова, использовать git history.
|
||||||
|
- Не переносить активный план в архив только потому, что он пока не начат.
|
||||||
|
|
||||||
|
## 6. Протокол ревью между шагами
|
||||||
|
|
||||||
|
После каждого шага плана агент:
|
||||||
|
|
||||||
|
1. останавливается и не начинает следующий Q-этап;
|
||||||
|
2. перечисляет изменённые файлы и принятые решения;
|
||||||
|
3. указывает выполненные проверки и их фактический результат;
|
||||||
|
4. отдельно перечисляет warnings, fixme, долги и вопросы;
|
||||||
|
5. ждёт подтверждения на продолжение.
|
||||||
|
|
||||||
|
Следующий шаг начинается только после ревью текущего изменения.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# Архив документов
|
||||||
|
|
||||||
|
> Статус: **active**. Здесь хранятся завершённые, отменённые и явно устаревшие
|
||||||
|
> документы как временная историческая справка.
|
||||||
|
|
||||||
|
## Назначение
|
||||||
|
|
||||||
|
Архив помогает быстро посмотреть, какое решение принималось раньше и почему. Он
|
||||||
|
не является источником текущих требований, критериев приёмки или команды. Для
|
||||||
|
актуальных правил используются `AGENTS.md`, `docs/README.md` и активные планы.
|
||||||
|
|
||||||
|
Если решение снова понадобится, его можно восстановить из git history или
|
||||||
|
создать новый активный документ.
|
||||||
|
|
||||||
|
## Обязательные метаданные
|
||||||
|
|
||||||
|
При переносе документа в архив добавить в начало:
|
||||||
|
|
||||||
|
```text
|
||||||
|
> Статус: archived
|
||||||
|
> Архивирован: YYYY-MM-DD
|
||||||
|
> Удалить после: YYYY-MM-DD
|
||||||
|
> Причина: краткое объяснение, почему документ больше не активен
|
||||||
|
> Использование: только историческая справка
|
||||||
|
```
|
||||||
|
|
||||||
|
Дата `Удалить после` — дата архивирования плюс 30 дней. Старые файлы, созданные
|
||||||
|
до введения политики, могут не иметь этих дат; они также считаются архивными и
|
||||||
|
не являются активными требованиями. При следующем касании их можно удалить или
|
||||||
|
привести к шаблону.
|
||||||
|
|
||||||
|
## Порядок архивирования
|
||||||
|
|
||||||
|
1. Убедиться, что документ действительно завершён, отменён или заменён более
|
||||||
|
актуальным источником.
|
||||||
|
2. Добавить обязательные метаданные.
|
||||||
|
3. Переместить файл в `docs/archive/`.
|
||||||
|
4. Проверить ссылки из backlog, планов, checklist и `docs/README.md`.
|
||||||
|
5. Не менять архивный документ под новые требования.
|
||||||
|
|
||||||
|
## Удаление
|
||||||
|
|
||||||
|
Через 30 дней после архивирования:
|
||||||
|
|
||||||
|
- проверить, что документ не нужен для текущей работы;
|
||||||
|
- найти и удалить оставшиеся ссылки на него из активных документов;
|
||||||
|
- удалить файл из `docs/archive/`;
|
||||||
|
- при необходимости отметить удаление в истории изменений.
|
||||||
|
|
||||||
|
До истечения срока архивный файл не превращается обратно в live-документ: если
|
||||||
|
он снова актуален, создаётся новый документ или возвращается версия из git
|
||||||
|
истории с новым статусом и датами.
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
# Анализ: набор PNG-утилит для браузера
|
# Анализ: набор PNG-утилит для браузера
|
||||||
|
|
||||||
|
> Статус: archived Архивирован: 2026-09-25 Удалить после: 2026-10-25 Причина:
|
||||||
|
> ранний исследовательский разбор, не являющийся текущим планом Использование:
|
||||||
|
> только историческая справка
|
||||||
|
|
||||||
Проект: **easy-png-tools** — набор PNG-утилит, работающий полностью в браузере.
|
Проект: **easy-png-tools** — набор PNG-утилит, работающий полностью в браузере.
|
||||||
Вдохновлён идеей онлайн-сервисов «все PNG-операции в одном месте»: никаких
|
Вдохновлён идеей онлайн-сервисов «все PNG-операции в одном месте»: никаких
|
||||||
загрузок на сервер, всё считается локально. Стек: **SvelteKit +
|
загрузок на сервер, всё считается локально. Стек: **SvelteKit +
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
# Хранить данные для сортировки по популярности инструментов
|
# Хранить данные для сортировки по популярности инструментов
|
||||||
|
|
||||||
|
> Статус: archived Архивирован: 2026-09-25 Удалить после: 2026-10-25 Причина:
|
||||||
|
> ранний исследовательский вариант, не являющийся текущим планом Использование:
|
||||||
|
> только историческая справка
|
||||||
|
|
||||||
Идея выложить на Vercel и использовать Vercel KV (на базе Upstash Redis) — это
|
Идея выложить на Vercel и использовать Vercel KV (на базе Upstash Redis) — это
|
||||||
отличный, рабочий и очень быстрый в реализации вариант. Для 150 инструментов
|
отличный, рабочий и очень быстрый в реализации вариант. Для 150 инструментов
|
||||||
объем данных будет крошечным, но здесь есть пара критически важных нюансов по
|
объем данных будет крошечным, но здесь есть пара критически важных нюансов по
|
||||||
+33
-25
@@ -5,7 +5,8 @@
|
|||||||
- [x] Кросс-языковой линтер словарей (warn-only: паритет ключей, пустые
|
- [x] Кросс-языковой линтер словарей (warn-only: паритет ключей, пустые
|
||||||
значения, совпадение `{placeholder}`-переменных между всеми локалями) —
|
значения, совпадение `{placeholder}`-переменных между всеми локалями) —
|
||||||
правило `i18n/dict-consistency`, детали в §Фаза 8
|
правило `i18n/dict-consistency`, детали в §Фаза 8
|
||||||
`docs/plan-preview-i18n.md`
|
`docs/plan-preview-i18n.md`. Правило реализовано; доведение baseline до
|
||||||
|
zero-warning вынесено в Q2 `docs/plan-codebase-quality.md`.
|
||||||
- [ ] проверка дублирования кода html - div с одинаковым классом и т.д. (глянуть
|
- [ ] проверка дублирования кода html - div с одинаковым классом и т.д. (глянуть
|
||||||
что за `SonarLint` или написать кастомный линтер)
|
что за `SonarLint` или написать кастомный линтер)
|
||||||
- [ ] проверка текстов в svelte\ts\html - всё тексты должны быть через i18n
|
- [ ] проверка текстов в svelte\ts\html - всё тексты должны быть через i18n
|
||||||
@@ -109,29 +110,36 @@
|
|||||||
|
|
||||||
Зарегистрированы при написании e2e (`web/e2e/`, `pnpm --dir web test:e2e`) и
|
Зарегистрированы при написании e2e (`web/e2e/`, `pnpm --dir web test:e2e`) и
|
||||||
ручного чек-листа — см. `docs/checklist-manual-testing.md` (раздел G). Каждый
|
ручного чек-листа — см. `docs/checklist-manual-testing.md` (раздел G). Каждый
|
||||||
зафиксирован как `test.fixme`. После фикса бага: убрать соответствующий
|
пункт связан с соответствующим `test.fixme` или отдельным тестовым долгом. После
|
||||||
`test.fixme` и отметить пункт G в чек-листе как пройденный.
|
фикса: убрать `test.fixme` и отметить пункт G в чек-листе как пройденный.
|
||||||
|
|
||||||
1. **Генераторы без кнопки «Generate»** — все 21 инструмент категории GENERATE
|
1. **Генераторы без автоматического результата** — все 21 инструмент категории
|
||||||
открываются, но в UI нет кнопки Generate и полей схемы (только RU/EN/Reset);
|
GENERATE открываются, но в UI нет полей схемы и результата; доступны только
|
||||||
результат через UI недостижим. В `SchemaToolView.svelte` `isGenerator`
|
RU/EN/Reset. В `SchemaToolView.svelte` уже есть auto-run через debounce,
|
||||||
определяется как `tool.generate && !tool.run`, кнопка рисуется только если
|
поэтому отдельная кнопка Generate не требуется. Ожидание: поля схемы,
|
||||||
`ongenerate` прокинут, а для генераторов с дефолтным `input: "file"` — нет.
|
автоматический запуск по дефолтам и результат-картинка. Fixme:
|
||||||
Ожидание: поля схемы + кнопка «Generate», результат-картинка по дефолтам.
|
`web/e2e/generators.spec.ts`. Кнопка Generate не добавляется без отдельного
|
||||||
Fixme: `web/e2e/generators.spec.ts`. Кнопки и не должно быть, все процессы
|
UX-решения.
|
||||||
должны запускаться автоматически
|
|
||||||
2. **resize-png с дефолтами падает** — схема по умолчанию `size: 0×0` +
|
2. **resize-png с дефолтами падает** — схема по умолчанию `size: 0×0` +
|
||||||
`keepAspect: true` → при загрузке ЛЮБОГО PNG сразу `errors.resizeSize`
|
`keepAspect: true` → при загрузке ЛЮБОГО PNG сразу `errors.resizeSize`
|
||||||
(alert), результата нет. `registry-new/geometry.ts`. Ожидание: осмысленный
|
(alert), результата нет. `web/src/lib/registry/geometry.ts`. Ожидание:
|
||||||
дефолт-размер (например, исходный) либо кнопка, а не авто-ошибка.
|
осмысленный дефолт-размер (например, исходный) либо отдельный режим ввода, а
|
||||||
|
не авто-ошибка.
|
||||||
3. **crop-png с дефолтами падает** — аналогично: `width: 0, height: 0` → сразу
|
3. **crop-png с дефолтами падает** — аналогично: `width: 0, height: 0` → сразу
|
||||||
`errors.cropSize`. `registry-new/geometry.ts`. Ожидание: базовый кроп по
|
`errors.cropSize`. `web/src/lib/registry/geometry.ts`. Ожидание: базовый кроп
|
||||||
умолчанию либо внятное предзаполнение.
|
по умолчанию либо внятное предзаполнение.
|
||||||
4. **Сырые ключи ошибок в UI** — alert на tool-странице показывает сырой ключ
|
4. **Сырые ключи ошибок в UI** — alert на tool-странице показывает сырой ключ
|
||||||
i18n (`errors.resizeSize`), а не сообщение из `en.ts` / `ru.ts` (там
|
i18n (`errors.resizeSize`), а не сообщение из `en.ts` / `ru.ts` (там
|
||||||
`resizeSize: "Width and/or height must be positive"`). Проверяется на
|
`resizeSize: "Width and/or height must be positive"`). Проверяется на
|
||||||
resize-png / crop-png. Ожидание: человекочитаемое сообщение на текущем языке.
|
resize-png / crop-png. Ожидание: человекочитаемое сообщение на текущем языке.
|
||||||
Fixme: `web/e2e/known-issues.spec.ts` (тест «error message localized»).
|
Fixme: `web/e2e/known-issues.spec.ts` (тест «error message localized»).
|
||||||
|
5. **Theme storage key в e2e устарел** — production использует ключ `theme`, а
|
||||||
|
`web/e2e/navigation.spec.ts:30-48` проверяет `easy-png-tools:theme`.
|
||||||
|
Ожидание: исправить тест на фактический контракт и снять `test.fixme`.
|
||||||
|
6. **Reset и auto-run требуют решения** — `pipeline.spec.ts:55-63` ожидает
|
||||||
|
очистку результата, но текущий `SchemaToolView.svelte:162-173` может сразу
|
||||||
|
перезапустить обработку. Нужно определить семантику Reset, затем исправить
|
||||||
|
тест и снять `test.fixme`.
|
||||||
|
|
||||||
## Идеи
|
## Идеи
|
||||||
|
|
||||||
@@ -168,7 +176,7 @@
|
|||||||
**Download**: юзер скачивает результат в нужном формате (mime/ext/quality), а
|
**Download**: юзер скачивает результат в нужном формате (mime/ext/quality), а
|
||||||
pipeline при этом не усложняется лишним звеном. **Сделано (2026-09):**
|
pipeline при этом не усложняется лишним звеном. **Сделано (2026-09):**
|
||||||
механическая часть реализована в preview — `ToolEntry.output`
|
механическая часть реализована в preview — `ToolEntry.output`
|
||||||
(`OutputFormat`: mime/ext/qualityParamId) в `registry-new/types.ts`;
|
(`OutputFormat`: mime/ext/qualityParamId) в `web/src/lib/registry/types.ts`;
|
||||||
`SchemaToolView.download()` кодирует по `output` (jpg/webp/bmp уже настроены;
|
`SchemaToolView.download()` кодирует по `output` (jpg/webp/bmp уже настроены;
|
||||||
`png-to-bmp` переведён сюда же). **Осталось (UX-райз «Download»):**
|
`png-to-bmp` переведён сюда же). **Осталось (UX-райз «Download»):**
|
||||||
- выбор формата/качества прямо в кнопке/диалоге Download для любого
|
- выбор формата/качества прямо в кнопке/диалоге Download для любого
|
||||||
@@ -221,15 +229,15 @@
|
|||||||
контракте поле `preview` у `remove-color`/`remove-background` показывало
|
контракте поле `preview` у `remove-color`/`remove-background` показывало
|
||||||
быстрый ч/б превью-маску (`colorMask`/`backgroundMaskPreview`) того, что
|
быстрый ч/б превью-маску (`colorMask`/`backgroundMaskPreview`) того, что
|
||||||
будет вырезано. При миграции на единый `run(ctx)` поле убрано (шаг 8,
|
будет вырезано. При миграции на единый `run(ctx)` поле убрано (шаг 8,
|
||||||
`registry-new/alpha.ts`) — новый executor и schema-превью зовут `run()`
|
`web/src/lib/registry/alpha.ts`) — новый executor и schema-превью зовут
|
||||||
напрямую, маска пока не нужна. **Идея 1:** дать каждому `run` возможность
|
`run()` напрямую, маска пока не нужна. **Идея 1:** дать каждому `run`
|
||||||
вернуть (или инструмент — объявить) `runMask` — ч/б изображение маски
|
возможность вернуть (или инструмент — объявить) `runMask` — ч/б изображение
|
||||||
изменений либо иной подход (отдельное поле `mask` + функция маски, второй
|
маски изменений либо иной подход (отдельное поле `mask` + функция маски,
|
||||||
результат, overlay). Оценка — на усмотрение при проработке (S/M). Пока живём
|
второй результат, overlay). Оценка — на усмотрение при проработке (S/M).
|
||||||
без неё. **Идея 2:** каждый `run` возвращает два изображения - для
|
Пока живём без неё. **Идея 2:** каждый `run` возвращает два изображения -
|
||||||
отображения (показывает маску или сам результат), и для передачи в следующий
|
для отображения (показывает маску или сам результат), и для передачи в
|
||||||
инструмент (всегда результат. Оценка — на усмотрение при проработке (S/M).
|
следующий инструмент (всегда результат. Оценка — на усмотрение при
|
||||||
Пока живём без неё.
|
проработке (S/M). Пока живём без неё.
|
||||||
|
|
||||||
15. **Процесс работы с инструментами 1 → many и many → 1** — абстракция
|
15. **Процесс работы с инструментами 1 → many и many → 1** — абстракция
|
||||||
результата «набор файлов» оформлена и работает: тип `FileResult`,
|
результата «набор файлов» оформлена и работает: тип `FileResult`,
|
||||||
|
|||||||
@@ -96,6 +96,27 @@
|
|||||||
корректный (не «кракозябры»).
|
корректный (не «кракозябры»).
|
||||||
- [ ] remove-background на сложной полупрозрачности — края не «звенят».
|
- [ ] remove-background на сложной полупрозрачности — края не «звенят».
|
||||||
|
|
||||||
|
## G. Известные баги preview
|
||||||
|
|
||||||
|
> Список синхронизирован с `docs/backlog.md`. Каждый пункт связан с
|
||||||
|
> зарегистрированной проблемой или соответствующим `test.fixme`; после
|
||||||
|
> исправления отметить его здесь и убрать `test.fixme` в том же изменении.
|
||||||
|
|
||||||
|
- [ ] **Генераторы:** открыть инструмент категории 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`.
|
||||||
|
- [ ] **Theme persistence:** переключить тему и проверить сохранение в ключе
|
||||||
|
`theme`. `docs/backlog.md`, `web/e2e/navigation.spec.ts`.
|
||||||
|
- [ ] **Reset/auto-run:** проверить выбранную семантику Reset и автоматический
|
||||||
|
перезапуск после изменения параметров. `docs/backlog.md`,
|
||||||
|
`web/e2e/pipeline.spec.ts`.
|
||||||
|
|
||||||
## Как долго
|
## Как долго
|
||||||
|
|
||||||
- Полный прогон: ~40 минут (все разделы, включая мегапиксели и 4К) в двух
|
- Полный прогон: ~40 минут (все разделы, включая мегапиксели и 4К) в двух
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
### Q0. Зафиксировать baseline и синхронизировать документацию
|
### Q0. Зафиксировать baseline и синхронизировать документацию
|
||||||
|
|
||||||
**Оценка:** S. **Зависимости:** нет.
|
**Статус:** готов к ревью. **Оценка:** S. **Зависимости:** нет.
|
||||||
|
|
||||||
- Проверить фактические команды и зафиксировать их в quality-gate документации.
|
- Проверить фактические команды и зафиксировать их в quality-gate документации.
|
||||||
- Вынести расширенный workflow агента в `docs/agent-workflow.md`, оставив в
|
- Вынести расширенный workflow агента в `docs/agent-workflow.md`, оставив в
|
||||||
@@ -64,6 +64,8 @@
|
|||||||
`docs/checklist-manual-testing.md`.
|
`docs/checklist-manual-testing.md`.
|
||||||
- Убрать устаревшее утверждение про hardcoded debt в `kit` из `AGENTS.md`, если
|
- Убрать устаревшее утверждение про hardcoded debt в `kit` из `AGENTS.md`, если
|
||||||
оно больше не соответствует коду.
|
оно больше не соответствует коду.
|
||||||
|
- Перенести явно устаревшие `docs/analysis.md` и `docs/sorting-backend.md` в
|
||||||
|
`docs/archive/`, добавить даты архивирования и удаления через 30 дней.
|
||||||
- Создать `docs/README.md` как индекс активных документов и карту источников
|
- Создать `docs/README.md` как индекс активных документов и карту источников
|
||||||
истины; подробные правила не дублировать в корневых файлах.
|
истины; подробные правила не дублировать в корневых файлах.
|
||||||
|
|
||||||
@@ -296,6 +298,19 @@ Blanket-запрет всех string literals не использовать.
|
|||||||
текущие критерии приёмки без отдельной сверки с кодом. Новый документ создаётся
|
текущие критерии приёмки без отдельной сверки с кодом. Новый документ создаётся
|
||||||
только когда темы нет в существующем файле; иначе обновляется существующий.
|
только когда темы нет в существующем файле; иначе обновляется существующий.
|
||||||
|
|
||||||
|
### Архивирование и срок хранения
|
||||||
|
|
||||||
|
Завершённые, отменённые или явно устаревшие документы переносятся в
|
||||||
|
`docs/archive/`, а не остаются в корне `docs/` как рабочие планы. При переносе
|
||||||
|
добавляются дата архивирования, дата удаления и причина. Архивный документ —
|
||||||
|
временная справка для быстрого просмотра прошлых решений, но не источник текущих
|
||||||
|
требований.
|
||||||
|
|
||||||
|
Срок хранения после архивирования — 30 дней. После этой даты документ можно
|
||||||
|
удалить после проверки ссылок; если он снова нужен, его восстанавливают из git
|
||||||
|
history или пересоздают как новый активный документ. Подробная процедура и
|
||||||
|
шаблон метаданных находятся в `docs/archive/README.md`.
|
||||||
|
|
||||||
### Какие документы подготовить
|
### Какие документы подготовить
|
||||||
|
|
||||||
| Документ | Назначение | Когда создавать/обновлять |
|
| Документ | Назначение | Когда создавать/обновлять |
|
||||||
@@ -306,6 +321,7 @@ Blanket-запрет всех string literals не использовать.
|
|||||||
| `docs/testing-strategy.md` | Слои тестов, locator policy, i18n assertions, fixtures, `test.fixme` и правила e2e | Q3; при изменении тестовой архитектуры |
|
| `docs/testing-strategy.md` | Слои тестов, locator policy, i18n assertions, fixtures, `test.fixme` и правила e2e | Q3; при изменении тестовой архитектуры |
|
||||||
| `docs/architecture-overview.md` | Карта `core`, registry, executor, нового UI и `/v1`, shared-модули и зависимости | Q4 или перед крупным рефакторингом; не дублировать существующие планы |
|
| `docs/architecture-overview.md` | Карта `core`, registry, executor, нового UI и `/v1`, shared-модули и зависимости | Q4 или перед крупным рефакторингом; не дублировать существующие планы |
|
||||||
| `web/eslint-plugins/README.md` | Детали custom lint rules, token policy и fixtures | Уже существует; менять только вместе с правилами |
|
| `web/eslint-plugins/README.md` | Детали custom lint rules, token policy и fixtures | Уже существует; менять только вместе с правилами |
|
||||||
|
| `docs/archive/README.md` | Политика временного архива, даты и удаления через 30 дней | Q0; обновлять при изменении архивной политики |
|
||||||
|
|
||||||
Не создавать отдельные `docs/commands.md`, `docs/known-issues.md` или копию
|
Не создавать отдельные `docs/commands.md`, `docs/known-issues.md` или копию
|
||||||
backlog: команды принадлежат `quality-gates`, известные проблемы — backlog и
|
backlog: команды принадлежат `quality-gates`, известные проблемы — backlog и
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
# План: i18n в preview (новый UI)
|
# План: i18n в preview (новый UI)
|
||||||
|
|
||||||
> Статус: готов к реализации (вопросы §5 решены). Соответствует беклог-задаче
|
> Статус: **частично выполнен** — базовая i18n-инфраструктура нового UI,
|
||||||
> «добавить i18n в preview» (`docs/backlog.md`). Реализация не начата.
|
> локализация ошибок и `i18n/dict-consistency` уже реализованы; zero-warning
|
||||||
|
> baseline и plural-формы остаются Q2. Актуальные решения и ограничения — в
|
||||||
|
> `docs/plan-codebase-quality.md`.
|
||||||
|
|
||||||
## 1. Что получается
|
## 1. Что получается
|
||||||
|
|
||||||
Новый UI (`web/src/routes/**` кроме `v1`, `web/src/lib/components/**` кроме
|
Новый UI (`web/src/routes/**` кроме `v1`, `web/src/lib/components/**` кроме
|
||||||
`v1`) переходит на существующий модуль `lib/i18n`: переключатель RU/EN в шапке
|
`v1`) использует модуль `lib/i18n`: переключатель RU/EN в шапке работает по
|
||||||
работает по-настоящему, все строки локализованы, ошибки уже локализуются.
|
локали, строки и ошибки локализованы. Остаточные задачи — довести паритет
|
||||||
Инфраструктура i18n уже есть и проверена (v1-ветка) — задача в том, чтобы
|
словарей до zero-warning и спроектировать plural-формы.
|
||||||
подключить к ней preview и закрыть пробелы словарей.
|
|
||||||
|
|
||||||
До начала локализации **v1 изолируется**: у v1 появляется полная замороженная
|
До начала локализации **v1 изолируется**: у v1 появляется полная замороженная
|
||||||
копия `lib/i18n` → `lib/v1/i18n`, у нового UI — своя независимая ветка
|
копия `lib/i18n` → `lib/v1/i18n`, у нового UI — своя независимая ветка
|
||||||
|
|||||||
@@ -4,10 +4,11 @@
|
|||||||
> Остались C20 (шаг 6, проверка нового дизайна) — **следующий этап**. C19/C21
|
> Остались C20 (шаг 6, проверка нового дизайна) — **следующий этап**. C19/C21
|
||||||
> (шаг 7, удаление старого) — **отложены**, нет ценности. Они больше не
|
> (шаг 7, удаление старого) — **отложены**, нет ценности. Они больше не
|
||||||
> привязаны к «верности против рефа»: `docs/archive/plan-design-fix.md` закрыт,
|
> привязаны к «верности против рефа»: `docs/archive/plan-design-fix.md` закрыт,
|
||||||
> аудит против рефа прекращён. Tech debt закрыт
|
> аудит против рефа прекращён. Общий tech-debt baseline зафиксирован в
|
||||||
> (`docs/archive/plan-tech-debt.md`). Backlog №14 (переезд старых файлов в
|
> `docs/plan-codebase-quality.md`; legacy cleanup остаётся отложенным. Backlog
|
||||||
> `old/`) — **выполнено**. Покупка домена НЕ была блокером C17: домен нужен для
|
> №14 (переезд старых файлов в `old/`) — **выполнено**. Покупка домена НЕ была
|
||||||
> S1 (`plan-seo.md`) — canonical, sitemap, снятие `noindex`.
|
> блокером C17: домен нужен для S1 (`plan-seo.md`) — canonical, sitemap, снятие
|
||||||
|
> `noindex`.
|
||||||
>
|
>
|
||||||
> Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву),
|
> Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву),
|
||||||
> `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере.
|
> `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере.
|
||||||
|
|||||||
+16
-17
@@ -50,11 +50,10 @@
|
|||||||
клиенте (localStorage) — для SEO не учитываем.
|
клиенте (localStorage) — для SEO не учитываем.
|
||||||
- **Прод-домен без `BASE_PATH`.** Сборка с базой (GitHub Pages `/repo/`) ломает
|
- **Прод-домен без `BASE_PATH`.** Сборка с базой (GitHub Pages `/repo/`) ломает
|
||||||
абсолютные URL, canonical и «корневость» страниц. Свой домен + корень.
|
абсолютные URL, canonical и «корневость» страниц. Свой домен + корень.
|
||||||
- **URL-схема инструментов:** короткие плоские адреса. После C17 вынести
|
- **URL-схема инструментов:** короткие плоские адреса. После C17 страницы
|
||||||
страницы инструментов в корень: `/crop-png` (как у конкурента), каталог —
|
инструментов находятся в корне на `/tools/[id]`, каталог — на `/list-tools`;
|
||||||
`/tools`. Переезд `/preview/tools/[id]` → `/[id]` сделать **одновременно с
|
текущую схему не менять без отдельного SEO-плана: после индексации
|
||||||
C17** (в одном атомарном коммите): после индексации переименование URL = 301 и
|
переименование URL означает 301 и потерю позиций.
|
||||||
потеря позиций.
|
|
||||||
- **Без GA и рекламных скриптов:** аналитика — self-hosted Plausible/Umami или
|
- **Без GA и рекламных скриптов:** аналитика — self-hosted Plausible/Umami или
|
||||||
Cloudflare Web Analytics. «No tracking» — часть позиционирования, её нельзя
|
Cloudflare Web Analytics. «No tracking» — часть позиционирования, её нельзя
|
||||||
подрывать собственными скриптами.
|
подрывать собственными скриптами.
|
||||||
@@ -68,10 +67,10 @@
|
|||||||
- SvelteKit + `adapter-static`, `prerender = true` на весь сайт
|
- SvelteKit + `adapter-static`, `prerender = true` на весь сайт
|
||||||
(`web/src/routes/+layout.ts`) — весь контент в статичном HTML, ботам не нужен
|
(`web/src/routes/+layout.ts`) — весь контент в статичном HTML, ботам не нужен
|
||||||
JS. Это главный технический козырь.
|
JS. Это главный технический козырь.
|
||||||
- 121 инструмент в `registry-new` с «SEO-шными» id (`crop-png`,
|
- 122 инструмента в `web/src/lib/registry` с «SEO-шными» id (`crop-png`,
|
||||||
`add-border-png`, …) — URL уже повторяют паттерн конкурента.
|
`add-border-png`, …) — URL уже повторяют паттерн конкурента.
|
||||||
- Уникальные `<title>` + `<meta description>` на страницах инструментов старой
|
- На корневых страницах инструментов есть базовые `<title>` и `robots`; полный
|
||||||
ветки; механика переносится на новую при C17.
|
SEO-слой (canonical, OG, content и JSON-LD) остаётся S1/S2.
|
||||||
- Каталог со ссылками на все инструменты (внутренняя перелинковка) и карта
|
- Каталог со ссылками на все инструменты (внутренняя перелинковка) и карта
|
||||||
инструментов против конкурента: `docs/tools-map.md` (у них 311, из них 107 —
|
инструментов против конкурента: `docs/tools-map.md` (у них 311, из них 107 —
|
||||||
нишевые клоны-серии Logo*/Icon*/Stamp* поверх обычных операций).
|
нишевые клоны-серии Logo*/Icon*/Stamp* поверх обычных операций).
|
||||||
@@ -80,12 +79,12 @@
|
|||||||
Чего нет (пробелы закрываются этапами ниже):
|
Чего нет (пробелы закрываются этапами ниже):
|
||||||
|
|
||||||
| Пробел | Где сейчас | Этап |
|
| Пробел | Где сейчас | Этап |
|
||||||
| ----------------------------------------------------- | ----------------------------------- | ------ |
|
| ----------------------------------------------------- | ---------------------------------------- | ---- |
|
||||||
| `sitemap.xml` | нет | S1 |
|
| `sitemap.xml` | нет | S1 |
|
||||||
| `robots.txt` без `Sitemap:` | allow-all (`web/static/robots.txt`) | S1 |
|
| `robots.txt` без `Sitemap:` | allow-all (`web/static/robots.txt`) | S1 |
|
||||||
| `rel=canonical` | нет | S1 |
|
| `rel=canonical` | нет | S1 |
|
||||||
| OG/Twitter-теги, OG-картинки | нет | S1 |
|
| OG/Twitter-теги, OG-картинки | нет | S1 |
|
||||||
| `noindex, nofollow` на страницах инструментов preview | `preview/tools/[id]/+page.svelte` | S1/C17 |
|
| `noindex, nofollow` на страницах инструментов preview | `web/src/routes/tools/[id]/+page.svelte` | S1 |
|
||||||
| Контент страницы (H1-текст, how-to, FAQ, related) | только title/description | S2 |
|
| Контент страницы (H1-текст, how-to, FAQ, related) | только title/description | S2 |
|
||||||
| JSON-LD (SoftwareApplication, FAQPage, Breadcrumb) | нет | S3 |
|
| JSON-LD (SoftwareApplication, FAQPage, Breadcrumb) | нет | S3 |
|
||||||
| `llms.txt`, хабы категорий с текстом | нет | S3 |
|
| `llms.txt`, хабы категорий с текстом | нет | S3 |
|
||||||
@@ -111,7 +110,7 @@
|
|||||||
## 3. Стратегия
|
## 3. Стратегия
|
||||||
|
|
||||||
1. **Не лобовая, а ядро интентов.** 80% объёма поиска приносят ~30–50 запросов.
|
1. **Не лобовая, а ядро интентов.** 80% объёма поиска приносят ~30–50 запросов.
|
||||||
Покрытие инструментов у нас почти полное (121); приоритет — контент и
|
Покрытие инструментов у нас почти полное (122); приоритет — контент и
|
||||||
качество страниц ядра, затем хвосты.
|
качество страниц ядра, затем хвосты.
|
||||||
2. **Страница = лендинг, а не «пустая коробка».** Шаблон контента: H1 → 1–2
|
2. **Страница = лендинг, а не «пустая коробка».** Шаблон контента: H1 → 1–2
|
||||||
абзаца «что делает» → как использовать (шаги) → параметры → FAQ (3–5 вопросов
|
абзаца «что делает» → как использовать (шаги) → параметры → FAQ (3–5 вопросов
|
||||||
@@ -163,10 +162,10 @@
|
|||||||
(`tools/[id]/+page.svelte`) — делается одновременно с S1d (canonical)
|
(`tools/[id]/+page.svelte`) — делается одновременно с S1d (canonical)
|
||||||
чтобы Google сразу проиндексировал с правильным доменом.
|
чтобы Google сразу проиндексировал с правильным доменом.
|
||||||
- [ ] **[S1b]** Скрипт `web/scripts/gen-sitemap.mjs`: генерирует `sitemap.xml` в
|
- [ ] **[S1b]** Скрипт `web/scripts/gen-sitemap.mjs`: генерирует `sitemap.xml` в
|
||||||
`build/` из `TOOLS` реестра (`registry-new`) + статических страниц. Вызов
|
`build/` из `TOOLS` реестра (`web/src/lib/registry`) + статических
|
||||||
из `pnpm build` после `vite build` (adapter-static пишет в `build/`,
|
страниц. Вызов из `pnpm build` после `vite build` (adapter-static пишет в
|
||||||
дописываем файл там же). Origin — из env (`PUBLIC_SITE_ORIGIN`), учёт
|
`build/`, дописываем файл там же). Origin — из env (`PUBLIC_SITE_ORIGIN`),
|
||||||
опционального `BASE_PATH`.
|
учёт опционального `BASE_PATH`.
|
||||||
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебные маршруты (`/kit` до
|
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебные маршруты (`/kit` до
|
||||||
C19; после — вернуть минимальный allow-all).
|
C19; после — вернуть минимальный allow-all).
|
||||||
- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по
|
- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по
|
||||||
@@ -183,7 +182,7 @@
|
|||||||
- [ ] **[S2a]** Схема данных: `seo`-блок per-tool (`longDescription`,
|
- [ ] **[S2a]** Схема данных: `seo`-блок per-tool (`longDescription`,
|
||||||
`howTo: string[]`, `faq: {q, a}[]`) — в i18n-словарях (ru/en), не в коде
|
`howTo: string[]`, `faq: {q, a}[]`) — в i18n-словарях (ru/en), не в коде
|
||||||
реестра. Черновики — генерацией из схемы параметров инструмента, вычитка
|
реестра. Черновики — генерацией из схемы параметров инструмента, вычитка
|
||||||
вручную пачками по категориям (самый трудоёмкий этап: ~121 × 2 локали; RU
|
вручную пачками по категориям (самый трудоёмкий этап: ~122 × 2 локали; RU
|
||||||
— отложить до решения о `/ru/`).
|
— отложить до решения о `/ru/`).
|
||||||
- [ ] **[S2b]** Компонент контента страницы инструмента (kit): H1, lead, how-to
|
- [ ] **[S2b]** Компонент контента страницы инструмента (kit): H1, lead, how-to
|
||||||
(`ol`), описание параметров (из схемы), FAQ, related tools (перелинковка
|
(`ol`), описание параметров (из схемы), FAQ, related tools (перелинковка
|
||||||
@@ -239,7 +238,7 @@
|
|||||||
|
|
||||||
## 5. Приоритизация инструментов (первая волна контента)
|
## 5. Приоритизация инструментов (первая волна контента)
|
||||||
|
|
||||||
Источник — `docs/tools-map.md` (121 реализовано; у конкурента 311, из них 107 —
|
Источник — `docs/tools-map.md` (122 реализовано; у конкурента 311, из них 107 —
|
||||||
клоны-серии). Первая волна — топ-интенты, где конкуренты ранжируются, а у нас
|
клоны-серии). Первая волна — топ-интенты, где конкуренты ранжируются, а у нас
|
||||||
уже есть инструмент и он не хуже:
|
уже есть инструмент и он не хуже:
|
||||||
|
|
||||||
|
|||||||
+8
-7
@@ -1,13 +1,14 @@
|
|||||||
# План разработки: easy-png-tools
|
# План разработки: easy-png-tools
|
||||||
|
|
||||||
> **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена — сайт живёт,
|
> **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена — сайт живёт,
|
||||||
> каталог переведён в типизированный `registry` (121/125), новый дизайн по
|
> каталог переведён в типизированный `registry` (122 текущих инструмента), новый
|
||||||
> `plan-redesign.md` стал основным на корневых маршрутах (C17/C18 выполнены),
|
> дизайн по `plan-redesign.md` стал основным на корневых маршрутах (C17/C18
|
||||||
> старый UI — на `/v1/*` (удаление отложено, ценности не даёт — C19 в бэклоге).
|
> выполнены), старый UI — на `/v1/*` (удаление отложено, ценности не даёт — C19
|
||||||
> Tech debt закрыт. Следующий этап: C20 (проверка нового дизайна,
|
> в бэклоге). Tech debt не закрыт полностью; текущий baseline и следующие
|
||||||
> `plan-redesign.md`, §10) + SEO S1-free (`plan-seo.md`) + баги. Домен нужен для
|
> quality-задачи зафиксированы в `docs/plan-codebase-quality.md`. Следующий
|
||||||
> SEO (`plan-seo.md`, S1-domain). Фазы 2–8 — будущие. Фазы 9–10 спланированы в
|
> этап: C20 (проверка нового дизайна, `plan-redesign.md`, §10) + SEO S1-free
|
||||||
> `docs/plan-platform.md`.
|
> (`plan-seo.md`) + баги. Домен нужен для SEO (`plan-seo.md`, S1-domain). Фазы
|
||||||
|
> 2–8 — будущие. Фазы 9–10 спланированы в `docs/plan-platform.md`.
|
||||||
|
|
||||||
## 0. Решения
|
## 0. Решения
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user