From ebb2176a2cd0f70ceb79e5c302275c1c00a82d5b Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Fri, 25 Sep 2026 15:00:30 +0500 Subject: [PATCH] chore: update verify tasks, add ci jobs --- .github/workflows/deploy.yml | 33 ++++++++++++++- .github/workflows/quality.yml | 77 +++++++++++++++++++++++++++++++++++ AGENTS.md | 6 ++- README.md | 54 +++++++++++++++--------- docs/README.md | 3 +- docs/agent-workflow.md | 6 +-- docs/backlog.md | 13 +++--- docs/plan-codebase-quality.md | 3 +- docs/quality-gates.md | 75 ++++++++++++++++++++++++++++++++++ package.json | 1 + web/src/app.css | 4 +- 11 files changed, 239 insertions(+), 36 deletions(-) create mode 100644 .github/workflows/quality.yml create mode 100644 docs/quality-gates.md diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 21bbcc8..57ee006 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,38 @@ concurrency: cancel-in-progress: true jobs: + verify: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ^11.20.0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + cache-dependency-path: | + pnpm-lock.yaml + web/pnpm-lock.yaml + + - name: Install root dependencies + run: pnpm install --frozen-lockfile + + - name: Install web dependencies + working-directory: web + run: pnpm install --frozen-lockfile + + - name: Run quality gate + run: pnpm verify + build: + needs: verify runs-on: ubuntu-latest steps: - name: Checkout @@ -61,4 +92,4 @@ jobs: steps: - name: Deploy id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 0000000..d50cd23 --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,77 @@ +name: Quality + +on: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: quality-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + verify: + name: Fast quality gate + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ^11.20.0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + cache-dependency-path: | + pnpm-lock.yaml + web/pnpm-lock.yaml + + - name: Install root dependencies + run: pnpm install --frozen-lockfile + + - name: Install web dependencies + working-directory: web + run: pnpm install --frozen-lockfile + + - name: Run quality gate + run: pnpm verify + + e2e: + name: E2E (non-blocking baseline) + needs: verify + continue-on-error: true + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ^11.20.0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + cache-dependency-path: web/pnpm-lock.yaml + + - name: Install web dependencies + working-directory: web + run: pnpm install --frozen-lockfile + + - name: Install Chromium + working-directory: web + run: pnpm exec playwright install --with-deps chromium + + - name: Run E2E + working-directory: web + run: pnpm test:e2e diff --git a/AGENTS.md b/AGENTS.md index a8ca575..6247f2b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,6 +16,8 @@ - Форматирование: `pnpm format` в корне (оба прогона) или `pnpm --dir web format` (только код web/). Проверка: `pnpm check:docs` (docs) + `pnpm --dir web exec prettier --check .` (код). +- Полный быстрый gate: `pnpm verify`; подробная матрица команд и CI — + `docs/quality-gates.md`. - Линтинг: `pnpm --dir web lint` (ESLint). Полный прогон дизайн-проверок: `pnpm --dir web lint:all` (ESLint + stylelint + токен-аудит). Каждый шаг выполняется, даже если предыдущий упал. `app_v1.css` и legacy-ветка исключены @@ -59,8 +61,8 @@ - Здесь держать только обязательные инварианты, команды и ссылки на подробные документы; не превращать `AGENTS.md` в полный справочник. - Индекс активных документов: `docs/README.md`; подробный workflow: - `docs/agent-workflow.md`; текущий план качества: - `docs/plan-codebase-quality.md`. + `docs/agent-workflow.md`; quality gates: `docs/quality-gates.md`; текущий + план: `docs/plan-codebase-quality.md`. - Новые подробные правила, процедуры и таблицы хранить в `docs/`, а детали конкретных lint-правил — в `web/eslint-plugins/README.md`. - Завершённые или устаревшие документы переносить в `docs/archive/`, указывать diff --git a/README.md b/README.md index cb46b15..7e1abcc 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,32 @@ # easy-png-tools -Browser-based PNG utility toolkit — no server, no data upload, everything runs locally. +Browser-based PNG utility toolkit — no server, no data upload, everything runs +locally. -Inspired by online services like onlinepngtools.com, but fully offline-capable and open source. +Inspired by online services like onlinepngtools.com, but fully offline-capable +and open source. ## Features -- **Pixel-level image processing** — format conversion, transparency/alpha channel, color transformations, geometry, filters/convolutions, morphology, quantization & palettes, image generation, text/watermarks, analysis & checks -- **Pipeline system (workspace)** — load image → chain multiple tool steps → sequential application → download result; pipelines saved to localStorage, exportable as JSON -- **Web Worker execution** — heavy operations run off the main thread with automatic fallback to direct calls +- **Pixel-level image processing** — format conversion, transparency/alpha + channel, color transformations, geometry, filters/convolutions, morphology, + quantization & palettes, image generation, text/watermarks, analysis & checks +- **Pipeline system (workspace)** — load image → chain multiple tool steps → + sequential application → download result; pipelines saved to localStorage, + exportable as JSON +- **Web Worker execution** — heavy operations run off the main thread with + automatic fallback to direct calls - **i18n** — full Russian and English localization with search matching - **Dark/Light themes** — persisted to localStorage -- **Pure TypeScript core** — `lib/core/` operates on `ImageData`/`Uint8ClampedArray` with no DOM dependency -- **~30+ tools** across categories: transparency, color, geometry, filters, morphology, palettes, generation, text, analysis +- **Pure TypeScript core** — `lib/core/` operates on + `ImageData`/`Uint8ClampedArray` with no DOM dependency +- **~30+ tools** across categories: transparency, color, geometry, filters, + morphology, palettes, generation, text, analysis ## Tech Stack -- **SvelteKit** (Svelte 5, runes mode) with static adapter — pure static export, no server +- **SvelteKit** (Svelte 5, runes mode) with static adapter — pure static export, + no server - **Vite** + **TypeScript** (strict) - **Vitest** for unit tests - **ESLint** + **Prettier** @@ -46,14 +56,15 @@ Static output is written to `web/build/`. ### Other Commands -| Command | Description | -| ------------------------ | ------------------------- | -| `pnpm --dir web test` | Run unit tests (Vitest) | -| `pnpm --dir web check` | Type-check (svelte-check) | -| `pnpm --dir web lint` | Lint (ESLint) | -| `pnpm --dir web format` | Format code (Prettier) | -| `pnpm format:docs` | Format docs (Prettier) | -| `pnpm --dir web preview` | Preview production build | +| Command | Description | +| ------------------------ | ------------------------------ | +| `pnpm verify` | Run the full fast quality gate | +| `pnpm --dir web test` | Run unit tests (Vitest) | +| `pnpm --dir web check` | Type-check (svelte-check) | +| `pnpm --dir web lint` | Lint (ESLint) | +| `pnpm --dir web format` | Format code (Prettier) | +| `pnpm format:docs` | Format docs (Prettier) | +| `pnpm --dir web preview` | Preview production build | ## Project Structure @@ -75,13 +86,18 @@ easy-png-tools/ ## Architecture -The project is built around a **tool registry** (`registry.ts`) — each tool is a self-contained entry with `{id, title, description, category, params, run}`. Pages, forms, and pipelines are generated from this registry. +The project is built around a **tool registry** (`registry.ts`) — each tool is a +self-contained entry with `{id, title, description, category, params, run}`. +Pages, forms, and pipelines are generated from this registry. -Core image processing lives in `lib/core/` and operates directly on `ImageData` objects with no browser API dependencies, making it portable to other environments (WASM, CLI) in the future. +Core image processing lives in `lib/core/` and operates directly on `ImageData` +objects with no browser API dependencies, making it portable to other +environments (WASM, CLI) in the future. ## Roadmap -See [docs/roadmap.md](docs/roadmap.md) for the full development plan. Current phases: +See [docs/roadmap.md](docs/roadmap.md) for the full development plan. Current +phases: 1. **Phase 1** — TypeScript core + web UI (in progress) 2. **Phase 2** — Rust/WASM core for performance-critical operations diff --git a/docs/README.md b/docs/README.md index 9c53551..ec4ad86 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,6 +20,7 @@ | `AGENTS.md` | Краткий обязательный контракт для агента | active | | `docs/plan-codebase-quality.md` | План quality gates, тестов и lint-правил | draft | | `docs/agent-workflow.md` | Подробный порядок исследования, изменения и проверки | active | +| `docs/quality-gates.md` | Команды проверки, warnings и CI | active | | `docs/backlog.md` | Продуктовые, UX- и инфраструктурные задачи | active | | `docs/roadmap.md` | Общие направления развития | active | | `docs/plan-redesign.md` | Новый дизайн и границы `/v1` | active | @@ -39,7 +40,7 @@ - Поведение, которое агент обязан соблюдать сразу, — кратко в `AGENTS.md`. - Точные команды, параметры скриптов и критерии качества — в - `docs/quality-gates.md` после Q1 или в README соответствующей подсистемы. + `docs/quality-gates.md` или в README соответствующей подсистемы. - Архитектура, потоки данных и границы модулей — в отдельном architecture-плане или документе, не дублируя существующие планы. - Реализация lint-правил, fixtures и технические детали ESLint — в diff --git a/docs/agent-workflow.md b/docs/agent-workflow.md index f6ac681..69d968e 100644 --- a/docs/agent-workflow.md +++ b/docs/agent-workflow.md @@ -32,8 +32,8 @@ ## 3. Проверки -Команды и их область применения перечислены в `AGENTS.md`; после Q1 их точная -матрица будет поддерживаться в `docs/quality-gates.md`. +Команды и их область применения перечислены в `AGENTS.md`; точная матрица и +текущая политика warnings/errors поддерживаются в `docs/quality-gates.md`. | Изменение | Минимальная проверка | | ------------------------------------------------------- | ------------------------------------------------------ | @@ -72,7 +72,7 @@ E2E запускается отдельно от быстрых проверок - обязательное поведение агента — `AGENTS.md`; - индекс и карта документов — `docs/README.md`; -- качество и точные команды — `docs/quality-gates.md` после Q1; +- качество и точные команды — `docs/quality-gates.md`; - тестовая архитектура — `docs/testing-strategy.md` после Q3; - lint implementation — `web/eslint-plugins/README.md`; - продуктовые решения — backlog и активные планы. diff --git a/docs/backlog.md b/docs/backlog.md index 928ef81..5759e5c 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -215,14 +215,13 @@ 12. **HARD-серия** (glitch, barcode, signature-extract, handwritten-digital). Из `archive/plan-gap-waves.md`. -13. **Контраст текста на акцентных кнопках — пересмотреть после готовности - сайта**. Текст `--color-background` на фоне `--color-main`/`--color-accent` - (тон 48) даёт контраст ~4.1–4.3 (light) — ниже AA 4.5 для обычного текста; - `palette.test.ts` держит для кнопок порог 4.0 (AA large-text) осознанно, как - компромисс текущего дизайна. После полного завершения редизайна пересмотреть - тона (например поднять tone кнопок до ~55) и вернуть порог 4.5. Также +13. **Контраст текста на акцентных кнопках — частично закрыт**. Для dark-темы + `--color-main`/`--color-accent` подняты до tone 56, чтобы пройти текущий + порог `palette.test.ts` 4.0; targeted-тест проходит. Light-тема сохраняет + контраст ~4.1–4.3, что ниже AA 4.5 для обычного текста, поэтому после + завершения редизайна нужно повторно поднять тона и вернуть порог 4.5. Также проверить `--color-danger` (dark, тон 55): текст на нём 4.93 — ок, но - light-danger тон 48 = 4.25 на границе. + light-danger tone 48 = 4.25 на границе. 14. **Отображение маски для инструментов (runMask/preview-mask)** — придумать и реализовать процесс показа маски результата. **Контекст:** в старом diff --git a/docs/plan-codebase-quality.md b/docs/plan-codebase-quality.md index 589af33..bad6755 100644 --- a/docs/plan-codebase-quality.md +++ b/docs/plan-codebase-quality.md @@ -74,7 +74,8 @@ ### Q1. Единый quality gate и CI -**Оценка:** S–M. **Зависимости:** Q0. +**Статус:** готов к ревью. **Проверено:** `pnpm verify` проходит; E2E оставлен +отдельным non-blocking job. **Оценка:** S–M. **Зависимости:** Q0. Добавить read-only `verify`-команду, которая запускает: diff --git a/docs/quality-gates.md b/docs/quality-gates.md new file mode 100644 index 0000000..92baa57 --- /dev/null +++ b/docs/quality-gates.md @@ -0,0 +1,75 @@ +# Quality gates + +> Статус: **active**. Каноническое описание быстрых проверок репозитория. +> Краткие обязательные команды остаются в `AGENTS.md`. + +## Каноническая команда + +Запускать из корня репозитория: + +```text +pnpm verify +``` + +`verify` выполняет последовательно: + +1. `pnpm --dir web check` — SvelteKit sync и `svelte-check`. +2. `pnpm --dir web test` — полный Vitest-набор. +3. `pnpm --dir web test:rules` — отдельный быстрый прогон тестов ESLint-правил. +4. `pnpm --dir web lint:all` — ESLint, Stylelint и token audit. +5. `pnpm --dir web exec prettier --check .` — форматирование кода `web/`. +6. `pnpm check:docs` — форматирование Markdown. +7. `pnpm --dir web build` — production build. + +Полный `test` уже включает тесты lint-правил; отдельный `test:rules` в `verify` +оставлен как явный быстрый диагностический этап. + +## E2E + +E2E не входит в `verify`, потому что Playwright поднимает build и статический +сервер: + +```text +pnpm --dir web test:e2e +``` + +Запускать его обязательно для изменений маршрутов, загрузки файла, результата, +download, темы или локализации. В текущем CI это отдельный non-blocking +baseline; после закрытия известных ошибок его можно сделать blocking. + +## Быстрые подмножества + +| Изменение | Команда | +| ---------------------------- | ------------------------------------------------------- | +| Только Markdown | `pnpm check:docs` | +| TypeScript/Svelte | `pnpm --dir web check` и `pnpm --dir web test` | +| Lint-правило или lint-конфиг | `pnpm --dir web test:rules` и `pnpm --dir web lint:all` | +| Пользовательский поток | `pnpm --dir web test:e2e` | +| Полный локальный gate | `pnpm verify` | + +## Errors и warnings + +- `errors` завершают соответствующий инструмент ненулевым кодом. +- `warnings` не завершают текущий lint автоматически, пока не включён строгий + режим. +- На baseline Q0 `lint:all` даёт 0 errors, 188 `i18n/dict-consistency` warnings + и 4 unused-token warnings. Это известные долги, а не чистый результат. +- После Q2 parity-линтер должен перейти к zero-warning, после чего можно + включить `--max-warnings=0` без обходных allowlist-ов. + +## CI + +`.github/workflows/quality.yml`: + +- `verify` блокирует PR при typecheck, unit, rule-test, lint, format, docs или + build ошибке; +- `e2e` запускается отдельным job после verify и пока не блокирует PR. + +`.github/workflows/deploy.yml` перед production build запускает тот же +`pnpm verify`, поэтому deploy не должен проходить при ошибке быстрых проверок. + +## Локальная диагностика + +При медленном полном прогоне сначала запускай минимальную команду из таблицы, а +перед ревью или merge — `pnpm verify`. После каждого шага плана результат команд +и текущий baseline фиксируются в отчёте агента. diff --git a/package.json b/package.json index 9462b3f..e391a27 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "index.js", "scripts": { "test": "pnpm --dir web test", + "verify": "pnpm --dir web check && pnpm --dir web test && pnpm --dir web test:rules && pnpm --dir web lint:all && pnpm --dir web exec prettier --check . && pnpm check:docs && pnpm --dir web build", "dev": "pnpm --dir web dev", "build": "pnpm --dir web build", "format": "pnpm format:docs && pnpm --dir web format", diff --git a/web/src/app.css b/web/src/app.css index 08889fc..0a86da8 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -199,8 +199,8 @@ --color-text-accent: hct(from var(--brand-alt) h 25 90); --color-text-accent-muted: hct(from var(--brand-alt) h 22 70); - --color-main: hct(from var(--brand-main) h 60 50); - --color-accent: hct(from var(--brand-alt) h 60 50); + --color-main: hct(from var(--brand-main) h 60 56); + --color-accent: hct(from var(--brand-alt) h 60 56); --color-success: hct(160 65 55); --color-warning: hct(80 65 55); --color-danger: hct(30 70 55);