From eb6133b0a57e80be56212c41f86d223385a066ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 26 Sep 2026 21:52:08 +0200 Subject: [PATCH] Add Claude Code and Codex agent modules --- modules/claude.nix | 36 ++++++++++++++++++++++++++++++++++++ modules/codex.nix | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 modules/claude.nix create mode 100644 modules/codex.nix diff --git a/modules/claude.nix b/modules/claude.nix new file mode 100644 index 0000000000000000000000000000000000000000..a267b3be851c7941de1db408b800e8c983c9ea46 --- /dev/null +++ b/modules/claude.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.claude; + settingsFile = (pkgs.formats.json { }).generate "claude-settings.json" cfg.settings; +in +{ + options.claude = { + enable = lib.mkEnableOption "Claude Code"; + package = lib.mkOption { + type = lib.types.package; + description = "The Claude Code package; must provide bin/claude."; + }; + settings = lib.mkOption { + type = (pkgs.formats.json { }).type; + default = { }; + description = "Settings layered over the account's settings.json via --settings."; + }; + }; + + config.build.agents.claude = lib.mkIf cfg.enable { + exe = lib.getExe' cfg.package "claude"; + stateEnvVar = "CLAUDE_CONFIG_DIR"; + instructionsFile = "CLAUDE.md"; + # Managed links: path relative to the state dir -> store path. + files = { }; + flags = lib.optionals (cfg.settings != { }) [ + "--settings" + "${settingsFile}" + ]; + }; +} diff --git a/modules/codex.nix b/modules/codex.nix new file mode 100644 index 0000000000000000000000000000000000000000..281585f816343e8f8c2cc224ee8c4e8e4fbd39aa --- /dev/null +++ b/modules/codex.nix @@ -0,0 +1,38 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.codex; + profile = "agent-environments"; + settingsFile = (pkgs.formats.toml { }).generate "codex-${profile}.config.toml" cfg.settings; +in +{ + options.codex = { + enable = lib.mkEnableOption "Codex"; + package = lib.mkOption { + type = lib.types.package; + description = "The Codex package; must provide bin/codex."; + }; + settings = lib.mkOption { + type = (pkgs.formats.toml { }).type; + default = { }; + description = "Settings layered over the account's config.toml as the '${profile}' profile."; + }; + }; + + config.build.agents.codex = lib.mkIf cfg.enable { + exe = lib.getExe' cfg.package "codex"; + stateEnvVar = "CODEX_HOME"; + instructionsFile = "AGENTS.md"; + files = lib.optionalAttrs (cfg.settings != { }) { + "${profile}.config.toml" = settingsFile; + }; + flags = lib.optionals (cfg.settings != { }) [ + "--profile" + profile + ]; + }; +}