Auto-syncs stale docstrings and README when function signatures change. Detects documentation drift after refactors, parameter additions, or return type changes. Dry-run by default — proposes before writing.
87
100%
Does it follow best practices?
Impact
86%
1.59xAverage score across 17 eval scenarios
Passed
No known issues
#!/usr/bin/env bash
set -euo pipefail
INPUT="$(cat)"
if command -v python3 >/dev/null 2>&1; then
HOOK_INPUT="$INPUT" python3 - <<'PY'
import json
import os
import re
import sys
try:
data = json.loads(os.environ.get("HOOK_INPUT", ""))
except json.JSONDecodeError:
raise SystemExit(0)
tool_name = data.get("tool_name")
tool_input = data.get("tool_input") or {}
file_path = tool_input.get("file_path") or ""
if tool_name in {"Edit", "Write"} and re.search(r"\.mdx$", file_path, re.IGNORECASE):
print(
json.dumps(
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": f"MDX edits are not allowed ({file_path}).",
}
}
)
)
raise SystemExit(0)
if tool_name in {"Edit", "Write"} and re.search(r"\.md$", file_path, re.IGNORECASE):
print(
json.dumps(
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "ask",
"permissionDecisionReason": f"Markdown edits require explicit approval ({file_path}).",
}
}
)
)
raise SystemExit(0)
raise SystemExit(0)
PY
exit $?
fi
TOOL_NAME=$(printf '%s' "$INPUT" | sed -n 's/.*"tool_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)
FILE_PATH=$(printf '%s' "$INPUT" | sed -n 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)
shopt -s nocasematch
if [[ "$TOOL_NAME" =~ ^(Edit|Write)$ ]] && [[ "$FILE_PATH" =~ \.mdx$ ]]; then
printf '%s\n' "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"MDX edits are not allowed ($FILE_PATH).\"}}"
exit 0
fi
if [[ "$TOOL_NAME" =~ ^(Edit|Write)$ ]] && [[ "$FILE_PATH" =~ \.md$ ]]; then
printf '%s\n' "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"ask\",\"permissionDecisionReason\":\"Markdown edits require explicit approval ($FILE_PATH).\"}}"
exit 0
fi
shopt -u nocasematch
exit 0evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17