agent-skills-nix
Kyure-A/agent-skills-nixИнструмент для декларативного управления Agent Skills (директориями с SKILL.md) на Nix: pinning источников через flake, автообнаружение, выборка, бандлинг и интеграция с Home Manager.
Установка
git clone https://github.com/Kyure-A/agent-skills-nix.gitREADME
agent-skills-nix
Декларативное управление Agent Skills (директориями, содержащими SKILL.md) с pinning-источниками через flake, автообнаружением, выборкой, бандлингом и интеграцией с Home Manager.
Концепции
- sources: Именованные входы (flake или path), указывающие на корень скиллов (
subdir). ОпциональныйidPrefixдобавляет пространство имён к обнаруженным ID скиллов, чтобы избежать коллизий между источниками. - discover: Рекурсивно сканирует источники на наличие директорий с
SKILL.md, формируя каталог. Скиллы могут быть вложенными (например,ecosystem/c-ecosystem/), их ID используют/в качестве разделителя. - skills.enable / skills.enableAll / skills.explicit: Декларативный выбор обнаруженных скиллов, включение всех (глобально или по списку источников) и явно заданных; автоустановка не происходит без явного согласия.
- targets: Агент-специфичные назначения, синхронизируемые из store-бандла (структуры:
link,symlink-tree,copy-tree). Targets отключены по умолчанию (enable = false). Опцияdestподдерживает раскрытие переменных оболочки во время выполнения (например,${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills). См. Пути targets по умолчанию ниже.
Фильтры источников
Каждый источник поддерживает опциональные фильтры для управления обнаружением:
idPrefix(null | string, по умолчанию:null): Префикс, добавляемый к обнаруженным ID скиллов. Полезен, когда несколько источников предоставляют одинаковые относительные пути, напримерidPrefix = "openai";превращаетpdfвopenai/pdf.filter.maxDepth(null | int, по умолчанию:null): Максимальная глубина рекурсии при поискеSKILL.md.null= без ограничений (внутренний предел 100 для защиты от симлинк-петель),1= только непосредственные дочерние элементы,2= один уровень вложенности. Установите1для восстановления поведения без рекурсии (только плоская структура).filter.nameRegex(null | string, по умолчанию:null): Регулярное выражение, сопоставляемое с относительным путём скилла (например,cat-a/skill-1) для ограничения обнаружения.
Если два источника предоставляют pdf, явно задайте им префиксы для уникальности ID:
sources.openai = {
input = "openai-skills";
subdir = "skills";
idPrefix = "openai";
};
sources.anthropic = {
input = "anthropic-skills";
subdir = "skills";
idPrefix = "anthropic";
};
skills.enable = [ "openai/pdf" "anthropic/pdf" ];Пути targets по умолчанию
| Target | Глобальный путь | Локальный путь |
|---|---|---|
| agents | $HOME/.agents/skills | .agents/skills |
| codex | ${CODEX_HOME:-$HOME/.codex}/skills | .codex/skills |
| claude | ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills | .claude/skills |
| copilot | $HOME/.copilot/skills | .github/skills |
| cursor | $HOME/.cursor/skills | .cursor/skills |
| windsurf | $HOME/.codeium/windsurf/skills | .windsurf/skills |
| antigravity | $HOME/.gemini/antigravity/skills | .agent/skills |
| gemini | $HOME/.gemini/skills | .gemini/skills |
Быстрый старт (дочерний flake + Home Manager)
Разместите конфигурацию скиллов в небольшом дочернем flake, чтобы единственными pinned-входами там были источники скиллов.
Используйте пример быстрого старта:
- Обзор:
examples/quickstart/README.md - Main (тесная связь):
examples/quickstart/main/flake.nix - Child (разделённый каталог):
examples/quickstart/child/flake.nix
Примечания:
- В
mainagent-skillsи источники скиллов перечислены непосредственно в верхнеуровневых входах. - В
childверхний уровень зависит только отskills-catalog = path:./skills; входы скиллов находятся в./skills/flake.nix. - Если вы используете ссылки на
inputисточников в конфигурации модуля, передайте flakeinputsв Home Manager черезextraSpecialArgs. - Чтобы включить target по умолчанию, установите
targets.<name>.enable = true;(например,targets.claude.enable = true;). structure = "link"использует симлинкиhome.file;symlink-treeиcopy-treeвыполняются вhome.activation.symlink-treeиспользуетrsync -a --delete(сохранение симлинков);copy-treeиспользуетrsync -aL --delete(разыменование симлинков).destподдерживает раскрытие переменных оболочки во время выполнения (например,${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills). Примечание: структураlinkне поддерживает переменные оболочки и будет использовать fallback-путь.
Выходные данные flake
packages.<system>.agent-skills-bundle: Store-бандл выбранных скиллов (пустой по умолчанию; настраивается в потребителях).apps.<system>.skills-install: Синхронизирует бандл с включёнными глобальными targets (см. Пути targets по умолчанию). Переопределите назначения черезAGENT_SKILLS_DESTS.apps.<system>.skills-install-local: Синхронизирует бандл с включёнными локальными targets (см. Пути targets по умолчанию) с использованиемcopy-tree. Переопределите корень черезAGENT_SKILLS_ROOT, назначения черезAGENT_SKILLS_LOCAL_DESTS.apps.<system>.skills-list: JSON-представление каталога по умолчанию.checks.<system>.skills: Проверка корректности сборки бандла.homeManagerModules.default: Модуль Home Manager, реализующий описанный DSL.lib.agent-skills: Вспомогательные функции (discoverCatalog,selectSkills,mkBundle,mkLocalInstallScript,mkShellHook,catalogJson,defaultConfig).
Библиотечные функции
См. examples/library-functions/snippet.nix.
discoverCatalog рекурсивно обнаруживает директории с SKILL.md и генерирует ID с разделителем / для вложенных скиллов (например, cat-a/skill-1). Установите idPrefix на источнике для добавления пространства имён к обнаруженным ID (например, openai/pdf). Функция проверяет наличие SKILL.md и отклоняет дублирующиеся ID после добавления префикса (сообщения об ошибках включают абсолютные пути обоих конфликтующих источников). selectSkills выдаёт ошибку при наличии неизвестных записей в allowlist или отсутствующих файлов, предотвращая случайное расхождение. (Home Manager отображает skills.enable → allowlist и skills.explicit → skills.)
Кастомизация скиллов
Явные скиллы поддерживают опции transform и packages для настройки SKILL.md и зависимостей бандла:
См. examples/skill-customization/explicit-transform.nix.
Это генерирует:
my-skill/
├── SKILL.md
├── jq -> /nix/store/xxx-jq/bin/jq
└── curl/ -> /