Thanks for your interest in contributing! DevLog uses Clean Architecture, so most contributions are self-contained in a single layer.
git clone https://github.com/vikey89/DevLog.git
cd devlog
./gradlew build # requires JDK 21 (Temurin recommended)Note: If Gradle can't find JDK 21, set
JAVA_HOMEto your JDK 21 installation path.
Every PR must pass:
./gradlew detekt # static analysis — zero issues
./gradlew test # all tests green- Create
src/main/kotlin/dev/vikey/devlog/data/llm/YourSource.kt - Implement the
LlmSourceinterface:
class YourSource(
private val client: HttpClient,
private val apiKey: Lazy<String>,
private val model: String,
) : LlmSource {
override suspend fun generate(prompt: String, system: String): Result<String> = runCatching {
// HTTP call with Ktor Client
}
}- Add a value to the
Providerenum indomain/model/Provider.kt - Register it in
ProviderRegistry.kt
That's it. One file + one line.
- Create
src/main/kotlin/dev/vikey/devlog/presentation/renderer/YourRenderer.kt - Implement the
Rendererinterface:
class YourRenderer : Renderer {
override suspend fun render(report: DevlogReport) {
// format and print the report
}
}- Register it in
RendererFactory.kt:
"your-format" -> YourRenderer()- Define the interface in
domain/repository/ - Implement in
data/(e.g.,data/jira/JiraDataSource.kt) - Create the repository implementation in
data/repository/ - Wire it in
presentation/di/AppModule.kt
- Domain layer has minimal dependencies (Kotlin stdlib + coroutines-core + kotlinx-datetime)
- Data layer implements domain interfaces
- Presentation layer depends on domain use cases
- Use
data classfor models,interfacefor contracts - Use fakes (not mocks) for testing — put them in
test/fakes/ - Every use case must have tests
type(scope): short description
# Examples:
feat(llm): add Mistral provider
fix(git): handle repos with no commits
test(daily): add cache invalidation test