docs: per-module READMEs (run vs library) + root navigation hub
ci / JVM build + tests (pull_request) Failing after 54s

Every subproject now has README.md:
- 3 runnable modules (:standalone, :agentik-cli, :agentik-tui):
  quickstart, env table, parameters, known limits
- 11 library modules: what it is, which problem solves, how to
  wire it in, where versions live

Root README.md is the navigation hub (Quickstart, Modules table,
publish + CI/CD notes).

Also: ci.yml prunes the :memory-vector -x excludes now that
text-embedding-kmp artifacts are published to caffeine.

518 tests green.

Verified publish pipeline: :proto:publish to caffeine produces
pom.module + per-target klibs + sources for all 9 KMP targets.

🤖 Generated with [opencode]
This commit is contained in:
SubochevAV
2026-09-16 20:44:16 +03:00
parent 5ad972767d
commit 8f616f359f
22 changed files with 1125 additions and 890 deletions
+65 -63
View File
@@ -1,77 +1,79 @@
# :skills — `pw.binom.agentik.skills`
# `:skills` — парсер SKILL.md (KMP, JVM-only)
**Парсер opencode-style скилов: `SKILL.md` или `*.yaml` с YAML-frontmatter + markdown body.**
Загружается в system prompt как отдельная секция; модели доступны тулы
`read_skill` / `skill_save` / `skill_delete` (если они подключены через
`:agent-toolsets`).
## Что это
## Какую проблему решает
Парсер и runtime для навыков агента в формате [opencode Skills](https://docs.opencode.dev):
Агенту нужно **знать**, какие процедуры/инструкции у него есть, не таская их
в коде. Скил — это:
- **SKILL.md / \*.yaml** с YAML-frontmatter (`name`, `description`,
`allowed-tools`, etc.) и markdown-телом.
- Реестр `SkillCatalog`, лоадер `SkillLoader` (поиск по
`~/.agentik/skills/`).
- `Skill` имеет стабильный id, описание, может требовать определённые
tools (`allowed-tools: [run_command, write_file]`) — это контролируется
на уровне вызова.
- Загруженные скиллы аггрегируются в system-prompt через
`Skill.toSystemPromptSection()` или подгружаются по требованию через
tool `read_skill`.
Решает задачу: агенту нужно объяснить "что я умею" на разных языках
(нативный skill-вызов vs. описание), нужно уметь включать/выключать
навыки по требованию, и нужно хранить текстовые навыки прямо в
git-репозитории (а не в БД).
## Где используется
- `:standalone` подгружает все SKILL.md из `~/.agentik/skills/`
и инструментового скилл-майнера (skill-mining: создание новых
SKILL.md по LLM-рефлексии).
- Активно юзается для: `code-review`, `arch-summary`, `telegram-reply`,
любых "habits" агента.
## Как подключить
```kotlin
kotlin {
sourceSets.commonMain.dependencies {
api("pw.binom.agentik:skills:0.1.0")
}
}
```
## Версии
`gradle/libs.versions.toml` → `[versions] agentik-skills`.
## Пример SKILL.md
```markdown
---
name: backend:spring:db-base
description: Правила JPA/Flyway миграций и репозиториев в agentik.
name: code-review
description: Review uncommitted diff and produce line-anchored comments.
allowed-tools: [run_command, read_file]
---
Правила, которые применяются ко всем изменениям схемы:
- миграции только в Flyway;
- новые колонки nullable by default;
- ...
You are a strict reviewer. For every change in the diff, output:
- File: <path>
- Severity: <nit|warning|blocker>
- Comment: <one sentence>
Only mention issues that are objectively wrong. Do not refactor.
```
Парсер читает такие файлы из каталога (рекурсивно), валидирует обязательные
поля (`name`, `description`), собирает каталог для system prompt и **поддерживает
горячее обновление**: добавил файл — доступен в следующем `read_skill` без
рестарта.
## Тесты
## Формат
Поддерживаются оба варианта:
- **`SKILL.md`** — единый файл в каталоге (с frontmatter + body).
- **`*.yaml`** + опциональный `*.md`-компаньон с тем же basename.
Frontmatter — YAML, минимум `name` (с `:` для вложенности) и `description`.
Остальные поля — пользовательские, доступны через `SkillFile.frontmatter`.
## Подключение
```kotlin
commonMain {
implementation("pw.binom.agentik:skills:$version")
implementation("com.charleskorn.kaml:kaml:0.55.0")
}
```
## Использование
```kotlin
import pw.binom.agentik.skills.SkillCatalog
val catalog = SkillCatalog.fromDirectory(Path("/etc/agentik/skills"))
catalog.listAll().forEach { skill ->
println("- ${skill.name}: ${skill.description}")
}
val skill = catalog.findByName("backend:spring:db-base")
val body = skill?.body
```
`SkillPrompt` умеет отрендерить каталог в markdown-секцию для system prompt
(с truncate по длине, чтобы не раздувать контекст).
## Где смотреть версии
- `version` из `gradle.properties` (`version=0.1.0`)
- релизы: `https://git.binom.pw/subochev/agentik/releases`
## Сборка
```bash
./gradlew :skills:build
./gradlew :skills:jvmTest
```
KMP-таргеты — полный набор как у `:proto`. Зависимости — только `kotlinx-serialization` + `kaml`.
Покрывают: парсинг yaml-frontmatter, обработку отсутствующих полей,
unicode-имена, дубликаты id, очень большое тело.
## Чего здесь НЕТ
- Никакого HTTP / tool-вызова. Парсер и реестр — не более.
- Никакой БД. SKILL.md живут в файлах под управлением пользователя.
## Текущий статус
Используется продакшеном. Парсер простой и предсказуемый; расширять
формат frontmatter можно без поломок (новые поля игнорируются).