From 4b97e6c5f117b36c49c609669f1b6f073b2c2304 Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 25 Apr 2026 16:28:17 -0700 Subject: [PATCH] codex: manage generated skills with home-manager --- home-manager/codex-generated-skills.nix | 67 +++++++++++++++++++++++++ nix-darwin/home/common.nix | 7 ++- nixos/dotfiles-links.nix | 4 ++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 home-manager/codex-generated-skills.nix diff --git a/home-manager/codex-generated-skills.nix b/home-manager/codex-generated-skills.nix new file mode 100644 index 00000000..d6a3d445 --- /dev/null +++ b/home-manager/codex-generated-skills.nix @@ -0,0 +1,67 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.myModules.codexGeneratedSkills; +in { + options.myModules.codexGeneratedSkills = { + enable = lib.mkEnableOption "generated Codex skill setup"; + + codexHome = lib.mkOption { + type = lib.types.str; + default = "${config.home.homeDirectory}/.codex"; + description = "Codex home directory."; + }; + + skillsDir = lib.mkOption { + type = lib.types.str; + default = "${cfg.codexHome}/skills"; + description = "Codex skills directory."; + }; + + primaryRuntimeDir = lib.mkOption { + type = lib.types.str; + default = "${config.home.homeDirectory}/.cache/codex-runtimes/codex-primary-runtime"; + description = "Codex primary runtime cache directory."; + }; + }; + + config = lib.mkIf cfg.enable { + home.activation.setupCodexGeneratedSkills = lib.hm.dag.entryAfter ["writeBoundary"] '' + codex_home=${lib.escapeShellArg cfg.codexHome} + skills_dir=${lib.escapeShellArg cfg.skillsDir} + runtime_skills_root=${lib.escapeShellArg "${cfg.primaryRuntimeDir}/skills/skills"} + + mkdir -p "$skills_dir" + + if [ -x ${lib.escapeShellArg "${pkgs.codex}/bin/codex"} ]; then + if ! CODEX_HOME="$codex_home" ${lib.escapeShellArg "${pkgs.codex}/bin/codex"} debug prompt-input "bootstrap generated Codex skills" >/dev/null; then + echo "setupCodexGeneratedSkills: codex failed to bootstrap .system skills" >&2 + fi + else + echo "setupCodexGeneratedSkills: codex binary not found; skipping .system skill bootstrap" >&2 + fi + + if [ -d "$runtime_skills_root" ]; then + tmp_dir="$(mktemp -d "''${TMPDIR:-/tmp}/codex-primary-runtime.XXXXXX")" + trap 'rm -rf "$tmp_dir"' EXIT + + mkdir -p "$tmp_dir/codex-primary-runtime" + for skill_name in slides spreadsheets; do + if [ -d "$runtime_skills_root/$skill_name" ]; then + cp -R "$runtime_skills_root/$skill_name" "$tmp_dir/codex-primary-runtime/$skill_name" + fi + done + + if [ "$(find "$tmp_dir/codex-primary-runtime" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')" != "0" ]; then + rm -rf "$skills_dir/codex-primary-runtime" + mv "$tmp_dir/codex-primary-runtime" "$skills_dir/codex-primary-runtime" + fi + else + echo "setupCodexGeneratedSkills: runtime skills not found at $runtime_skills_root; skipping codex-primary-runtime" >&2 + fi + ''; + }; +} diff --git a/nix-darwin/home/common.nix b/nix-darwin/home/common.nix index 6c9bb177..37f2c848 100644 --- a/nix-darwin/home/common.nix +++ b/nix-darwin/home/common.nix @@ -88,13 +88,18 @@ in { programs.home-manager.enable = true; - imports = [inputs.agenix.homeManagerModules.default]; + imports = [ + inputs.agenix.homeManagerModules.default + ../../home-manager/codex-generated-skills.nix + ]; age.identityPaths = ["${config.home.homeDirectory}/.ssh/id_ed25519"]; age.secrets.gpg-keys.file = ../../nixos/secrets/gpg-keys.age; age.secrets.gpg-passphrase.file = ../../nixos/secrets/gpg-passphrase.age; home.file = dotfilesLinks; + myModules.codexGeneratedSkills.enable = true; + home.activation.linkEmacsDotdir = lib.hm.dag.entryAfter ["writeBoundary"] '' live_emacs_dir="$HOME/dotfiles/dotfiles/emacs.d" target_emacs_dir="${dotfilesDir}/emacs.d" diff --git a/nixos/dotfiles-links.nix b/nixos/dotfiles-links.nix index bb1d1805..65ad1980 100644 --- a/nixos/dotfiles-links.nix +++ b/nixos/dotfiles-links.nix @@ -55,9 +55,13 @@ let }; in { + imports = [ ../home-manager/codex-generated-skills.nix ]; + home.file = builtins.listToAttrs (map mkManaged managedRelFiles); + myModules.codexGeneratedSkills.enable = true; + # Home Manager directory links for .emacs.d resolve through the store on this # machine, which breaks Elpaca's writable state under ~/.emacs.d/elpaca. # Manage placement here instead so ~/.emacs.d always points at the live