From director-mode-lite
Generates bash hook scripts and settings.json configs for Claude Code events like PreToolUse, PostToolUse, SessionStart from user requirements; handles chmod +x and validation via /hooks-check.
npx claudepluginhub claude-world/director-mode-liteThis skill uses the workspace's default tool permissions.
Generate a hook script and configuration based on requirements.
Guides creation of Claude Code plugin hooks with prompt-based and bash command types for PreToolUse, PostToolUse, Stop, and other events. Covers plugin hooks.json and settings.json formats.
Creates Bash hook scripts with error handling for Claude Code events like SessionStart and PreToolUse, registers them in settings.json with matcher syntax, sets permissions, and provides restart/test instructions.
Guides development of event-driven hooks for Claude Code plugins using prompt-based and command-based configurations in hooks.json for events like PreToolUse, PostToolUse, Stop, and SessionStart to validate tools and automate workflows.
Share bugs, ideas, or general feedback.
Generate a hook script and configuration based on requirements.
Usage: /hook-template [hook-type] [purpose]
| Type | When it Runs | Use Case |
|---|---|---|
PreToolUse | Before a tool runs | Block, validate, add context |
PostToolUse | After a tool completes | Log, notify, react |
UserPromptSubmit | User submits a prompt | Context injection, validation |
Stop | Main agent stopping | Completeness check, continue loops |
SubagentStop | Subagent finishes | Task validation |
SessionStart | Session begins | Context loading, env setup |
SessionEnd | Session ends | Cleanup, logging |
PreCompact | Before context compaction | Preserve critical context |
PostCompact | After compaction completes | Context recovery |
Notification | User is notified | External alerts (Slack, etc.) |
Elicitation | MCP server requests input | Override elicitation |
ElicitationResult | Elicitation result available | Post-process |
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
type | String | Yes | - | "command" or "prompt" |
command | String | If type=command | - | Shell command to execute |
prompt | String | If type=prompt | - | Natural language prompt for LLM |
timeout | Integer | No | 60s (command), 30s (prompt) | Seconds |
once | Boolean | No | false | Run hook only once per session |
All hooks receive JSON on stdin with these fields:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.txt",
"cwd": "/current/working/dir",
"permission_mode": "ask",
"hook_event_name": "PreToolUse",
"tool_name": "Write",
"tool_input": { "file_path": "/path/to/file" }
}
Gather Requirements
*)Generate Script at .claude/hooks/[name].sh
Update settings.json with hook config
Make Executable: chmod +x
Validate with /hooks-check
#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
# Block edits to specific files
if [[ "$FILE" == *"package-lock.json"* ]]; then
echo "BLOCKED: Do not edit lockfiles directly" >&2
exit 2
fi
exit 0 # Allow (no output needed)
#!/bin/bash
cat > /dev/null # Consume stdin
INFO="This file requires careful review"
jq -n --arg ctx "$INFO" '{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"additionalContext": $ctx
}
}'
exit 0
#!/bin/bash
INPUT=$(cat)
# Process and log... (no stdout needed)
exit 0
#!/bin/bash
CHECKPOINT=".auto-loop/checkpoint.json"
if [[ ! -f "$CHECKPOINT" ]]; then
exit 0 # Allow stop
fi
# Block stop to continue loop
jq -n --arg reason "Continuing iteration" \
'{"decision": "block", "reason": $reason}'
exit 0
#!/bin/bash
cat > /dev/null
echo "Loading project context..." >&2
exit 0
Instead of a bash script, use type: "prompt" in settings.json:
{
"hooks": {
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "Review the work done. Return 'approve' if complete, or 'block' with reason.",
"timeout": 30
}
]
}
]
}
}
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/validate.sh",
"timeout": 60
}
]
}
],
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/load-context.sh",
"once": true
}
]
}
]
}
}
/hook-template PreToolUse "block edits to package-lock.json"
Creates:
- .claude/hooks/protect-lockfile.sh
- Updates .claude/settings.json