From da12d1fc5bb446953603e403c724437d2e6860f1 Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Wed, 3 Dec 2025 08:22:04 +1000 Subject: [PATCH] feat: add detailed error logging to keyword sync workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit API Changes: - Return errorMessages array in sync response (first 5 errors) Workflow Changes: - Display error messages in GitHub Actions logs with formatting - Include error details in Discord notifications (first 3 errors) - Shows errors in both console output and Discord embed Example output: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⚠️ SYNC ERRORS (4 total): ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Failed to process pkg1: Invalid tpmjs field • Failed to process pkg2: Network timeout ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/sync-keyword.yml | 101 ++++++++++++++------- apps/web/src/app/api/sync/keyword/route.ts | 1 + 2 files changed, 70 insertions(+), 32 deletions(-) diff --git a/.github/workflows/sync-keyword.yml b/.github/workflows/sync-keyword.yml index aa51509..9fea0c6 100644 --- a/.github/workflows/sync-keyword.yml +++ b/.github/workflows/sync-keyword.yml @@ -28,6 +28,19 @@ jobs: packagesFound=$(echo "$response" | jq -r '.data.packagesFound') durationMs=$(echo "$response" | jq -r '.data.durationMs') + # Extract and display error messages + errorMessages=$(echo "$response" | jq -r '.data.errorMessages[]?' 2>/dev/null || echo "") + + if [ -n "$errorMessages" ]; then + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "⚠️ SYNC ERRORS ($errors total):" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "$response" | jq -r '.data.errorMessages[]?' | while IFS= read -r error; do + echo " • $error" + done + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + fi + # Set outputs for Discord notification echo "processed=$processed" >> $GITHUB_OUTPUT echo "skipped=$skipped" >> $GITHUB_OUTPUT @@ -35,6 +48,15 @@ jobs: echo "packagesFound=$packagesFound" >> $GITHUB_OUTPUT echo "durationMs=$durationMs" >> $GITHUB_OUTPUT + # Store error messages for Discord (first 3, truncated) + if [ "$errors" -gt 0 ]; then + errorSummary=$(echo "$response" | jq -r '.data.errorMessages[0:3]? | join("\n• ")' 2>/dev/null || echo "") + if [ -n "$errorSummary" ]; then + # Save to file to preserve newlines + echo "• $errorSummary" > /tmp/error_summary.txt + fi + fi + # Determine status emoji if [ "$errors" -gt 0 ]; then echo "status_emoji=⚠️" >> $GITHUB_OUTPUT @@ -50,6 +72,52 @@ jobs: # Format duration duration_sec=$(echo "scale=2; ${{ steps.sync.outputs.durationMs }} / 1000" | bc) + # Build base fields + fields='[ + { + "name": "📦 Packages Found", + "value": "${{ steps.sync.outputs.packagesFound }}", + "inline": true + }, + { + "name": "✨ Processed", + "value": "${{ steps.sync.outputs.processed }}", + "inline": true + }, + { + "name": "⏭️ Skipped", + "value": "${{ steps.sync.outputs.skipped }}", + "inline": true + }, + { + "name": "❌ Errors", + "value": "${{ steps.sync.outputs.errors }}", + "inline": true + }, + { + "name": "⏱️ Duration", + "value": "'"$duration_sec"'s", + "inline": true + }, + { + "name": "🔗 Run", + "value": "[View Logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})", + "inline": true + }' + + # Add error details if errors exist + if [ -f /tmp/error_summary.txt ] && [ ${{ steps.sync.outputs.errors }} -gt 0 ]; then + error_text=$(cat /tmp/error_summary.txt | head -c 900) + fields="$fields"', + { + "name": "🔍 Error Details", + "value": "```\n'"$error_text"'\n```", + "inline": false + }' + fi + + fields="$fields"']' + # Create Discord embed curl -X POST "${{ secrets.DISCORD_WEBHOOK }}" \ -H "Content-Type: application/json" \ @@ -57,38 +125,7 @@ jobs: "embeds": [{ "title": "${{ steps.sync.outputs.status_emoji }} NPM Keyword Search Sync", "color": ${{ steps.sync.outputs.status_color }}, - "fields": [ - { - "name": "📦 Packages Found", - "value": "${{ steps.sync.outputs.packagesFound }}", - "inline": true - }, - { - "name": "✨ Processed", - "value": "${{ steps.sync.outputs.processed }}", - "inline": true - }, - { - "name": "⏭️ Skipped", - "value": "${{ steps.sync.outputs.skipped }}", - "inline": true - }, - { - "name": "❌ Errors", - "value": "${{ steps.sync.outputs.errors }}", - "inline": true - }, - { - "name": "⏱️ Duration", - "value": "'"$duration_sec"'s", - "inline": true - }, - { - "name": "🔗 Run", - "value": "[View Logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})", - "inline": true - } - ], + "fields": '"$fields"', "timestamp": "'"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"'" }] }' diff --git a/apps/web/src/app/api/sync/keyword/route.ts b/apps/web/src/app/api/sync/keyword/route.ts index 09a64b7..1989256 100644 --- a/apps/web/src/app/api/sync/keyword/route.ts +++ b/apps/web/src/app/api/sync/keyword/route.ts @@ -178,6 +178,7 @@ export async function POST(request: NextRequest) { errors, packagesFound: searchResults.length, durationMs: Date.now() - startTime, + errorMessages: errorMessages.slice(0, 5), // Include first 5 error messages }, }); } catch (error) {