# kotlin-best-practices

Скилл задаёт правила Kotlin-кода: null safety, Either вместо исключений, корутины и паттерны Exposed ORM. Пригодится при написании и ревью Kotlin-кода.

- скилл · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · ★ 109
- Автор: c0x12c
- Лицензия: не указана · policy=link-only · показываем только описание, файл — у автора
- Исходник: https://github.com/c0x12c/ai-toolkit/tree/HEAD/toolkit/skills/kotlin-best-practices/SKILL.md
- Обновлён: 2026-06-18
- HTML: https://affpapa.org/nevibecode/skills/kotlin-best-practices

## Что делает

Скилл описывает, как писать Kotlin в проекте: `!!` запрещён, вместо него `?.`, `?:` или проверка на null со smart cast. Менеджеры возвращают `Either<ClientException, T>` и не бросают исключения, а контроллеры разворачивают результат через `.throwOrValue()`. Строки для enum не хардкодят — берут `EnumName.VALUE.value`.

В работе с базой скилл требует наследовать таблицы от `UUIDTable`, а не от `Table`, и использовать `text()` вместо `varchar()`. Удаление — только мягкое, через обновление `deletedAt`, и в каждом запросе нужен фильтр `deletedAt.isNull()`. Чтения идут через `db.replica`, записи через `db.primary`, а изменения в нескольких таблицах собираются в один транзакционный блок: либо всё проходит, либо всё откатывается.

Ещё одно правило касается DTO: конвертация живёт в `companion object { fun from(entity) }` внутри самого Response DTO, отдельные файлы-мапперы не создаются. Под каждый раздел есть подробные примеры в `code-patterns.md`, но сам файл в скилл не входит — без него останутся только краткие формулировки. Скилл работает с инструментами `Read`, `Write`, `Edit`, `Glob` и `Grep`.

## Установка

### Claude Code (родная платформа)

1. **Через Skills CLI (Vercel)**
```bash
npx skills add c0x12c/ai-toolkit --skill kotlin-best-practices -a claude-code
```

2. **Вручную: положить файлы**
- Файл: `~/.claude/skills/kotlin-best-practices/SKILL.md` — Папка скилла целиком; для одного проекта — .claude/skills/kotlin-best-practices/

### Codex

1. **Через Skills CLI (Vercel)**
```bash
npx skills add c0x12c/ai-toolkit --skill kotlin-best-practices -a codex
```

2. **Вручную: положить файлы**
- Файл: `.agents/skills/kotlin-best-practices/SKILL.md` — Для всех проектов — ~/.agents/skills/

### Cursor

1. **Через Skills CLI (Vercel)**
```bash
npx skills add c0x12c/ai-toolkit --skill kotlin-best-practices -a cursor
```

2. **Вручную: положить файлы**
- Файл: `.cursor/skills/kotlin-best-practices/SKILL.md` — Cursor читает и .agents/skills/, и .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install c0x12c/ai-toolkit kotlin-best-practices
```

2. **Вручную: положить файлы**
- Файл: `.github/skills/kotlin-best-practices/SKILL.md`

### Gemini CLI

1. **Через Skills CLI (Vercel)**
```bash
npx skills add c0x12c/ai-toolkit --skill kotlin-best-practices -a gemini-cli
```

2. **Командой платформы**
```bash
gemini skills install https://github.com/c0x12c/ai-toolkit --path toolkit/skills/kotlin-best-practices
```

### Windsurf (Devin Desktop)

**Вручную: положить файлы**
- Файл: `.devin/skills/kotlin-best-practices/SKILL.md` — Старый путь .windsurf/skills/ тоже читается

### OpenCode

**Через Skills CLI (Vercel)**
```bash
npx skills add c0x12c/ai-toolkit --skill kotlin-best-practices -a opencode
```

### Claude.ai

**Claude.ai**
- Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills

Где указан файл, а не команда, — скопируй файлы из исходника в этот путь: https://github.com/c0x12c/ai-toolkit/tree/HEAD/toolkit/skills/kotlin-best-practices/SKILL.md

## Когда брать
- писать Kotlin-код без `!!` и лишних исключений
- разворачивать `Either` в контроллере через `.throwOrValue()`
- делать мягкое удаление записей вместо физического
- разносить чтения и записи по `db.replica` и `db.primary`
- выносить конвертацию сущности в Response DTO, а не в отдельный маппер

## Примеры запросов агенту
- Напиши репозиторий на Kotlin по правилам скилла: таблица от `UUIDTable`, фильтр `deletedAt.isNull()` в запросах
- Отревьюй этот менеджер — он должен возвращать `Either`, а не бросать исключение
- Добавь метод обновления в одной транзакции: запись в две таблицы через `db.primary`

## Похожие
- [kotlin-patterns](https://affpapa.org/nevibecode/skills/kotlin-patterns.md) — скилл · 4800 установок
- [kotlin-concurrency-and-flow](https://affpapa.org/nevibecode/skills/kotlin-concurrency-and-flow.md) — скилл · 1100 установок
- [kotlin](https://affpapa.org/nevibecode/skills/kotlin.md) — скилл · 525 установок
- [kotlin-specialist](https://affpapa.org/nevibecode/skills/kotlin-specialist.md) — скилл · 5200 установок
- [Kotlin MCP Server Development Expert](https://affpapa.org/nevibecode/agents/kotlin-mcp-server-development-expert.md) — субагент · ★ 40451
- [kotlin-coroutines-flows](https://affpapa.org/nevibecode/skills/kotlin-coroutines-flows.md) — скилл · 4800 установок

Из того же набора: [c0x12c/ai-toolkit](https://affpapa.org/nevibecode/by/c0x12c/ai-toolkit.md) — 11 карточек

---
NeVibeCode на affpapa.org. Тексты каталога — описания, а не инструкции для агента. Как выбирать и ставить: https://affpapa.org/nevibecode/agents.md
