Files
iomgaa 6bdb802f01 chore: track claude skills, tools, templates, reference code and research-wiki
- Add all claude skills (brainstorming, commit, debugging, TDD, etc.)
- Add claude hooks (pre-commit-guard, post-edit-quality)
- Add research templates (experiment plan, research brief, etc.)
- Add claude tools (arxiv/semantic_scholar/openalex fetch, wiki, exa)
- Add TRM4 reference implementation as algorithm fidelity baseline
- Add research-wiki content (plans, index, graph, query_pack)
- Update .gitignore to exclude .graphify_version runtime state
2026-07-06 20:59:03 -04:00

84 lines
2.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================
# post-edit-quality.sh
# Claude Code PostToolUse hook — 每次编辑 .py 文件后自动检查
#
# 触发时机:Claude 每次执行 Write/Edit 后
# 作用:对被修改的文件执行复杂度和风格检查
# 退出码:0 = 通过,非0 = 报告问题(非阻塞,Claude 会看到反馈)
#
# 配置方法:在 .claude/settings.local.json 中注册:
# "hooks": {
# "PostToolUse": [
# { "matcher": "Write|Edit", "command": "bash scripts/hooks/post-edit-quality.sh" }
# ]
# }
# ============================================================
set -euo pipefail
# <填写: 项目 Conda 环境路径>
# PROJ_ENV="/home/<user>/miniconda3/envs/<env-name>/bin"
# [[ -d "$PROJ_ENV" ]] && export PATH="$PROJ_ENV:$PATH"
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
# 只检查 .py 文件
if [[ ! "$FILE_PATH" == *.py ]]; then
exit 0
fi
# 只检查存在的文件
if [[ ! -f "$FILE_PATH" ]]; then
exit 0
fi
ERRORS=""
WARNINGS=""
# ── 1. Ruff 格式 + lint 检查 ──
if command -v ruff &> /dev/null; then
RUFF_OUTPUT=$(ruff check "$FILE_PATH" 2>&1 || true)
if [[ -n "$RUFF_OUTPUT" ]]; then
ERRORS+="[ruff] 风格/lint 问题:\n$RUFF_OUTPUT\n\n"
fi
fi
# ── 2. Radon 圈复杂度(只报告 C 级及以下) ──
if command -v radon &> /dev/null; then
RADON_OUTPUT=$(radon cc "$FILE_PATH" -n C -s 2>&1 || true)
if echo "$RADON_OUTPUT" | grep -qE '^\s+[FMC]\s'; then
ERRORS+="[radon] 圈复杂度过高(≥C):\n$RADON_OUTPUT\n\n"
fi
fi
# ── 3. 文件行数检查(warning,不阻塞)──
LINE_COUNT=$(wc -l < "$FILE_PATH")
if [[ "$LINE_COUNT" -gt 200 ]]; then
WARNINGS+="[行数] $FILE_PATH${LINE_COUNT} 行,超过 200 行建议上限。\n\n"
fi
# ── 4. 禁止裸 except ──
if grep -nE '^\s*except\s*:\s*$|^\s*except\s+Exception\s*:\s*pass' "$FILE_PATH" 2>/dev/null; then
ERRORS+="[安全] 检测到裸 except 或 except Exception: pass,请捕获具体异常类型。\n\n"
fi
# ── 5. 禁止硬编码敏感信息 ──
if grep -nEi "(api_key|secret|password|token)\s*=\s*[\"'][^\"']+[\"']" "$FILE_PATH" 2>/dev/null; then
ERRORS+="[安全] 疑似硬编码敏感信息,请使用环境变量或 .env 文件。\n\n"
fi
# ── 输出结果 ──
if [[ -n "$WARNINGS" ]]; then
echo -e "⚠️ Warnings$FILE_PATH,不阻塞):\n" >&2
echo -e "$WARNINGS" >&2
fi
if [[ -n "$ERRORS" ]]; then
echo -e "❌ 代码质量检查发现问题($FILE_PATH):\n" >&2
echo -e "$ERRORS" >&2
exit 1
fi
exit 0