#!/usr/bin/env bash # Stop hook: runs quick quality checks and outputs JSON result. # 轻量检查(<15s),不编译后端 — 重型检查留给 pre-push 和 CI。 # 残留扫描由 check-completeness.sh(PostToolUse)按文件处理,此处不重复。 # Outputs diagnostic info to stderr, final JSON status to stdout. set -euo pipefail cd "${AGENT_PROJECT_DIR:-$(pwd)}" # Suppress during brainstorming / exploratory sessions if [ -f ".agents/.suppress-hooks" ]; then echo '{"status":"ok","mode":"suppressed"}' exit 0 fi HAS_ERRORS=0 # All diagnostics go to stderr { echo '=== [STOP HOOK QUALITY GATE] ===' # ---- 1/2: 变更文件残留扫描(未完成标记 + 调试遗留)---- echo '[1/2] 变更文件残留扫描...' CHANGED=$( { git diff --name-only HEAD 2>/dev/null; git diff --cached --name-only 2>/dev/null; } | sort -u ) LEFTOVERS="" while IFS= read -r f; do [ -z "$f" ] && continue [ -f "$f" ] || continue case "$f" in gym-manage-web/src/*|gym-manage-uniapp/**|gym-manage-coach-uniapp/**|*.java|*.ts|*.tsx|*.js|*.vue) if grep -nE '\.only\(|\.skip\(' "$f" 2>/dev/null | grep -qE '\.(only|skip)\('; then LEFTOVERS="${LEFTOVERS} [LEFTOVER] ${f}: .only()/.skip() 残留\n" fi if grep -nE 'console\.log' "$f" 2>/dev/null | grep -qv 'console\.log(`' 2>/dev/null; then LEFTOVERS="${LEFTOVERS} [LEFTOVER] ${f}: console.log 残留\n" fi ;; esac done <<< "$CHANGED" if [ -n "$LEFTOVERS" ]; then printf '%b' "$LEFTOVERS" echo " ⚠️ 存在调试/测试残留(未阻断,提交前请清理)" else echo ' 残留扫描: PASS' fi # ---- 2/2: 未提交任务状态检查 ---- echo '[2/2] 任务状态检查...' if [ -d ".pi/todos" ]; then OPEN=$(ls .pi/todos/*.md 2>/dev/null | wc -l | tr -d ' ') echo " 打开的任务: ${OPEN}(如需关闭请使用 todo 工具或手动更新)" else echo ' 任务目录: 不存在' fi # ---- Summary ---- if [ "$HAS_ERRORS" -eq 0 ]; then echo '=== [STOP HOOK: ALL PASS] ===' else echo '=== [STOP HOOK: ERRORS FOUND] ===' fi } >&2 # Output final status as JSON if [ "$HAS_ERRORS" -eq 0 ]; then echo '{"status":"ok"}' else echo '{"status":"error"}' fi