# Codebase Structure

**Analysis Date:** 2026-01-09

## Directory Layout

```
SportsTime/
├── SportsTimeApp.swift           # @main entry point
├── Features/                     # Presentation layer
│   ├── Home/                    # Dashboard, suggested trips
│   ├── Trip/                    # Creation & detail views
│   ├── Schedule/                # Browse games
│   ├── Settings/                # User preferences
│   └── Progress/                # Stadium visits, achievements
├── Planning/                     # Domain layer
│   ├── Engine/                  # Planning algorithms
│   └── Models/                  # Planning-specific types
├── Core/                         # Data layer
│   ├── Models/                  # Domain + Local + CloudKit models
│   ├── Services/                # Data providers, sync, APIs
│   ├── Theme/                   # Design system
│   ├── Extensions/              # Swift extensions
│   └── Utilities/               # Helpers
├── Export/                       # PDF generation
│   ├── PDFGenerator.swift       # Main generator
│   └── Services/                # Asset services
├── Resources/                    # Assets, bundled JSON
└── Info.plist                   # App configuration

SportsTimeTests/                  # Unit tests
SportsTimeUITests/                # UI tests
Scripts/                          # Python data pipeline
docs/                            # Documentation
```

## Directory Purposes

**Features/ (Presentation):**
- Purpose: SwiftUI Views + @Observable ViewModels
- Contains: Feature-organized modules
- Key files: `HomeView.swift`, `TripCreationView.swift`, `TripDetailView.swift`
- Subdirectories: Views/, ViewModels/ per feature

**Planning/ (Domain):**
- Purpose: Trip planning business logic
- Contains: Engine algorithms, planning models
- Key files: `TripPlanningEngine.swift`, `GameDAGRouter.swift`, `PlanningModels.swift`
- Subdirectories: Engine/, Models/

**Core/ (Data):**
- Purpose: Models, services, infrastructure
- Contains: Domain structs, SwiftData models, services
- Key files: `DataProvider.swift`, `CloudKitService.swift`, `LocationService.swift`
- Subdirectories: Models/Domain/, Models/Local/, Models/CloudKit/, Services/

**Export/ (PDF):**
- Purpose: PDF generation with parallel asset fetching
- Contains: PDF generator, asset services
- Key files: `PDFGenerator.swift`, `MapSnapshotService.swift`, `PDFAssetPrefetcher.swift`
- Subdirectories: Services/

## Key File Locations

**Entry Points:**
- `SportsTime/SportsTimeApp.swift` - App entry, SwiftData schema
- `SportsTime/Features/Home/Views/HomeView.swift` - Main TabView

**Configuration:**
- `SportsTime/Info.plist` - App configuration, background modes
- `SportsTime.xcodeproj/project.pbxproj` - Build settings

**Core Logic:**
- `SportsTime/Core/Services/DataProvider.swift` - Single source of truth
- `SportsTime/Planning/Engine/TripPlanningEngine.swift` - Planning orchestrator
- `SportsTime/Planning/Engine/GameDAGRouter.swift` - Route finding

**Testing:**
- `SportsTimeTests/TravelEstimatorTests.swift` - 50+ tests
- `SportsTimeTests/ScenarioAPlannerSwiftTests.swift` - Scenario A tests
- `SportsTimeTests/ScenarioBPlannerTests.swift` - Scenario B tests
- `SportsTimeTests/ScenarioCPlannerTests.swift` - Scenario C tests

**Documentation:**
- `CLAUDE.md` - Project instructions for Claude Code
- `docs/MARKET_RESEARCH.md` - Competitive analysis

## Naming Conventions

**Files:**
- PascalCase for Swift files: `TripDetailView.swift`, `DataProvider.swift`
- Pattern: `{TypeName}.swift` matches primary type
- Views: `*View.swift`
- ViewModels: `*ViewModel.swift`
- Services: `*Service.swift`

**Directories:**
- PascalCase for feature directories: `Features/Trip/`
- Plural for collections: `Models/`, `Services/`, `Views/`

**Special Patterns:**
- `index.ts` equivalent: None (Swift doesn't use barrel files)
- Test files: `*Tests.swift` in `SportsTimeTests/`

## Where to Add New Code

**New Feature:**
- Primary code: `Features/{FeatureName}/Views/` and `ViewModels/`
- Tests: `SportsTimeTests/{FeatureName}Tests.swift`
- Config if needed: Update `SportsTimeApp.swift` schema if adding models

**New Service:**
- Implementation: `Core/Services/{ServiceName}.swift`
- Tests: `SportsTimeTests/{ServiceName}Tests.swift`

**New Planning Algorithm:**
- Definition: `Planning/Engine/{PlannerName}.swift`
- Protocol: Implement `ScenarioPlanner` protocol
- Tests: `SportsTimeTests/{PlannerName}Tests.swift`

**New Domain Model:**
- Domain struct: `Core/Models/Domain/{Model}.swift`
- SwiftData model (if persisted): `Core/Models/Local/{Model}.swift`
- Add to `SportsTimeApp.swift` schema

**Utilities:**
- Shared helpers: `Core/Utilities/`
- Extensions: `Core/Extensions/`

## Special Directories

**Resources/ (Bundled Data):**
- Purpose: Bootstrap data for offline-first
- Source: Generated by `Scripts/generate_canonical_data.py`
- Contents: `stadiums_canonical.json`, `teams_canonical.json`, `games_canonical.json`
- Committed: Yes

**Scripts/ (Python Pipeline):**
- Purpose: Data scraping, canonicalization, CloudKit import
- Contents: `scrape_schedules.py`, `cloudkit_import.py`, `canonicalize_*.py`
- Committed: Yes

**.planning/ (Project Planning):**
- Purpose: GSD workflow documents
- Contents: STATE.md, PLAN.md, codebase/
- Committed: Yes

---

*Structure analysis: 2026-01-09*
*Update when directory structure changes*
