#!/usr/bin/env bash # PostToolUse hook: 检查单个编辑文件中的未完成标记 # 在 Write/Edit 操作后对修改的文件运行 set -euo pipefail PROJECT_DIR="${AGENT_PROJECT_DIR:-$(pwd)}" # Suppress during brainstorming / exploratory sessions if [ -f "${PROJECT_DIR}/.trae/.suppress-hooks" ]; then exit 0 fi f="${AGENT_EDITED_FILE:-$AGENT_FILE}" if [ ! -f "$f" ]; then exit 0 fi issues=() ext="${f##*.}" basename=$(basename "$f") # ============================================================ # PART 1: Unfinished markers scan # ============================================================ if [[ "$ext" =~ ^(ts|tsx|js|jsx|vue)$ ]]; then while IFS=: read -r line_no content; do [ -z "$line_no" ] && continue trimmed=$(echo "$content" | sed 's/^[[:space:]]*//') if echo "$trimmed" | grep -qE '^\s*(TODO|FIXME|HACK|XXX):'; then issues+=(" L${line_no}: TODO/FIXME ${trimmed:0:100}") elif echo "$trimmed" | grep -qi 'not implemented' && echo "$trimmed" | grep -qi 'throw'; then issues+=(" L${line_no}: [SKELETON] ${trimmed:0:100}") elif echo "$trimmed" | grep -qE 'function [a-zA-Z_][a-zA-Z0-9_]*\s*\(\s*\)\s*\{\s*\}'; then if ! echo "$trimmed" | grep -q 'return'; then issues+=(" L${line_no}: [EMPTY FN] ${trimmed:0:100}") fi fi done < <(grep -nE 'TODO:|FIXME:|HACK:|XXX:|not implemented|function [a-zA-Z_][a-zA-Z0-9_]*\s*\(\s*\)\s*\{\s*\}' "$f" 2>/dev/null || true) fi # ============================================================ # REPORT # ============================================================ if [ ${#issues[@]} -gt 0 ]; then echo "" echo "[COMPLETENESS] $(basename "$f") 检查发现 ${#issues[@]} 个问题:" for issue in "${issues[@]:0:20}"; do echo "$issue" done if [ ${#issues[@]} -gt 20 ]; then echo " ... 及其他 $((${#issues[@]} - 20)) 处" fi echo "" fi