Skip to main content

check-before-commit

Scan staged git changes for sensitive information before committing. Checks for API keys, credentials, infrastructure details, PII, and sensitive config files. Behavior adapts to repo visibility: blocks on public repos, warns on private repos. Supports project-level allowlist via .claude/allowlist.json. Use when: committing code, before commit, check sensitive info, pre-commit check, 扫描泄露, 检查敏感信息, commit 前检查.

来源信息

仓库
JamesShi96/safe-push
最近来源活动
2026年4月25日 06:55
检测到的 SKILL.md 语言
英语
星标
12
分支
2

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
check-before-commit
description
Scan staged git changes for sensitive information before committing. Checks for API keys, credentials, infrastructure details, PII, and sensitive config files. Behavior adapts to repo visibility: blocks on public repos, warns on private repos. Supports project-level allowlist via .claude/allowlist.json. Use when: committing code, before commit, check sensitive info, pre-commit check, 扫描泄露, 检查敏感信息, commit 前检查.
# Check Before Commit Pre-commit sensitive information scanner. Adapts behavior based on repo visibility. ## Trigger - Automatically before `commit-commands:commit` - Manual: `/check-before-commit` ## Workflow ### Step 1: Detect repo visibility Run: ```bash gh repo view --json visibility --jq .visibility 2>/dev/null ``` - If returns `PUBLIC` → strict mode (block on findings) - If returns `PRIVATE` or `INTERNAL` → warn mode (report but don't block) - If fails → ask user: "Can't detect repo visibility. Is this a public or private repo?" ### Step 2: Get staged changes Run: ```bash git diff --cached ``` If no staged changes, report "No staged changes to scan" and exit. ### Step 3: Load allowlist (optional) Check for `.claude/allowlist.json` in project root. If exists, load the `allowed` array. Items in the allowlist are skipped during scanning. ### Step 4: Scan staged changes #### Layer 1: Regex scan (deterministic) Scan the diff output for these patterns: **Secrets & credentials:** ``` sk-(live|test|proj)-[a-zA-Z0-9]{20,} AKIA[0-9A-Z]{16} ghp_[a-zA-Z0-9]{36} gho_[a-zA-Z0-9]{36} xox[bpras]-[a-zA-Z0-9-]{10,} -----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY----- -----BEGIN PGP (PRIVATE KEY BLOCK|SIGNATURE)----- ``` **Infrastructure:** ``` # Private IPs 10\.\d{1,3}\.\d{1,3}\.\d{1,3} 172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3} 192\.168\.\d{1,3}\.\d{1,3} # Local paths (non-generic) /Users/[^/\s]+/[^\s]*(?!\.(git|npm|cache)) /C/Users/[^/\s]+/ /home/[^/\s]+/ # Database connection strings (postgres|mysql|mongodb|redis)://[^\s]+:[^\s]+@ ``` **Sensitive config files (check staged filenames):** ``` .env .env.* *.pem *.key *.p12 *.pfx .npmrc .netrc .ssh/ credentials service-account*.json ``` For each regex match: 1. Check if the matched value is in the allowlist → skip if yes 2. Otherwise record as finding #### Layer 2: Semantic scan (Claude judgment) Review the diff content for PII that regex can't reliably catch: - Phone numbers (especially Chinese mobile: 1[3-9]\d{9}) - National ID numbers (身份证号) - Real personal names in comments or config (not variable names or git authors) - Personal email addresses in non-git-config context Use context to distinguish: - `var userName = "test"` → OK, variable value - `// Contact 张三 at 13800138000` → finding, PII in comment - `sk-test-1234` in test fixture → check allowlist, suggest adding if not present ### Step 5: Report findings **No findings:** Output: "No sensitive information detected. Safe to commit." → Allow commit to proceed. **Findings + PUBLIC repo (strict mode):** Block the commit. Output each finding with: - File and line - Category (secret / infrastructure / PII / config file) - The matched content (partially masked for secrets) - Suggested action (remove / add to allowlist / use env variable) Wait for user to fix or explicitly override. **Findings + PRIVATE repo (warn mode):** List the findings as a warning. Output same details but don't block. User can proceed or choose to fix. ## Allowlist Management When a finding is a false positive, suggest: > "This appears to be a test/example value. Add to `.claude/allowlist.json` to skip in future scans?" Format of `.claude/allowlist.json`: ```json { "allowed": [ "sk-test-xxx", "example@company.com", "10.0.0.1" ] } ``` If the file doesn't exist, offer to create it when the first false positive is found. ## Integration with commit-commands:commit When triggered as part of the commit workflow: 1. Run this scan first 2. If scan blocks (public repo + findings) → stop, don't commit 3. If scan passes → proceed to normal commit flow
在 GitHub 查看