[CL-REACT-DOCTOR-CI] ci(forgejo): wire react-doctor PR gate + master baseline #102

Merged
andrei merged 1 commit from feature/claude-react-doctor-ci-20260521 into master 2026-05-21 06:05:04 +00:00
Owner

Что сделано

Новый workflow .forgejo/workflows/react-doctor.yml:

  • PR trigger: react-doctor --diff origin/master --fail-on error — блокирует merge при новых errors
  • Push to master: full scan как baseline regression
  • Paths filter: app/** + workflow self (избегаем noise на не-frontend PRs)
  • Self-hosted runner pattern: повторяет existing CI checkout (FORGEJO_TOKEN auth, ownership repair, corepack pnpm)
  • Always-run summary: JSON output с errorCount / warningCount / affectedFileCount в логах

Зачем

Phase 3 react-doctor trial plan (reference_trial_react_doctor_20260520.md). PR #101 закрыл 17 текущих errors. Этот gate предотвращает regression — новые PR с react errors блокируются на merge.

Detects: no-mutable-in-deps, effect-needs-cleanup, no-nested-component-definition, prefer-useReducer, hydration mismatch, и 12+ react-19/Vite/Tailwind-aware rules.

План тестирования

  • YAML syntax валиден
  • Workflow запустится на этой PR (path .forgejo/workflows/... НЕ matches app/** filter → но он matches react-doctor.yml path). Hmm — re-check trigger: пути app/** OR .forgejo/workflows/react-doctor.yml. Эта PR трогает только workflow file → должен trigger через .forgejo/workflows/react-doctor.yml path.
  • После merge: workflow появится в master + automatic baseline scan run
  • Smoke (manual): создать throwaway PR с useEffect(() => { setTimeout(...) }, [location.pathname]) — должен fail

Где могу ошибаться

  • --diff origin/master резолвинг: self-hosted Forgejo checkout удаляет .git и делает свежий init. Добавлен git fetch ... master:refs/remotes/origin/master для восстановления refspec, но не verified на live runner. Если react-doctor не найдёт base — fallback на full scan.
  • npx --yes react-doctor@latest: скачивает latest каждый run (~10-30s latency). Можно pin react-doctor@0.2.1 если стабильность critical.
  • fail-on error: 2130 warnings не блокируют — это правильно (Phase 2 уменьшит warnings отдельным sweep).
  • JSON summary step использует if: always() — если react-doctor краш мажорно, может не быть output.
  • Закрытый PR #101 (mergeable=true, squash merged 0ce1ce85) — 17 react-doctor errors fixed
  • Trial doc: D:/AI-Memory/stores/claude-project-memory/reference_trial_react_doctor_20260520.md
  • JSON baseline: D:/AI-Memory/stores/claude-project-memory/spike-data/react-doctor-europatech-app-20260521.json
## Что сделано Новый workflow `.forgejo/workflows/react-doctor.yml`: - **PR trigger**: `react-doctor --diff origin/master --fail-on error` — блокирует merge при новых errors - **Push to master**: full scan как baseline regression - **Paths filter**: `app/**` + workflow self (избегаем noise на не-frontend PRs) - **Self-hosted runner pattern**: повторяет existing CI checkout (FORGEJO_TOKEN auth, ownership repair, corepack pnpm) - **Always-run summary**: JSON output с errorCount / warningCount / affectedFileCount в логах ## Зачем Phase 3 react-doctor trial plan (`reference_trial_react_doctor_20260520.md`). PR #101 закрыл 17 текущих errors. Этот gate предотвращает regression — новые PR с react errors блокируются на merge. Detects: `no-mutable-in-deps`, `effect-needs-cleanup`, `no-nested-component-definition`, `prefer-useReducer`, hydration mismatch, и 12+ react-19/Vite/Tailwind-aware rules. ## План тестирования - ✅ YAML syntax валиден - ⏳ Workflow запустится на этой PR (path `.forgejo/workflows/...` НЕ matches `app/**` filter → но он matches `react-doctor.yml` path). Hmm — re-check trigger: пути `app/**` OR `.forgejo/workflows/react-doctor.yml`. Эта PR трогает только workflow file → должен trigger через `.forgejo/workflows/react-doctor.yml` path. - ⏳ После merge: workflow появится в master + automatic baseline scan run - Smoke (manual): создать throwaway PR с `useEffect(() => { setTimeout(...) }, [location.pathname])` — должен fail ## Где могу ошибаться - **--diff origin/master резолвинг**: self-hosted Forgejo checkout удаляет .git и делает свежий init. Добавлен `git fetch ... master:refs/remotes/origin/master` для восстановления refspec, но не verified на live runner. Если react-doctor не найдёт base — fallback на full scan. - **`npx --yes react-doctor@latest`**: скачивает latest каждый run (~10-30s latency). Можно pin `react-doctor@0.2.1` если стабильность critical. - **`fail-on error`**: 2130 warnings не блокируют — это правильно (Phase 2 уменьшит warnings отдельным sweep). - **JSON summary step** использует `if: always()` — если react-doctor краш мажорно, может не быть output. ## Related - Закрытый PR #101 (mergeable=true, squash merged 0ce1ce85) — 17 react-doctor errors fixed - Trial doc: `D:/AI-Memory/stores/claude-project-memory/reference_trial_react_doctor_20260520.md` - JSON baseline: `D:/AI-Memory/stores/claude-project-memory/spike-data/react-doctor-europatech-app-20260521.json`
[CL-REACT-DOCTOR-CI] ci(forgejo): wire react-doctor on PR + master push
Some checks failed
CI / App (pull_request) Has been cancelled
CI / Telegram Mini App (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
CI / API (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Has been cancelled
CI / Python SDK (pull_request) Has been cancelled
CI / Contracts (pull_request) Has been cancelled
React Doctor / React Doctor / App (pull_request) Has been cancelled
46a68109aa
## Что сделано

Новый workflow `.forgejo/workflows/react-doctor.yml`:
- Триггер: PR с изменениями в `app/**` ИЛИ push в master с теми же путями
- На PR — `react-doctor --diff origin/master --fail-on error` (только новые errors блокируют merge)
- На push в master — full scan как baseline regression
- Self-hosted runner pattern: server-local checkout через FORGEJO_TOKEN, ownership repair, corepack pnpm setup
- Final step печатает JSON summary (errors / warnings / affected files) в CI log независимо от result

## Зачем

Phase 3 из react-doctor trial plan (`reference_trial_react_doctor_20260520.md`).
PR #101 закрыл 17 текущих errors. Этот workflow предотвращает regression — новые
PR с react errors блокируются на merge gate.

Catches:
- `no-mutable-in-deps` (location/global в useEffect deps)
- `effect-needs-cleanup` (setTimeout/setInterval/.on без cleanup → memory leak)
- `no-nested-component-definition` (re-instantiate каждый render)
- 14+ другие react-19/Vite/Tailwind-aware rules

## План тестирования

-  YAML syntax валиден (python yaml.safe_load)
-  Workflow запустится автоматически на этой же PR (path matches `.forgejo/workflows/...`)
  и должен пройти диффом vs master с **0 новых errors** (errors уже закрыты в #101)
-  Manual trigger через push в master после merge — full scan baseline
- Smoke: создать PR с заведомо broken React useEffect — должен fail с errorCount > 0

## Где могу ошибаться

- **--diff origin/master резолвинг**: self-hosted Forgejo checkout удаляет .git и делает свежий init. `git fetch ... master:refs/remotes/origin/master` должен восстановить указатель но не verified. Если react-doctor не найдёт base — упадёт с unclear error.
- **npx --yes react-doctor@latest** скачивает свежую версию каждый run — латентность ~10-30s. Опция: pin версию (например `react-doctor@0.2.1`).
- **fail-on error**: warnings (2130 в app) не блокируют. Это правильно — иначе CI вечно красный. Phase 2 уменьшит warnings отдельно.
- **paths filter `app/**`**: workflow не запустится если PR трогает только api/, contracts/, tg/. Правильное поведение — react-doctor scans только app.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
andrei merged commit cc534ad2bd into master 2026-05-21 06:05:04 +00:00
andrei deleted branch feature/claude-react-doctor-ci-20260521 2026-05-21 06:05:05 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!102
No description provided.