| name | hf.scan-secrets-before-commit |
| description | hf.scan-secrets-before-commit |
hf.scan-secrets-before-commit
#!/bin/bash
set -euo pipefail
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
CWD=$(echo "$INPUT" | jq -r '.cwd // empty')
if ! echo "$COMMAND" | grep -qE '(^|\s|&&\s*|;\s*)git commit'; then
exit 0
fi
cd "$CWD"
STAGED_FILES=$(git diff --cached --name-only 2>/dev/null || true)
if [ -z "$STAGED_FILES" ]; then
exit 0
fi
ADDED_LINES=$(git diff --cached -U0 2>/dev/null | grep -E '^\+[^+]' || true)
if [ -z "$ADDED_LINES" ]; then
exit 0
fi
PATTERNS=(
'xoxb-[0-9]'
'xapp-[0-9]'
'xoxp-[0-9]'
'sk-[a-zA-Z0-9]{20,}'
'AKIA[0-9A-Z]{16}'
'ghp_[a-zA-Z0-9]{36}'
'ghs_[a-zA-Z0-9]{36}'
'glpat-[a-zA-Z0-9\-]{20}'
'AIza[0-9A-Za-z\-_]{35}'
)
COMBINED_PATTERN=$(printf '%s|' "${PATTERNS[@]}")
COMBINED_PATTERN="${COMBINED_PATTERN%|}"
MATCHES=$(echo "$ADDED_LINES" | grep -oEn "$COMBINED_PATTERN" 2>/dev/null || true)
if [ -n "$MATCHES" ]; then
echo "BLOCKED: Potential secrets detected in staged changes:" >&2
echo "" >&2
while IFS= read -r file; do
[ -f "$file" ] || continue
FILE_DIFF=$(git diff --cached -U0 -- "$file" 2>/dev/null | grep -E '^\+[^+]' || true)
if echo "$FILE_DIFF" | grep -qE "$COMBINED_PATTERN" 2>/dev/null; then
echo " - $file" >&2
fi
done <<< "$STAGED_FILES"
echo "" >&2
echo "Remove secrets and use environment variables instead." >&2
echo "If this is a false positive (e.g., test fixtures), ask the user to confirm." >&2
exit 2
fi