#!/usr/bin/env bash # Issue 关闭门禁检查 — 扫描已关闭的 Issue 文档是否存在未勾选子项 # 用法: # bash scripts/check-issue-checklist.sh # 检查所有 Issue # bash scripts/check-issue-checklist.sh --quiet # 静默模式(仅退出码) # bash scripts/check-issue-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/ 下的 Issue 文档 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 # 扫描已关闭的文档(包含 "status: closed" 或 "已关闭" 标记) while IFS= read -r plan_file; do [ -z "$plan_file" ] && continue basename=$(basename "$plan_file" .md) # 检查是否包含 closed 标记 if grep -qi "status.*closed\|已关闭\|已完成" "$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 " Issue 门禁: PASS" echo '{"status":"ok"}' exit 0 else [ "$QUIET" -eq 0 ] && echo " Issue 门禁: FAIL" for v in "${VIOLATIONS[@]}"; do echo " - $v" done echo '{"status":"error"}' exit 1 fi