changelog-observer
Track development session events in a daily markdown changelog, including file changes, test results, and key decisions.
Generate hook script from template. Use when adding a new hook, wiring a PreToolUse/PostToolUse/Stop/Notification hook, or scaffolding hook config for settings.json.
Claude Code
$ npx -y skills add claude-world/director-mode-lite --skill hook-template --agent claude-code
Codex
$ npx skills add claude-world/director-mode-lite --skill hook-template -a codex -y
Cursor
$ npx skills add claude-world/director-mode-lite --skill hook-template -a cursor -y
Gemini CLI
$ npx skills add claude-world/director-mode-lite --skill hook-template -a gemini-cli -y
GitHub Copilot
$ npx skills add claude-world/director-mode-lite --skill hook-template -a github-copilot -y
OpenCode
$ npx skills add claude-world/director-mode-lite --skill hook-template -a opencode -y
Windsurf
$ npx skills add claude-world/director-mode-lite --skill hook-template -a windsurf -y
name: hook-template description: Generate hook script from template. Use when adding a new hook, wiring a PreToolUse/PostToolUse/Stop/Notification hook, or scaffolding hook config for settings.json. user-invocable: true
Generate a hook script and configuration based on requirements.
**Usage**: `/hook-template [hook-event] [purpose]`
---
Claude Code defines **33 hook events**. The common ones, grouped:
| Group | Events | |-------|--------| | Lifecycle | `SessionStart`, `SessionEnd`, `Setup` | | Prompt | `UserPromptSubmit`, `UserPromptExpansion` | | Tool | `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch` | | Permission | `PermissionRequest`, `PermissionDenied` | | Subagent | `SubagentStart`, `SubagentStop` | | Stop | `Stop`, `StopFailure` | | Task | `TaskCreated`, `TaskCompleted` | | Compaction | `PreCompact`, `PostCompact` | | Notification | `Notification`, `MessageDisplay` | | MCP elicitation | `Elicitation`, `ElicitationResult` | | Model | `PreModelSwitch`, `PostModelSwitch` | | Environment | `ConfigChange`, `CwdChanged`, `DirectoryAdded`, `FileChanged`, `InstructionsLoaded`, `WorktreeCreate`, `WorktreeRemove`, `TeammateIdle` |
That is all 33 events. See the official Claude Code hooks docs for the full list and each event's payload. The templates below cover the practical 90%.
---
| Field | Type | Required | Default | Notes | |-------|------|----------|---------|-------| | `type` | String | Yes | - | `command`, `prompt`, `http`, `mcp_tool`, or `agent` | | `command` | String | If type=command | - | Shell command, or the executable when `args` is set | | `args` | Array | No | - | Exec form: no shell, each element is one argument | | `prompt` | String | If type=prompt/agent | - | Prompt for the model; `$ARGUMENTS` receives the input JSON | | `matcher` | String | No | all | Exact names (`Edit\|Write`), `*`, or a regex; ignored by events without matcher support | | `timeout` | Integer | No | 600 (command), 30 (prompt), 60 (agent) | Seconds, per hook | | `if` | String | No | - | Permission-rule filter such as `Bash(git *)`; tool events only | | `onFailure` | String | No | continue | `block` makes a hook that cannot run or times out block the action (v2.1.295+) | | `async` | Boolean | No | false | Command hooks only: run in the background, cannot block | | `once` | Boolean | No | false | Remove after the first successful run; honored only in skill frontmatter | | `statusMessage` | String | No | - | Message shown while the hook runs |
`type: command` (default) and `type: prompt` (LLM-evaluated) cover most needs. The `http`, `mcp_tool`, and `agent` entry types also exist for calling an endpoint, invoking an MCP tool, or dispatching a subagent.
---
All hooks receive JSON on stdin. The event name is in `hook_event_name`:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.jsonl",
"cwd": "/current/working/dir",
"permission_mode": "default",
"hook_event_name": "PreToolUse",
"tool_name": "Write",
"tool_input": { "file_path": "/path/to/file" }
}`deny`, `ask`, or `defer` (`-p` only). Exit code 2 with a stderr message is the shorthand for `deny`. The legacy top-level `{"decision": "approve" | "block"}` is still accepted.
`interrupted`, `isImage`).
`{"ok": false, "reason": "..."}`.
`{"decision": "block", "reason": "<next prompt>"}` — the key is `reason`.
---
1. **Gather Requirements**
2. **Generate Script** at `.claude/hooks/[name].sh`
3. **Update settings.json** with hook config
4. **Make Executable**: `chmod +x`
5. **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 # exit 2 = deny for PreToolUse
fi
exit 0 # Allow (no output needed)#!/bin/bash
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if [[ "$FILE" == *"package-lock.json"* ]]; then
jq -n '{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Do not edit lockfiles directly"
}
}'
exit 0
fi
# permissionDecision may be "allow", "deny", or "ask"
exit 0#!/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 — key is "reason", used as the next prompt
jq -n --arg reason "Continuing iteration" \
'{"decision": "block", "reason": $reason}'
exit 0#!/bin/bash cat > /dev/null # Plain stdout from SessionStart is added to Claude's context echo "Project context: run the test suite before committing." exit 0
Instead of a bas
Use Claude Code like a Director, not a Programmer. MIT toolkit with Auto-Loop, guided setup, 27 commands, 14 agents, and 32 skills.
Track development session events in a daily markdown changelog, including file changes, test results, and key decisions.
Validate custom agent file format and structure. Use after creating or editing an agent, before committing agent changes, or when…
Generate custom agent from template. Use when creating a new subagent from scratch, or scaffolding an agent file with correct…
List all available agents (core, expert, self-evolving). Use when the user asks what agents are available or runs /agents.
TDD-based autonomous development loop with checkpoint recovery and observability changelog
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.