diff --git a/home/common.nix b/home/common.nix index 2a05927..9cc7065 100644 --- a/home/common.nix +++ b/home/common.nix @@ -13,6 +13,7 @@ ./lazygit.nix ./migration.nix ./nvim.nix + ./skills.nix ./scripts.nix ./tmux.nix ./zsh.nix diff --git a/home/skills.nix b/home/skills.nix new file mode 100644 index 0000000..20d35cb --- /dev/null +++ b/home/skills.nix @@ -0,0 +1,75 @@ +{ + config, + lib, + pkgs, + ... +}: let + globalSkills = [ + { + name = "rams"; + source = "https://github.com/brianlovin/claude-config"; + } + { + name = "agent-browser"; + source = "https://github.com/vercel-labs/agent-browser"; + } + { + name = "find-skills"; + source = "https://github.com/vercel-labs/skills"; + } + { + name = "frontend-design"; + source = "https://github.com/anthropics/skills"; + } + { + name = "next-best-practices"; + source = "https://github.com/vercel-labs/next-skills"; + } + { + name = "turborepo"; + source = "https://github.com/vercel/turborepo"; + } + ]; + + manifestHash = builtins.hashString "sha256" (builtins.toJSON globalSkills); + + installCommands = lib.concatMapStringsSep "\n" (skill: '' + "${pkgs.nodejs_22}/bin/npx" skills add ${lib.escapeShellArg skill.source} --skill ${lib.escapeShellArg skill.name} -g -y + '') globalSkills; + + missingChecks = lib.concatMapStringsSep "\n" (skill: '' + if [ ! -e "$HOME/.agents/skills/${skill.name}" ]; then + needs_sync=1 + fi + '') globalSkills; +in { + home.activation.ensureGlobalSkills = lib.hm.dag.entryAfter ["writeBoundary"] '' + state_dir="${config.xdg.stateHome}/skills" + stamp_file="$state_dir/global-skills-manifest.sha256" + desired_hash=${lib.escapeShellArg manifestHash} + needs_sync=0 + + mkdir -p "$state_dir" "$HOME/.agents/skills" + + if [ ! -f "$stamp_file" ] || [ "$(cat "$stamp_file")" != "$desired_hash" ]; then + needs_sync=1 + fi + + ${missingChecks} + + if [ "$needs_sync" -eq 1 ]; then + export PATH="${lib.makeBinPath [ + pkgs.nodejs_22 + pkgs.git + pkgs.coreutils + pkgs.findutils + pkgs.gnugrep + pkgs.gnused + ]}:$PATH" + + ${installCommands} + + printf '%s\n' "$desired_hash" > "$stamp_file" + fi + ''; +}