From 35a357eb9df9dc6b5ec93f978e67fec1616eadc4 Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 30 Nov 2025 15:16:30 -0800 Subject: [PATCH] feat: add separate skill lists per target (claudeCodeSkills, openCodeSkills) --- modules/ai-skills.nix | 67 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/modules/ai-skills.nix b/modules/ai-skills.nix index 4462e45..ba3eb4a 100644 --- a/modules/ai-skills.nix +++ b/modules/ai-skills.nix @@ -4,51 +4,48 @@ with lib; let cfg = config.services.ai-skills; + + skillsList = '' + Available skills: + - niri-window-capture: Invisibly capture window screenshots + - screenshot-latest: Find latest screenshots + - tufte-press: Generate study card JSON + - worklog: Create org-mode worklogs + - update-spec-kit: Update spec-kit ecosystem + - update-opencode: Update OpenCode via Nix + - web-search: Search the web via Claude + - web-research: Deep web research with multiple backends + ''; in { options.services.ai-skills = { enable = mkEnableOption "AI agent skills for Claude Code and OpenCode"; - - skills = mkOption { - type = types.listOf types.str; - default = []; - description = '' - List of skills to deploy. Available skills: - - niri-window-capture: Invisibly capture window screenshots - - screenshot-latest: Find latest screenshots - - tufte-press: Generate study card JSON - - worklog: Create org-mode worklogs - - update-spec-kit: Update spec-kit ecosystem - - update-opencode: Update OpenCode via Nix - - web-search: Search the web via Claude - - web-research: Deep web research with multiple backends - ''; - example = [ "worklog" "web-search" ]; - }; - + skillsPath = mkOption { type = types.path; default = null; description = "Path to skills repository (e.g., ~/proj/skills/skills)"; }; - - enableClaudeCode = mkOption { - type = types.bool; - default = true; - description = "Deploy skills to Claude Code (~/.claude/skills/)"; + + # Per-target skill lists + claudeCodeSkills = mkOption { + type = types.listOf types.str; + default = []; + description = "Skills to deploy to Claude Code (~/.claude/skills/). ${skillsList}"; + example = [ "worklog" "niri-window-capture" ]; }; - - enableOpenCode = mkOption { - type = types.bool; - default = true; - description = "Deploy skills to OpenCode (~/.config/opencode/skills/)"; + + openCodeSkills = mkOption { + type = types.listOf types.str; + default = []; + description = "Skills to deploy to OpenCode (~/.config/opencode/skills/). ${skillsList}"; + example = [ "worklog" "web-search" ]; }; }; - + config = mkIf cfg.enable { - # Deploy skills to Claude Code home.file = mkMerge [ # Claude Code skills - (mkIf cfg.enableClaudeCode ( + (mkIf (cfg.claudeCodeSkills != []) ( builtins.listToAttrs ( map (skillName: { name = ".claude/skills/${skillName}"; @@ -56,12 +53,12 @@ in { source = "${cfg.skillsPath}/${skillName}"; recursive = true; }; - }) cfg.skills + }) cfg.claudeCodeSkills ) )) - + # OpenCode skills - (mkIf cfg.enableOpenCode ( + (mkIf (cfg.openCodeSkills != []) ( builtins.listToAttrs ( map (skillName: { name = ".config/opencode/skills/${skillName}"; @@ -69,7 +66,7 @@ in { source = "${cfg.skillsPath}/${skillName}"; recursive = true; }; - }) cfg.skills + }) cfg.openCodeSkills ) )) ];