From 18f78fc3d337effcd13fac4123a25ebe3174f078 Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Mon, 10 Aug 2026 07:59:17 +0530 Subject: [PATCH] fix: Format and Post Plugin Live Check Results --- .github/workflows/plugin-live-check.yml | 66 +++++++++++++++++++++---- scripts/live-check-plugin.js | 45 ++++++++++++----- 2 files changed, 91 insertions(+), 20 deletions(-) diff --git a/.github/workflows/plugin-live-check.yml b/.github/workflows/plugin-live-check.yml index 2dcb352..1aa49f0 100644 --- a/.github/workflows/plugin-live-check.yml +++ b/.github/workflows/plugin-live-check.yml @@ -1,7 +1,7 @@ name: Plugin Live Check on: - pull_request: + pull_request_target: branches: [master] workflow_dispatch: inputs: @@ -11,27 +11,39 @@ on: type: string concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true +permissions: {} + jobs: live-check: name: Plugin Live Check runs-on: ubuntu-latest + outputs: + should_comment: ${{ steps.comment-artifact.outputs.should_comment }} + permissions: contents: read - pull-requests: write steps: + - name: Checkout PR Merge Commit + if: github.event_name == 'pull_request_target' + uses: actions/checkout@v4 + with: + ref: refs/pull/${{ github.event.pull_request.number }}/merge + fetch-depth: 0 + - name: Checkout Repository + if: github.event_name == 'workflow_dispatch' uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get Changed Plugin Files id: changed-files - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request_target' uses: tj-actions/changed-files@v45 with: files: | @@ -55,7 +67,9 @@ jobs: uses: actions/setup-node@v4 with: node-version: '20' - cache: 'npm' + # Avoid writing contributor-controlled caches in the base branch's + # cache scope when running under pull_request_target. + cache: ${{ github.event_name == 'workflow_dispatch' && 'npm' || '' }} - name: Install Dependencies if: steps.targets.outputs.files != '' @@ -73,15 +87,49 @@ jobs: echo "exit_code=$?" >> "$GITHUB_OUTPUT" cat live-check-output.txt - - name: Post PR Comment - if: github.event_name == 'pull_request' && steps.changed-files.outputs.any_changed == 'true' - uses: marocchino/sticky-pull-request-comment@v2 + - name: Prepare PR Comment Artifact + id: comment-artifact + if: always() && github.event_name == 'pull_request_target' + run: | + if [ "${{ steps.changed-files.outputs.any_changed }}" = 'true' ] && [ -f live-check-output.txt ]; then + echo 'should_comment=true' >> "$GITHUB_OUTPUT" + else + echo 'should_comment=false' >> "$GITHUB_OUTPUT" + fi + + - name: Upload PR Comment Artifact + if: always() && steps.comment-artifact.outputs.should_comment == 'true' + uses: actions/upload-artifact@v4 with: - header: plugin-live-check + name: plugin-live-check-comment path: live-check-output.txt + retention-days: 1 - name: Fail On Real Errors if: steps.targets.outputs.files != '' && steps.live-check.outputs.exit_code != '0' run: | echo "Live check reported at least one FAIL — see the job log or PR comment above." exit 1 + + comment: + name: Post PR Comment + needs: live-check + if: always() && github.event_name == 'pull_request_target' && needs.live-check.outputs.should_comment == 'true' + runs-on: ubuntu-latest + + permissions: + actions: read + pull-requests: write + + steps: + - name: Download PR Comment Artifact + uses: actions/download-artifact@v4 + with: + name: plugin-live-check-comment + + - name: Post PR Comment + uses: marocchino/sticky-pull-request-comment@v3 + with: + number: ${{ github.event.pull_request.number }} + header: plugin-live-check + path: live-check-output.txt diff --git a/scripts/live-check-plugin.js b/scripts/live-check-plugin.js index 5539916..8f09779 100644 --- a/scripts/live-check-plugin.js +++ b/scripts/live-check-plugin.js @@ -84,6 +84,7 @@ async function bundlePlugin(pluginPath) { format: 'cjs', target: 'node22', write: false, + logLevel: 'silent', alias: { '@libs': path.join(REPO_ROOT, 'src/libs'), '@': path.join(REPO_ROOT, 'src'), @@ -317,35 +318,57 @@ async function checkPlugin(pluginPath) { return result; } +function escapeMarkdown(value) { + return String(value) + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('`', '`') + .replaceAll('|', '\\|') + .replace(/\r?\n/g, '
'); +} + function printReport(results) { let hasFail = false; + let hasInconclusive = false; + + console.log('## Plugin Live Check'); + for (const result of results) { - console.log('\n' + '='.repeat(80)); - console.log(result.pluginPath); - console.log('='.repeat(80)); + console.log(`\n### \`${escapeMarkdown(result.pluginPath)}\``); + console.log('\n| Check | Result | Details |'); + console.log('| --- | --- | --- |'); if (result.loadError) { hasFail = true; - console.log(` BUNDLE/LOAD FAIL — ${result.loadError}`); + console.log( + `| \`bundle/load\` | ❌ FAIL | ${escapeMarkdown(result.loadError)} |`, + ); continue; } for (const step of result.steps) { - const icon = - step.status === 'PASS' ? '✓' : step.status === 'FAIL' ? '✗' : '~'; + const resultLabel = + step.status === 'PASS' + ? '✅ PASS' + : step.status === 'FAIL' + ? '❌ FAIL' + : '⚠️ INCONCLUSIVE'; console.log( - ` ${icon} ${step.status.padEnd(12)} ${step.name} — ${step.detail}`, + `| \`${escapeMarkdown(step.name)}\` | ${resultLabel} | ${escapeMarkdown(step.detail)} |`, ); if (step.status === 'FAIL') hasFail = true; + if (step.status === 'INCONCLUSIVE') hasInconclusive = true; } } - console.log('\n' + '='.repeat(80)); + console.log( hasFail - ? 'RESULT: FAIL (at least one step failed)' - : 'RESULT: OK (no hard failures)', + ? '\n**Result: ❌ Failed — at least one check failed.**' + : hasInconclusive + ? '\n**Result: ⚠️ Inconclusive — no hard failures.**' + : '\n**Result: ✅ Passed — all checks succeeded.**', ); - console.log('='.repeat(80)); return hasFail; }