Files
2025-11-30 08:39:15 +08:00

180 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Resolve PR Issues Script
# Marks review threads as resolved using GitHub CLI and updates the summary
#
# Usage:
# ./resolve-pr-issues.sh --pr-dir ./ai-docs/reviews-pr-277 --from 1 --to 10
# ./resolve-pr-issues.sh --pr-dir ./ai-docs/reviews-pr-277 --all
set -euo pipefail
# Default values
PR_DIR=""
FROM=""
TO=""
ALL=false
# Use CWD if provided (for when called from skill location), otherwise use current directory
WORKING_DIR="${CWD:-$(pwd)}"
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--pr-dir)
PR_DIR="$2"
shift 2
;;
--from)
FROM="$2"
shift 2
;;
--to)
TO="$2"
shift 2
;;
--all)
ALL=true
shift
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 --pr-dir PR_DIR [--from N --to M | --all]"
exit 1
;;
esac
done
# Validate PR directory
if [[ -z "$PR_DIR" ]]; then
echo "❌ Error: --pr-dir is required"
exit 1
fi
# Resolve PR_DIR relative to WORKING_DIR if it's not absolute
if [[ ! "$PR_DIR" = /* ]]; then
PR_DIR="${WORKING_DIR}/${PR_DIR}"
fi
if [[ ! -d "$PR_DIR" ]]; then
echo "❌ Error: PR directory not found: $PR_DIR"
exit 1
fi
ISSUES_DIR="${PR_DIR}/issues"
if [[ ! -d "$ISSUES_DIR" ]]; then
echo "❌ Error: Issues directory not found: $ISSUES_DIR"
exit 1
fi
# Check if gh is installed
if ! command -v gh &> /dev/null; then
echo "❌ Error: GitHub CLI (gh) is not installed"
echo "Install from: https://cli.github.com"
exit 1
fi
echo "🔧 Resolving issues in: $PR_DIR"
echo ""
# Find unresolved issue files
if [[ "$ALL" == true ]]; then
FILES=($(find "$ISSUES_DIR" -name "issue_*_unresolved.md" -type f | sort))
else
if [[ -z "$FROM" ]] || [[ -z "$TO" ]]; then
echo "❌ Error: Either use --all or specify both --from and --to"
exit 1
fi
FILES=()
for i in $(seq "$FROM" "$TO"); do
ISSUE_NUM=$(printf "%03d" "$i")
MATCHES=($(find "$ISSUES_DIR" -name "issue_${ISSUE_NUM}_*_unresolved.md" -type f))
if [[ ${#MATCHES[@]} -gt 0 ]]; then
FILES+=("${MATCHES[@]}")
fi
done
fi
if [[ ${#FILES[@]} -eq 0 ]]; then
echo "✅ No unresolved issues found in specified range"
exit 0
fi
echo "Found ${#FILES[@]} unresolved issue(s) to process"
echo ""
RESOLVED_COUNT=0
FAILED_COUNT=0
# Process each file
for file in "${FILES[@]}"; do
filename=$(basename "$file")
# Extract thread ID from file
THREAD_ID=$(grep -m1 "^- Thread ID:" "$file" | sed 's/^- Thread ID: `\(.*\)`$/\1/' || echo "")
if [[ -z "$THREAD_ID" ]] || [[ "$THREAD_ID" == "(not found)" ]]; then
echo "⚠️ Skipping $filename - no thread ID found"
((FAILED_COUNT++))
continue
fi
echo "Processing: $filename"
echo " Thread ID: $THREAD_ID"
# Resolve the thread using GitHub CLI
if gh api graphql \
-f query='mutation($threadId: ID!) { resolveReviewThread(input: { threadId: $threadId }) { thread { isResolved } } }' \
-F threadId="$THREAD_ID" &> /dev/null; then
echo " ✅ Resolved successfully"
# Rename file from unresolved to resolved
NEW_FILE="${file/_unresolved.md/_resolved.md}"
mv "$file" "$NEW_FILE"
# Update status in file
sed -i.bak 's/- \[ \] UNRESOLVED/- [x] RESOLVED ✓/g' "$NEW_FILE"
sed -i.bak 's/UNRESOLVED/RESOLVED/g' "$NEW_FILE"
rm -f "${NEW_FILE}.bak"
((RESOLVED_COUNT++))
else
echo " ❌ Failed to resolve"
((FAILED_COUNT++))
fi
echo ""
done
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Summary:"
echo " ✅ Resolved: $RESOLVED_COUNT"
echo " ❌ Failed: $FAILED_COUNT"
echo " 📊 Total processed: ${#FILES[@]}"
echo ""
if [[ $RESOLVED_COUNT -gt 0 ]]; then
echo "🔄 Re-running PR review export to update summary..."
# Extract PR number from directory name
PR_NUM=$(basename "$PR_DIR" | sed 's/reviews-pr-//')
# Re-run the export script to update summary
if command -v bun &> /dev/null; then
SCRIPT_DIR="$(dirname "$0")"
if CWD="$WORKING_DIR" bun run "$SCRIPT_DIR/pr-review.ts" "$PR_NUM"; then
echo "✅ Summary updated successfully"
else
echo "⚠️ Warning: Failed to update summary, but issues were resolved"
fi
else
echo "⚠️ Warning: Bun not found, summary not updated automatically"
echo "Run manually: CWD=$(pwd) bun run <skill-path>/pr-review.ts $PR_NUM"
fi
fi
echo ""
echo "✅ Done!"