Skip to content
Back to skills

1160 Installation 1552a4ce

ASecurity

Step-by-step guide to installing and configuring Claude Code hooks.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added May 31, 2026
documentationpythongobashreactdockergitsecurity

Works with

  • claude code
  • cli

Security analysis

A93/100
  • highPerforms destructive filesystem operations

Pro scans all 2 files and shows the line behind each finding

Scanned May 31, 2026

npx -y skills add tools-only/X-Skills --skill 1160-installation_1552a4ce --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1160 Installation 1552a4ce?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1160 Installation 1552a4ce
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1160-installation-1552a4ce/badge)](https://www.skillsdirectory.com/skills/tools-only-1160-installation-1552a4ce)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
# Hook Installation Guide

Step-by-step guide to installing and configuring Claude Code hooks.

## Prerequisites

- **Claude Code CLI** installed and working
- **Python 3.9+** for Python hooks
- **Project directory** with `.claude/` folder

## Quick Install

```bash
# 1. Clone or download hooks
git clone https://github.com/DavidROliverBA/Daves-Claude-Code-Skills.git
cd Daves-Claude-Code-Skills

# 2. Copy hooks to your project
cp -r hooks/ /path/to/your-project/

# 3. Copy example configuration
cp docs/hooks/examples/minimal.json /path/to/your-project/.claude/settings.json

# 4. Test a hook
cd /path/to/your-project
echo '{}' | python3 hooks/security/secret-detection.py
echo "Exit code: 0"
```

If the test command exits 0, hooks are ready.

## Step-by-Step Installation

### 1. Choose Your Hooks

Select hooks based on your use case:

**Obsidian Vault:**
- All 12 hooks (security, quality, UX, safety, notification)
- Configuration: `examples/obsidian-vault.json`

**Python Project:**
- Security + code formatting + bash safety + notification
- Configuration: `examples/python-project.json`

**Minimal Setup:**
- Just secret detection + file protection
- Configuration: `examples/minimal.json`

### 2. Copy Hook Files

```bash
# Copy all hooks
cp -r hooks/ /path/to/your-project/

# Or copy specific categories
cp -r hooks/security/ /path/to/your-project/hooks/
cp -r hooks/quality/ /path/to/your-project/hooks/
```

**Directory structure after copying:**

```
/your-project/
├── .claude/
│   └── settings.json
├── hooks/
│   ├── security/
│   │   ├── secret-detection.py
│   │   ├── secret-file-scanner.py
│   │   └── file-protection.py
│   ├── quality/
│   │   ├── frontmatter-validator.py
│   │   ├── tag-taxonomy-enforcer.py
│   │   ├── wiki-link-checker.py
│   │   └── filename-convention-checker.py
│   ├── ux/
│   │   ├── code-formatter.py
│   │   ├── context-loader.sh
│   │   └── search-hint.sh
│   ├── safety/
│   │   └── bash-safety.py
│   └── notification/
│       └── desktop-notify.sh
└── [your project files]
```

### 3. Create/Edit settings.json

Create `.claude/settings.json` if it doesn't exist:

```bash
mkdir -p /path/to/your-project/.claude
touch /path/to/your-project/.claude/settings.json
```

Add hook configuration:

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {"type": "command", "command": "python3 hooks/security/file-protection.py"}
        ]
      }
    ]
  }
}
```

**Or copy example:**

```bash
cp docs/hooks/examples/minimal.json .claude/settings.json
```

### 4. Make Hooks Executable (Optional)

```bash
chmod +x hooks/**/*.py
```

Not required if you run with `python3 hooks/...` but makes direct execution possible.

### 5. Test Installation

Test each hook individually:

```bash
# Test file protection
echo '{
  "event": "PreToolUse",
  "tool_name": "Edit",
  "tool_input": {"file_path": "test.env"}
}' | python3 hooks/security/file-protection.py

# Should exit 2 (blocked) for .env file
echo "Exit code: 0"

# Test frontmatter validator
echo '{
  "event": "PostToolUse",
  "tool_name": "Write",
  "tool_input": {"file_path": "test.md"}
}' | python3 hooks/quality/frontmatter-validator.py

# Should exit 0 (success)
echo "Exit code: 0"
```

### 6. Verify Configuration

Validate JSON syntax:

```bash
cat .claude/settings.json | jq .
```

If `jq` not installed:

```bash
python3 -m json.tool .claude/settings.json
```

### 7. Test with Claude Code

Start a conversation and try a file edit:

```bash
claude-code
```

In the conversation:

```
> Edit test.md
```

Hooks should run automatically. Check for hook output in the response.

## Customising Hooks

### 1. Identify Customisable Sections

All hooks include `# Customise:` comments:

```python
# Customise: files to skip scanning
SKIP_PATTERNS = [
    r"\.pre-commit-config\.yaml$",
    r"secret-detection\.py$",
]
```

### 2. Edit Hook Files

Open hook in your editor:

```bash
vim hooks/security/file-protection.py
```

Modify the customisable sections:

```python
# Customise: Add your protected files
PROTECTED_PATTERNS = [
    r"\.env$",
    r".*\.key$",
    r"credentials\.json$",
    r"my-secret-file\.txt$",  # Add your pattern
]
```

### 3. Test Changes

```bash
echo '{
  "event": "PreToolUse",
  "tool_name": "Edit",
  "tool_input": {"file_path": "my-secret-file.txt"}
}' | python3 hooks/security/file-protection.py

echo "Exit code: 0"  # Should be 2 (blocked)
```

## Common Customisations

### File Protection (file-protection.py)

```python
# Add file patterns to protect
PROTECTED_PATTERNS = [
    r"\.env$",
    r".*\.key$",
    r"credentials\.json$",
    r"config\.secret\.yaml$",  # Custom pattern
]

# Add directories that are safe to edit
ALLOWED_DIRECTORIES = [
    "docs/",
    "tests/",
    "my-notes/",  # Custom directory
]
```

### Tag Taxonomy (tag-taxonomy-enforcer.py)

```python
# Customise tag hierarchies for your project
TAG_HIERARCHIES = {
    "area": ["engineering", "design", "marketing"],
    "project": ["my-app", "docs-site"],
    "technology": ["python", "react", "docker"],
}

# Add flat tags that don't need hierarchy
APPROVED_FLAT_TAGS = ["pinned", "draft", "archive"]
```

### Frontmatter Schemas (frontmatter-validator.py)

```python
# Customise note types and required fields
NOTE_SCHEMAS = {
    "BlogPost": ["type", "title", "date", "author", "tags"],
    "Recipe": ["type", "name", "ingredients", "steps"],
}
```

## Troubleshooting

### Hooks Not Running

**Symptom:** Edits work but hooks don't trigger

**Solutions:**

1. Check settings.json exists:
   ```bash
   ls -la .claude/settings.json
   ```

2. Validate JSON:
   ```bash
   cat .claude/settings.json | jq .
   ```

3. Check matcher pattern:
   ```json
   "matcher": "Edit|Write"  // Correct
   "matcher": "edit|write"  // Wrong (case sensitive)
   ```

4. Verify hook path:
   ```bash
   ls hooks/security/file-protection.py
   ```

### Permission Denied

**Symptom:** `Permission denied` when running hook

**Solutions:**

```bash
# Make hooks executable
chmod +x hooks/**/*.py

# Or use python3 explicitly in command
"command": "python3 hooks/security/file-protection.py"
```

### Hook Crashes

**Symptom:** Hook exits with error, tool continues

**Solutions:**

1. Test hook manually:
   ```bash
   echo '{}' | python3 hooks/security/file-protection.py
   ```

2. Check Python version:
   ```bash
   python3 --version  # Should be 3.9+
   ```

3. Check for syntax errors:
   ```bash
   python3 -m py_compile hooks/security/file-protection.py
   ```

### Hooks Block Everything

**Symptom:** All edits blocked unexpectedly

**Solutions:**

1. Check PROTECTED_PATTERNS in file-protection.py
2. Add debug output:
   ```python
   import sys
   sys.stderr.write(f"Checking file: {file_path}
")
   ```

3. Temporarily disable hook:
   ```json
   "hooks": []  // Empty array disables hooks
   ```

### Wrong Exit Code

**Symptom:** Hook runs but doesn't block/warn

**Solutions:**

- **PreToolUse blocking:** Must exit 2
- **PostToolUse warning:** Must exit 1
- **Success:** Exit 0

Test manually:

```bash
python3 hooks/security/file-protection.py < test-input.json
echo "Exit code: 0"
```

## Uninstalling Hooks

### Remove All Hooks

```bash
rm -rf hooks/
```

### Keep Hooks, Disable Configuration

Edit `.claude/settings.json`:

```json
{
  "hooks": {}
}
```

### Remove Specific Hook

1. Delete hook file:
   ```bash
   rm hooks/security/file-protection.py
   ```

2. Remove from settings.json:
   ```json
   "hooks": [
     // Remove this line:
     // {"type": "command", "command": "python3 hooks/security/file-protection.py"}
   ]
   ```

## Next Steps

- **Configure hooks:** Edit CUSTOMISE sections in hook files
- **Review examples:** Check `docs/hooks/examples/` for different setups
- **Read patterns:** See `docs/hooks/hook-patterns.md` for implementation patterns
- **Learn lifecycle:** Read `docs/hooks/hook-lifecycle.md` for event details

## Support

For issues or questions:

1. Check [troubleshooting](#troubleshooting) section above
2. Review [configuration.md](./configuration.md) for settings reference
3. Open issue on GitHub: [github.com/DavidROliverBA/Daves-Claude-Code-Skills](https://github.com/DavidROliverBA/Daves-Claude-Code-Skills)

Files in this skill

  • README.md877 B
  • skill.md8.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.