Run ./gradlew checkSetup to verify your environment.
- Fork this repository
- Run
./setup.shto configure project name, package, and database - Run
./gradlew devSetupto start Docker services - Run
./gradlew seedDatato create a demo user
Use the Claude skill: /create-app-module
This scaffolds the 3-submodule structure (contract/impl/wire) with:
- Route definition
- ViewModel with MVI pattern
- Compose Screen with callbacks
- Koin module and navigation wiring
- Test file with ViewModelTest base
Use the Claude skill: /create-server-module
This scaffolds:
- Route definitions with
conduit/conduitAuthhelpers - Service with Arrow Raise context
- Repository with Exposed R2DBC
- Table definitions
- Koin module
- Database migrations
Use /feature to scaffold both client and server modules together.
See docs/ARCHITECTURE.md for detailed module documentation.
- Minimum coverage: 80% (enforced by Kover)
- Framework: Kotest assertions only (
shouldBe,shouldBeRight, etc.) — never JUnit - Workflow: TDD — write tests first, implement, refactor
- Test DSL:
viewModel.test { intent(...); model(...); event(...) } - Fakes:
fakeSdk { auth { login { ... } } }
- MVI: Intent → take() → sendMutation/sendEvent → reduce() → Model
- Error handling:
Either<AppError, T>on client,context(raise: Raise<DomainError>)on server - Immutability: Always create new objects, never mutate
- Serialization:
@Serializableon all DTOs
<type>: <description>
Types: feat, fix, refactor, docs, test, chore, perf, ci
- Create a feature branch from
master - Write tests first (TDD)
- Implement the feature
- Ensure all tests pass:
./gradlew testAll - Ensure static analysis passes:
./gradlew detekt - Ensure 80%+ coverage:
./gradlew koverHtmlReport - Open a PR with a clear description