> Źródło: https://redai.pl/dev/struktura-folderu/ (dokumentacja modułów portalu redAi). Cała dokumentacja w jednym pliku: https://redai.pl/dev/moduly.md

## Struktura folderu

```
narzedzia/<klucz>/
  narzedzie.php          manifest (return [...]), JEDYNY plik obowiązkowy
  src/                   klasy PHP, przestrzeń Narzedzia\<Pascal>\ (ładuje je portal, bez composera)
  src/Narzedzie.php      opcjonalnie: haki, klasa Narzedzia\<Pascal>\Narzedzie extends App\Narzedzia\Narzedzie
  trasy.php              trasy za logowaniem
  trasy-publiczne.php    opcjonalnie: trasy bez logowania
  widoki/                widoki Blade: view('<klucz>::lista'), @include('<klucz>::_czesc')
  migracje/              migracje Laravela (tabele modułu)
  konfig.php             opcjonalnie: config('<klucz>.*')
  zasoby/                pliki statyczne (css, js, obrazy, fonty) pod /narzedzia-zasoby/<klucz>/...
  zasoby/zrzuty/         zrzuty ekranu do karty w Modułach (01.webp, 02.webp...)
  skille/<nazwa>/SKILL.md  opcjonalnie: skille czatu
```

- **Klucz** = nazwa folderu: małe litery, cyfry i podkreślnik, 2-41 znaków, zaczyna się od litery. Wzorzec: `^[a-z][a-z0-9_]{1,40}$`. Przykład: `faktury_kosztowe`.
- **Klucz jest globalnie unikalny w katalogu** i należy do autora, który pierwszy go wysłał. Wybierzcie nazwę, która nie zderzy się z innymi, np. z przedrostkiem firmy (`acme_faktury`).
- **Przestrzeń PHP** to klucz w PascalCase: `faktury_kosztowe` → `Narzedzia\FakturyKosztowe\`. Plik `src/Dane/Import.php` = klasa `Narzedzia\FakturyKosztowe\Dane\Import`. Autoloader portalu ładuje tylko tę przestrzeń.
- Foldery i pliki zaczynające się od kropki są zarezerwowane. Portal zapisuje w folderze modułu plik `.zrodlo.json` (skąd moduł przyszedł), nie wkładajcie go do paczki.
- Folder z błędem w manifeście jest pomijany, a błąd trafia do logu portalu. Portal działa dalej.
- **Folder modułu jest przy aktualizacji podmieniany w całości.** Nie trzymajcie w nim danych użytkowników. Dane idą do bazy albo do `storage/app/<klucz>/`.

