{ description = "AI agent skills for Claude Code and OpenCode"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: let # Home Manager module for deploying skills skillsModule = import ./modules/ai-skills.nix; # List of available skills availableSkills = [ "niri-window-capture" "screenshot-latest" "tufte-press" "worklog" "update-spec-kit" ]; in flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in { # Development shell for working on skills devShells.default = pkgs.mkShell { name = "ai-skills"; packages = with pkgs; [ bash shellcheck jq ]; shellHook = '' echo "🤖 AI Skills development environment" echo "Available skills: ${builtins.concatStringsSep ", " availableSkills}" echo "" echo "Commands:" echo " ./bin/deploy-skill.sh - Copy skill to dotfiles" echo " bash -n skills/*/scripts/*.sh - Validate all scripts" ''; }; # Package individual skills for deployment packages = let # Filter to only skills that exist existingSkills = builtins.filter (name: builtins.pathExists (./skills + "/${name}")) availableSkills; individualSkills = builtins.listToAttrs ( map (skillName: { name = skillName; value = pkgs.stdenv.mkDerivation { name = "ai-skill-${skillName}"; src = ./skills + "/${skillName}"; installPhase = '' mkdir -p $out cp -r . $out/ # Make scripts executable if [ -d $out/scripts ]; then chmod +x $out/scripts/*.sh 2>/dev/null || true fi ''; }; }) existingSkills ); in individualSkills // { # All skills as a combined package all-skills = pkgs.symlinkJoin { name = "all-ai-skills"; paths = builtins.attrValues individualSkills; }; }; }) // { # Export the Home Manager module homeManagerModules.ai-skills = skillsModule; # Also export as nixosModules for compatibility nixosModules.ai-skills = skillsModule; # Export skills paths for direct use lib = { inherit availableSkills; # Helper to get skill path getSkillPath = skillName: ./skills/${skillName}; # Helper to get all skill paths getAllSkillPaths = map (name: ./skills/${name}) availableSkills; }; }; }