Skip to main content
Glama

MCP Memory Service

resolve_threads.sh6.89 kB
#!/bin/bash # scripts/pr/resolve_threads.sh - Smart PR review thread resolution # # Automatically resolves review threads when the commented code has been modified. # Uses GitHub GraphQL API to resolve threads (REST API cannot do this). # # Usage: bash scripts/pr/resolve_threads.sh <PR_NUMBER> [COMMIT_SHA] [--auto] # Example: bash scripts/pr/resolve_threads.sh 212 HEAD --auto # # Modes: # --auto: Automatically resolve threads without confirmation # (default): Prompt for confirmation before resolving each thread set -e # Get script directory for sourcing helpers SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Source GraphQL helpers if [ -f "$SCRIPT_DIR/lib/graphql_helpers.sh" ]; then source "$SCRIPT_DIR/lib/graphql_helpers.sh" else echo "Error: GraphQL helpers not found at $SCRIPT_DIR/lib/graphql_helpers.sh" exit 1 fi # Parse arguments PR_NUMBER=$1 COMMIT_SHA=${2:-HEAD} AUTO_MODE=false if [ -z "$PR_NUMBER" ]; then echo "Usage: $0 <PR_NUMBER> [COMMIT_SHA] [--auto]" echo "Example: $0 212 HEAD --auto" exit 1 fi # Check for --auto flag if [ "$2" = "--auto" ] || [ "$3" = "--auto" ]; then AUTO_MODE=true fi # Verify gh CLI supports GraphQL if ! check_graphql_support; then exit 1 fi echo "========================================" echo " Smart PR Review Thread Resolution" echo "========================================" echo "PR Number: #$PR_NUMBER" echo "Commit: $COMMIT_SHA" echo "Mode: $([ "$AUTO_MODE" = true ] && echo "Automatic" || echo "Interactive")" echo "" # Get all review threads echo "Fetching review threads..." threads_json=$(get_review_threads "$PR_NUMBER") # Check if there are any threads total_threads=$(echo "$threads_json" | jq '.data.repository.pullRequest.reviewThreads.nodes | length') if [ "$total_threads" -eq 0 ]; then echo "✅ No review threads found for PR #$PR_NUMBER" exit 0 fi # Count unresolved threads unresolved_count=$(echo "$threads_json" | jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)] | length') echo "Total threads: $total_threads" echo "Unresolved threads: $unresolved_count" echo "" if [ "$unresolved_count" -eq 0 ]; then echo "✅ All review threads are already resolved!" exit 0 fi # Get files modified in the commit echo "Analyzing commit $COMMIT_SHA..." modified_files=$(get_modified_files "$COMMIT_SHA") if [ -z "$modified_files" ]; then echo "⚠️ No files modified in commit $COMMIT_SHA" echo "Cannot determine which threads to resolve." exit 1 fi echo "Modified files:" echo "$modified_files" | sed 's/^/ - /' echo "" # Process each unresolved thread resolved_count=0 skipped_count=0 failed_count=0 echo "Processing unresolved threads..." echo "========================================" echo "$threads_json" | jq -r '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | @json' | while IFS= read -r thread_json; do thread_id=$(echo "$thread_json" | jq -r '.id') path=$(echo "$thread_json" | jq -r '.path // "unknown"') line=$(echo "$thread_json" | jq -r '.line // 0') is_outdated=$(echo "$thread_json" | jq -r '.isOutdated') comment_body=$(echo "$thread_json" | jq -r '.comments.nodes[0].body // "No comment"' | head -c 100) echo "" echo "Thread: $thread_id" echo " File: $path:$line" echo " Outdated: $is_outdated" echo " Comment: ${comment_body}..." # Determine if we should resolve this thread should_resolve=false resolution_reason="" # Check if file was modified in the commit if echo "$modified_files" | grep -q "^${path}$"; then # File was modified - check if the specific line was changed if was_line_modified "$path" "$line" "$COMMIT_SHA"; then should_resolve=true resolution_reason="Line $line in $path was modified in commit $(git rev-parse --short "$COMMIT_SHA")" else resolution_reason="File modified but line $line unchanged" fi elif [ "$is_outdated" = "true" ]; then # Thread is marked as outdated by GitHub should_resolve=true resolution_reason="Thread marked as outdated by GitHub (code changed in subsequent commits)" else resolution_reason="File not modified in this commit" fi echo " Decision: $resolution_reason" if [ "$should_resolve" = true ]; then # Resolve the thread if [ "$AUTO_MODE" = true ]; then echo " Action: Auto-resolving..." # Add explanatory comment and resolve comment_text="✅ Resolved: $resolution_reason Verified by automated thread resolution script." if resolve_review_thread "$thread_id" "$comment_text" 2>/dev/null; then echo " ✅ Resolved successfully" resolved_count=$((resolved_count + 1)) else echo " ❌ Failed to resolve" failed_count=$((failed_count + 1)) fi else # Interactive mode - ask for confirmation read -p " Resolve this thread? (y/N): " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then # Optionally ask for custom comment read -p " Add custom comment? (leave empty for auto): " custom_comment if [ -n "$custom_comment" ]; then comment_text="✅ $custom_comment" else comment_text="✅ Resolved: $resolution_reason" fi if resolve_review_thread "$thread_id" "$comment_text" 2>/dev/null; then echo " ✅ Resolved successfully" resolved_count=$((resolved_count + 1)) else echo " ❌ Failed to resolve" failed_count=$((failed_count + 1)) fi else echo " ⏭️ Skipped" skipped_count=$((skipped_count + 1)) fi fi else echo " ⏭️ Skipped (no changes detected)" skipped_count=$((skipped_count + 1)) fi done echo "" echo "========================================" echo " Resolution Summary" echo "========================================" echo "Resolved: $resolved_count" echo "Skipped: $skipped_count" echo "Failed: $failed_count" echo "" # Get updated thread stats echo "Fetching updated thread status..." updated_stats=$(get_thread_stats "$PR_NUMBER") echo "Final Thread Status:" echo "$updated_stats" | jq -r 'to_entries | .[] | " \(.key | ascii_upcase): \(.value)"' echo "" # Exit with success if we resolved any threads or if there were none to resolve if [ "$resolved_count" -gt 0 ] || [ "$unresolved_count" -eq 0 ]; then echo "✅ Thread resolution complete!" exit 0 else echo "⚠️ No threads were resolved" exit 0 fi

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/doobidoo/mcp-memory-service'

If you have feedback or need assistance with the MCP directory API, please join our Discord server