claude-code: init module (#7685)

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
Austin Horstman 2025-08-16 21:33:06 -05:00 committed by GitHub
parent 567312006a
commit 8b4ac14968
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 589 additions and 0 deletions

View file

@ -0,0 +1,22 @@
{
programs.claude-code = {
enable = true;
package = null;
mcpServers = {
filesystem = {
type = "stdio";
command = "npx";
args = [
"-y"
"@modelcontextprotocol/server-filesystem"
"/tmp"
];
};
};
};
test.asserts.assertions.expected = [
"`programs.claude-code.package` cannot be null when `mcpServers` is configured"
];
}

View file

@ -0,0 +1,7 @@
{
programs.claude-code.enable = true;
nmt.script = ''
assertPathNotExists home-files/.claude
'';
}

View file

@ -0,0 +1,6 @@
{
claude-code-basic = ./basic.nix;
claude-code-full-config = ./full-config.nix;
claude-code-mcp = ./mcp.nix;
claude-code-assertion = ./assertion.nix;
}

View file

@ -0,0 +1,7 @@
---
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.

View file

@ -0,0 +1,8 @@
---
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.

View file

@ -0,0 +1,13 @@
---
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.

View file

@ -0,0 +1,9 @@
---
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.

View file

@ -0,0 +1,2 @@
#! /nix/store/00000000000000000000000000000000-bash/bin/bash -e
exec -a "$0" "/nix/store/00000000000000000000000000000000-claude-code/bin/.claude-wrapped" --mcp-config /nix/store/00000000000000000000000000000000-claude-code-mcp-config.json "$@"

View file

@ -0,0 +1,55 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"hooks": {
"PreToolUse": [
{
"hooks": [
{
"command": "echo 'Running bash command: $CLAUDE_TOOL_INPUT'",
"type": "command"
}
],
"matcher": "Bash"
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"command": "echo 'User submitted: $CLAUDE_USER_PROMPT'",
"type": "command"
}
],
"matcher": ""
}
]
},
"includeCoAuthoredBy": false,
"model": "claude-3-5-sonnet-20241022",
"permissions": {
"additionalDirectories": [
"../docs/"
],
"allow": [
"Bash(git diff:*)",
"Edit"
],
"ask": [
"Bash(git push:*)"
],
"defaultMode": "acceptEdits",
"deny": [
"WebFetch",
"Bash(curl:*)",
"Read(./.env)",
"Read(./secrets/**)"
],
"disableBypassPermissionsMode": "disable"
},
"statusLine": {
"command": "input=$(cat); echo \"[$(echo \"$input\" | jq -r '.model.display_name')] 📁 $(basename \"$(echo \"$input\" | jq -r '.workspace.current_dir')\")\"",
"padding": 0,
"type": "command"
},
"theme": "dark"
}

View file

@ -0,0 +1,126 @@
{
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.
'';
};
};
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}
'';
}

View file

@ -0,0 +1,55 @@
{ config, ... }:
{
programs.claude-code = {
package = config.lib.test.mkStubPackage {
name = "claude-code";
buildScript = ''
mkdir -p $out/bin
touch $out/bin/claude
chmod 755 $out/bin/claude
'';
};
enable = true;
mcpServers = {
github = {
type = "http";
url = "https://api.githubcopilot.com/mcp/";
};
filesystem = {
type = "stdio";
command = "npx";
args = [
"-y"
"@modelcontextprotocol/server-filesystem"
"/tmp"
];
};
database = {
type = "stdio";
command = "npx";
args = [
"-y"
"@bytebase/dbhub"
"--dsn"
"postgresql://user:pass@localhost:5432/db"
];
env = {
DATABASE_URL = "postgresql://user:pass@localhost:5432/db";
};
};
customTransport = {
type = "websocket";
url = "wss://example.com/mcp";
customOption = "value";
timeout = 5000;
};
};
};
nmt.script = ''
normalizedWrapper=$(normalizeStorePaths home-path/bin/claude)
assertFileContent $normalizedWrapper ${./expected-mcp-wrapper}
'';
}