40 lines
1.3 KiB
Bash
40 lines
1.3 KiB
Bash
#!/bin/bash
|
|
# Claude Code PostToolUse hook: Advises running skill-test after skill file changes
|
|
# Fires when any file inside .claude/skills/ is written or edited.
|
|
#
|
|
# Exit behavior:
|
|
# exit 0 = advisory only (non-blocking)
|
|
#
|
|
# Input schema (PostToolUse for Write|Edit):
|
|
# { "tool_name": "Write", "tool_input": { "file_path": "...", "content": "..." } }
|
|
|
|
INPUT=$(cat)
|
|
|
|
# Parse file path -- use jq if available, fall back to grep
|
|
if command -v jq >/dev/null 2>&1; then
|
|
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
|
|
else
|
|
FILE_PATH=$(echo "$INPUT" | grep -oE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//')
|
|
fi
|
|
|
|
# Normalize path separators (Windows backslash to forward slash)
|
|
FILE_PATH=$(echo "$FILE_PATH" | sed 's|\\|/|g')
|
|
|
|
# Only act on files inside .claude/skills/
|
|
if ! echo "$FILE_PATH" | grep -qE '(^|/)\.claude/skills/'; then
|
|
exit 0
|
|
fi
|
|
|
|
# Extract skill name from path (.claude/skills/[skill-name]/SKILL.md)
|
|
SKILL_NAME=$(echo "$FILE_PATH" | grep -oE '\.claude/skills/[^/]+' | sed 's|\.claude/skills/||')
|
|
|
|
if [ -z "$SKILL_NAME" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
echo "=== Skill Modified: $SKILL_NAME ===" >&2
|
|
echo "Run /skill-test static $SKILL_NAME to validate structural compliance." >&2
|
|
echo "====================================" >&2
|
|
|
|
exit 0
|