Przejdź do głównej zawartości

Struktura projektu zoptymalizowana pod AI

Prosisz AI o dodanie nowego endpointu API. Znajduje handler route’a, ale potem spędza 8000 tokenów na czytaniu 2000-liniowego pliku “utils.ts” szukając helperów do walidacji. Są tam — obok 40 innych niepowiązanych funkcji. AI się gubi, wybiera zły helper i generuje kod, który psuje istniejącą funkcjonalność.

To samo zadanie w dobrze zorganizowanym projekcie zużywa ułamek kontekstu. AI natychmiast znajduje src/validators/user.ts, czyta 80 linii i generuje poprawny kod za pierwszym razem.

Organizacja plików to nie tylko czytelność dla ludzi. To nawigowalność dla AI. Im łatwiej twoja baza kodu jest do przejrzenia, tym mniej kontekstu AI marnuje na eksplorację i tym lepsza jest jakość wyników.

  • Wzorzec struktury projektu zoptymalizowany pod programowanie wspomagane AI
  • Wskazówki dotyczące rozmiaru plików, nazewnictwa i granic modułów pomagające narzędziom AI
  • Strategie organizacji monorepo i dużych baz kodu pod AI
  • Prompty do analizy i poprawy istniejącej struktury przez AI

Asystenci AI do kodowania nawigują po bazie kodu na dwa sposoby:

  1. Czytanie plików. AI czyta pliki, aby zrozumieć kontekst. Każda przeczytana linia zużywa tokeny.
  2. Wyszukiwanie. AI szuka po nazwie pliku, zawartości lub znaczeniu semantycznym. Jasne nazewnictwo sprawia, że wyniki wyszukiwania są trafniejsze.

Słaba organizacja szkodzi obu ścieżkom:

  • Gigantyczne pliki zmuszają AI do czytania tysięcy nieistotnych linii, żeby znaleźć jedną potrzebną funkcję.
  • Niejasne nazwy (utils.ts, helpers.ts, misc.ts) sprawiają, że wyniki wyszukiwania są niejednoznaczne i zmuszają AI do spekulatywnego czytania plików.
  • Głębokie zagnieżdżanie zwiększa liczbę traversów katalogów, które AI musi wykonać.
  • Cykliczne zależności dezorientują AI co do granic modułów i prowadzą do błędnych sugestii importów.

Utrzymuj pliki poniżej 300 linii. Gdy plik przekracza ten rozmiar, AI musi czytać zawartość, której nie potrzebuje, marnując kontekst. Dziel według odpowiedzialności.

ZamiastUżyj
utils.ts (800 linii, 30 funkcji)validators/email.ts, formatters/date.ts, parsers/csv.ts
api.ts (1200 linii, wszystkie endpointy)routes/users.ts, routes/billing.ts, routes/notifications.ts
types.ts (500 linii, wszystkie typy)types/user.ts, types/billing.ts, types/notification.ts

Nazwa pliku powinna mówić AI, co jest w środku, bez konieczności czytania. Wyszukiwanie semantyczne działa lepiej, gdy nazwy plików odpowiadają koncepcjom, które zawierają.

NiejasneOpisowe
helpers.tspassword-hashing.ts
index.ts (re-eksporty)Utrzymuj pliki index szczupłe, poniżej 20 linii
service.tsnotification-service.ts
Component.tsxUserProfileCard.tsx

Trzymaj implementację, testy i typy razem. Gdy AI czyta twoją implementację, może natychmiast znaleźć powiązany plik testowy bez szukania.

src/services/
notification/
notification-service.ts
notification-service.test.ts
notification-types.ts
README.md # Krótki opis modułu

Wyszukiwanie semantyczne Cursor indeksuje cały workspace. Ogromnie korzysta z opisowych nazw plików i kolokacji, ponieważ wyszukiwanie może znaleźć powiązany kod bez czytania nieistotnych plików.

Dodaj .cursor/rules/structure.md, żeby poinformować Cursor o twoich konwencjach:

---
description: "Project structure conventions"
alwaysApply: true
---
## File Organization
- Keep files under 300 lines
- Co-locate tests with implementations
- Use descriptive filenames (notification-service.ts not service.ts)
- Split utils by domain (validators/email.ts not utils.ts)

Monorepo stanowią unikalne wyzwanie dla narzędzi AI, ponieważ ogromna liczba plików może przytłoczyć wyszukiwanie i indeksowanie.

Użyj .cursorignore do wyłączenia nieistotnych pakietów z indeksowania:

.cursorignore
packages/legacy-app/
packages/internal-tools/
node_modules/
dist/

Pracując w konkretnym pakiecie, otwieraj tylko ten pakiet jako workspace, a nie całe monorepo. To skupia wyszukiwanie semantyczne Cursor na istotnym kodzie.

Każde narzędzie używa .gitignore (i specyficznych plików ignorowania) do pomijania nieistotnej zawartości. Upewnij się, że pliki ignorowania wyłączają wszystko, czego AI nie powinno czytać:

# .gitignore (również respektowany przez narzędzia AI)
node_modules/
dist/
build/
.next/
coverage/
*.min.js
*.bundle.js

Brak ignorowania artefaktów budowania oznacza, że AI może czytać zminifikowany JavaScript lub skompilowane wyniki, marnując ogromne ilości kontekstu na nieczytelną zawartość.

Zespół opiera się restrukturyzacji. Nie musisz reorganizować całej bazy kodu na raz. Zacznij od rozdzielenia najgorszych przypadków — 1000-liniowych plików i uniwersalnych utils. Użyj AI do pomocy przy restrukturyzacji: doskonale radzi sobie z ekstrakcją funkcji do osobnych modułów.

Pliki index stają się rozdęte. Pliki index, które re-eksportują wszystko z pakietu, zużywają kontekst, gdy AI je czyta. Utrzymuj pliki barrel szczupłe (poniżej 20 linii) lub wyeliminuj je na rzecz bezpośrednich importów.

Różne narzędzia indeksują inaczej. Cursor używa embeddingów semantycznych, Claude Code używa narzędzi plikowych (Read, Grep, Glob), a Codex ma własne indeksowanie. Struktura, która działa dobrze dla jednego narzędzia, generalnie działa dobrze dla wszystkich, ale zwracaj uwagę na specyficzne pliki ignorowania narzędzi.

Kolokacja nie działa dla współdzielonych narzędzi. Część kodu naprawdę jest współdzielona między wieloma funkcjami (połączenie z bazą danych, logowanie, obsługa błędów). Trzymaj je w jasno nazwanym katalogu shared/ lub lib/ z małymi, skupionymi plikami.