- README.md в каждом подмодуле: для библиотек — описание проблемы, подключение через maven-central/caffeine, версии в gradle/libs.versions.toml. Для запускаемых модулей — команды запуска + переменные среды с дефолтами. - Корневой README.md переписан как навигационный хаб: что это, где клиенты, где серверы, как собрать, как опубликовать. - build.gradle.kts: per-module POM-description через единую карту в rootProject.extra (порядок важен — нужно ДО apply плагина KMP, поэтому beforeEvaluate в subprojects). - .gitea/workflows/ci.yml (новый): build + jvmTest + shadowJar на PR/push main. - .gitea/workflows/release.yml (обновлён): публикует библиотеки в caffeine Nexus + собирает 3 fatjar'а и крепит их к release как бинарные ассеты.
2.8 KiB
:skills — pw.binom.agentik.skills
Парсер opencode-style скилов: SKILL.md или *.yaml с YAML-frontmatter + markdown body.
Загружается в system prompt как отдельная секция; модели доступны тулы
read_skill / skill_save / skill_delete (если они подключены через
:agent-toolsets).
Какую проблему решает
Агенту нужно знать, какие процедуры/инструкции у него есть, не таская их в коде. Скил — это:
---
name: backend:spring:db-base
description: Правила JPA/Flyway миграций и репозиториев в agentik.
---
Правила, которые применяются ко всем изменениям схемы:
- миграции только в Flyway;
- новые колонки nullable by default;
- ...
Парсер читает такие файлы из каталога (рекурсивно), валидирует обязательные
поля (name, description), собирает каталог для system prompt и поддерживает
горячее обновление: добавил файл — доступен в следующем read_skill без
рестарта.
Формат
Поддерживаются оба варианта:
SKILL.md— единый файл в каталоге (с frontmatter + body).*.yaml+ опциональный*.md-компаньон с тем же basename.
Frontmatter — YAML, минимум name (с : для вложенности) и description.
Остальные поля — пользовательские, доступны через SkillFile.frontmatter.
Подключение
commonMain {
implementation("pw.binom.agentik:skills:$version")
implementation("com.charleskorn.kaml:kaml:0.55.0")
}
Использование
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
Сборка
./gradlew :skills:build
./gradlew :skills:jvmTest
KMP-таргеты — полный набор как у :proto. Зависимости — только kotlinx-serialization + kaml.