codex: manage generated skills with home-manager
This commit is contained in:
67
home-manager/codex-generated-skills.nix
Normal file
67
home-manager/codex-generated-skills.nix
Normal file
@@ -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
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -88,13 +88,18 @@
|
|||||||
in {
|
in {
|
||||||
programs.home-manager.enable = true;
|
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.identityPaths = ["${config.home.homeDirectory}/.ssh/id_ed25519"];
|
||||||
age.secrets.gpg-keys.file = ../../nixos/secrets/gpg-keys.age;
|
age.secrets.gpg-keys.file = ../../nixos/secrets/gpg-keys.age;
|
||||||
age.secrets.gpg-passphrase.file = ../../nixos/secrets/gpg-passphrase.age;
|
age.secrets.gpg-passphrase.file = ../../nixos/secrets/gpg-passphrase.age;
|
||||||
home.file = dotfilesLinks;
|
home.file = dotfilesLinks;
|
||||||
|
|
||||||
|
myModules.codexGeneratedSkills.enable = true;
|
||||||
|
|
||||||
home.activation.linkEmacsDotdir = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
home.activation.linkEmacsDotdir = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
live_emacs_dir="$HOME/dotfiles/dotfiles/emacs.d"
|
live_emacs_dir="$HOME/dotfiles/dotfiles/emacs.d"
|
||||||
target_emacs_dir="${dotfilesDir}/emacs.d"
|
target_emacs_dir="${dotfilesDir}/emacs.d"
|
||||||
|
|||||||
@@ -55,9 +55,13 @@ let
|
|||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
imports = [ ../home-manager/codex-generated-skills.nix ];
|
||||||
|
|
||||||
home.file =
|
home.file =
|
||||||
builtins.listToAttrs (map mkManaged managedRelFiles);
|
builtins.listToAttrs (map mkManaged managedRelFiles);
|
||||||
|
|
||||||
|
myModules.codexGeneratedSkills.enable = true;
|
||||||
|
|
||||||
# Home Manager directory links for .emacs.d resolve through the store on this
|
# Home Manager directory links for .emacs.d resolve through the store on this
|
||||||
# machine, which breaks Elpaca's writable state under ~/.emacs.d/elpaca.
|
# machine, which breaks Elpaca's writable state under ~/.emacs.d/elpaca.
|
||||||
# Manage placement here instead so ~/.emacs.d always points at the live
|
# Manage placement here instead so ~/.emacs.d always points at the live
|
||||||
|
|||||||
Reference in New Issue
Block a user