89 lines
4.1 KiB
Markdown
89 lines
4.1 KiB
Markdown
# CLAUDE.md
|
|
|
|
## 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
|
|
|
|
Č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
|
|
|
|
## 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
|
|
- 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)
|
|
- 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
|
|
- 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í)
|
|
|
|
### Data konvence
|
|
- Všechny response klíče **snake_case** (DB sloupce, PHP proměnné, JSON klíče)
|
|
- `$authData['user_id']` (ne `userId`)
|
|
- camelCase jen tam, kde to vyžaduje React/JS ekosystém (handlery, hooky, props, state)
|
|
- Stabilní React keys: `_key` property, nikdy array index
|
|
|
|
### Error handling
|
|
- API success: `{ "success": true, "data": {...} }`
|
|
- 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
|
|
|
|
### 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
|
|
- 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 (-)
|
|
- Č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)
|
|
- 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í)
|
|
3. Build musí projít bez chyb
|
|
|
|
## Pravidla
|
|
|
|
- Nikdy nečti `.env` soubory
|
|
- Chrome používej pouze na výslovnou žádost 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()`
|