Files
home-manager/tests/modules/programs/claude-code/full-config.nix
Austin Horstman e28654b710 claude-code: mark hook scripts executable
Inline hooks are scripts, so write them with the executable bit set. Add NMT assertions covering default and custom config directories.

(cherry picked from commit d0af9b8bf3)
2026-06-01 19:47:05 -05:00

146 lines
4.2 KiB
Nix

{
programs.claude-code = {
enable = true;
settings = {
theme = "dark";
permissions = {
allow = [
"Bash(git diff:*)"
"Edit"
];
ask = [ "Bash(git push:*)" ];
deny = [
"WebFetch"
"Bash(curl:*)"
"Read(./.env)"
"Read(./secrets/**)"
];
additionalDirectories = [ "../docs/" ];
defaultMode = "acceptEdits";
disableBypassPermissionsMode = "disable";
};
model = "claude-3-5-sonnet-20241022";
hooks = {
UserPromptSubmit = [
{
matcher = "";
hooks = [
{
type = "command";
command = "echo 'User submitted: $CLAUDE_USER_PROMPT'";
}
];
}
];
PreToolUse = [
{
matcher = "Bash";
hooks = [
{
type = "command";
command = "echo 'Running bash command: $CLAUDE_TOOL_INPUT'";
}
];
}
];
};
statusLine = {
type = "command";
command = "input=$(cat); echo \"[$(echo \"$input\" | jq -r '.model.display_name')] 📁 $(basename \"$(echo \"$input\" | jq -r '.workspace.current_dir')\")\"";
padding = 0;
};
includeCoAuthoredBy = false;
};
commands = {
changelog = ''
---
allowed-tools: Bash(git log:*), Bash(git diff:*)
argument-hint: [version] [change-type] [message]
description: Update CHANGELOG.md with new entry
---
Parse the version, change type, and message from the input
and update the CHANGELOG.md file accordingly.
'';
commit = ''
---
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
description: Create a git commit with proper message
---
## Context
- Current git status: !`git status`
- Current git diff: !`git diff HEAD`
- Recent commits: !`git log --oneline -5`
## Task
Based on the changes above, create a single atomic git commit with a descriptive message.
'';
};
agents = {
code-reviewer = ''
---
name: code-reviewer
description: Specialized code review agent
tools: Read, Edit, Grep
---
You are a senior software engineer specializing in code reviews.
Focus on code quality, security, and maintainability.
'';
documentation = ''
---
name: documentation
description: Documentation writing assistant
model: claude-3-5-sonnet-20241022
tools: Read, Write, Edit
---
You are a technical writer who creates clear, comprehensive documentation.
Focus on user-friendly explanations and examples.
'';
};
hooks = {
pre-edit = ''
#!/usr/bin/env bash
echo "About to edit file: $1"
'';
post-commit = ''
#!/usr/bin/env bash
echo "Committed with message: $1"
'';
};
};
nmt.script = ''
assertFileExists home-files/.claude/settings.json
assertFileContent home-files/.claude/settings.json ${./expected-settings.json}
assertFileExists home-files/.claude/agents/code-reviewer.md
assertFileContent home-files/.claude/agents/code-reviewer.md ${./expected-code-reviewer.md}
assertFileExists home-files/.claude/agents/documentation.md
assertFileContent home-files/.claude/agents/documentation.md ${./expected-documentation.md}
assertFileExists home-files/.claude/commands/changelog.md
assertFileContent home-files/.claude/commands/changelog.md ${./expected-changelog}
assertFileExists home-files/.claude/commands/commit.md
assertFileContent home-files/.claude/commands/commit.md ${./expected-commit}
assertFileExists home-files/.claude/hooks/pre-edit
assertFileIsExecutable home-files/.claude/hooks/pre-edit
assertFileRegex home-files/.claude/hooks/pre-edit "About to edit file"
assertFileExists home-files/.claude/hooks/post-commit
assertFileIsExecutable home-files/.claude/hooks/post-commit
assertFileRegex home-files/.claude/hooks/post-commit "Committed with message"
'';
}