Fix Claude Code Home Manager config

Generate Claude settings from Nix so managed commands use the correct home directory, add declarative keybindings for Shift+Enter newline support, and replace the broken inline docs hook with a portable script.

Also stop exporting CLAUDE_CONFIG_DIR so Claude no longer splits managed config between ~/.claude and ~/.config/claude, and fix the status line script shebang for NixOS.

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Harivansh Rathi 2026-03-31 07:15:36 +00:00
parent b93511b85c
commit 29f9020c2f
6 changed files with 99 additions and 33 deletions

View file

@ -1,24 +1,60 @@
{
config,
inputs,
pkgs,
...
}:
let
claudePackage = inputs.claudeCode.packages.${pkgs.stdenv.hostPlatform.system}.default;
jsonFormat = pkgs.formats.json { };
claudeSettings = jsonFormat.generate "claude-settings.json" {
"$schema" = "https://json.schemastore.org/claude-code-settings.json";
env = {
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = "1";
};
permissions = {
defaultMode = "bypassPermissions";
};
hooks = {
PreToolUse = [
{
matcher = "Read";
hooks = [
{
type = "command";
command = "${config.home.homeDirectory}/.claude/sync-docs.sh";
}
];
}
];
};
statusLine = {
type = "command";
command = "${config.home.homeDirectory}/.claude/statusline.sh";
};
voiceEnabled = true;
};
in
{
home.file.".local/bin/claude".source = "${claudePackage}/bin/claude";
# Claude Code still resolves user settings from ~/.claude rather than XDG.
# Claude Code stores shared config, commands, plugins, and skills in ~/.claude.
# Global UI settings changed through /config still live in ~/.claude.json and are
# intentionally left user-managed because Claude mutates that file directly.
home.file.".claude/CLAUDE.md".source = ../config/claude/CLAUDE.md;
home.file.".claude/commands" = {
source = ../config/claude/commands;
recursive = true;
};
home.file.".claude/settings.json".source = ../config/claude/settings.json;
home.file.".claude/settings.json".source = claudeSettings;
home.file.".claude/settings.local.json".source = ../config/claude/settings.local.json;
home.file.".claude/keybindings.json".source = ../config/claude/keybindings.json;
home.file.".claude/statusline.sh" = {
source = ../config/claude/statusline.sh;
executable = true;
};
home.file.".claude/sync-docs.sh" = {
source = ../config/claude/sync-docs.sh;
executable = true;
};
}

View file

@ -40,9 +40,6 @@ in
AWS_SHARED_CREDENTIALS_FILE = "${config.xdg.configHome}/aws/credentials";
AWS_CONFIG_FILE = "${config.xdg.configHome}/aws/config";
})
(lib.mkIf (f.claude or false) {
CLAUDE_CONFIG_DIR = "${config.xdg.configHome}/claude";
})
{
PSQL_HISTORY = "${config.xdg.stateHome}/psql_history";
SQLITE_HISTORY = "${config.xdg.stateHome}/sqlite_history";