refactor: odstraneni PSR-1 SideEffects warningu
- Handler funkce extrahovany z API souboru do api/admin/handlers/ - config.php rozdeleny na helpers.php (funkce) a constants.php (konstanty) - require_once odstranen z class souboru (AuditLog, JWTAuth, LeaveNotification) - vendor/autoload.php presunuto do config.php bootstrap - totp-handlers.php: pridany use deklarace pro TwoFactorAuth - phpstan.neon: bootstrapFiles, scanDirectories, dynamicConstantNames - Opraveny chybejici routing bloky v totp.php a session.php Vysledek: phpcs 0 errors 0 warnings, PHPStan 0 errors, ESLint 0 errors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
149
CLAUDE.md
149
CLAUDE.md
@@ -3,42 +3,120 @@
|
||||
## Projektová paměť
|
||||
|
||||
Před začátkem práce si načti relevantní soubory z `memory/`:
|
||||
- `MEMORY.md` — tech stack, architektura, klíčové poznámky
|
||||
- `structure.md` — adresářová struktura, routes, API endpointy
|
||||
- `patterns.md` — coding konvence (frontend i backend), CSS architektura
|
||||
- `modules.md` — detaily modulů (attendance, offers, orders, invoices, projects, atd.)
|
||||
- `design-system.md` — CSS třídy, komponenty, theme tokens
|
||||
- `security.md` — bezpečnostní audit, auth, rate limiting
|
||||
- `MEMORY.md` - tech stack, architektura, klíčové poznámky
|
||||
- `structure.md` - adresářová struktura, routes, API endpointy
|
||||
- `patterns.md` - coding konvence (frontend i backend), CSS architektura
|
||||
- `modules.md` - detaily modulů (attendance, offers, orders, invoices, projects, atd.)
|
||||
- `design-system.md` - CSS třídy, komponenty, theme tokens
|
||||
- `security.md` - bezpečnostní audit, auth, rate limiting
|
||||
|
||||
Čti podle typu úkolu — nemusíš vše, ale vždy alespoň `MEMORY.md`.
|
||||
Čti podle typu úkolu - nemusíš vše, ale vždy alespoň `MEMORY.md`.
|
||||
|
||||
---
|
||||
|
||||
## Prostředí
|
||||
|
||||
- **Dev server:** Apache WAMP → `C:\Apache24\htdocs`
|
||||
- **PHP/MySQL:** v systémovém PATH (`php -v`, `mysql -u root`)
|
||||
- **npm:** při instalaci balíčků vždy `--legacy-peer-deps` (eslint peer conflict)
|
||||
- **Deploy (dev):** po každém `npm run build` smaž obsah `C:\Apache24\htdocs` a zkopíruj tam `dist/`
|
||||
- **DB migrace:** SQL soubory ukládej do `sql/`, aplikuj přes `mysql` příkaz
|
||||
- **Projekt:** `D:\Claude\BOHA Website\app`
|
||||
- **Frontend:** Vite dev server (`npm run dev`) - port 3000
|
||||
- **Backend:** PHP built-in server (`php -S localhost:8000`) - port 8000
|
||||
- **Databáze:** MySQL 8.4 na localhost, DB název: `app`
|
||||
- **Vite proxy:** `/api` -> `http://localhost:8000`
|
||||
- **npm:** při instalaci balíčků vždy `--legacy-peer-deps`
|
||||
- **Git remote:** https://git.boha-automation.cz/boha_admin/app.git
|
||||
|
||||
---
|
||||
|
||||
## Spuštění dev serveru
|
||||
|
||||
```bash
|
||||
# Terminal 1 - Frontend
|
||||
npm run dev
|
||||
|
||||
# Terminal 2 - PHP API
|
||||
php -S localhost:8000
|
||||
```
|
||||
|
||||
Aplikace běží na http://localhost:3000
|
||||
|
||||
---
|
||||
|
||||
## Autonomní režim
|
||||
|
||||
Když běžíš s `--auto`, dodržuj tento postup:
|
||||
|
||||
### Před jakoukoli prací:
|
||||
1. Načti `memory/MEMORY.md` a relevantní memory soubory
|
||||
2. Spusť diagnostiku:
|
||||
- `npx eslint src/` - zkontroluj chyby
|
||||
- `vendor/bin/phpcs` - zkontroluj PSR-12
|
||||
- `npm run build` - ověř že build projde
|
||||
|
||||
### Během práce:
|
||||
- Po každé větší změně spusť `npm run build` - ověř že nic nerozbíjíš
|
||||
- Opravuj průběžně ESLint a PHPCS chyby
|
||||
- Pokud si nejsi jistý architektonickým rozhodnutím, zapiš do reportu a pokračuj dál
|
||||
|
||||
### Po dokončení práce:
|
||||
1. Spusť finální kontroly:
|
||||
- `npx eslint src/` - 0 errors
|
||||
- `vendor/bin/phpcs` - 0 errors
|
||||
- `npm run build` - musí projít
|
||||
2. Commitni a pushni:
|
||||
- `git add .`
|
||||
- `git commit -m "typ: stručný popis změn"`
|
||||
- `git push`
|
||||
3. Napiš report do `reports/YYYY-MM-DD.md`
|
||||
|
||||
### Commit message konvence:
|
||||
- `feat:` - nová funkce
|
||||
- `fix:` - oprava bugu
|
||||
- `refactor:` - refaktoring bez změny funkčnosti
|
||||
- `style:` - formátování, lint opravy
|
||||
- `docs:` - dokumentace
|
||||
- `perf:` - optimalizace výkonu
|
||||
|
||||
### Report formát:
|
||||
|
||||
```
|
||||
# Report YYYY-MM-DD
|
||||
|
||||
## Zadání
|
||||
- Co bylo požadováno
|
||||
|
||||
## Provedené změny
|
||||
- Seznam změn s krátkým popisem
|
||||
|
||||
## Nalezené problémy
|
||||
- Problémy co vyžadují rozhodnutí uživatele (pokud nějaké)
|
||||
|
||||
## Stav
|
||||
- ESLint: PASS/FAIL
|
||||
- PHPCS: PASS/FAIL
|
||||
- Build: PASS/FAIL
|
||||
- Git: commitnuto a pushnuto / jen commitnuto / nepushnuto
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Coding Standards
|
||||
|
||||
### PHP
|
||||
- PSR-12, `strict_types=1` vždy
|
||||
- Typované parametry a návratové typy povinné
|
||||
- Repository pattern pro DB — žádné raw SQL v controllerech
|
||||
- Repository pattern pro DB - žádné raw SQL v controllerech
|
||||
- Prepared statements s `?` placeholdery, žádná string interpolace v SQL
|
||||
- PHPStan level 6 musí projít
|
||||
- `vendor/bin/phpcs` (PSR-12) musí projít bez chyb
|
||||
- Docblock PŘED `declare(strict_types=1)`, ne za ním
|
||||
|
||||
### React
|
||||
- Funkcionální komponenty, žádné class components (výjimka: `ErrorBoundary.jsx` - React nemá hook pro error boundaries)
|
||||
- Funkcionální komponenty, žádné class components (výjimka: `ErrorBoundary.jsx`)
|
||||
- Props typované přes interface, ne inline type
|
||||
- Žádné `any` typy
|
||||
- Custom hooks pro business logiku — ne inline useEffect spaghetti
|
||||
- Žádné vnořené ternáry — použít early return, if/else, helper funkci nebo lookup objekt
|
||||
- Custom hooks pro business logiku - ne inline useEffect spaghetti
|
||||
- Žádné vnořené ternáry - použít early return, if/else, helper funkci nebo lookup objekt
|
||||
- Striktní porovnání (`===`/`!==`), nikdy `==`/`!=`
|
||||
- API volání vždy přes `apiFetch()` z `../utils/api` — nikdy raw `fetch` (výjimka: `AuthContext.jsx` - auth vrstva používá raw `fetch`, protože `apiFetch` na ní závisí)
|
||||
- API volání vždy přes `apiFetch()` z `../utils/api` (výjimka: `AuthContext.jsx`)
|
||||
|
||||
### Data konvence
|
||||
- Všechny response klíče **snake_case** (DB sloupce, PHP proměnné, JSON klíče)
|
||||
@@ -51,38 +129,47 @@ Před začátkem práce si načti relevantní soubory z `memory/`:
|
||||
- API error: `{ "success": false, "error": "message" }`
|
||||
- PHP: `jsonResponse()`, `errorResponse()`, `successResponse()` helpery
|
||||
- Frontend: `alert.success()` / `alert.error()` přes `useAlert()`
|
||||
- Formulářová validace vždy frontend inline — viz sekce níže
|
||||
- Formulářová validace vždy frontend inline
|
||||
|
||||
### Inline validace formulářů
|
||||
- `has-error` class na `.admin-form-group` + `.admin-form-error` pod inputem
|
||||
- Error message vždy **za inputem** (ne před ním — posouvá layout)
|
||||
- `const [errors, setErrors] = useState({})` — validace v handleSubmit/handleSave, clear na onChange
|
||||
- Error message vždy **za inputem** (ne před ním)
|
||||
- `const [errors, setErrors] = useState({})` - validace v handleSubmit/handleSave, clear na onChange
|
||||
- Povinná pole: `required` class na labelu (červená hvězdička)
|
||||
- Detaily viz `design-system.md`
|
||||
|
||||
---
|
||||
|
||||
## Komentáře v kódu
|
||||
|
||||
- Piš jako programátor, stručně a k věci
|
||||
- Nekomentuj zřejmé věci (`setUser(null)`, `getAccessToken()`)
|
||||
- Nepoužívej em dash (—), používej normální pomlčku (-)
|
||||
- Nekomentuj zřejmé věci
|
||||
- Nepoužívej em dash, používej normální pomlčku (-)
|
||||
- Čeština i angličtina OK, preferuj češtinu u nových komentářů
|
||||
- Komentář jen když přidává info, které nejde vyčíst z kódu (důvod, workaround, gotcha)
|
||||
- Komentář jen když přidává info, které nejde vyčíst z kódu
|
||||
- Docblocky jen u složitějších funkcí/API endpointů
|
||||
- Žádné komentáře typu `// Set headers`, `// Get input`
|
||||
|
||||
---
|
||||
|
||||
## Kontroly před buildem
|
||||
|
||||
Vždy spusť před `npm run build`:
|
||||
|
||||
1. `npx eslint src/` — 0 errors, 0 warnings
|
||||
2. `vendor/bin/phpcs` — 0 errors (warnings tolerovány, ale nepotlačuj je v nastavení)
|
||||
1. `npx eslint src/` - 0 errors, 0 warnings
|
||||
2. `vendor/bin/phpcs` - 0 errors
|
||||
3. Build musí projít bez chyb
|
||||
|
||||
## Pravidla
|
||||
---
|
||||
|
||||
- Nikdy nečti `.env` soubory
|
||||
- Chrome používej pouze na výslovnou žádost uživatele
|
||||
## Zakázané operace
|
||||
|
||||
- NIKDY nečti `.env` soubory
|
||||
- NIKDY nepoužívej SSH, SCP, rsync na jakýkoli vzdálený server
|
||||
- NIKDY neměň databázi na vzdáleném serveru
|
||||
- NIKDY nespouštěj Chrome bez výslovné žádosti uživatele
|
||||
- Žádné TODO/FIXME v kódu
|
||||
- Žádné `console.log` v kódu — ani po debugování (console.error jen s `import.meta.env.DEV` guardem)
|
||||
- Funkce max 50 řádků — u React komponent se počítá logika, ne JSX template
|
||||
- Permissions: frontend `hasPermission()` + `<Forbidden />` guard, backend `requirePermission()`
|
||||
- Žádné `console.log` v kódu (console.error jen s `import.meta.env.DEV` guardem)
|
||||
- Funkce max 50 řádků - u React komponent se počítá logika, ne JSX template
|
||||
- Žádné `any` typy v TypeScript/React
|
||||
- Žádná string interpolace v SQL dotazech
|
||||
|
||||
Reference in New Issue
Block a user