From 9abce4a5a1a00c4def55e9a1a78cf2f6b9fcbda6 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Mon, 6 Apr 2026 14:59:55 -0400 Subject: [PATCH 1/4] ci: add workflow that removes `needs review` on review --- .../remove-needs-review-on-review.yml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/remove-needs-review-on-review.yml diff --git a/.github/workflows/remove-needs-review-on-review.yml b/.github/workflows/remove-needs-review-on-review.yml new file mode 100644 index 000000000..41aa13fc6 --- /dev/null +++ b/.github/workflows/remove-needs-review-on-review.yml @@ -0,0 +1,35 @@ +name: remove-needs-review-on-review + +on: + pull_request_review: + types: + - submitted + +jobs: + remove-needs-review: + name: 🏷️ Remove needs review label + if: github.repository == 'npmx-dev/npmx.dev' && contains(fromJson('["MEMBER","OWNER"]'), github.event.review.author_association) + runs-on: ubuntu-slim + permissions: + issues: write + steps: + - name: 🏷️ Remove needs review label + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const pr = context.payload.pull_request; + const LABEL = 'needs review'; + + if (!pr.labels.some(({ name }) => name === LABEL)) { + console.log(`PR #${pr.number} does not have the "${LABEL}" label.`); + return; + } + + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + name: LABEL, + }); + + console.log(`Removed "${LABEL}" from PR #${pr.number}.`); From 05183de189e86eadd6232cded6fcb37c60c5899b Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Mon, 6 Apr 2026 18:27:34 -0400 Subject: [PATCH 2/4] ci: use GH API to get reviewer permissions --- .../remove-needs-review-on-review.yml | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.github/workflows/remove-needs-review-on-review.yml b/.github/workflows/remove-needs-review-on-review.yml index 41aa13fc6..53174d9a3 100644 --- a/.github/workflows/remove-needs-review-on-review.yml +++ b/.github/workflows/remove-needs-review-on-review.yml @@ -8,9 +8,10 @@ on: jobs: remove-needs-review: name: 🏷️ Remove needs review label - if: github.repository == 'npmx-dev/npmx.dev' && contains(fromJson('["MEMBER","OWNER"]'), github.event.review.author_association) + if: github.repository == 'npmx-dev/npmx.dev' runs-on: ubuntu-slim permissions: + contents: read issues: write steps: - name: 🏷️ Remove needs review label @@ -18,13 +19,33 @@ jobs: with: script: | const pr = context.payload.pull_request; + const review = context.payload.review; const LABEL = 'needs review'; + const reviewer = review?.user?.login; + + if (!reviewer) { + console.log('No reviewer login found in payload, skipping.'); + return; + } if (!pr.labels.some(({ name }) => name === LABEL)) { console.log(`PR #${pr.number} does not have the "${LABEL}" label.`); return; } + const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username: reviewer, + }); + + console.log(`Reviewer @${reviewer} permission is "${permission.permission}".`); + + if (!['admin', 'maintain', 'write'].includes(permission.permission)) { + console.log(`Reviewer @${reviewer} is not a maintainer, skipping.`); + return; + } + await github.rest.issues.removeLabel({ owner: context.repo.owner, repo: context.repo.repo, From 962e9b309e379a87caaa0d12c0f8b01b35bc56c7 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Tue, 7 Apr 2026 16:01:09 -0400 Subject: [PATCH 3/4] ci: add missing worflow permission --- .github/workflows/remove-needs-review-on-review.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/remove-needs-review-on-review.yml b/.github/workflows/remove-needs-review-on-review.yml index 53174d9a3..19a1310a1 100644 --- a/.github/workflows/remove-needs-review-on-review.yml +++ b/.github/workflows/remove-needs-review-on-review.yml @@ -13,6 +13,7 @@ jobs: permissions: contents: read issues: write + pull-requests: write steps: - name: 🏷️ Remove needs review label uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 From bcbe2358aab8d68383139bb033f833844feba763 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Tue, 7 Apr 2026 17:47:17 -0400 Subject: [PATCH 4/4] ci: ignore self-reviews and bot reviews --- .github/workflows/remove-needs-review-on-review.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/remove-needs-review-on-review.yml b/.github/workflows/remove-needs-review-on-review.yml index 19a1310a1..4c8d2d29a 100644 --- a/.github/workflows/remove-needs-review-on-review.yml +++ b/.github/workflows/remove-needs-review-on-review.yml @@ -23,12 +23,24 @@ jobs: const review = context.payload.review; const LABEL = 'needs review'; const reviewer = review?.user?.login; + const author = pr.user?.login; + const reviewerType = review?.user?.type; if (!reviewer) { console.log('No reviewer login found in payload, skipping.'); return; } + if (reviewerType === 'Bot') { + console.log(`Skipping bot review from @${reviewer} on PR #${pr.number}.`); + return; + } + + if (reviewer === author) { + console.log(`Skipping self-review from @${reviewer} on PR #${pr.number}.`); + return; + } + if (!pr.labels.some(({ name }) => name === LABEL)) { console.log(`PR #${pr.number} does not have the "${LABEL}" label.`); return;