docs: add AGENTS.md with build commands, architecture, and conventions
This commit is contained in:
@@ -0,0 +1,82 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
## Project
|
||||||
|
|
||||||
|
MyIce — Kotlin Multiplatform ice hockey schedule/convocation viewer (Android, iOS, Desktop).
|
||||||
|
Port of the Flutter app at `~/work/gitea.parano.ch/herel/myice/myice_mobile/`.
|
||||||
|
|
||||||
|
## Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Compile (desktop)
|
||||||
|
./gradlew composeApp:compileKotlinDesktop
|
||||||
|
|
||||||
|
# Run desktop app
|
||||||
|
./gradlew composeApp:run
|
||||||
|
|
||||||
|
# Tests (desktop target — KMP has no commonTest task)
|
||||||
|
./gradlew composeApp:desktopTest
|
||||||
|
|
||||||
|
# Android debug APK
|
||||||
|
./gradlew composeApp:assembleDebug
|
||||||
|
|
||||||
|
# Android release APK (requires keystore.properties at project root)
|
||||||
|
./gradlew composeApp:assembleRelease
|
||||||
|
|
||||||
|
# macOS DMG
|
||||||
|
./gradlew composeApp:packageDistributionForCurrentOS
|
||||||
|
```
|
||||||
|
|
||||||
|
## Lint / Typecheck
|
||||||
|
|
||||||
|
There is no separate lint task. Compilation is the type check:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./gradlew composeApp:compileKotlinDesktop
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- Kotlin 2.3.20, Compose Multiplatform 1.11.1, Material 3
|
||||||
|
- Ktor 3.5.1 (CIO on Android/Desktop, Darwin on iOS)
|
||||||
|
- kotlinx.serialization 1.11.0
|
||||||
|
- multiplatform-settings 1.3.0
|
||||||
|
- lifecycle-viewmodel-compose 2.10.0
|
||||||
|
- Gradle 9.5.1, AGP 8.13.2
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
Layered: `models → network → cache → filter → viewmodel → ui`
|
||||||
|
|
||||||
|
- **commonMain**: all shared code (models, networking, caching, filtering, viewmodels, UI)
|
||||||
|
- **androidMain**: Android OAuth (Custom Tabs), MainActivity, CIO engine
|
||||||
|
- **iosMain**: iOS OAuth (ASWebAuthenticationSession), MainViewController, Darwin engine
|
||||||
|
- **desktopMain**: Desktop OAuth (local HTTP server), Main.kt, CIO engine
|
||||||
|
|
||||||
|
Package: `ch.parano.myice`
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
- Single `composeApp` module, shared UI approach (not per-platform UI)
|
||||||
|
- French UI strings (matching the Flutter app)
|
||||||
|
- TDD: write tests in `commonTest`, run via `desktopTest` target
|
||||||
|
- `expect/actual` for platform-specific code (HttpClient engine, OAuth)
|
||||||
|
- No comments in code unless explicitly requested
|
||||||
|
- Follow existing file structure: one class per file, organized by layer
|
||||||
|
|
||||||
|
## Backend
|
||||||
|
|
||||||
|
API at `https://myice.parano.ch` (hardcoded in `network/ApiConfig.kt`).
|
||||||
|
Endpoints: `/login`, `/userinfo`, `/accounts`, `/schedule?account=`, `/game/{id}?account=`
|
||||||
|
|
||||||
|
## Secrets
|
||||||
|
|
||||||
|
- `keystore.properties` and `*.keystore` are gitignored — never commit
|
||||||
|
- OAuth tokens stored via multiplatform-settings (plaintext, same as Flutter app)
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
- iOS `.xcodeproj` must be created manually in Xcode (Swift files exist in `iosApp/`)
|
||||||
|
- ViewModels use `remember{}` instead of `viewModel()` (state lost on Android rotation)
|
||||||
|
- No URL-decoding in token parser (JWT tokens don't need it)
|
||||||
|
- `AuthViewModel.init()` logs out on any network error, not just 401
|
||||||
Reference in New Issue
Block a user