#!/usr/bin/env bash # Task 完成门禁检查 — 扫描已标记完成的 Task 是否存在未勾选子项 # 用法: # bash scripts/check-task-checklist.sh # 检查所有 Task # bash scripts/check-task-checklist.sh --quiet # 静默模式(仅退出码) # bash scripts/check-task-checklist.sh --help # 显示帮助 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" QUIET=0 usage() { echo "Usage: $0 [options]" echo "" echo "Options:" echo " --quiet 静默模式(仅通过退出码表示结果)" echo " --help 显示此帮助" exit 0 } while [[ $# -gt 0 ]]; do case "$1" in --quiet) QUIET=1; shift ;; --help) usage ;; *) echo "Unknown option: $1"; usage ;; esac done # 检查 docs/plans/ 下的 Task 文档 PLANS_DIR="${PROJECT_DIR}/docs/plans" HAS_ERRORS=0 VIOLATIONS=() if [ ! -d "$PLANS_DIR" ]; then [ "$QUIET" -eq 0 ] && echo " 检查: ${PLANS_DIR} 不存在,跳过" echo '{"status":"ok"}' exit 0 fi # 扫描已完成的计划文档 while IFS= read -r plan_file; do [ -z "$plan_file" ] && continue basename=$(basename "$plan_file" .md) # 检查是否包含"已完成"标记 if grep -qi "已完成\|completed" "$plan_file" 2>/dev/null; then # 检查是否有未勾选的 checklist 项 UNCHECKED=$(grep -cE '^\s*[-*]\s+\[[ ]\]' "$plan_file" 2>/dev/null || true) if [ "$UNCHECKED" -gt 0 ]; then VIOLATIONS+=("${basename}: ${UNCHECKED} 个未勾选子项") HAS_ERRORS=1 fi fi done < <(find "$PLANS_DIR" -name '*.md' -type f 2>/dev/null) if [ "$HAS_ERRORS" -eq 0 ]; then [ "$QUIET" -eq 0 ] && echo " Task 门禁: PASS" echo '{"status":"ok"}' exit 0 else [ "$QUIET" -eq 0 ] && echo " Task 门禁: FAIL" for v in "${VIOLATIONS[@]}"; do echo " - $v" done echo '{"status":"error"}' exit 1 fi