mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
feat: remove v1 routes and libs
This commit is contained in:
+10
-10
@@ -6,7 +6,7 @@
|
||||
|
||||
## Порядок чтения
|
||||
|
||||
1. `AGENTS.md` — команды, обязательные инварианты и границы old/new.
|
||||
1. `AGENTS.md` — команды и обязательные инварианты.
|
||||
2. Этот файл — выбрать актуальный документ по теме.
|
||||
3. `docs/plan-codebase-quality.md` — текущий план приведения качества в порядок
|
||||
и последовательность следующих шагов.
|
||||
@@ -23,8 +23,7 @@
|
||||
| `docs/quality-gates.md` | Команды проверки, warnings и CI | 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-redesign.md` | Новый дизайн production UI | active |
|
||||
| `docs/plan-seo.md` | SEO/GEO-план | active |
|
||||
| `docs/plan-platform.md` | PWA/API/WASM-план | active |
|
||||
| `docs/checklist-manual-testing.md` | Ручная приёмка preview | active |
|
||||
@@ -51,16 +50,17 @@
|
||||
только если темы нет в существующем документе; иначе обновляется источник
|
||||
истины.
|
||||
|
||||
## Текущий baseline Q0
|
||||
## Текущий baseline Q3
|
||||
|
||||
На момент фиксации Q0:
|
||||
На момент фиксации Q3:
|
||||
|
||||
- registry нового UI содержит 122 инструмента;
|
||||
- production registry содержит 122 инструмента;
|
||||
- `pnpm --dir web check` проходит без ошибок и предупреждений;
|
||||
- `pnpm --dir web lint:all` завершается с 0 errors и 0 i18n warnings; остаются 4
|
||||
unused design tokens от token audit;
|
||||
- `pnpm verify` проходит; unit/e2e результаты считать актуальными только после
|
||||
отдельного прогона, исторические числа в `docs/archive/` не являются baseline.
|
||||
- `pnpm --dir web test` — 39 test files / 422 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, 5 skipped.
|
||||
|
||||
Baseline и следующий шаг поддерживаются в `docs/plan-codebase-quality.md`.
|
||||
|
||||
|
||||
@@ -12,12 +12,11 @@
|
||||
4. Найти существующие типы, константы, helpers и тестовые паттерны до создания
|
||||
нового определения.
|
||||
5. Определить границу изменения:
|
||||
- новый UI — `web/src/routes/**` и `web/src/lib/components/**`;
|
||||
- legacy — `web/src/routes/v1/**` и `web/src/lib/v1/**`;
|
||||
- production UI — `web/src/routes/**` и `web/src/lib/components/**`;
|
||||
- shared — `web/src/lib/core/**` и `web/src/lib/theme.svelte.ts`.
|
||||
|
||||
Изменение shared-кода требует проверки обеих веток. Смешивание old/new нельзя
|
||||
обходить относительными импортами или исключениями линтера.
|
||||
Изменение shared-кода требует проверки production-потребителей. Не добавлять
|
||||
исключения линтера ради отдельных модулей без записи в baseline.
|
||||
|
||||
## 2. Порядок изменения
|
||||
|
||||
@@ -73,7 +72,7 @@ E2E запускается отдельно от быстрых проверок
|
||||
- обязательное поведение агента — `AGENTS.md`;
|
||||
- индекс и карта документов — `docs/README.md`;
|
||||
- качество и точные команды — `docs/quality-gates.md`;
|
||||
- тестовая архитектура — `docs/testing-strategy.md` после Q3;
|
||||
- тестовая архитектура — `docs/testing-strategy.md` после Q4;
|
||||
- lint implementation — `web/eslint-plugins/README.md`;
|
||||
- продуктовые решения — backlog и активные планы.
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
> Статус: archived Архивирован: 2026-09-25 Удалить после: 2026-10-25 Причина:
|
||||
> исторический план i18n с уже завершённым UI-v1; plural-формы перенесены в
|
||||
> backlog. Использование: только историческая справка
|
||||
|
||||
# План: i18n в preview (новый UI)
|
||||
|
||||
> Статус: **частично выполнен** — базовая i18n-инфраструктура нового UI,
|
||||
+7
-10
@@ -4,9 +4,9 @@
|
||||
|
||||
- [x] Кросс-языковой линтер словарей (warn-only: паритет ключей, пустые
|
||||
значения, совпадение `{placeholder}`-переменных между всеми локалями) —
|
||||
правило `i18n/dict-consistency`, детали в §Фаза 8
|
||||
`docs/plan-preview-i18n.md`. Правило реализовано; Q2 перевёл i18n baseline
|
||||
к zero-warning через policy-aware fallback, не меняя `/v1`.
|
||||
правило `i18n/dict-consistency`, детали в `web/eslint-plugins/README.md`.
|
||||
Правило реализовано; Q2 перевёл i18n baseline к zero-warning через
|
||||
policy-aware fallback.
|
||||
- [ ] проверка дублирования кода html - div с одинаковым классом и т.д. (глянуть
|
||||
что за `SonarLint` или написать кастомный линтер)
|
||||
- [ ] проверка текстов в svelte\ts\html - всё тексты должны быть через i18n
|
||||
@@ -14,7 +14,7 @@
|
||||
- [ ] консистентность комментариев - если есть описание к одному инструменту -
|
||||
оно должно быть у всех или объяснено, почему этот инструмент такой
|
||||
особенный и заслуживает комментарий
|
||||
- [ ] удалить legacy `tools.*.params` из root i18n после проверки потребителей;
|
||||
- [ ] удалить мёртвые `tools.*.params` из root i18n после проверки потребителей;
|
||||
до этого Q2 держит pattern-based policy-исключение
|
||||
|
||||
## Мелочи всякие
|
||||
@@ -53,8 +53,7 @@
|
||||
- [ ] сделать загрузку картинки исходника по ctrl+v и drag-and-drop (dropzone)
|
||||
- [ ] square-mask-png - проверить работу - параметры неверно считаются. width -
|
||||
100, height - 100, x - 100, y - 100, обрезает 50% на 50% картинку
|
||||
- [ ] прикрутить кастомный color picker (есть в old), добавить прозрачность
|
||||
(range?)
|
||||
- [ ] прикрутить кастомный color picker, добавить прозрачность (range?)
|
||||
- [ ] проверить настройки range slider на crop-png - слишком большие значения
|
||||
- [ ] для range slider field - добавить поле для ввода цифр и кнопку сброса
|
||||
значения
|
||||
@@ -75,8 +74,7 @@
|
||||
|
||||
- [x] добавить i18n в preview
|
||||
- [ ] множественные числа (часть/части/частей; «N параметров», счётчики) —
|
||||
`tPlural()` и формат `PluralForms`, детали в §Фаза 9
|
||||
`docs/plan-preview-i18n.md`
|
||||
`tPlural()` и формат `PluralForms`; детали и критерии — в этом backlog
|
||||
|
||||
## SEO/GEO
|
||||
|
||||
@@ -103,8 +101,7 @@
|
||||
Общий план: `docs/plan-platform.md`; WASM-ядро и CLI уже в `docs/roadmap.md`
|
||||
(фазы 3–8) — здесь только новые треки.
|
||||
|
||||
- [ ] PWA: manifest + service worker, оффлайн-режим, установка (после C17 и S1;
|
||||
C19 отложен — не блокер)
|
||||
- [ ] PWA: manifest + service worker, оффлайн-режим, установка (после S1)
|
||||
- [ ] API: спайк серверного ядра (нативный Rust vs edge-wasm), ключи, free tier
|
||||
(после wasm-фаз 5–7)
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# План: линтеры, тесты и качество кодовой базы
|
||||
|
||||
> Статус: **draft — на ревью**.
|
||||
> Статус: **draft — Q0–Q3 готовы к ревью; Q4 — следующий этап**.
|
||||
>
|
||||
> Источник: `docs/backlog.md`, аудит конфигурации `web/`, e2e-тестов и
|
||||
> инфраструктурных скриптов. До подтверждения плана кодовые изменения не
|
||||
> выполняются.
|
||||
> инфраструктурных скриптов. Q0–Q3 выполнены; Q4–Q8 выполняются отдельными
|
||||
> атомарными шагами.
|
||||
>
|
||||
> Цель: сделать качество кодовой базы воспроизводимым, убрать ложную «зелёность»
|
||||
> проверок, стабилизировать тестовые контракты и только после этого расширять
|
||||
@@ -14,51 +14,40 @@
|
||||
|
||||
1. Сначала stabilизировать существующие проверки и тестовые контракты, а не
|
||||
добавлять новые сложные lint-правила.
|
||||
2. Старый UI (`src/lib/v1/`, `src/routes/v1/`, `app_v1.css`) больше не является
|
||||
обязательной поддерживаемой версией: текущий production на корневых маршрутах
|
||||
уже достаточно стабилен для использования.
|
||||
3. Пока `/v1` существует, старый и новый UI остаются изолированными. Не тратить
|
||||
время на исправления, тесты и документацию, которые нужны только v1.
|
||||
4. Удаление v1 — реальный следующий cleanup-задача (Q3). Не ждать, пока legacy
|
||||
начнёт мешать, и не тратить время на его поддержку; если задача упирается в
|
||||
v1, Q3 выполняется перед ней.
|
||||
5. `core/` и `theme/` — общие модули. Их изменения проверяются unit-тестами и
|
||||
smoke-сценариями для обеих веток, пока ветка v1 не удалена.
|
||||
6. Изменения делаются небольшими атомарными частями, в соответствии с
|
||||
2. Старый UI удалён: production работает на корневых маршрутах, а `/v1/**` и
|
||||
v1-specific код больше не являются частью приложения.
|
||||
3. Не добавлять новые v1-фичи, не чинить v1-баги и не расширять v1-тесты.
|
||||
4. `core/` и `theme/` — общие модули. Их изменения проверяются unit-тестами и
|
||||
smoke-сценариями production-потребителей.
|
||||
5. Изменения делаются небольшими атомарными частями, в соответствии с
|
||||
`AGENTS.md`.
|
||||
7. Каждый новый lint-rule сначала появляется в report-only/warn-only режиме,
|
||||
6. Каждый новый lint-rule сначала появляется в report-only/warn-only режиме,
|
||||
получает fixtures и тесты, и только после очистки baseline становится
|
||||
blocking.
|
||||
8. Детали реализации правил остаются в `web/eslint-plugins/README.md`;
|
||||
7. Детали реализации правил остаются в `web/eslint-plugins/README.md`;
|
||||
`AGENTS.md` содержит краткие обязательные политики, понятные агенту без
|
||||
дополнительных поисков, и ссылки на подробные документы.
|
||||
|
||||
### Политика legacy v1
|
||||
### Политика удаления legacy v1
|
||||
|
||||
- v1 можно удалить; это разрешённый cleanup, а не обязательная работа перед
|
||||
каждой задачей.
|
||||
- Не добавлять новые v1-фичи, не чинить v1-баги и не расширять v1-тесты без
|
||||
прямой зависимости текущей задачи от legacy-кода.
|
||||
- Если задача требует изменений в v1 или общих модулях, сначала выполнить Q3,
|
||||
если это не противоречит атомарности текущей задачи, и продолжить работу
|
||||
только с production-веткой.
|
||||
- Если порядок работ изменится, Q3 можно перенести как целый cleanup, но не
|
||||
возвращать постоянную поддержку v1.
|
||||
- После удаления проверить маршруты, импорты, i18n, тесты, документацию и
|
||||
конфигурацию lint; старые ссылки не оставлять как «источник совместимости».
|
||||
- Q3 — отдельная атомарная cleanup-задача; поддержка v1 не возвращается.
|
||||
- Старые маршруты и UI-файлы удаляются без redirects и без совместимого
|
||||
maintenance-режима.
|
||||
- В рабочей кодовой базе не оставлять UI-v1-пути, исключения или документацию,
|
||||
которые выглядят как действующий источник совместимости.
|
||||
- Исторические упоминания допустимы только в `docs/archive/`.
|
||||
- Будущий API-контракт `POST /v1/process` из `docs/plan-platform.md` не связан с
|
||||
удалённым UI-v1 и остаётся в планах.
|
||||
|
||||
## 2. Что уже есть и что мешает
|
||||
## 2. Текущее состояние quality-контура
|
||||
|
||||
- `i18n/dict-consistency` реализован и подключён как `warn-only`
|
||||
(`web/eslint.config.js:177-188`). Проверки ключей, пустых значений и
|
||||
placeholders есть, но текущий baseline ещё содержит расхождения.
|
||||
- `lint:all` запускает ESLint, Stylelint и token audit
|
||||
(`web/scripts/lint-all.mjs:31-54`), но не запускает typecheck, unit-тесты,
|
||||
Prettier или Playwright.
|
||||
- CI workflow сейчас проверяет только production build
|
||||
(`.github/workflows/deploy.yml:40-53`).
|
||||
- В e2e есть фиксированные числа, точные тексты, CSS-классы и `alt`-селекторы:
|
||||
`web/e2e/catalog.spec.ts:4-55`, `web/e2e/text-and-verdicts.spec.ts:52-101`.
|
||||
- `pnpm verify` объединяет typecheck, unit, rule-тесты, lint, форматирование,
|
||||
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`).
|
||||
@@ -137,9 +126,10 @@ pnpm --dir web test:e2e
|
||||
- `BASE_LOCALE` — единственный источник registry-English fallback для
|
||||
`tools.*.title` и `tools.*.description`; остальные локали требуют физические
|
||||
ключи.
|
||||
- Legacy `tools.*.params` исключён pattern-based policy до отдельной очистки
|
||||
мёртвого словаря; пустые значения и placeholders не подавляются.
|
||||
- Исправлены три реальных RU option-label gaps и удалены неиспользуемые legacy
|
||||
- Временно неиспользуемые `tools.*.params` исключены pattern-based policy до
|
||||
отдельной очистки мёртвого словаря; пустые значения и placeholders не
|
||||
подавляются.
|
||||
- Исправлены три реальных RU option-label gaps и удалены неиспользуемые
|
||||
option-группы из `ru.ts`.
|
||||
- Исправлен tie-break placeholder parity: при равенстве голосов выбирается
|
||||
`BASE_LOCALE`.
|
||||
@@ -148,22 +138,21 @@ pnpm --dir web test:e2e
|
||||
- Plural-формы остаются отдельной задачей после Q2 и не смешиваются с этим
|
||||
этапом.
|
||||
|
||||
### Q3. Удалить v1 (следующий cleanup)
|
||||
### Q3. Удалить UI-v1 (cleanup завершён)
|
||||
|
||||
**Статус:** следующий шаг после Q2. **Оценка:** M. **Зависимости:** Q0, Q1, Q2.
|
||||
**Статус:** выполнен. **Проверено:** `pnpm verify` и production E2E smoke
|
||||
проходят; после проверки обновлены конфиги и активные документы. **Оценка:** M.
|
||||
**Зависимости:** Q0, Q1, Q2.
|
||||
|
||||
- Удалить `web/src/routes/v1/**`, `web/src/lib/v1/**`, `app_v1.css`, v1-specific
|
||||
i18n/tests и оставшиеся v1-ссылки.
|
||||
- Убрать v1 из isolation/lint/test-конфигураций и документации; не оставлять
|
||||
исключения только ради удалённого кода.
|
||||
- Обновить shared `core`/`theme` проверки: после удаления v1 проверять только
|
||||
production-потребителя.
|
||||
- Прогнать `pnpm verify` и отдельный e2e smoke production-маршрутов.
|
||||
- Не выполнять удаление как побочный эффект другого PR; это отдельная атомарная
|
||||
задача.
|
||||
- Удалены `web/src/routes/v1/**`, `web/src/lib/v1/**`, `app_v1.css`, v1-specific
|
||||
i18n/tests и fixtures.
|
||||
- Удалены isolation plugin, его тест и все v1-исключения из lint-конфигураций.
|
||||
- Убраны v1-ссылки из production-кода и активных документов; исторические
|
||||
упоминания остаются в `docs/archive/`.
|
||||
- Проверены production build, verify и отдельный E2E smoke production-маршрутов.
|
||||
|
||||
**Готово, когда:** production build и verify зелёные, v1-маршруты и файлы
|
||||
отсутствуют, а ссылки и конфиги не содержат legacy-путей.
|
||||
**Результат:** `/v1/**`, UI-v1-файлы и legacy-конфигурация отсутствуют;
|
||||
следующий этап — Q4.
|
||||
|
||||
### Q4. Тестовый контракт e2e
|
||||
|
||||
@@ -243,8 +232,6 @@ file-result-инструментам.
|
||||
- Очистить или использовать unused design tokens; после очистки решить, должен
|
||||
ли unused audit быть fail-режимом.
|
||||
- Добавить тесты для token audit и PostCSS HCT-плагина.
|
||||
- Проверить/исправить расхождение документации isolation rule и реально
|
||||
передаваемых options.
|
||||
- Покрыть базовым JS recommended сам код ESLint-плагинов и lint-скриптов.
|
||||
- Отдельно решить, должен ли обычный CSS проходить проверку undefined tokens и
|
||||
hardcoded colors наравне со Svelte styles.
|
||||
@@ -291,8 +278,8 @@ Blanket-запрет всех string literals не использовать.
|
||||
|
||||
1. Какой набор команд считается полным quality gate и что означает успешный
|
||||
результат при warnings.
|
||||
2. Старый/new scope и политику v1: v1 можно удалить, но пока он существует, не
|
||||
расширять на него новые правила и не тратить время на его поддержку.
|
||||
2. Production-scope и политику удаления v1: новые изменения относятся только к
|
||||
production UI; исторические UI-v1-упоминания остаются в архиве.
|
||||
3. Политику e2e: semantic locators, допустимый `data-testid`, запрет
|
||||
бессмысленных counts/classes/alt/exact prose.
|
||||
4. Политику i18n: новые пользовательские тексты через i18n; registry source,
|
||||
@@ -301,7 +288,7 @@ Blanket-запрет всех string literals не использовать.
|
||||
исправление и удаление теста происходят вместе.
|
||||
6. Комментарии и `TODO`/`FIXME` должны объяснять «почему» и иметь ссылку на
|
||||
работу.
|
||||
7. Shared-модули `core`/`theme` требуют проверки обеих веток.
|
||||
7. Shared-модули `core`/`theme` требуют проверки production-потребителей.
|
||||
|
||||
Синтаксические списки ESLint-правил и подробные токены остаются в
|
||||
`web/eslint-plugins/README.md`.
|
||||
@@ -309,7 +296,7 @@ Blanket-запрет всех string literals не использовать.
|
||||
### Политика документации для агентов
|
||||
|
||||
`AGENTS.md` не должен превращаться в полный справочник проекта. В нём оставляем
|
||||
только обязательный рабочий контракт: команды, границы old/new, ключевые
|
||||
только обязательный рабочий контракт: команды, production-scope, ключевые
|
||||
инварианты, исключения и ссылки на подробные документы. Если агенту нужно понять
|
||||
причину или workflow, в `AGENTS.md` должна быть короткая понятная формулировка;
|
||||
длинные примеры, точные процедуры, таблицы и критерии проверки переносятся в
|
||||
@@ -351,15 +338,15 @@ history или пересоздают как новый активный док
|
||||
|
||||
### Какие документы подготовить
|
||||
|
||||
| Документ | Назначение | Когда создавать/обновлять |
|
||||
| ------------------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
|
||||
| `docs/README.md` | Индекс активных документов, карта источников истины и краткий порядок чтения для агента | Q0; при добавлении нового активного документа |
|
||||
| `docs/agent-workflow.md` | Подробный workflow: исследование, изменение, проверка, работа с legacy и обновление документации | Q0–Q1; только для процессов, не описанных кратко в `AGENTS.md` |
|
||||
| `docs/quality-gates.md` | Команды проверки, semantics errors/warnings, порядок запуска и требования CI | Q1; при изменении scripts/config/CI |
|
||||
| `docs/testing-strategy.md` | Слои тестов, locator policy, i18n assertions, fixtures, `test.fixme` и правила e2e | Q4; при изменении тестовой архитектуры |
|
||||
| `docs/architecture-overview.md` | Карта `core`, registry, executor, нового UI и `/v1`, shared-модули и зависимости | Q5 или перед крупным рефакторингом; не дублировать существующие планы |
|
||||
| `web/eslint-plugins/README.md` | Детали custom lint rules, token policy и fixtures | Уже существует; менять только вместе с правилами |
|
||||
| `docs/archive/README.md` | Политика временного архива, даты и удаления через 30 дней | Q0; обновлять при изменении архивной политики |
|
||||
| Документ | Назначение | Когда создавать/обновлять |
|
||||
| ------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
||||
| `docs/README.md` | Индекс активных документов, карта источников истины и краткий порядок чтения для агента | Q0; при добавлении нового активного документа |
|
||||
| `docs/agent-workflow.md` | Подробный workflow: исследование, изменение, проверка и обновление документации | Q0–Q1; только для процессов, не описанных кратко в `AGENTS.md` |
|
||||
| `docs/quality-gates.md` | Команды проверки, semantics errors/warnings, порядок запуска и требования CI | Q1; при изменении scripts/config/CI |
|
||||
| `docs/testing-strategy.md` | Слои тестов, locator policy, i18n assertions, fixtures, `test.fixme` и правила e2e | Q4; при изменении тестовой архитектуры |
|
||||
| `docs/architecture-overview.md` | Карта `core`, registry, executor, production UI и shared-модулей | Q5 или перед крупным рефакторингом; не дублировать существующие планы |
|
||||
| `web/eslint-plugins/README.md` | Детали custom lint rules, token policy и fixtures | Уже существует; менять только вместе с правилами |
|
||||
| `docs/archive/README.md` | Политика временного архива, даты и удаления через 30 дней | Q0; обновлять при изменении архивной политики |
|
||||
|
||||
Не создавать отдельные `docs/commands.md`, `docs/known-issues.md` или копию
|
||||
backlog: команды принадлежат `quality-gates`, известные проблемы — backlog и
|
||||
@@ -392,11 +379,9 @@ refactor, новые i18n-правила и исправление продук
|
||||
|
||||
## 7. Решения, которые нужно принять на ревью
|
||||
|
||||
- Оставляем ли dictionary linter warn-only до очистки или сразу вводим blocking
|
||||
baseline?
|
||||
- Считаем ли `registry.title/description` физическими i18n-ключами или
|
||||
допустимым английским fallback?
|
||||
- Подтверждаем ли auto-run генераторов без кнопки Generate?
|
||||
- Что именно должен делать Reset при включённом auto-run?
|
||||
- Какие semantic locators и допустимые `data-testid` закрепить в Q4?
|
||||
- Какие browser/e2e проверки должны быть обязательными для PR, а какие —
|
||||
отдельным ночным прогоном?
|
||||
- Подтверждаем ли auto-run генераторов без кнопки Generate?
|
||||
- Что именно должен делать Reset при включённом auto-run?
|
||||
- Какие i18n-сценарии проверяются в e2e, а какие остаются unit-проверками?
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
- Гейт: один и тот же пайплайн даёт пиксельно идентичный результат в браузере,
|
||||
CLI и API (harness фазы 7 расширяется третьим рантаймом).
|
||||
|
||||
## 2. Фаза 10 — PWA (после C17 и S1; C19 не блокер)
|
||||
## 2. Фаза 10 — PWA (после S1)
|
||||
|
||||
- [ ] **[P1]** Манифест: имя (бренд после R1 из plan-seo §6), иконки 192/512 +
|
||||
maskable, theme-color из дизайн-токенов, `display: standalone`.
|
||||
@@ -64,8 +64,7 @@
|
||||
## 3. Порядок и связи
|
||||
|
||||
- WASM-ядро, эталоны, CLI — `docs/roadmap.md` фазы 2–8 (не дублируются).
|
||||
- PWA — после C17 (один дизайн, реальные маршруты) и после S1 `plan-seo.md`; C19
|
||||
отложен и PWA не ждёт (не кешировать noindex-версии); API — после фаз 5–7.
|
||||
- PWA — после S1 `plan-seo.md`; API — после фаз 5–7.
|
||||
- Синергия с дистрибуцией: «works offline, installable» и публичный API —
|
||||
аргументы для Product Hunt / alternative.to / GitHub (plan-seo S4c) и для
|
||||
GEO-текстов (`llms.txt`, описания категорий).
|
||||
|
||||
+50
-116
@@ -1,44 +1,26 @@
|
||||
# План: переезд на новый дизайн (refs) — параллельная сборка
|
||||
|
||||
> Статус: C17 **выполнен** (`docs/archive/plan-c17.md`), C18 **выполнен**.
|
||||
> Остались C20 (шаг 6, проверка нового дизайна) — **следующий этап**. C19/C21
|
||||
> (шаг 7, удаление старого) — **отложены**, нет ценности. Они больше не
|
||||
> привязаны к «верности против рефа»: `docs/archive/plan-design-fix.md` закрыт,
|
||||
> аудит против рефа прекращён. Общий tech-debt baseline зафиксирован в
|
||||
> `docs/plan-codebase-quality.md`; legacy cleanup остаётся отложенным. Backlog
|
||||
> №14 (переезд старых файлов в `old/`) — **выполнено**. Покупка домена НЕ была
|
||||
> блокером C17: домен нужен для S1 (`plan-seo.md`) — canonical, sitemap, снятие
|
||||
> `noindex`.
|
||||
> Статус: C17 **выполнен** (`docs/archive/plan-c17.md`), C18 **выполнен**, Q3
|
||||
> (удаление старого UI) **выполнен**. Остался C20 (шаг 6, проверка нового
|
||||
> дизайна) — **следующий этап**. C21 (удалить refs) остаётся отдельной уборкой.
|
||||
> Общий tech-debt baseline и следующие quality-задачи зафиксированы в
|
||||
> `docs/plan-codebase-quality.md`. Покупка домена НЕ была блокером C17: домен
|
||||
> нужен для S1 (`plan-seo.md`) — canonical, sitemap, снятие `noindex`.
|
||||
>
|
||||
> Источники: `refs/` — Next/React-референс (правда по пикселям и интерактиву),
|
||||
> `refs-html/` — статические HTML-снимки для быстрого просмотра в браузере.
|
||||
>
|
||||
> **Стратегия изменена.** Вместо in-place рестайла (старый план A–F, правка
|
||||
> общих компонентов на месте с алиасами токенов) — **параллельная сборка**:
|
||||
> новый дизайн строится отдельно, изолируется от старого, проверяется целиком,
|
||||
> затем становится основным и старый удаляется. Старое приложение остаётся
|
||||
> рабочим и шippable на всём протяжении перехода.
|
||||
> **Историческая стратегия перехода:** сначала новый UI собирался отдельно,
|
||||
> затем стал production, после чего legacy-ветка была удалена Q3. Текущие
|
||||
> критерии относятся только к production UI; старые решения и детали перехода
|
||||
> остаются в архивных планах.
|
||||
|
||||
## 0. Почему меняем стратегию
|
||||
|
||||
- **Старый план (A–F):** правим `ui/*` и страницы на месте, держим старые токены
|
||||
как алиасы, чтобы ничего не сломалось до этапа F. Риск: общие компоненты
|
||||
редактируются вживую → регресс старого UI во время работы, новый дизайн нельзя
|
||||
принять изолированно.
|
||||
- **Новый подход (5 фаз):** (1) строим новый ui-kit, (2) строим новые страницы
|
||||
рядом, не трогая старые, (3) проверяем новый дизайн, (4) делаем его основным,
|
||||
(5) удаляем старый. Ниже фазы 1–5 — это требуемые шаги.
|
||||
- **Главный технический риск и его решение.** Сейчас `web/src/app.css`
|
||||
импортируется в **корневом** `web/src/routes/+layout.svelte:2` и потому
|
||||
грузится на ВСЕХ маршрутах, включая новые. Решение — **не префиксовать новый
|
||||
CSS (никакого `.ds2`), а разнести глобальные стили по layout'ам без
|
||||
наследования**: (а) убрать `import '../app.css'` из корневого layout; (б)
|
||||
старые маршруты обернуть группой `(old)/` с собственным layout, импортирующим
|
||||
`app.css`; (в) новые маршруты (`preview/*`) — собственный layout,
|
||||
импортирующий `design2.css`. SvelteKit делает code-splitting CSS по маршрутам,
|
||||
а стили компонентов скоупятся сами — поэтому глобальные стили каждого дизайна
|
||||
живут только в своей ветке, и префикс-обёртка `.ds2` не нужна. Старые `ui/` и
|
||||
страницы не трогаются до фазы 5.
|
||||
- Переход выполнялся параллельной сборкой, чтобы новый UI можно было проверить
|
||||
независимо; теперь production использует только новые маршруты и `app.css`.
|
||||
- Дизайн-токены и глобальные стили живут в `web/src/app.css`; отдельные layout
|
||||
для удалённого UI-v1 больше не нужны.
|
||||
|
||||
## 1. Источники и их оценка
|
||||
|
||||
@@ -189,68 +171,29 @@
|
||||
> `app.css`; если позже захотим держать новые маршруты внутри группы, `@`
|
||||
> пригодится для сброса родительского layout.
|
||||
|
||||
## 6. Маршрутизация параллельных страниц
|
||||
## 6. Маршрутизация: историческая схема перехода
|
||||
|
||||
Новые страницы живут в **отдельной ветке `preview/*`**, не трогая старые:
|
||||
Во время перехода UI-kit проверялся в отдельной ветке, затем его страницы были
|
||||
перенесены на production-маршруты. Эта схема нужна только для восстановления
|
||||
контекста C17; текущая структура описана в разделе 7, отдельных preview- или
|
||||
legacy-layouts в production больше нет.
|
||||
|
||||
```txt
|
||||
src/routes/+layout.svelte # нейтральный, БЕЗ app.css
|
||||
src/routes/(old)/+layout.svelte # импорт app.css + старая шапка/подвал
|
||||
src/routes/(old)/+page.svelte # / (старое)
|
||||
src/routes/(old)/demo/+page.svelte # /demo
|
||||
src/routes/(old)/list-tools/...
|
||||
src/routes/(old)/tools/[id]/...
|
||||
src/routes/preview/+layout.svelte # импорт design2.css, <AppShell>
|
||||
src/routes/preview/+page.svelte # /preview — воркспейс (index/demo)
|
||||
src/routes/preview/demo/+page.svelte # /preview/demo
|
||||
src/routes/preview/list-tools/+page.svelte
|
||||
src/routes/preview/tools/[id]/+page.svelte
|
||||
```
|
||||
## 7. Фазы выполнения
|
||||
|
||||
- Каждая новая страница импортирует **только** `kit/*`. Старые страницы не
|
||||
изменяются (только перемещены в `(old)/`).
|
||||
- Фаза 4: содержимое `preview/*` переносится на реальные маршруты (move-файлы),
|
||||
группа `(old)/` удаляется, `design2.css` подключается в корневом
|
||||
`+layout.svelte` (как новый основной слой), временный флаг/кнопка убираются.
|
||||
- **C1–C16 — UI-kit и проверка нового дизайна.** Токены, компоненты и
|
||||
интерактивные состояния приняты; детали перехода остаются в архивном
|
||||
`plan-design-fix.md`.
|
||||
- **C17/C18 — production-переход.** Новые страницы перенесены на реальные
|
||||
корневые маршруты; `app.css` стал единственным production-стилем.
|
||||
- **Q3/C19 — cleanup.** Удалены UI-v1, legacy CSS, v1-тесты, fixtures и
|
||||
isolation-конфигурация; production build и verify проверяются отдельно.
|
||||
- **C20 — следующий этап.** Финальный проход по брейкпоинтам и визуальной
|
||||
приёмке production UI.
|
||||
- **C21 — отдельная уборка.** Удалить `refs/` и `refs-html/`, если они больше не
|
||||
нужны.
|
||||
|
||||
## 7. Фазы выполнения (1–5 по запросу)
|
||||
|
||||
Каждая фаза заканчивается зелёными `test`/`check`/`build` и ревью в браузере
|
||||
(обе темы) против `refs-html/`.
|
||||
|
||||
- **Фаза 1 — Фундамент + UI-kit.** Токены §2, `design2.css` по §5, все примитивы
|
||||
§3 и контролы §4 как отдельные компоненты. Критерий: демо-страница kit'а
|
||||
(`/preview` или временная) показывает все состояния (light/dark,
|
||||
hover/disabled, все варианты Button/Segmented/Badge); unit-тесты форм не
|
||||
падают; **старые страницы визуально не изменились** (изоляция работает).
|
||||
|
||||
- **Фаза 2 — Новые страницы.** Под `preview/*` (§6): воркспейс, demo,
|
||||
list-tools, tool-page (двухпанельная раскладка из рефа: settings-panel +
|
||||
preview-panel, step-cards для chain). Критерий: разметка соответствует
|
||||
`refs-html/index.html`, `gradient.html`, `background-remover.html`,
|
||||
`list-tools.html`; интерактив (слайдеры/тоглы/загрузка/автозапуск) работает в
|
||||
новом стиле; старые маршруты продолжают работать как раньше.
|
||||
|
||||
- **Фазa 3 — Проверка нового дизайна.** Смоук §8 (обе темы, узкий экран, 800px),
|
||||
скриншоты против `refs-html/`, прогон старого тест-сьюта для доказательства
|
||||
отсутствия регресса, RU/EN-локализация новых лейблов. Критерий: визуальное
|
||||
совпадение с рефом, зелёные тесты, записанные скриншоты приняты.
|
||||
|
||||
- **Фаза 4 — Сделать новый дизайн основным.** Перенос `preview/*` → реальные
|
||||
маршруты; `design2.css` подключается в корневом `+layout.svelte`; удаление
|
||||
preview-группы и временного флага/кнопки. Старые страницы теперь не
|
||||
используются (мёртвый код), но физически ещё в репо. Критерий: реальные
|
||||
маршруты отдают новый дизайн, тесты зелёные, билд без предупреждений.
|
||||
|
||||
- **Фаза 5 — Удалить старый дизайн.** Удаление старых страниц, старого `ui/`,
|
||||
старого `app.css` (и его токенов), неиспользуемых классов; наведение порядка в
|
||||
`components/` (имя каталога и подпапок — решается на фазе 1; к C17 `kit/` уже
|
||||
разложен в `components/`). Финальный проход по брейкпоинтам 1200/1100/800/480.
|
||||
Критерий: `grep` по старым токенам/классам пуст, build чистый, старый дизайн
|
||||
нигде не упоминается.
|
||||
|
||||
Оценка объёма: Фаза 1 — фундамент+kit (~1 день), Фаза 2 — страницы (~1–2 дня),
|
||||
Фаза 3 — проверка (~полдня), Фаза 4–5 — переключение и чистка (~полдня).
|
||||
Критерии каждого этапа — зелёные `test`/`check`/`build`, отсутствие остаточных
|
||||
legacy-путей в production-коде и ревью в браузере для UI-изменений.
|
||||
|
||||
## 8. Смоук (после фазы 3, контроль на фазе 4)
|
||||
|
||||
@@ -268,14 +211,10 @@ src/routes/preview/tools/[id]/+page.svelte
|
||||
## 9. Открытые вопросы
|
||||
|
||||
- **Имя финального каталога компонентов:** решено на C1 — писали в `kit/`, C17
|
||||
разложил его в `components/` (подпапки fields/layout/ui). На C19 — только
|
||||
разложил его в `components/` (подпапки fields/layout/ui). На C21 — только
|
||||
навести порядок внутри `components/`, переименование не требуется.
|
||||
- **Изоляция через layout:** `app.css` вынесен из корневого layout в
|
||||
`(old)/+layout.svelte`; новый `design2.css` — только в `preview/+layout`.
|
||||
Проверить на фазе 1, что на `/preview/*` не попадают стили старого дизайна
|
||||
(DevTools → вкладка Styles, нет правил из `app.css`).
|
||||
- **Переключатель для проверки:** рекомендую `localStorage`-флаг + кнопка
|
||||
«Preview v2» в старой шапке + группа `preview/*`. Убрать на фазе 4.
|
||||
- **Единый production CSS:** `app.css` подключается в корневом layout; отдельных
|
||||
legacy-layouts и переключателей версий больше нет.
|
||||
- **Mono-лейблы рефа на английском** (`PROCESSING PIPELINE`): завести i18n-
|
||||
ключи, но допустить часть английских брендовых («приборная панель»).
|
||||
- **Версия в шапке/футере:** из `package.json` через `define` или захардкодить —
|
||||
@@ -283,8 +222,8 @@ src/routes/preview/tools/[id]/+page.svelte
|
||||
- **`refs/` и `refs-html/` — одноразовый источник, НЕ поддерживаемый.** После
|
||||
внедрения нового дизайна все правки дизайна делаются сразу в продакшен-коде
|
||||
(`design2.css` + `kit/`), а не в `refs/`. Механизм синхронизации «ref → код»
|
||||
не нужен и не создаётся. `refs/` и `refs-html/` можно удалить из репо на фазе
|
||||
5 (по желанию), они не являются частью рантайма.
|
||||
не нужен и не создаётся. `refs/` и `refs-html/` — только историческая справка;
|
||||
их можно удалить в C21, они не являются частью рантайма.
|
||||
|
||||
## 10. План исполнения (мелкие коммиты)
|
||||
|
||||
@@ -362,10 +301,10 @@ src/routes/preview/tools/[id]/+page.svelte
|
||||
|
||||
### Шаг 5. Сделать новый дизайн основным
|
||||
|
||||
> C17 — **выполнен** (`docs/archive/plan-c17.md`): старый `(old)/` → `/v1/`,
|
||||
> preview-страницы переехали в корень, `app.css` стал корневым. C18 (правки
|
||||
> импортов/редиректов после переноса, проверка билда) — **выполнен**. Остались:
|
||||
> C19 (удаление старого, раскрытие `recommended` на весь код), C20, C21.
|
||||
> C17 — **выполнен** (`docs/archive/plan-c17.md`): production-маршруты
|
||||
> перенесены в корень, `app.css` стал корневым. C18 (правки импортов/редиректов
|
||||
> после переноса, проверка билда) — **выполнен**. Q3 удалил старые UI-маршруты и
|
||||
> код. Остались C20 и C21.
|
||||
|
||||
- [x] **[C17]** Перенести `preview/*` → реальные маршруты (move), удалить
|
||||
`(old)/`, корневой `+layout.svelte` импортирует `design2.css` + новый
|
||||
@@ -387,26 +326,21 @@ src/routes/preview/tools/[id]/+page.svelte
|
||||
|
||||
- [ ] **[C20]** Финальный проход по брейкпоинтам 1200/1100/800/480; build без
|
||||
предупреждений; `grep` по старым токенам/классам пуст. Доказательство
|
||||
отсутствия регресса: старый `v1/` работает и не затронут.
|
||||
отсутствия регресса: production-маршруты и основные пользовательские
|
||||
потоки работают.
|
||||
|
||||
### Шаг 7. Опциональная чистка (отложен, нет срока)
|
||||
### Шаг 7. Cleanup
|
||||
|
||||
- [x] **[C19/Q3]** Удалить старое: маршруты `routes/v1/**`, код `lib/v1/**`,
|
||||
`app_v1.css`, v1-тесты, fixtures и isolation-плагин; убрать v1-исключения
|
||||
из конфигурации и активной документации.
|
||||
- [ ] **[C21]** Удалить `refs/` и `refs-html/` из репо — они больше не источник
|
||||
правды.
|
||||
- [ ] **[C19]** Удалить старое: маршруты `routes/v1/**`, код `lib/v1/**`,
|
||||
`app_v1.css` (и его токены), неиспользуемые классы. **И раскрыть ESLint
|
||||
`recommended` на весь код** — убрать scoped-блок `newCode` в
|
||||
`web/eslint.config.js`, прогнать `lint` и починить всплывшие ошибки.
|
||||
_Примечание: доменные модули (`lib/core`, `lib/registry`, тесты и т.п.) —
|
||||
это не «старый дизайн», у них свой линт-долг; расширение `recommended` на
|
||||
них может выдать много ошибок. Решить на C19: либо чиним сразу, либо
|
||||
расширяем scoped только на `src/routes/**` + `src/lib/components/**`._
|
||||
- [ ] Навести порядок в `components/` (согласовать подпапки, финальное имя
|
||||
каталога).
|
||||
|
||||
> **Удаление v1 не решает никаких текущих задач** и не даёт пользовательской
|
||||
> ценности. Старый код лежит мёртвым, не мешает, не ломает билд. Удалять стоит
|
||||
> только когда нет горящих задач и хочется навести порядок.
|
||||
> C19/Q3 — отдельная cleanup-задача, не источник пользовательской ценности.
|
||||
> После удаления проверяются только production-маршруты и общие модули.
|
||||
>
|
||||
> Если какой-то коммит тянет за собой > 500 строк (например, C6/C7), разбивать
|
||||
> на под-коммиты по 2–4 компонента. Тесты/билд прогонять после каждого коммита,
|
||||
|
||||
+9
-9
@@ -138,7 +138,7 @@
|
||||
Разбито на две группы: **domain-free** (делаем параллельно с покупкой домена) и
|
||||
**domain-required** (после покупки и DNS-настройки).
|
||||
|
||||
#### S1-free: без домена (параллельно с C18–C19)
|
||||
#### S1-free: без домена (параллельно с quality-планом)
|
||||
|
||||
- [ ] **[S1e]** OG-картинки per-tool: генерация PNG-карточек скриптом на
|
||||
существующем ядре (мы сами умеем рисовать PNG) — имя инструмента + бренд,
|
||||
@@ -149,7 +149,7 @@
|
||||
для lossy) для всех инструментов — механика `ToolEntry.output` уже есть
|
||||
(backlog №7, райз «выбор формата/качества»). Продуктовая основа «image
|
||||
tools»-позиционирования: без неё сайт остаётся PNG-сайтом. Вести
|
||||
параллельно с C18–C19.
|
||||
параллельно с текущими quality-задачами.
|
||||
- [ ] **[S1g]** Поведение конвертеров после S1f: не предлагать в меню форматов
|
||||
формат исходника (disable) — чтобы «convert png to jpg» не мог сохранить в
|
||||
png. Существующие страницы не трогать: `jpg-to-png`, `png-to-jpg`,
|
||||
@@ -166,8 +166,8 @@
|
||||
страниц. Вызов из `pnpm build` после `vite build` (adapter-static пишет в
|
||||
`build/`, дописываем файл там же). Origin — из env (`PUBLIC_SITE_ORIGIN`),
|
||||
учёт опционального `BASE_PATH`.
|
||||
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебные маршруты (`/kit` до
|
||||
C19; после — вернуть минимальный allow-all).
|
||||
- [ ] **[S1c]** `robots.txt`: `Sitemap:` + закрыть служебный `/kit`; после
|
||||
cleanup — вернуть минимальный allow-all.
|
||||
- [ ] **[S1d]** Компонент `Seo.svelte` (kit): canonical (абсолютный URL по
|
||||
актуальному маршруту), OG-теги (title/description/type/url/image),
|
||||
twitter:card. Подключить в root-layout. **Требует `PUBLIC_SITE_ORIGIN`**
|
||||
@@ -177,7 +177,7 @@
|
||||
> зелёный; в `build/` лежит корректный `sitemap.xml` со всеми инструментами;
|
||||
> canonical/OG присутствуют на всех страницах; e2e зелёные.
|
||||
|
||||
### S2. Контентный слой (параллельно C18–C19, волнами по категориям)
|
||||
### S2. Контентный слой (параллельно quality-плану, волнами по категориям)
|
||||
|
||||
- [ ] **[S2a]** Схема данных: `seo`-блок per-tool (`longDescription`,
|
||||
`howTo: string[]`, `faq: {q, a}[]`) — в i18n-словарях (ru/en), не в коде
|
||||
@@ -328,10 +328,10 @@ with PNG, JPG, WebP» в тексте + селектор формата в Downl
|
||||
- [ ] **[R2]** Купить выбранный домен (кандидаты и пробы — в локальном плане) и
|
||||
настроить деплой на Vercel без `BASE_PATH` (§0). Домен нужен до S1-domain:
|
||||
canonical и sitemap генерятся от `PUBLIC_SITE_ORIGIN`.
|
||||
- **Порядок:** R1+R2 можно делать параллельно с C17/C18/C19 (не блокируют). R2
|
||||
(домен) — блокер только для S1-domain (canonical + sitemap + снятие
|
||||
`noindex`). После индексации переименование = переезд с 301, потеря позиций и
|
||||
ссылок — не делать. Поэтому R1/R2 — до S1-domain, но не обязательно до C17.
|
||||
- **Порядок:** R1+R2 можно делать параллельно с текущими quality-задачами (не
|
||||
блокируют). R2 (домен) — блокер только для S1-domain (canonical + sitemap +
|
||||
снятие `noindex`). После индексации переименование = переезд с 301, потеря
|
||||
позиций и ссылок — не делать.
|
||||
|
||||
## 7. Что осознанно НЕ делаем
|
||||
|
||||
|
||||
@@ -55,10 +55,10 @@ baseline; после закрытия известных ошибок его м
|
||||
- Token audit пока оставляет unused-token warnings отдельным неблокирующим
|
||||
сообщением.
|
||||
- `lint:all` по-прежнему сообщает 4 unused-token warnings отдельным
|
||||
предупреждением token audit; это следующий debt Q6.
|
||||
предупреждением token audit; это следующий debt Q7.
|
||||
- `dict-consistency` использует base-locale fallback для registry metadata и
|
||||
pattern-based policy для legacy `tools.*.params`; это не молчаливый
|
||||
`allowPaths`-список.
|
||||
pattern-based policy для временно неиспользуемых `tools.*.params`; это не
|
||||
молчаливый `allowPaths`-список.
|
||||
|
||||
## CI
|
||||
|
||||
|
||||
+9
-9
@@ -2,13 +2,13 @@
|
||||
|
||||
> **Статус:** Фаза 1 (полноценный TS-сайт) в основном выполнена — сайт живёт,
|
||||
> каталог переведён в типизированный `registry` (122 текущих инструмента), новый
|
||||
> дизайн по `plan-redesign.md` стал основным на корневых маршрутах (C17/C18
|
||||
> выполнены), старый UI — на `/v1/*` (удаление отложено, ценности не даёт — C19
|
||||
> в бэклоге). Tech debt не закрыт полностью; текущий baseline и следующие
|
||||
> quality-задачи зафиксированы в `docs/plan-codebase-quality.md`. Следующий
|
||||
> этап: C20 (проверка нового дизайна, `plan-redesign.md`, §10) + SEO S1-free
|
||||
> (`plan-seo.md`) + баги. Домен нужен для SEO (`plan-seo.md`, S1-domain). Фазы
|
||||
> 2–8 — будущие. Фазы 9–10 спланированы в `docs/plan-platform.md`.
|
||||
> дизайн по `plan-redesign.md` стал единственным production UI на корневых
|
||||
> маршрутах; UI-v1 удалён в Q3. Tech debt не закрыт полностью; текущий baseline
|
||||
> и следующие quality-задачи зафиксированы в `docs/plan-codebase-quality.md`.
|
||||
> Следующий этап: C20 (проверка нового дизайна, `plan-redesign.md`, §10) + SEO
|
||||
> S1-free (`plan-seo.md`) + баги. Домен нужен для SEO (`plan-seo.md`,
|
||||
> S1-domain). Фазы 2–8 — будущие. Фазы 9–10 спланированы в
|
||||
> `docs/plan-platform.md`.
|
||||
|
||||
## 0. Решения
|
||||
|
||||
@@ -162,8 +162,8 @@ wasm.
|
||||
### Фаза 10 — PWA — см. `docs/plan-platform.md`
|
||||
|
||||
Manifest + service worker, оффлайн-режим («работает без сети — файлы не покидают
|
||||
устройство»), установка как приложение. Wasm-фаз не требует, идёт после C17/C19
|
||||
и S1 из `plan-seo.md`. Чек-лист — `docs/plan-platform.md`, §2.
|
||||
устройство»), установка как приложение. Wasm-фаз не требует, идёт после S1 из
|
||||
`plan-seo.md`. Чек-лист — `docs/plan-platform.md`, §2.
|
||||
|
||||
## 3. Правила сравнения (для фаз 4–7)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user