From b98af64952625765a3ec69d460abd8719d2651ab Mon Sep 17 00:00:00 2001 From: Carlos Holguera Date: Mon, 22 Dec 2025 14:04:36 +0100 Subject: [PATCH 1/2] Create close-spam-issues.yml --- .github/workflows/close-spam-issues.yml | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/close-spam-issues.yml diff --git a/.github/workflows/close-spam-issues.yml b/.github/workflows/close-spam-issues.yml new file mode 100644 index 000000000..f2bdbb2ce --- /dev/null +++ b/.github/workflows/close-spam-issues.yml @@ -0,0 +1,55 @@ +name: Auto close spam issues from new users + +on: + issues: + types: [opened, reopened] + +permissions: + issues: write + +jobs: + close_if_new_user: + runs-on: ubuntu-latest + steps: + - name: Close issue if opened by a new user + uses: actions/github-script@v7 + with: + script: | + const issue = context.payload.issue + const assoc = issue.author_association || "" + const labels = (issue.labels || []).map(l => (typeof l === "string" ? l : l.name)) + const exemptLabels = new Set(["allow", "do-not-close", "not-spam", "triage"]) + const isExempt = labels.some(l => exemptLabels.has(l)) + + const newUserAssocs = new Set(["NONE", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR"]) + const isNewUser = newUserAssocs.has(assoc) + + if (!isNewUser || isExempt) { + core.info(`Not closing. author_association=${assoc}, exempt=${isExempt}`) + return + } + + const message = + "Hi. This issue was auto closed because it looks like spam or low signal from a new account. " + + "If you believe this is a mistake, reply to this issue with clear details and we will review and reopen if appropriate." + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ["spam"] + }) + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + body: message + }) + + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + state: "closed" + }) From 67ad1bebab7480f426b6041685f222097de4d052 Mon Sep 17 00:00:00 2001 From: Carlos Holguera Date: Mon, 22 Dec 2025 16:06:18 +0100 Subject: [PATCH 2/2] add close prs --- .github/workflows/close-spam-prs.yml | 56 ++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/workflows/close-spam-prs.yml diff --git a/.github/workflows/close-spam-prs.yml b/.github/workflows/close-spam-prs.yml new file mode 100644 index 000000000..de235939f --- /dev/null +++ b/.github/workflows/close-spam-prs.yml @@ -0,0 +1,56 @@ +name: Auto close spam PRs from new users + +on: + pull_request_target: + types: [opened, reopened] + +permissions: + pull-requests: write + issues: write + +jobs: + close_if_new_user: + runs-on: ubuntu-latest + steps: + - name: Close PR if opened by a new user + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request + const assoc = pr.author_association || "" + const labels = (pr.labels || []).map(l => (typeof l === "string" ? l : l.name)) + const exemptLabels = new Set(["allow", "do-not-close", "not-spam", "triage"]) + const isExempt = labels.some(l => exemptLabels.has(l)) + + const newUserAssocs = new Set(["NONE", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR"]) + const isNewUser = newUserAssocs.has(assoc) + + if (!isNewUser || isExempt) { + core.info(`Not closing. author_association=${assoc}, exempt=${isExempt}`) + return + } + + const message = + "Hi. This pull request was auto closed because it looks like spam or low signal from a new account. " + + "If you believe this is a mistake, comment with what this PR changes and why it is relevant, and we will review and reopen if appropriate." + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + labels: ["spam"] + }) + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + body: message + }) + + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + state: "closed" + })