{
  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"
  '';
}
