Folder z appką i co jeszcze?

Buduję appkę o nazwie Mafiozo. To asystent prowadzącego do gry w mafię: losuje role, podpowiada kwestie i pilnuje przebiegu nocy.
W pierwszej części pokazałem w rolce, jak wygląda struktura folderów w moim projekcie. Tutaj to samo, ale z zajrzeniem do środka: co leży w każdym folderze i po co.
Teza jest prosta: żeby wypuścić aplikację mobilną, nie wystarczy sama aplikacja. Oprócz kodu potrzebuję dokumentacji, tekstów i grafik do sklepów, skryptów i strony. Kod appki to jeden folder z kilku.
Tak wygląda projekt
mafiozo/
├── docs/ dokumentacja
├── mobile/ aplikacja
├── store/ teksty i grafiki do sklepów
├── tools/ skrypty pomocnicze
├── web/ strona
├── AGENTS.md instrukcje dla agentów AI
├── CLAUDE.md importuje AGENTS.md
└── README.md spis folderówPomijam ukryte pliki i foldery z kropką, bo nie są częścią układu.
docs/: co appka ma robić i jak ją zbudować
Zaczynam od dokumentacji, bo zanim powstanie pierwszy ekran, ktoś (ja albo agent) musi wiedzieć, co appka ma robić. Część dokumentów powstała przed kodem, część rośnie razem z projektem.
W docs/superpowers/ leżą projekt i plan, które wygenerował agent AI na podstawie moich rozmów z nim:
specs/mafiozo-decyzje.mdto dziennik decyzji. Każdy wpis ma datę, autora i powód, a założenia agenta, których nie potwierdziłem, są oznaczone słowem „domysł". Jest tam między innymi paleta kolorów (tło od#0F0F11do#1E1B1F, akcent#A61B22) i sprawdzenie, czy nazwa „Mafiozo" nie jest zajęta.specs/mafiozo-projekt.mdto pełny projekt: cele, nie-cele i anty-cele, a potem wieczór krok po kroku, od listy graczy po zmianę prowadzącego. Przykładowy anty-cel: „appka spowalnia wieczór: każdy krok ma być jednym dotknięciem".plans/mafiozo-implementacja.mdto plan na 17 zadań, pisany dla agentów. Kolejność jest taka: najpierw czysta logika gry, potem teksty i grafiki, na końcu ekrany. Każde zadanie zaczyna się od padających testów:
Task 2: Role i liczby
- Step 1: Testy (padające).
defaultMafiaCount: 5→1, 6→2, 7→2, 8→2, 9→2, 10→3, 12→3, 14→4.maxMafiaCount: 5→2, 6→2, 7→3, 10→4. ... - Step 2:
npm test -- roles→ FAIL.
Obok leżą cztery krótsze dokumenty:
architektura.md: mapa plików aplikacji i decyzje warte zachowania, każda z powodem. Na przykład: wszystkie teksty interfejsu siedzą w jednym miejscu, a logika gry to czysty TypeScript, w którym każdy plik ma test.pierwsze-kroki.md: jednorazowa lista 18 rzeczy do wyklikania po założeniu projektu (EAS, AdMob, Firebase, Vercel, sklepy). Odhaczam, a po wszystkim usuwam plik.pulapki.md: pułapki, w które już wpadłem, każda z powodem. Na przykład: gdy Apple zatwierdzi wersję, jej „pociąg" jest zamknięty i nowy build pod tym samym numerem zostaje odrzucony, więcversionpodnoszę przed każdym buildem do sklepu.uruchamianie.md: jak odpalić appkę, bramka przed buildem w chmurze (najpierw lokalnyxcodebuild, bo build w EAS kosztuje kolejkę) i wydanie.
mobile/: sama aplikacja
W mobile/ jest kod całej aplikacji: Expo, na iOS i Androida. To jest to, co zwykle mamy na myśli, mówiąc „appka". I to dopiero jeden z folderów. Jak jest zbudowana w środku, pokażę w innym odcinku.
store/: materiały do sklepów
Sklepy to osobna praca, więc mają osobny folder: teksty, grafiki i deklaracje.
teksty.mdto jedyne miejsce, w którym trzymam pola tekstowe: nazwę, podtytuł, opis, „Co nowego" i adresy. Każde pole ma licznik znaków i limit sklepu, który sprawdza walidator (node tools/store/build-metadata.mjs --check), bo App Store Connect nie ostrzega o za długich polach, tylko odrzuca zapis.- Stąd nazwa „Mafiozo" i osobny podtytuł: „Mafiozo: asystent do gry w mafię" ma 32 znaki, a limit to 30. Nazwa ma 7 znaków, podtytuł 23.
zrodla/to surowe zrzuty z symulatora i emulatora. Z nich skrypty składają grafiki z podpisami (podpisy.json) i wyglądem (styl.json), w rozmiarach, których chcą sklepy, na przykład 1320×2868 dla iPhone'a i 2064×2752 dla iPada.appstore/opis.mdiplay/opis.mdto wszystko, co nie jest polem tekstowym: deklaracje prywatności (App Privacy w App Store, Data Safety w Google Play), uwagi dla recenzenta i kategorie. Deklaracja musi się zgadzać w trzech miejscach naraz: w App Store Connect, w Data Safety i w polityce prywatności.
Tak wygląda pole w teksty.md:
Podtytuł (23/30)
Asystent do gry w mafiętools/: skrypty pomocnicze
Skrypty są inne w każdej appce, bo każda ma swoje potrzeby. W Mafiozo duża część dotyczy sklepów (tools/store/):
build-metadata.mjssprawdza teksty i limity,compose.pyicompose_play.pyskładają zrzuty z podpisami, akreatywne.pygrafiki do strony produktu,check_assets.pysprawdza gotowe grafiki: czy to PNG, czy rozmiar jest dokładny, czy nie ma kanału alfa i czy jest profil sRGB,asc-diff.mjspokazuje, co jest na koncie App Store Connect (tylko odczyt).
Jest też tools/promo/ ze skryptami do 30-sekundowego filmu promocyjnego: nagrania ekranu z symulatora, podpisy w każdym języku i muzyka generowana czystym Pythonem. Reszta to drobiazgi, jak make_icons.py, który składa ikony z rysunku mafioza.
Dzięki temu limity i formaty sprawdza skrypt, a nie ja na oko.
web/: strona
Na razie to tylko tymczasowy index.html. Docelowo będzie to strona w Next.js hostowana na Vercelu, z polityką prywatności, bo Apple wymaga adresu polityki prywatności dla każdej aplikacji, więc strona jest potrzebna, zanim appka trafi do App Store. Pewnie dostanie osobny odcinek.
AGENTS.md: instrukcje dla agenta
To plik dla agentów AI, który mówi im, jak pracować w tym repo. Zaczyna się od zdania „Expo HAS CHANGED": przed pisaniem kodu agent ma przeczytać dokumentację właściwej wersji, bo to, co zna z treningu, może już nie obowiązywać. Dalej:
- Nie ma pliku ze stanem projektu. Opis stanu w
.mdrozjeżdża się z rzeczywistością, więc stan wyznaczają git i EAS. - Bramki mówią, co odpalić po jakiej zmianie.
- Reguły, które łatwo złamać, każda z powodem. Na przykład: przed buildem do sklepu podnoszę
version, aeas submitodpalam tylko na wyraźną prośbę, bo to zgłoszenie do recenzji.
Tak wyglądają bramki:
Bramki
cd mobile && npx tsc --noEmitinpm test— muszą przejść przed commitem.- Zmiana tekstów w
store/teksty.md→node tools/store/build-metadata.mjs --check(--fix-labelsprzelicza liczniki w etykietach). Zmiana grafik →python3 tools/store/check_assets.py.
CLAUDE.md importuje AGENTS.md, a README.md to spis folderów.
Co z tego wynika
Żeby wypuścić appkę, potrzebuję poza samą appką:
- dokumentacji, czyli co i jak buduję,
- tekstów do sklepów, razem z pilnowaniem limitów,
- grafik i zrzutów w wymaganych rozmiarach,
- skryptów, które to składają i sprawdzają,
- strony z polityką prywatności,
- instrukcji dla agenta.
Jak widzisz, aplikacja to tylko jeden folder.
W kolejnych częściach pokażę, jak powstaje Mafiozo. Rolka z tej części jest na moim Instagramie: @adam_robi_appki.