К основному содержанию
правило

kotlin-ktor-development-cursorrules-prompt-file — правило Cursor

Правило задаёт структуру и практики для Kotlin-проектов на Ktor в Cursor. Оно пригодится при разработке API, сервисов и тестов.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/kotlin-ktor-development-cursorrules-prompt-file.mdc
Открыть на GitHub

Что делает kotlin-ktor-development-cursorrules-prompt-file

Правило охватывает все файлы по маске **/* и предлагает строить приложение вокруг бизнес-фич: общие компоненты, конфигурация и отдельные каталоги для auth, users и других функций. Для маршрутов, сервисов и репозиториев заданы разные зоны ответственности, а зависимости следует передавать через конструктор.

В рекомендациях учтены Kotlin 2.1.20+, Ktor, JDK 21, Gradle с Kotlin DSL, Exposed, HikariCP, Koin и Kotest. Также описаны обработка ошибок через StatusPages, тестирование маршрутов в Ktor 3.x и требования к покрытию: 80% для кода в целом и 90% для репозиториев, сервисов и валидации. Если проект использует другой стек, эти указания потребуют адаптации.

Какие задачи решает

  • разложить Kotlin-код по бизнес-фичам
  • разделить маршруты, сервисы и репозитории
  • задать обработку ошибок через StatusPages
  • проверить сервисы и API-тесты с Kotest
  • ориентировать проект на Ktor и Gradle Kotlin DSL

Примеры запросов агенту

  • Разложи новый модуль пользователей по бизнес-фиче и раздели маршруты, сервис и репозиторий.
  • Добавь обработчик GET /api/users/{id} с валидацией UUID и тестом через testApplication.
  • Проверь сервис Ktor: добавь тесты для найденного пользователя и ResourceNotFoundException.

Как установить kotlin-ktor-development-cursorrules-prompt-file

Вручную: положить файлы

.cursor/rules/kotlin-ktor-development-cursorrules-prompt-file.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о kotlin-ktor-development-cursorrules-prompt-file

Как установить kotlin-ktor-development-cursorrules-prompt-file в Cursor?

Сохраните правило в файле .cursor/rules/kotlin-ktor-development-cursorrules-prompt-file.mdc в проекте.

Что делает kotlin-ktor-development-cursorrules-prompt-file?

Правило направляет Cursor при создании Kotlin-приложений на Ktor: задаёт feature-based структуру, разделение слоёв, обработку ошибок и подход к тестам.

Какие требования к стеку задаёт правило?

Оно ориентировано на Kotlin 2.1.20+, JDK 21, Gradle с Kotlin DSL и Ktor. В списке зависимостей также указаны Exposed, HikariCP, kotlinx.serialization, Koin, kotlin-logging и Kotest.

Исходный текст

kotlin-ktor-development-cursorrules-prompt-file.mdc · CC0-1.0
---
description: "Cursor rules for Kotlin development with Ktor integration."
globs: **/*
alwaysApply: false
---
## Instruction to developer: save this file as .cursorrules and place it on the root project directory

## Core Principles
- Follow **SOLID**, **DRY**, **KISS**, and **YAGNI** principles
- Adhere to **OWASP** security best practices
- Break tasks into smallest units and solve problems step-by-step

## Technology Stack
- **Framework**: Kotlin Ktor with Kotlin 2.1.20+
- **JDK**: 21 (LTS)
- **Build**: Gradle with Kotlin DSL
- **Dependencies**: Ktor Server Core/Netty, kotlinx.serialization, Exposed, HikariCP, kotlin-logging, Koin, Kotest

## Application Structure (Feature-Based)
- **Organize by business features, not technical layers**
- Each feature is self-contained with all related components
- Promotes modularity, reusability, and better team collaboration
- Makes codebase easier to navigate and maintain
- Enables parallel development on different features
```
src/main/kotlin/com/company/app/
├── common/              # Shared utilities, extensions
├── config/              # Application configuration, DI
└── features/
    ├── auth/            # Feature directory
    │   ├── models/
    │   ├── repositories/
    │   ├── services/
    │   └── routes/
    └── users/           # Another feature
        ├── ...
```

Test structure mirrors the feature-based organization:
```
src/test/kotlin/com/company/app/
├── common/
└── features/
    ├── auth/
    │   ├── models/
    │   ├── repositories/
    │   ├── services/
    │   └── routes/
    └── users/
        ├── ...
```

## Application Logic Design
1. Route handlers: Handle requests/responses only
2. Services: Contain business logic, call repositories
3. Repositories: Handle database operations
4. Entity classes: Data classes for database models
5. DTOs: Data transfer between layers

## Entities & Data Classes
- Use Kotlin data classes with proper validation
- Define Table objects when using Exposed ORM
- Use UUID or auto-incrementing integers for IDs

## Repository Pattern
```kotlin
interface UserRepository {
    suspend fun findById(id: UUID): UserDTO?
    suspend fun create(user: CreateUserRequest): UserDTO
    suspend fun update(id: UUID, user: UpdateUserRequest): UserDTO?
    suspend fun delete(id: UUID): Boolean
}

class UserRepositoryImpl : UserRepository {
    override suspend fun findById(id: UUID): UserDTO? = withContext(Dispatchers.IO) {
        transaction {
            Users.select { Users.id eq id }
                .mapNotNull { it.toUserDTO() }
                .singleOrNull()
        }
    }
    // Other implementations...
}
```

## Service Layer
```kotlin
interface UserService {
    suspend fun getUserById(id: UUID): UserDTO
    suspend fun createUser(request: CreateUserRequest): UserDTO
    suspend fun updateUser(id: UUID, request: UpdateUserRequest): UserDTO
    suspend fun deleteUser(id: UUID)
}

class UserServiceImpl(
    private val userRepository: UserRepository
) : UserService {
    override suspend fun getUserById(id: UUID): UserDTO {
        return userRepository.findById(id) ?: throw ResourceNotFoundException("User", id.toString())
    }
    // Other implementations...
}
```

## Route Handlers
```kotlin
fun Application.configureUserRoutes(userService: UserService) {
    routing {
        route("/api/users") {
            get("/{id}") {
                val id = call.parameters["id"]?.let { UUID.fromString(it) }
                    ?: throw ValidationException("Invalid ID format")
                val user = userService.getUserById(id)
                call.respond(ApiResponse("SUCCESS", "User retrieved", user))
            }
            // Other routes...
        }
    }
}
```

## Error Handling
```kotlin
open class ApplicationException(
    message: String,
    val statusCode: HttpStatusCode = HttpStatusCode.InternalServerError
) : RuntimeException(message)

class ResourceNotFoundException(resource: String, id: String) :
    ApplicationException("$resource with ID $id not found", HttpStatusCode.NotFound)

fun Application.configureExceptions() {
    install(StatusPages) {
        exception<ResourceNotFoundException> { call, cause ->
            call.respond(cause.statusCode, ApiResponse("ERROR", cause.message ?: "Resource not found"))
        }
        exception<Throwable> { call, cause ->
            call.respond(HttpStatusCode.InternalServerError, ApiResponse("ERROR", "An internal error occurred"))
        }
    }
}
```

## Testing Strategies and Coverage Requirements

### Test Coverage Requirements
- **Minimum coverage**: 80% overall code coverage required
- **Critical components**: 90%+ coverage for repositories, services, and validation
- **Test all edge cases**: Empty collections, null values, boundary conditions
- **Test failure paths**: Exception handling, validation errors, timeouts
- **All public APIs**: Must have integration tests
- **Performance-critical paths**: Must have benchmarking tests

### Unit Testing with Kotest
```kotlin
class UserServiceTest : DescribeSpec({
    describe("UserService") {
        val mockRepository = mockk<UserRepository>()
        val userService = UserServiceImpl(mockRepository)

        it("should return user when exists") {
            val userId = UUID.randomUUID()
            val user = UserDTO(userId.toString(), "Test User", "[email protected]")
            coEvery { mockRepository.findById(userId) } returns user

            val result = runBlocking { userService.getUserById(userId) }

            result shouldBe user
        }

        it("should throw exception when user not found") {
            val userId = UUID.randomUUID()
            coEvery { mockRepository.findById(userId) } returns null

            shouldThrow<ResourceNotFoundException> {
                runBlocking { userService.getUserById(userId) }
            }
        }
    }
})
```

## Route Testing with Ktor 3.x
```kotlin
class UserRoutesTest : FunSpec({
    test("GET /api/users/{id} returns 200 when user exists") {
        val mockService = mockk<UserService>()
        val userId = UUID.randomUUID()
        val user = UserDTO(userId.toString(), "Test User", "[email protected]")

        coEvery { mockService.getUserById(userId) } returns user

        testApplication {
            application {
                configureRouting()
                configureDI { single { mockService } }
            }

            client.get("/api/users/$userId").apply {
                status shouldBe HttpStatusCode.OK
                bodyAsText().let {
                    Json.decodeFromString<ApiResponse<UserDTO>>(it)
                }.data shouldBe user
            }
        }
    }
})
```

## Key Principles for Testable Code
1. **Single Responsibility**: Each method should do one thing well
2. **Pure Functions**: Same input always produces same output
3. **Dependency Injection**: Constructor injection for testable components
4. **Clear Boundaries**: Well-defined inputs and outputs
5. **Small Methods**: Extract complex logic into testable helper functions

## Configuration Management
```kotlin
// Type-safe configuration
interface AppConfig {
    val database: DatabaseConfig
    val security: SecurityConfig
}

data class DatabaseConfig(
    val driver: String,
    val url: String,
    val user: String,
    val password: String
)

// Access in application
fun Application.configureDI() {
    val appConfig = HoconAppConfig(environment.config)

    install(Koin) {
        modules(module {
            single<AppConfig> { appConfig }
            single { appConfig.database }
        })
    }
}
```

## Security Best Practices
```kotlin
fun Application.configureSecurity() {
    install(Authentication) {
        jwt("auth-jwt") {
            // JWT configuration
        }
    }

    install(DefaultHeaders) {
        header(HttpHeaders.XContentTypeOptions, "nosniff")
        header(HttpHeaders.XFrameOptions, "DENY")
        header(HttpHeaders.ContentSecurityPolicy, "default-src 'self'")
        header("Strict-Transport-Security", "max-age=31536000; includeSubDomains")
    }
}
```

## Health Checks & Monitoring
```kotlin
fun Application.configureMonitoring() {
    val startTime = System.currentTimeMillis()

    routing {
        get("/health") {
            call.respond(mapOf("status" to "UP", "uptime" to "${(System.currentTimeMillis() - startTime) / 1000}s"))
        }

        get("/metrics") {
            call.respond(prometheusRegistry.scrape())
        }
    }

    install(MicrometerMetrics) {
        registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
        meterBinders = listOf(
            JvmMemoryMetrics(),
            JvmGcMetrics(),
            ProcessorMetrics(),
            JvmThreadMetrics()
        )
    }
}
```

## Performance Tuning
- **JVM Settings**: `-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:MaxRAMPercentage=75.0`
- **Connection Pooling**: Configure HikariCP with proper sizing based on workload
- **Caching**: Use Caffeine for in-memory caching of frequently accessed data
- **Coroutines**: Use structured concurrency for asynchronous processing
- **Database Queries**: Optimize with proper indexing, batch operations, pagination

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Похожие правила IDE

Все правила IDE по теме «Бэкенд и API» →
typespec-m365-copilot официальный github Правило подсказывает, как описывать агентов и API-плагины Microsoft 365 Copilot на TypeSpec. Срабатывает при работе с файлами .tsp. ★ 40 451звёзд репо typescript-mcp-server официальный github Правило подсказывает Copilot, как писать MCP-серверы на TypeScript SDK: классы, схемы на zod, транспорты и типовые ошибки. ★ 40 451звёзд репо springboot официальный github Правило задаёт Copilot стиль кода для Spring Boot: внедрение зависимостей, конфигурация, логирование и проверка сборки. ★ 40 451звёзд репо springboot-4-migration официальный github Инструкция для GitHub Copilot по переводу проектов со Spring Boot 3.x на 4.0. Помогает обновить зависимости в Gradle Kotlin DSL, каталоги версий и имена стартеров. ★ 40 451звёзд репо ruby-on-rails официальный github Задаёт для GitHub Copilot стандарты архитектуры Rails: тонкие контроллеры, сервисные объекты и строгие миграции. Помогает писать предсказуемый бэкенд на Ruby. ★ 40 451звёзд репо quarkus официальный github Задаёт стандарты разработки на Quarkus для GitHub Copilot при работе с Java и сборщиками. Направляет генерацию сервисов, конфигураций и тестов. ★ 40 451звёзд репо

Из того же набора140

laravel-tall-stack-best-practices-cursorrules-prom Правило задаёт практики для Laravel и TALL Stack в Cursor. Оно помогает писать PHP-код, Livewire-компоненты и интерфейсы на Alpine.js и Tailwind CSS. ★ 41 024звёзд репо laravel-php-83-cursorrules-prompt-file Правило для Cursor, которое ведёт агента по разработке пакетов Laravel: структура, стандарты кода, тесты и документация. ★ 41 024звёзд репо kubestellar-console Правило задаёт нормы для React/TypeScript-фронтенда и Go-бэкенда KubeStellar Console. Пригодится для карточек дашборда и мультикластерных запросов. ★ 41 024звёзд репо kubernetes-mkdocs-documentation-cursorrules-prompt Правило задаёт Cursor роль технического писателя: агент пишет документацию по Kubernetes и cloud native в Markdown и MkDocs. ★ 41 024звёзд репо knative-istio-typesense-gpu-cursorrules-prompt-fil Правило для Cursor, которое превращает ассистента в помощника по serverless-проектам на Knative с Istio, Typesense и HTMX. Пригодится, если вы собираете поисковое приложение на этих технологиях. ★ 41 024звёзд репо javascript-typescript-code-quality-cursorrules-pro Правило задаёт стиль для JavaScript и TypeScript: простой, читаемый и тестируемый код с небольшими изменениями. Подходит для задач в Cursor. ★ 41 024звёзд репо javascript-chrome-apis-cursorrules-prompt-file Правило для Cursor, которое настраивает ИИ-агента на разработку расширений Chrome: манифест, архитектура, работа с Chrome API. ★ 41 024звёзд репо java-springboot-jpa-cursorrules-prompt-file Правило задаёт структуру Java-проектов на Spring Boot с JPA, DTO и разделением слоёв. Пригодится для генерации REST API по единой схеме. ★ 41 024звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой